Ver código fonte

新增 swaggerv3 的接口生成,和接口的扫描

xiaochan 11 meses atrás
pai
commit
3cfc82f116
29 arquivos alterados com 831 adições e 28 exclusões
  1. 25 9
      pom.xml
  2. 1 4
      thyy-archive/pom.xml
  3. 2 0
      thyy-archive/src/main/java/org/thyy/archive/ThyyArchiveApplication.java
  4. 33 0
      thyy-haikang/.gitignore
  5. 52 0
      thyy-haikang/pom.xml
  6. 14 0
      thyy-haikang/src/main/java/org/thyy/haikang/ConfigData.java
  7. 15 0
      thyy-haikang/src/main/java/org/thyy/haikang/ThyyHaikangApplication.java
  8. 44 0
      thyy-haikang/src/main/java/org/thyy/haikang/controller/DoorController.java
  9. 38 0
      thyy-haikang/src/main/java/org/thyy/haikang/controller/OrgController.java
  10. 16 0
      thyy-haikang/src/main/java/org/thyy/haikang/dao/OrgDao.java
  11. 38 0
      thyy-haikang/src/main/java/org/thyy/haikang/entity/apidata/door/SingleAdd.java
  12. 37 0
      thyy-haikang/src/main/java/org/thyy/haikang/entity/apidata/org/AdvanceOrgList.java
  13. 68 0
      thyy-haikang/src/main/java/org/thyy/haikang/entity/apidata/org/GetOrgListQuery.java
  14. 39 0
      thyy-haikang/src/main/java/org/thyy/haikang/entity/apidata/org/OrgBatchAdd.java
  15. 9 0
      thyy-haikang/src/main/java/org/thyy/haikang/entity/data/CodeName.java
  16. 30 0
      thyy-haikang/src/main/java/org/thyy/haikang/entity/params/door/AddPatient.java
  17. 4 0
      thyy-haikang/src/main/java/org/thyy/haikang/entity/result/SuccessAdd.java
  18. 38 0
      thyy-haikang/src/main/java/org/thyy/haikang/service/DoorService.java
  19. 28 0
      thyy-haikang/src/main/java/org/thyy/haikang/service/OrgService.java
  20. 58 0
      thyy-haikang/src/main/java/org/thyy/haikang/utils/RequestUtils.java
  21. 26 0
      thyy-haikang/src/main/resources/application-prod.yml
  22. 39 0
      thyy-haikang/src/main/resources/application.yml
  23. 123 0
      thyy-haikang/src/main/resources/logback-spring.xml
  24. 1 1
      thyy-socket/pom.xml
  25. 2 2
      thyy-socket/src/main/java/org/thyy/socket/ThyySocketApplication.java
  26. 1 1
      thyy-utils/pom.xml
  27. 30 0
      thyy-utils/src/main/java/org/thyy/utils/config/Knife4jConfig.java
  28. 13 9
      thyy-utils/src/main/java/org/thyy/utils/exception/GlobalExceptionHandler.java
  29. 7 2
      thyy-utils/src/main/java/org/thyy/utils/result/ResultVo.java

+ 25 - 9
pom.xml

@@ -17,21 +17,14 @@
 
     <properties>
         <java.version>21</java.version>
-
-        <thyy.busuness>0.0.1</thyy.busuness>
         <!-- 改版本别改错了, install 时如果有修改 utils 最好全部 install -->
-        <!--   电子病历的归档,和文件上传的功能     -->
-        <thyy.archive>0.0.6</thyy.archive>
-        <!--    socket 消息    -->
-        <thyy.socket>0.0.4</thyy.socket>
-        <!--   通用的工具类      -->
-        <thyy.utils>0.0.1</thyy.utils>
     </properties>
 
     <modules>
         <module>thyy-archive</module>
         <module>thyy-utils</module>
         <module>thyy-socket</module>
+        <module>thyy-haikang</module>
     </modules>
 
     <dependencies>
@@ -40,6 +33,10 @@
             <artifactId>hutool-all</artifactId>
             <version>5.8.34</version>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
@@ -53,6 +50,13 @@
             <artifactId>fastjson2</artifactId>
             <version>2.0.52</version>
         </dependency>
