Explorar o código

Merge branch 'dev' of ssh://10.10.100.21/source/saas-platform into dev

huangx %!s(int64=7) %!d(string=hai) anos
pai
achega
146def7ead
Modificáronse 31 ficheiros con 530 adicións e 131 borrados
  1. 0 22
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/config/WebMvcConfig.java
  2. 1 1
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/FundtransferServiceImpl.java
  3. 4 4
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/ProdInOutServiceImpl.java
  4. 4 4
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/PurchaseServiceImpl.java
  5. 2 2
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleServiceImpl.java
  6. 1 1
      base-servers/account/account-api/src/main/java/com/usoftchina/saas/account/api/AccountApi.java
  7. 2 2
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/RoleDTO.java
  8. 5 0
      base-servers/auth/auth-server/pom.xml
  9. 4 1
      base-servers/auth/auth-server/src/main/java/com/usoftchina/saas/auth/AuthApplication.java
  10. 28 3
      base-servers/auth/auth-server/src/main/java/com/usoftchina/saas/auth/controller/AuthController.java
  11. 1 0
      base-servers/pom.xml
  12. 20 0
      base-servers/socket/pom.xml
  13. 24 0
      base-servers/socket/socket-api/pom.xml
  14. 32 0
      base-servers/socket/socket-api/src/main/java/com/usoftchina/saas/socket/api/SocketMessageApi.java
  15. 51 0
      base-servers/socket/socket-server/pom.xml
  16. 6 0
      base-servers/socket/socket-server/src/main/docker/Dockerfile
  17. 40 0
      base-servers/socket/socket-server/src/main/java/com/usoftchina/saas/socket/SocketApplication.java
  18. 43 0
      base-servers/socket/socket-server/src/main/java/com/usoftchina/saas/socket/controller/MessageController.java
  19. 65 0
      base-servers/socket/socket-server/src/main/resources/application.yml
  20. 12 0
      base-servers/socket/socket-server/src/main/resources/config/application-docker-dev.yml
  21. 10 0
      base-servers/socket/socket-server/src/main/resources/config/application-docker.yml
  22. 113 0
      base-servers/socket/socket-server/src/main/resources/logback-spring.xml
  23. 10 28
      framework/core/src/main/java/com/usoftchina/saas/base/dto/CommonBaseDTO.java
  24. 0 27
      framework/core/src/main/java/com/usoftchina/saas/base/entity/BaseEntity.java
  25. 2 19
      framework/core/src/main/java/com/usoftchina/saas/base/entity/CommonBaseEntity.java
  26. 2 5
      framework/core/src/main/java/com/usoftchina/saas/base/service/BaseServiceImpl.java
  27. 16 0
      frontend/saas-web/app/view/home/charts/MonthSale.js
  28. 9 4
      frontend/saas-web/app/view/home/charts/PurchaseTrend.js
  29. 9 4
      frontend/saas-web/app/view/home/charts/SaleTrend.js
  30. 9 4
      frontend/saas-web/app/view/home/charts/StockAmount.js
  31. 5 0
      pom.xml

+ 0 - 22
applications/money/money-server/src/main/java/com/usoftchina/saas/money/config/WebMvcConfig.java

@@ -1,22 +0,0 @@
-//package com.usoftchina.saas.money.config;
-//
-//import org.springframework.web.servlet.config.annotation.CorsRegistry;
-//import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
-//
-///**
-// * @author heqw
-// * @date 2018/11/13 16:58
-// **/
-//public class WebMvcConfig extends WebMvcConfigurerAdapter {
-//    @Override
-//    public void addCorsMappings(CorsRegistry registry) {
-//        registry.addMapping("/**")
-//                .allowedOrigins("*")
-//                .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
-//                .allowedHeaders("Content-Type", "X-Requested-With", "accept", "Origin", "Access-Control-Request-Method",
-//                        "Access-Control-Request-Headers")
-//                .exposedHeaders("Access-Control-Allow-Origin", "Access-Control-Allow-Credentials")
-//                .maxAge(3600)
-//                .allowCredentials(true);
-//    }
-//}

+ 1 - 1
applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/FundtransferServiceImpl.java

@@ -155,7 +155,7 @@ public class FundtransferServiceImpl extends CommonBaseServiceImpl<FundtransferM
 
         //删除中间表
         fundtransfer = fundtransferMapper.selectByPrimaryKey(id);