+
+        <dependency>
+            <groupId>com.github.xingfudeshi</groupId>
+            <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
+            <version>4.6.0</version>
+        </dependency>
+
     </dependencies>
 
     <dependencyManagement>
@@ -60,7 +64,19 @@
             <dependency>
                 <groupId>org.thyy.business</groupId>
                 <artifactId>thyy-utils</artifactId>
-                <version>0.0.1</version>
+                <version>0.0.3</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.microsoft.sqlserver</groupId>
+                <artifactId>mssql-jdbc</artifactId>
+                <version>8.2.2.jre8</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
+                <version>3.5.9</version>
             </dependency>
         </dependencies>
     </dependencyManagement>

+ 1 - 4
thyy-archive/pom.xml

@@ -8,7 +8,7 @@
         <version>0.0.1</version>
     </parent>
     <artifactId>thyy-archive</artifactId>
-    <version>${thyy.archive}</version>
+    <version>0.0.7</version>
     <name>thyy-archive</name>
     <description>thyy-archive</description>
     <properties>
@@ -24,10 +24,8 @@
         <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
-            <version>3.5.9</version>
         </dependency>
 
-
         <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
         <dependency>
             <groupId>com.itextpdf</groupId>
@@ -45,7 +43,6 @@
         <dependency>
             <groupId>com.microsoft.sqlserver</groupId>
             <artifactId>mssql-jdbc</artifactId>
-            <version>8.2.2.jre8</version>
         </dependency>
 
         <dependency>

+ 2 - 0
thyy-archive/src/main/java/org/thyy/archive/ThyyArchiveApplication.java

@@ -3,9 +3,11 @@ package org.thyy.archive;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
 
 @SpringBootApplication
 @MapperScan("org.thyy.archive.dao")
+@ComponentScan("org.thyy.*")
 public class ThyyArchiveApplication {
 
     public static void main(String[] args) {

+ 33 - 0
thyy-haikang/.gitignore

@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/

+ 52 - 0
thyy-haikang/pom.xml

@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.thyy.business</groupId>
+        <artifactId>thyy-business</artifactId>
+        <version>0.0.1</version>
+    </parent>
+    <artifactId>thyy-haikang</artifactId>
+    <version>0.0.1</version>
+    <name>thyy-haikang</name>
+    <description>thyy-haikang</description>
+    <properties>
+        <java.version>21</java.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.thyy.business</groupId>
+            <artifactId>thyy-utils</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.microsoft.sqlserver</groupId>
+            <artifactId>mssql-jdbc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
+            <version>3.5.9</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/com.hikvision.ga/artemis-http-client -->
+        <dependency>
+            <groupId>com.hikvision.ga</groupId>
+            <artifactId>artemis-http-client</artifactId>
+            <version>1.1.3</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 14 - 0
thyy-haikang/src/main/java/org/thyy/haikang/ConfigData.java

@@ -0,0 +1,14 @@
+package org.thyy.haikang;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@Data
+@ConfigurationProperties(prefix = "thyy.haikang")
+public class ConfigData {
+    private String key;
+    private String secret;
+    private String url;
+}

+ 15 - 0
thyy-haikang/src/main/java/org/thyy/haikang/ThyyHaikangApplication.java

@@ -0,0 +1,15 @@
+package org.thyy.haikang;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+@SpringBootApplication
+@MapperScan("org.thyy.haikang.dao")
+@ComponentScan("org.thyy.*")
+public class ThyyHaikangApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(ThyyHaikangApplication.class, args);
+    }
+}

+ 44 - 0
thyy-haikang/src/main/java/org/thyy/haikang/controller/DoorController.java

@@ -0,0 +1,44 @@
+package org.thyy.haikang.controller;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.thyy.haikang.entity.params.door.AddPatient;
+import org.thyy.haikang.service.DoorService;
+import org.thyy.utils.result.R;
+import org.thyy.utils.result.ResultVo;
+
+
+/**
+ * 门禁系统
+ */
+@RestController
+@RequestMapping("/door")
+@Slf4j
+@Tag(description = "门禁创建用户", name = "门禁")
+public class DoorController {
+
+    private final DoorService doorService;
+
+    public DoorController(DoorService doorService) {
+        this.doorService = doorService;
+    }
+
+    @PostMapping("/createPatient")
+    @Operation(description = "创建患者门禁,注意同一个患者不能调用多次这个接口", summary = "创建患者门禁")
+    public ResultVo<String> createPatient(@RequestBody @Validated AddPatient params) {
+        return R.ok(doorService.createPatient(params));
+    }
+
+    @PostMapping("/destructionUser")
+    @Operation(description = "销毁这个患者的门禁权限", summary = "删除患者门禁")
+    public ResultVo<String> destructionUser() {
+        return R.ok();
+    }
+
+}

+ 38 - 0
thyy-haikang/src/main/java/org/thyy/haikang/controller/OrgController.java

@@ -0,0 +1,38 @@
+package org.thyy.haikang.controller;
+
+import com.alibaba.fastjson2.JSONObject;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.web.bind.annotation.*;
+import org.thyy.haikang.entity.apidata.org.AdvanceOrgList;
+import org.thyy.haikang.entity.apidata.org.GetOrgListQuery;
+import org.thyy.haikang.service.OrgService;
+import org.thyy.haikang.utils.RequestUtils;
+import org.thyy.utils.result.R;
+import org.thyy.utils.result.ResultVo;
+
+
+@RestController
+@RequestMapping("/org")
+public class OrgController {
+
+    private final OrgService orgService;
+
+    public OrgController(OrgService orgService) {
+        this.orgService = orgService;
+    }
+
+    @PostMapping("/synchronizeDepartments")
+    @Operation(description = "同步本院科室", summary = "同步本院科室")
+    public ResultVo<String> synchronizeDepartments() {
+        orgService.synchronizeDepartments();
+        return R.ok();
+    }
+
+    @PostMapping("/advance/orgList")
+    @Operation(description = "获取组织列表", summary = "获取组织列表")
+    public ResultVo<AdvanceOrgList> getAdvanceOrgList(@RequestBody GetOrgListQuery query) {
+        AdvanceOrgList post = RequestUtils.post("/api/resource/v2/org/advance/orgList", JSONObject.toJSONString(query));
+        return R.ok(post);
+    }
+
+}

+ 16 - 0
thyy-haikang/src/main/java/org/thyy/haikang/dao/OrgDao.java

@@ -0,0 +1,16 @@
+package org.thyy.haikang.dao;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import org.thyy.haikang.entity.apidata.org.OrgBatchAdd;
+
+import java.util.List;
+
+@Mapper
+public interface OrgDao {
+
+    @Select("select rtrim(code) as orgIndexCode," +
+            "       rtrim(name) as orgName," +
+            "      parentIndexCode = 'root000000'  from zy_dept_code")
+    List<OrgBatchAdd> deptList();
+}

+ 38 - 0
thyy-haikang/src/main/java/org/thyy/haikang/entity/apidata/door/SingleAdd.java

@@ -0,0 +1,38 @@
+package org.thyy.haikang.entity.apidata.door;
+
+import jakarta.validation.Valid;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class SingleAdd {
+    private String personId;
+    private String personName;
+    private String gender;
+    private String orgIndexCode;
+    private String birthday;
+    private String phoneNo;
+    private String email;
+    private String certificateType;
+    private String certificateNo;
+    private String jobNo;
+    private String tagId;
+
+    @Valid
+    private List<FaceInfo> faces;
+
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    static class FaceInfo {
+
+        private String faceData;
+    }
+}

+ 37 - 0
thyy-haikang/src/main/java/org/thyy/haikang/entity/apidata/org/AdvanceOrgList.java

@@ -0,0 +1,37 @@
+package org.thyy.haikang.entity.apidata.org;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.ZonedDateTime;
+
+@Data
+@Schema(description = "组织信息实体类")
+public class AdvanceOrgList {
+    @Schema(description = "组织索引代码", example = "root000000")
+    private String orgIndexCode;
+
+    @Schema(description = "组织代码", example = "0000000")
+    private String organizationCode;
+
+    @Schema(description = "组织名称", example = "泰和医院")
+    private String orgName;
+
+    @Schema(description = "组织路径", example = "@root000000@")
+    private String orgPath;
+
+    @Schema(description = "父组织索引代码", example = "-1")
+    private String parentOrgIndexCode;
+
+    @Schema(description = "排序", example = "1")
+    private Integer sort;
+
+    @Schema(description = "更新时间", example = "2024-12-25T05:00:00.313+08:00")
+    private ZonedDateTime updateTime;
+
+    @Schema(description = "是否可用", example = "true")
+    private boolean available;
+
+    @Schema(description = "是否为叶子节点", example = "false")
+    private boolean leaf;
+}