-        banksubledgerMapper.deleteByPrimaryKey(fundtransfer.getFt_code(), "其他收入单");
+        banksubledgerMapper.deleteByPrimaryKey(fundtransfer.getFt_code(), "资金转账");
 
         //资金
         //取从表金额

+ 4 - 4
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/ProdInOutServiceImpl.java

@@ -143,7 +143,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         //判断更新与保存动作
         if (StringUtils.isEmpty(pi_id) || "0".equals(pi_id.toString())){
             prodInOut.setCompanyId(companyId);
-            setCreateInfo(prodInOut);
+            //setCreateInfo(prodInOut);
             //插入操作
             getMapper().insertSelective(prodInOut);
             pi_id = prodInOut.getId();
@@ -170,7 +170,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
             messageLogService.save(baseDTO);
             return baseDTO;
         }else{
-            setUpdateInfo(prodInOut);
+            //setUpdateInfo(prodInOut);
         }
         //更新操作
         getMapper().updateByPrimaryKeySelective(prodInOut);
@@ -517,7 +517,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
             }
             prodInOut.setPi_statuscode(Status.CLOSE.name());
             prodInOut.setPi_status(Status.CLOSE.getDisplay());
-            setUpdateInfo(prodInOut);
+            //setUpdateInfo(prodInOut);
             getMapper().updateByPrimaryKeySelective(prodInOut);
             docBaseDTO = getBaseDTOById(id,prodInOut.getPi_class(),prodInOut.getPi_inoutno());
             //日志
@@ -552,7 +552,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
             }
             prodInOut.setPi_statuscode(Status.OPEN.name());
             prodInOut.setPi_status(Status.OPEN.getDisplay());
-            setUpdateInfo(prodInOut);
+            //setUpdateInfo(prodInOut);
             getMapper().updateByPrimaryKeySelective(prodInOut);
             docBaseDTO = getBaseDTOById(id,prodInOut.getPi_class(),prodInOut.getPi_inoutno());
             //日志

+ 4 - 4
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/PurchaseServiceImpl.java

@@ -128,7 +128,7 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
         if (StringUtils.isEmpty(pu_id) || "0".equals(pu_id.toString())) {
             //录入人
             purchase.setCompanyId(companyId);
-            setCreateInfo(purchase);
+           // setCreateInfo(purchase);
             //插入操作
             purchaseMapper.insertSelective(purchase);
             pu_id = purchase.getId();
@@ -159,7 +159,7 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
             messageLogService.save(baseDTO);
             return baseDTO;
         }else{
-            setUpdateInfo(purchase);
+           // setUpdateInfo(purchase);
         }
         //更新操作
         purchaseMapper.updateByPrimaryKeySelective(purchase);
@@ -518,7 +518,7 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
         purchase.setUpdateTime(new Date());
         purchase.setUpdaterId(BaseContextHolder.getUserId());
         purchase.setUpdater(BaseContextHolder.getUserName());
-        setUpdateInfo(purchase);
+       // setUpdateInfo(purchase);
         //更新存在字段
         purchaseMapper.updateByPrimaryKeySelective(purchase);
         //更新最新采购单价
@@ -540,7 +540,7 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
         purchase.setId(id);
         purchase.setPu_status(Status.UNAUDITED.getDisplay());
         purchase.setPu_statuscode(Status.UNAUDITED.name());
-        setUpdateInfo(purchase);
+        //setUpdateInfo(purchase);
         //更新存在字段
         purchaseMapper.updateByPrimaryKeySelective(purchase);
         DocBaseDTO docBaseDTO = getBaseDTOById(id);

+ 2 - 2
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleServiceImpl.java

@@ -41,7 +41,7 @@ import java.util.*;
  * @create: 2018-10-22 11:29
  **/
 @Service