+ 68 - 0
thyy-haikang/src/main/java/org/thyy/haikang/entity/apidata/org/GetOrgListQuery.java

@@ -0,0 +1,68 @@
+package org.thyy.haikang.entity.apidata.org;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class GetOrgListQuery {
+    /**
+     * 组织名称
+     * 如默认部门
+     */
+    private String orgName;
+
+    /**
+     * 组织唯一标识码集合
+     * 多个值使用英文逗号分隔,不超过1000个
+     */
+    private String orgIndexCodes;
+
+    /**
+     * 当前页码
+     * 当前页码需大于0
+     */
+    @Schema(description = "当前页码", minLength = 1, defaultValue = "1")
+    private Integer pageNo = 1;
+
+    /**
+     * 每页记录数
+     * 每页记录展示的数目应大于0,小于等于1000
+     */
+    @Schema(description = "每页记录数", maxLength = 1000, minLength = 1, defaultValue = "30")
+    private Integer pageSize = 30;
+
+    /**
+     * 父组织唯一标识码集合
+     * 多个值使用英文逗号分隔,不超过1000个
+     */
+    private String parentOrgIndexCodes;
+
+    /**
+     * 是否查询子孙组织
+     * true时,搜索parentOrgIndexCodes的所有子孙组织;false时,只搜索直接子组织
+     */
+    private Boolean isSubOrg;
+
+    /**
+     * 查询表达式列表
+     * 用于定义查询条件
+     */
+    private List<Map<String, Object>> expressions;
+
+    /**
+     * 排序字段
+     * 必须是查询条件中的字段,否则返回参数错误
+     */
+    @Schema(description = "排序字段,必须是查询条件中的字段,否则返回参数错误", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    private String orderBy = null;
+
+    /**
+     * 排序类型
+     * 降序:desc,升序:asc
+     */
+    @Schema(description = "排序类型,降序:desc,升序:asc", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    private String orderType;
+}

+ 39 - 0
thyy-haikang/src/main/java/org/thyy/haikang/entity/apidata/org/OrgBatchAdd.java

@@ -0,0 +1,39 @@
+package org.thyy.haikang.entity.apidata.org;
+
+import lombok.Data;
+
+@Data
+public class OrgBatchAdd {
+
+    /**
+     * 调用方指定的标识
+     * 用于在接口调用成功后绑定服务端生成的标识,建议每次调用时保持唯一性
+     */
+    private Long clientId;
+
+    /**
+     * 组织唯一标志
+     * 不允许与其他组织(包括已删除的)重复,值为空或不传时系统自动生成
+     */
+    private String orgIndexCode;
+
+    /**
+     * 组织名称
+     * 1到32个字符,不能包含特殊字符 ' / \ : * ? " < >
+     */
+    private String orgName;
+
+    /**
+     * 父组织的唯一标识码
+     * 必填字段,用于确定组织在组织树中的位置
+     */
+    private String parentIndexCode;
+
+    /**
+     * 组织编码
+     * 当添加小区节点时必填,编码应以01101开头,共8位数字;
+     * 当添加楼栋单元时必填,编码应以01101开头,共20位数字;
+     * 其它场景下该值无效
+     */
+    private String orgCode;
+}

+ 9 - 0
thyy-haikang/src/main/java/org/thyy/haikang/entity/data/CodeName.java

@@ -0,0 +1,9 @@
+package org.thyy.haikang.entity.data;
+
+import lombok.Data;
+
+@Data
+public class CodeName {
+    private String code;
+    private String name;
+}

+ 30 - 0
thyy-haikang/src/main/java/org/thyy/haikang/entity/params/door/AddPatient.java

@@ -0,0 +1,30 @@
+package org.thyy.haikang.entity.params.door;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+@Data
+@Schema
+public class AddPatient {
+
+    @NotNull(message = "住院号不能为空")
+    @Schema(description = "住院号")
+    private String patNo;
+
+    @NotNull(message = "住院次数不能为空")
+    @Schema(description = "住院次数")
+    private Integer times;
+
+    @NotNull(message = "性别不能为空")
+    @Schema(description = "性别")
+    private String gender;
+
+    @NotNull(message = "病区不能为空")
+    @Schema(description = "病区")
+    private String orgIndexCode;
+
+    @NotNull(message = "患者姓名不能为空")
+    @Schema(description = "患者姓名")
+    private String personName;
+}

+ 4 - 0
thyy-haikang/src/main/java/org/thyy/haikang/entity/result/SuccessAdd.java

@@ -0,0 +1,4 @@
+package org.thyy.haikang.entity.result;
+
+public class SuccessAdd {
+}

+ 38 - 0
thyy-haikang/src/main/java/org/thyy/haikang/service/DoorService.java

@@ -0,0 +1,38 @@
+package org.thyy.haikang.service;
+
+import com.alibaba.fastjson2.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.thyy.haikang.entity.apidata.door.SingleAdd;
+import org.thyy.haikang.entity.params.door.AddPatient;
+import org.thyy.haikang.utils.RequestUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class DoorService {
+
+    public String createPatient(AddPatient params) {
+        String id = params.getPatNo() + params.getTimes();
+
+        Map<String, String> header = new HashMap<>() {{
+            put("tagId", "patient");
+        }};
+
+        SingleAdd addParams = SingleAdd.builder()
+                .personName(params.getPersonName())
+                .gender(params.getGender())
+                .jobNo(id)
+                .orgIndexCode(params.getOrgIndexCode())
+                .certificateType("111")
+                .tagId("patient")
+                .build();
+
+        JSONObject post = RequestUtils.post("/api/resource/v2/person/single/add", JSONObject.toJSONString(addParams), header);
+        log.info("添加住院患者:{}", post.toJSONString());
+        return "添加成功";
+    }
+
+}

+ 28 - 0
thyy-haikang/src/main/java/org/thyy/haikang/service/OrgService.java

@@ -0,0 +1,28 @@
+package org.thyy.haikang.service;
+
+import com.alibaba.fastjson2.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.thyy.haikang.entity.apidata.org.OrgBatchAdd;
+import org.thyy.haikang.dao.OrgDao;
+import org.thyy.haikang.utils.RequestUtils;
+
+import java.util.List;
+
+@Service
+@Slf4j
+public class OrgService {
+
+    private final OrgDao orgDao;
+
+    public OrgService(OrgDao orgDao) {
+        this.orgDao = orgDao;
+    }
+
+    public void synchronizeDepartments() {
+        List<OrgBatchAdd> codeNames = orgDao.deptList();
+        Object post = RequestUtils.post("/api/resource/v1/org/batch/add", JSONObject.toJSONString(codeNames));
+        log.info("同步数据:{}", post.toString());
+    }
+
+}

+ 58 - 0
thyy-haikang/src/main/java/org/thyy/haikang/utils/RequestUtils.java

@@ -0,0 +1,58 @@
+package org.thyy.haikang.utils;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.alibaba.fastjson2.JSONObject;
+import com.hikvision.artemis.sdk.ArtemisHttpUtil;
+import com.hikvision.artemis.sdk.config.ArtemisConfig;
+import lombok.extern.slf4j.Slf4j;
+import org.thyy.utils.exception.BizException;
+import org.thyy.utils.exception.ExceptionEnum;
+import org.thyy.haikang.ConfigData;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+@Slf4j
+public class RequestUtils {
+    private static final ConfigData config = SpringUtil.getBean(ConfigData.class);
+    static final String ARTEMIS_PATH = "/artemis";
+    static final String contentType = "application/json";
+
+    static {
+        ArtemisConfig.host = config.getUrl();
+        ArtemisConfig.appKey = config.getKey();
+        ArtemisConfig.appSecret = config.getSecret();
+    }
+
+    public static <T> T post(String url, String body, Map<String, String> headers) {
+        String previewURLsApi = ARTEMIS_PATH + url;
+        Map<String, String> path = new HashMap<>(2) {
+            {
+                put("https://", previewURLsApi);
+            }
+        };
+
+        try {
+            String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null,
+                    contentType, headers);
+            JSONObject jsonObject = JSONObject.parseObject(result);
+            log.info("\npost \nurl:{}\nheader:{}\nbody:{}\nresult:{}", url, headers, body, jsonObject);
+            if (jsonObject == null) {
+                throw new BizException(ExceptionEnum.LOGICAL_ERROR, "返回体为空");
+            }
+            if (jsonObject.getString("code").equals("0")) {
+                return (T) jsonObject.get("data");
+            }
+            throw new BizException(ExceptionEnum.LOGICAL_ERROR, jsonObject.getString("msg"));
+
+        } catch (Exception e) {
+            log.error("接口调用错误:{}", e.getMessage());
+            throw new BizException(ExceptionEnum.LOGICAL_ERROR, e.getMessage());
+        }
+    }
+
+    public static <T> T post(String url, String body) {
+        return post(url, body, null);
+    }
+}

+ 26 - 0
thyy-haikang/src/main/resources/application-prod.yml

@@ -0,0 +1,26 @@
+spring:
+  application:
+    name: thyy-haikang
+  datasource:
+    url: "jdbc:sqlserver://172.16.32.168:1433;databaseName=thxyhisdb"
+    username: "sa"
+    password:
+    driver-class-name: "com.microsoft.sqlserver.jdbc.SQLServerDriver"
+  jackson:
+    time-zone: Asia/Shanghai
+    date-format: yyyy-MM-dd HH:mm:ss
+  mvc:
+    format:
+      date: yyyy-MM-dd
+      date-time: yyyy-MM-dd HH:mm:ss
+
+server:
+  port: 20923
+  servlet:
+    context-path: /thyy/api/haikang
+
+thyy:
+  haikang:
+    key: "26610301"
+    secret: "oZNYo4r0QydlpYkHF7Vp"
+    url: "172.16.32.210:443"

+ 39 - 0
thyy-haikang/src/main/resources/application.yml

@@ -0,0 +1,39 @@
+spring:
+  application:
+    name: thyy-haikang
+  datasource:
+    url: "jdbc:sqlserver://172.16.32.168:1433;databaseName=thxyhisdb"
+    username: "sa"
+    password:
+    driver-class-name: "com.microsoft.sqlserver.jdbc.SQLServerDriver"
+  jackson:
+    time-zone: Asia/Shanghai
+    date-format: yyyy-MM-dd HH:mm:ss
+  mvc:
+    format:
+      date: yyyy-MM-dd
+      date-time: yyyy-MM-dd HH:mm:ss
+
+server:
+  port: 20923
+  servlet:
+    context-path: /thyy/api/haikang
+thyy:
+  haikang:
+    key: "26610301"
+    secret: "oZNYo4r0QydlpYkHF7Vp"
+    url: "172.16.32.210:443"
+
+# springdoc-openapi????
+springdoc:
+  swagger-ui:
+    path: /swagger-ui.html
+    tags-sorter: alpha
+    operations-sorter: alpha
+  api-docs:
+    path: /v3/api-docs
+# knife4j???????????????
+knife4j:
+  enable: true
+  setting:
+    language: zh_cn

+ 123 - 0
thyy-haikang/src/main/resources/logback-spring.xml

@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+
+    <springProperty scope="context" name="LOG_HOME" source="logging.path"
+                    defaultValue="serverlog"/>
+
+    <!-- 日志级别 -->
+    <springProperty scope="context" name="LOG_ROOT_LEVEL" source="logging.level.root" defaultValue="INFO"/>
+
+    <!--  标识这个"STDOUT" 将会添加到这个logger -->
+    <springProperty scope="context" name="STDOUT" source="log.stdout" defaultValue="STDOUT"/>
+
+    <!-- 日志文件名称-->
+    <property name="LOG_PREFIX" value="spring-boot-logback"/>
+
+    <!-- 日志文件编码-->
+    <property name="LOG_CHARSET" value="UTF-8"/>
+
+    <!-- 日志文件路径+日期-->
+    <property name="LOG_DIR" value="${LOG_HOME}/%d{yyyy-MM-dd}"/>
+
+    <!--对日志进行格式化-->
+    <property name="LOG_MSG" value="- [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] [%logger{16}] --> %msg%n "/>
+
+    <!--文件大小,默认10MB-->
+    <property name="MAX_FILE_SIZE" value="30MB"/>
+
+    <!-- 配置日志的滚动时间 ,value表示保留日志的天数,0表示永久保存 -->
+    <property name="MAX_HISTORY" value="0"/>
+
+
+    <!-- 彩色日志 -->
+    <!-- 彩色日志依赖的渲染类 -->
+    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <!-- 彩色日志格式 -->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="-[%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){blue}] [%clr(%level)] [%clr(%thread)] [%clr(%logger{16}){cyan}] %clr(-->){red} %clr(%msg%n){yellow}"/>
+
+    <!--输出到控制台-->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <!-- 输出的日志内容格式化-->
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
+        </layout>
+    </appender>
+
+    <!--输出到文件-->
+    <appender name="0" class="ch.qos.logback.core.rolling.RollingFileAppender">
+    </appender>
+
+    <!-- 定义 ALL 日志的输出方式:-->
+    <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!--日志文件路径,日志文件名称-->
+        <File>${LOG_HOME}/all_${LOG_PREFIX}.log</File>
+
+        <!-- 设置滚动策略,当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <!--日志文件路径,新的 ALL 日志文件名称,“ i ” 是个变量 -->
+            <FileNamePattern>${LOG_DIR}/all_${LOG_PREFIX}.log</FileNamePattern>
+
+            <!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志-->
+            <MaxHistory>${MAX_HISTORY}</MaxHistory>
+            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
+        </rollingPolicy>
+
+        <!-- 输出的日志内容格式化-->
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <pattern>${LOG_MSG}</pattern>
+        </layout>
+    </appender>
+
+    <!-- 定义 ERROR 日志的输出方式:-->
+    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 下面为配置只输出error级别的日志 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>ERROR</level>
+            <OnMismatch>DENY</OnMismatch>
+            <OnMatch>ACCEPT</OnMatch>
+        </filter>
+        <!--日志文件路径,日志文件名称-->
+        <File>${LOG_HOME}/err_${LOG_PREFIX}.log</File>
+
+        <!-- 设置滚动策略,当天的日志大小超过 ${MAX_FILE_SIZE} 文件大小时候,新的内容写入新的文件, 默认10MB -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+
+            <!--日志文件路径,新的 ERR 日志文件名称,“ i ” 是个变量 -->
+            <FileNamePattern>${LOG_DIR}/err_${LOG_PREFIX}.log</FileNamePattern>
+
+            <!-- 配置日志的滚动时间 ,表示只保留最近 10 天的日志-->
+            <MaxHistory>${MAX_HISTORY}</MaxHistory>
+            <maxFileSize>${MAX_FILE_SIZE}</maxFileSize>
+        </rollingPolicy>
+
+        <!-- 输出的日志内容格式化-->
+        <layout class="ch.qos.logback.classic.PatternLayout">
+            <Pattern>${LOG_MSG}</Pattern>
+        </layout>
+    </appender>
+
+    <!-- additivity 设为false,则logger内容不附加至root ,配置以配置包下的所有类的日志的打印,级别是 ERROR-->
+
+    <logger name="org.springframework" level="ERROR"/>
+    <logger name="org.apache.commons" level="ERROR"/>
+    <!--    <logger name="th.itcenter.apps.controller.logger.LoggingController" level="WARN"/>-->
+    <!-- ${LOG_ROOT_LEVEL} 日志级别 -->
+    <root level="${LOG_ROOT_LEVEL}">
+
+        <!-- 标识这个"${STDOUT}"将会添加到这个logger -->
+        <appender-ref ref="${STDOUT}"/>
+
+        <!-- FILE_ALL 日志输出添加到 logger -->
+        <appender-ref ref="FILE_ALL"/>
+
+        <!-- FILE_ERROR 日志输出添加到 logger -->
+        <appender-ref ref="FILE_ERROR"/>
+    </root>
+
+</configuration>

+ 1 - 1
thyy-socket/pom.xml

@@ -8,7 +8,7 @@
         <version>0.0.1</version>
     </parent>
     <artifactId>thyy-socket</artifactId>
-    <version>${thyy.socket}</version>
+    <version>0.0.5</version>
     <name>thyy-socket</name>
     <description>thyy-socket</description>
 

+ 2 - 2
thyy-socket/src/main/java/org/thyy/socket/ThyySocketApplication.java

@@ -2,12 +2,12 @@ package org.thyy.socket;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
 
 @SpringBootApplication
+@ComponentScan("org.thyy.*")
 public class ThyySocketApplication {
-
     public static void main(String[] args) {
         SpringApplication.run(ThyySocketApplication.class, args);
     }
-
 }

+ 1 - 1
thyy-utils/pom.xml

@@ -9,7 +9,7 @@
     </parent>
     <packaging>jar</packaging>
     <artifactId>thyy-utils</artifactId>
-    <version>${thyy.utils}</version>
+    <version>0.0.3</version>
     <name>thyy-utils</name>
     <description>thyy-utils</description>
 </project>

+ 30 - 0
thyy-utils/src/main/java/org/thyy/utils/config/Knife4jConfig.java

@@ -0,0 +1,30 @@
+package org.thyy.utils.config;
+
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Contact;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.info.License;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+@Configuration
+public class Knife4jConfig {
+
+    @Bean
+    public OpenAPI openAPI() {
+        return new OpenAPI()
+                .info(new Info()
+                        // 标题
+                        .title("接口文档")
+                        // 描述Api接口文档的基本信息
+                        .description("后端服务接口")
+                        // 版本
+                        .version("v1.0.0")
+                        // 设置OpenAPI文档的联系信息,姓名,邮箱。
+                        .contact(new Contact().name("Thomas").email("2907205361@qq.com"))
+                        // 设置OpenAPI文档的许可证信息,包括许可证名称为"Apache 2.0",许可证URL为"http://springdoc.org"。
+                        .license(new License().name("Apache 2.0").url("http://springdoc.org"))
+                );
+    }
+}

+ 13 - 9
thyy-utils/src/main/java/org/thyy/utils/exception/GlobalExceptionHandler.java

@@ -1,7 +1,8 @@
 package org.thyy.utils.exception;
 
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.validation.BindingResult;
+import org.springframework.context.support.DefaultMessageSourceResolvable;
+import org.springframework.validation.FieldError;
 import org.springframework.web.bind.MethodArgumentNotValidException;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ResponseBody;
@@ -9,7 +10,8 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
 import org.thyy.utils.result.R;
 import org.thyy.utils.result.ResultVo;
 
-import java.util.Objects;
+import java.util.List;
+import java.util.stream.Collectors;
 
 @Slf4j
 @RestControllerAdvice
@@ -22,13 +24,6 @@ public class GlobalExceptionHandler {
         return R.fail(ExceptionEnum.INTERNAL_SERVER_ERROR, e.getMessage());
     }
 
-
-    @ExceptionHandler(value = MethodArgumentNotValidException.class)
-    public ResultVo<String> bindException(MethodArgumentNotValidException e) {
-        BindingResult bindingResult = e.getBindingResult();
-        return R.fail(ExceptionEnum.NULL_POINTER, Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
-    }
-
     @ExceptionHandler(value = BizException.class)
     public ResultVo<String> businessException(BizException e) {
         log.error("【BizException】发生业务异常", e);
@@ -55,4 +50,13 @@ public class GlobalExceptionHandler {
         return R.fail(ExceptionEnum.NULL_POINTER, "错误原因:" + e.getCause().getMessage());
     }
 
+    @ExceptionHandler(value = MethodArgumentNotValidException.class)
+    @ResponseBody
+    public ResultVo<String> handlerValidException(MethodArgumentNotValidException e) {
+        log.error("发送参数校验异常:{}", e.getMessage());
+        List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
+        String message = fieldErrors.stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining(";"));
+        return R.fail(ExceptionEnum.INVALID_PARAM, message);
+    }
+
 }

+ 7 - 2
thyy-utils/src/main/java/org/thyy/utils/result/ResultVo.java

@@ -1,17 +1,22 @@
 package org.thyy.utils.result;
 
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import org.thyy.utils.exception.ExceptionEnum;
 
 @Data
 public class ResultVo<D> {
+
+    @Schema(description = "响应码 200 成功")
     private Integer code;
+    @Schema(description = "消息")
     private String message;
+    @Schema(description = "数据")
     private D data;
 
     public ResultVo() {
-        this.code = 200;
-        this.message = "success";
+        this.code = ExceptionEnum.SUCCESS.getCode();
+        this.message = ExceptionEnum.SUCCESS.getMessage();
     }
 
     public ResultVo(Integer code, String message, D data) {