-public class SaleServiceImpl extends CommonBaseServiceImpl<SaleMapper,Sale> implements SaleService{
+public class SaleServiceImpl implements SaleService{
 
     @Autowired
     private SaleListMapper saleListMapper;
@@ -101,7 +101,7 @@ public class SaleServiceImpl extends CommonBaseServiceImpl<SaleMapper,Sale> impl
         //人员Id
         Long userId = BaseContextHolder.getUserId();
         //获取主表信息
-         SaleDTO main = formdata.getMain();
+        SaleDTO main = formdata.getMain();
         List<SaleDetailDTO> items = formdata.getItems();
         //插入从表数据
         List<SaleDetail> insertDetails = new ArrayList<>();

+ 1 - 1
base-servers/account/account-api/src/main/java/com/usoftchina/saas/account/api/AccountApi.java

@@ -76,6 +76,6 @@ public interface AccountApi {
      * @param accountUpdateDTO
      * @return
      */
-    @PostMapping("/update")
+    @PostMapping("/account/update")
     Result update(@RequestBody AccountUpdateDTO accountUpdateDTO);
 }

+ 2 - 2
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/RoleDTO.java

@@ -67,9 +67,9 @@ public class RoleDTO extends CommonBaseDTO implements Serializable{
                 ", description='" + description + '\'' +
                 ", id=" + id +
                 ", createTime=" + createTime +
-                ", creatorName='" + creator + '\'' +
+                ", creatorName='" + creatorName + '\'' +
                 ", updateTime=" + updateTime +
-                ", updaterName='" + updater + '\'' +
+                ", updaterName='" + updaterName + '\'' +
                 '}';
     }
 }

+ 5 - 0
base-servers/auth/auth-server/pom.xml

@@ -70,6 +70,11 @@
             <groupId>com.usoftchina.saas</groupId>
             <artifactId>test-starter</artifactId>
         </dependency>
+        <!-- socket -->
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>socket-api</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 4 - 1
base-servers/auth/auth-server/src/main/java/com/usoftchina/saas/auth/AuthApplication.java

@@ -12,7 +12,10 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
  */
 @SpringBootApplication
 @EnableEurekaClient
-@EnableFeignClients(basePackages = "com.usoftchina.saas.account.api")
+@EnableFeignClients(basePackages = {
+        "com.usoftchina.saas.account.api",
+        "com.usoftchina.saas.socket.api"
+})
 @MapperScan(basePackages = "com.usoftchina.saas.auth.mapper")
 public class AuthApplication {
     public static void main(String[] args) {

+ 28 - 3
base-servers/auth/auth-server/src/main/java/com/usoftchina/saas/auth/controller/AuthController.java

@@ -21,8 +21,11 @@ import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.exception.ExceptionCode;
 import com.usoftchina.saas.page.PageDefault;
 import com.usoftchina.saas.page.PageRequest;
+import com.usoftchina.saas.socket.api.SocketMessageApi;
 import com.usoftchina.saas.utils.BeanMapper;
 import com.usoftchina.saas.utils.CollectionUtils;
+import com.usoftchina.saas.utils.JsonUtils;
+import com.usoftchina.saas.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
@@ -61,6 +64,9 @@ public class AuthController {
     @Autowired
     private AuthorizeCountService authorizeCountService;
 
+    @Autowired
+    private SocketMessageApi socketMessageApi;
+
     /**
      * 登录认证获取token
      *
@@ -107,22 +113,24 @@ public class AuthController {
     /**
      * 账户中心登录回调
      *
+     * @param clientId 客户端唯一标志,发起请求到账户中心时带上
      * @param info
      * @return
      */
     @PostMapping("/sso/callback")
-    public Result ssoCallback(CookieInfo info) {
+    public Result ssoCallback(HttpServletRequest request, @RequestParam String clientId, CookieInfo info) {
         if (null != info && null != info.getMobile()) {
+            AccountDTO accountDTO = null;
             Result<AccountDTO> result = accountApi.getAccount(info.getMobile());
             if (!result.isSuccess()) {
                 if (ExceptionCode.USER_NOT_EXIST.getCode() == result.getCode()) {
                     // 新用户,自动注册
-                    createAccountByCookieInfo(info);
+                    accountDTO = createAccountByCookieInfo(info);
                 } else {
                     return Result.error(result.getCode(), result.getMessage());
                 }
             } else {
-                AccountDTO accountDTO = result.getData();
+                accountDTO = result.getData();
                 // 检测uu是否正确
                 if (null == accountDTO.getUu() || !info.getUserUU().equals(accountDTO.getUu())) {
                     accountDTO.setUu(info.getUserUU());
@@ -132,6 +140,23 @@ public class AuthController {
                     }
                 }
             }
+            // TODO
+            String appId = "trade-app";
+            // 登录日志
+            authorizeLogService.save(AuthorizeLog.from(request)
+                    .setAccountId(accountDTO.getId())
+                    .setAppId(appId).build());
+            // 将登录信息推送到客户端
+            if (!StringUtils.isEmpty(clientId)) {
+                Long companyId = null;
+                if (!CollectionUtils.isEmpty(accountDTO.getCompanies())) {
+                    companyId = accountDTO.getCompanies().get(0).getId();
+                }
+                JwtInfo jwtInfo = new JwtInfo(appId, companyId, accountDTO.getId(), accountDTO.getUsername(), accountDTO.getRealname());
+                JwtToken jwtToken = JwtHelper.generateToken(jwtInfo, privateKeyPath, expire);
+                TokenDTO tokenDTO = BeanMapper.map(jwtToken, TokenDTO.class);
+                socketMessageApi.sendToClient(clientId, JsonUtils.toJsonString(new AuthDTO(tokenDTO, accountDTO)));
+            }
             return Result.success();
         }
         return Result.error(ExceptionCode.COOKIE_ILLEGAL_ARGUMENT);

+ 1 - 0
base-servers/pom.xml

@@ -22,6 +22,7 @@
         <module>sms</module>
         <module>account</module>
         <module>ui-server</module>
+        <module>socket</module>
     </modules>
 
 </project>

+ 20 - 0
base-servers/socket/pom.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>base-servers</artifactId>
+        <groupId>com.usoftchina.saas</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>socket</artifactId>
+    <packaging>pom</packaging>
+    <description>web socket</description>
+    <modules>
+        <module>socket-server</module>
+        <module>socket-api</module>
+    </modules>
+
+</project>

+ 24 - 0
base-servers/socket/socket-api/pom.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>socket</artifactId>
+        <groupId>com.usoftchina.saas</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>socket-api</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 32 - 0
base-servers/socket/socket-api/src/main/java/com/usoftchina/saas/socket/api/SocketMessageApi.java

@@ -0,0 +1,32 @@
+package com.usoftchina.saas.socket.api;
+
+import com.usoftchina.saas.base.Result;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+
+/**
+ * @author yingp
+ * @date 2018/11/15
+ */
+@FeignClient(name = "socket-server")
+public interface SocketMessageApi {
+    /**
+     * 发送信息给指定用户
+     *
+     * @param clientId
+     * @param message
+     * @return
+     */
+    @PostMapping("/clients/{clientId}")
+    Result sendToClient(@PathVariable String clientId, String message);
+
+    /**
+     * 广播信息
+     *
+     * @param message
+     * @return
+     */
+    @PostMapping("/clients")
+    Result sendToAllClients(String message);
+}

+ 51 - 0
base-servers/socket/socket-server/pom.xml

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>socket</artifactId>
+        <groupId>com.usoftchina.saas</groupId>
+        <version>1.0.0-SNAPSHOT</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>socket-server</artifactId>
+    <description>web socket server</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>server-starter</artifactId>
+        </dependency>
+        <!-- sleuth -->
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-zipkin</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.amqp</groupId>
+            <artifactId>spring-rabbit</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>net.logstash.logback</groupId>
+            <artifactId>logstash-logback-encoder</artifactId>
+        </dependency>
+        <!-- socket -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
+    </dependencies>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>docker-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 6 - 0
base-servers/socket/socket-server/src/main/docker/Dockerfile

@@ -0,0 +1,6 @@
+FROM frolvlad/alpine-oraclejdk8:slim
+VOLUME /tmp
+ADD socket-server-1.0.0-SNAPSHOT.jar app.jar
+RUN sh -c 'touch /app.jar'
+ENV JAVA_OPTS=""
+ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

+ 40 - 0
base-servers/socket/socket-server/src/main/java/com/usoftchina/saas/socket/SocketApplication.java

@@ -0,0 +1,40 @@
+package com.usoftchina.saas.socket;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
+import org.springframework.messaging.simp.config.MessageBrokerRegistry;
+import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
+import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
+import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
+
+/**
+ * @author yingp
+ * @date 2018/11/15
+ */
+@SpringBootApplication
+@EnableEurekaClient
+@EnableWebSocketMessageBroker
+public class SocketApplication implements WebSocketMessageBrokerConfigurer {
+
+    public static void main(String[] args) {
+        SpringApplication.run(SocketApplication.class, args);
+    }
+
+    @Override
+    public void registerStompEndpoints(StompEndpointRegistry registry) {
+        registry.addEndpoint("/ws")
+                .setAllowedOrigins("*")
+                .withSockJS();
+    }
+
+    @Override
+    public void configureMessageBroker(MessageBrokerRegistry registry) {
+        // 此域上可以向客户端发消息
+        registry.enableSimpleBroker("/topic","/queue","/clients");
+        // 服务端往客户端发送
+        registry.setUserDestinationPrefix("/clients/");
+        // 客户端往服务端发送
+        registry.setApplicationDestinationPrefixes("/server");
+    }
+}

+ 43 - 0
base-servers/socket/socket-server/src/main/java/com/usoftchina/saas/socket/controller/MessageController.java

@@ -0,0 +1,43 @@
+package com.usoftchina.saas.socket.controller;
+
+import com.usoftchina.saas.base.Result;
+import org.springframework.messaging.simp.SimpMessagingTemplate;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * @author yingp
+ * @date 2018/11/15
+ */
+@RestController
+@RequestMapping("/message")
+public class MessageController {
+
+    @Resource
+    private SimpMessagingTemplate simpMessagingTemplate;
+
+    @PostMapping("/clients/{clientId}")
+    public Result sendToClient(@PathVariable String clientId, String message) {
+        /**
+         * 前端使用
+         * <pre>
+         *     stomp.subscribe('/clients/{clientId}/message', function(message){});
+         * </pre>
+         */
+        simpMessagingTemplate.convertAndSendToUser(clientId, "/message", message);
+        return Result.success();
+    }
+
+    @PostMapping("/clients")
+    public Result sendToAllClients(String message) {
+        /**
+         * 前端使用
+         * <pre>
+         *     stomp.subscribe('/clients/message', function(message){});
+         * </pre>
+         */
+        simpMessagingTemplate.convertAndSend("/message", message);
+        return Result.success();
+    }
+}

+ 65 - 0
base-servers/socket/socket-server/src/main/resources/application.yml

@@ -0,0 +1,65 @@
+spring:
+  profiles:
+    active: dev
+  application:
+    name: socket-server
+  security:
+    user:
+      name: admin
+      password: select111***
+  rabbitmq:
+    host: 192.168.0.176
+    port: 5672
+    virtual-host: dev
+    username: saas
+    password: select123***
+  zipkin:
+    sender:
+      type: rabbit
+    locator:
+      discovery:
+        enabled: true
+  sleuth:
+    sampler:
+      probability: 1.0
+  redis:
+    host: 192.168.253.12
+    port: 6379
+  jackson:
+    date-format: yyyy-MM-dd HH:mm:ss
+    time-zone: GMT+8
+eureka:
+  instance:
+    leaseRenewalIntervalInSeconds: 10
+    health-check-url-path: /actuator/health
+    status-page-url-path: /actuator/info
+    prefer-ip-address: true
+    metadata-map:
+      user.name: ${spring.security.user.name}
+      user.password: ${spring.security.user.password}
+  client:
+    registryFetchIntervalSeconds: 5
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.0.181:8510/eureka/
+server:
+  port: 8680
+  tomcat:
+    uri-encoding: UTF-8
+management:
+  endpoints:
+    web:
+      exposure:
+        include: "*"
+  endpoint:
+    health:
+      show-details: always
+    shutdown:
+      enabled: true
+    restart:
+      enabled: true
+info:
+  name: '@project.artifactId@'
+  description: '@project.description@'
+  version: '@project.version@'
+  spring-boot-version: '@spring.boot.version@'
+  spring-cloud-version: '@spring.cloud.version@'

+ 12 - 0
base-servers/socket/socket-server/src/main/resources/config/application-docker-dev.yml

@@ -0,0 +1,12 @@
+eureka:
+  instance:
+    hostname: saas-socket-server-dev
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server-dev:8510/eureka/
+spring:
+  rabbitmq:
+    virtual-host: dev
+server:
+  port: 8690

+ 10 - 0
base-servers/socket/socket-server/src/main/resources/config/application-docker.yml

@@ -0,0 +1,10 @@
+eureka:
+  instance:
+    hostname: saas-socket-server
+    prefer-ip-address: false
+  client:
+    serviceUrl:
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server:8500/eureka/
+spring:
+  rabbitmq:
+    virtual-host: docker

+ 113 - 0
base-servers/socket/socket-server/src/main/resources/logback-spring.xml

@@ -0,0 +1,113 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <include resource="org/springframework/boot/logging/logback/base.xml" />
+    <jmxConfigurator/>
+
+    <!--
+    %m
+    输出代码中指定的消息
+    %p
+    输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
+    %r
+    输出自应用启动到输出该log信息耗费的毫秒数
+    %c
+    输出所属的类目,通常就是所在类的全名
+    %t
+    输出产生该日志事件的线程名
+    %n
+    输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
+    %d
+    输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},
+    输出类似:2002年10月18日 22:10:28,921
+    %l
+    输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
+    -->
+
+    <springProperty scope="context" name="log.path" source="logging.path" defaultValue="/var/log/saas/socket-server"/>
+    <springProperty scope="context" name="spring.application.name" source="spring.application.name" defaultValue="socket-server"/>
+    <springProperty scope="context" name="spring.profiles.active" source="spring.profiles.active" defaultValue="dev"/>
+    <springProperty scope="context" name="common-pattern" source="logging.common-pattern" defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS}:[%5p] [%t:%r] [%C{1}:%M:%L] --> %m%n"/>
+    <springProperty scope="context" name="log.level.console" source="logging.level.console" defaultValue="INFO"/>
+    <springProperty scope="context" name="log.destination" source="logging.destination" defaultValue="192.168.253.3:5000"/>
+
+    <contextName>${spring.application.name}-${spring.profiles.active}-logback</contextName>
+
+    <appender name="CONSOLE_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>${log.level.console}</level>
+        </filter>
+        <encoder>
+            <pattern>${common-pattern}</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="ROOT_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/root.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
+            <fileNamePattern>${log.path}/%d{yyyy-MM}/root-%d{yyyy-MM-dd}-%i.log.gz</fileNamePattern>
+            <maxFileSize>128MB</maxFileSize>
+            <maxHistory>7</maxHistory>
+            <totalSizeCap>20GB</totalSizeCap>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${common-pattern}</pattern>
+        </encoder>
+    </appender>
+
+    <!-- Appender to log in a JSON format -->
+    <appender name="JSON_APPENDER" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+        <destination>${log.destination}</destination>
+        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
+            <providers>
+                <pattern>
+                    <pattern>
+                        {
+                        "severity": "%level",
+                        "service": "${spring.application.name:-}",
+                        "trace": "%X{X-B3-TraceId:-}",
+                        "span": "%X{X-B3-SpanId:-}",
+                        "parent": "%X{X-B3-ParentSpanId:-}",
+                        "exportable": "%X{X-Span-Export:-}",
+                        "pid": "${PID:-}",
+                        "thread": "%thread",
+                        "class": "%logger{40}",
+                        "rest": "%message"
+                        }
+                    </pattern>
+                </pattern>
+            </providers>
+        </encoder>
+    </appender>
+
+    <logger name="org.springframework" level="INFO"/>
+    <logger name="com.usoftchina.saas" level="INFO"/>
+
+    <springProfile name="dev">
+        <root level="INFO">
+            <appender-ref ref="CONSOLE_APPENDER"/>
+        </root>
+    </springProfile>
+
+    <springProfile name="test">
+        <root level="INFO">
+            <appender-ref ref="CONSOLE_APPENDER"/>
+            <appender-ref ref="ROOT_APPENDER"/>
+        </root>
+    </springProfile>
+
+    <springProfile name="docker">
+        <logger name="org.springframework" level="WARN"/>
+        <logger name="com.usoftchina.saas" level="WARN"/>
+        <root level="WARN">
+            <appender-ref ref="CONSOLE_APPENDER"/>
+            <appender-ref ref="JSON_APPENDER"/>
+        </root>
+    </springProfile>
+
+    <springProfile name="docker-dev">
+        <root level="INFO">
+            <appender-ref ref="CONSOLE_APPENDER"/>
+        </root>
+    </springProfile>
+
+</configuration>

+ 10 - 28
framework/core/src/main/java/com/usoftchina/saas/base/dto/CommonBaseDTO.java

@@ -9,28 +9,10 @@ import java.util.Date;
  */
 public abstract class CommonBaseDTO implements Serializable{
     protected Long id;
-
     protected Date createTime;
-    protected Long creatorId;
-    protected String creator;
-
+    protected String creatorName;
     protected Date updateTime;
-    protected Long updaterId;
-    protected String updater;
-
-    public String getCreator() {
-        return creator;
-    }
-
-    public void setCreator(String creator){
-        this.creator = creator;
-    }
-
-    public String getUpdater() { return updater; }
-
-    public void setUpdater(String updater){
-        this.updater = updater;
-    }
+    protected String updaterName;
 
     public Long getId() {
         return id;
@@ -48,12 +30,12 @@ public abstract class CommonBaseDTO implements Serializable{
         this.createTime = createTime;
     }
 
-    public Long getCreatorId() {
-        return creatorId;
+    public String getCreatorName() {
+        return creatorName;
     }
 
-    public void setCreatorId(Long creatorId) {
-        this.creatorId = creatorId;
+    public void setCreatorName(String creatorName) {
+        this.creatorName = creatorName;
     }
 
     public Date getUpdateTime() {
@@ -64,11 +46,11 @@ public abstract class CommonBaseDTO implements Serializable{
         this.updateTime = updateTime;
     }
 
-    public Long getUpdaterId() {
-        return updaterId;
+    public String getUpdaterName() {
+        return updaterName;
     }
 
-    public void setUpdaterId(Long updaterId) {
-        this.updaterId = updaterId;
+    public void setUpdaterName(String updaterName) {
+        this.updaterName = updaterName;
     }
 }

+ 0 - 27
framework/core/src/main/java/com/usoftchina/saas/base/entity/BaseEntity.java

@@ -64,31 +64,4 @@ public abstract class BaseEntity<E extends Serializable> implements Serializable
      * @param companyId
      */
     public abstract void setCompanyId(long companyId);
-
-    /**
-     * get 创建人
-     *
-     * @return
-     */
-    public abstract String getCreator();
-
-    /**
-     * set 创建人
-     *
-     * @param creator
-     */
-    public abstract  void setCreator(String creator);
-
-    /**
-     * get 创建人
-     *
-     * @return
-     */
-    public abstract String getUpdater();
-    /**
-     * set 创建人
-     *
-     * @param updater
-     */
-    public abstract  void setUpdater(String updater);
 }

+ 2 - 19
framework/core/src/main/java/com/usoftchina/saas/base/entity/CommonBaseEntity.java

@@ -12,15 +12,10 @@ public abstract class CommonBaseEntity extends BaseEntity<Long> {
      * company id
      */
     protected Long companyId;
-
-    protected Long creatorId;
-    protected String creator;
     protected Date createTime;
-
-    protected Long updaterId;
-    protected String updater;
+    protected Long creatorId;
     protected Date updateTime;
-
+    protected Long updaterId;
 
     @Override
     public Long getId() {
@@ -77,16 +72,4 @@ public abstract class CommonBaseEntity extends BaseEntity<Long> {
     public void setUpdaterId(long updaterId) {
         this.updaterId = updaterId;
     }
-
-    @Override
-    public String  getCreator(){return creator;};
-
-    @Override
-    public void setCreator(String creator){ this.creator = creator; };
-
-    @Override
-    public String getUpdater(){ return updater;};
-
-    @Override
-    public void setUpdater(String updater){ this.updater = updater; };
 }

+ 2 - 5
framework/core/src/main/java/com/usoftchina/saas/base/service/BaseServiceImpl.java

@@ -81,14 +81,12 @@ public abstract class BaseServiceImpl<ID extends Serializable, T extends BaseEnt
      *
      * @param record
      */
-    protected void setCreateInfo(T record) {
+    private void setCreateInfo(T record) {
         Date nowDate = new Date();
         record.setCreateTime(nowDate);
         record.setCreatorId(BaseContextHolder.getUserId());
-        record.setCreator(BaseContextHolder.getUserName());
         record.setUpdateTime(nowDate);
         record.setUpdaterId(BaseContextHolder.getUserId());
-        record.setUpdater(BaseContextHolder.getUserName());
     }
 
     /**
@@ -96,9 +94,8 @@ public abstract class BaseServiceImpl<ID extends Serializable, T extends BaseEnt
      *
      * @param record
      */
-    protected void setUpdateInfo(T record) {
+    private void setUpdateInfo(T record) {
         record.setUpdateTime(new Date());
         record.setUpdaterId(BaseContextHolder.getUserId());
-        record.setUpdater(BaseContextHolder.getUserName());
     }
 }

+ 16 - 0
frontend/saas-web/app/view/home/charts/MonthSale.js

@@ -32,6 +32,22 @@ Ext.define('saas.view.home.charts.MonthSale', {
                     '#53A8E2',
                     '#76DDFB',
                     '#DBECF8',
+                    '#426AB3',
+                    '#228FBD',
+                    '#2A5CAA',
+                    '#7BBFEA',
+                    '#2A8FBD',
+                    '#4C556E',
+                    '#9999FF',
+                    '#CCCCFF',
+                    '#06B9D1',
+                    '#005A78',
+                    '#00466B',
+                    '#005687',
+                    '#05173B',
+                    '#1A4FA3',
+                    '#1E90FF',
+                    '#B0E0E6'
                 ],
                 width: '100%',
                 innerPadding: 20,

+ 9 - 4
frontend/saas-web/app/view/home/charts/PurchaseTrend.js

@@ -28,10 +28,10 @@ Ext.define('saas.view.home.charts.PurchaseTrend', {
                     store: '{purchase_trend}',
                 },
                 axes: [{
-                    title: {
-                        text: '月',
-                        fontSize: 14,
-                    },
+                    // title: {
+                    //     text: '月',
+                    //     fontSize: 14,
+                    // },
                     type: 'category',
                     fields: ['x'],
                     position: 'bottom',
@@ -39,6 +39,7 @@ Ext.define('saas.view.home.charts.PurchaseTrend', {
                         fill: '#E7EBEF',
                         strokeStyle: 'transparent'
                     },
+                    renderer: me.categoryRender
                 },{
                     type: 'numeric',
                     fields: ['y'],
@@ -80,4 +81,8 @@ Ext.define('saas.view.home.charts.PurchaseTrend', {
         tooltip.setHtml(record.get('x') + ': ' + record.get('y') + '万元');
     },
 
+    categoryRender: function(axis, label, layoutContext, lastLabel) {
+        return label + '月';
+    }
+
 });

+ 9 - 4
frontend/saas-web/app/view/home/charts/SaleTrend.js

@@ -34,10 +34,10 @@ Ext.define('saas.view.home.charts.SaleTrend', {
 
                 // },
                 axes: [{
-                    title: {
-                        text: '月',
-                        fontSize: 14,
-                    },
+                    // title: {
+                    //     text: '月',
+                    //     fontSize: 14,
+                    // },
                     type: 'category',
                     fields: ['x'],
                     position: 'bottom',
@@ -45,6 +45,7 @@ Ext.define('saas.view.home.charts.SaleTrend', {
                         fill: '#E7EBEF',
                         strokeStyle: 'transparent'
                     },
+                    renderer: me.categoryRender
                 },{
                     type: 'numeric',
                     fields: ['sale', 'saleback'],
@@ -94,4 +95,8 @@ Ext.define('saas.view.home.charts.SaleTrend', {
         tooltip.setHtml(record.get('x') + title + record.get(item.series.getYField()) + '万元');
     },
 
+    categoryRender: function(axis, label, layoutContext, lastLabel) {
+        return label + '月';
+    }
+
 });

+ 9 - 4
frontend/saas-web/app/view/home/charts/StockAmount.js

@@ -28,10 +28,10 @@ Ext.define('saas.view.home.charts.StockAmount', {
                     store: '{stock_amount}',
                 },
                 axes: [{
-                    title: {
-                        text: '月',
-                        fontSize: 14,
-                    },
+                    // title: {
+                    //     text: '月',
+                    //     fontSize: 14,
+                    // },
                     type: 'category',
                     fields: ['x'],
                     position: 'bottom',
@@ -39,6 +39,7 @@ Ext.define('saas.view.home.charts.StockAmount', {
                         fill: '#E7EBEF',
                         strokeStyle: 'transparent'
                     },
+                    renderer: me.categoryRender
                 },{
                     type: 'numeric',
                     fields: ['y'],
@@ -80,4 +81,8 @@ Ext.define('saas.view.home.charts.StockAmount', {
         tooltip.setHtml(record.get('x') + ': ' + record.get('y') + '万元');
     },
 
+    categoryRender: function(axis, label, layoutContext, lastLabel) {
+        return label + '月';
+    }
+
 });

+ 5 - 0
pom.xml

@@ -304,6 +304,11 @@
                 <artifactId>test-starter</artifactId>
                 <version>${project.release.version}</version>
             </dependency>
+            <dependency>
+                <groupId>com.usoftchina.saas</groupId>
+                <artifactId>socket-api</artifactId>
+                <version>${project.release.version}</version>
+            </dependency>
             <!-- file upload -->
             <dependency>
                 <groupId>io.github.openfeign.form</groupId>