huanglizhi 1 жил өмнө
parent
commit
f71ddf8fb1
100 өөрчлөгдсөн 2716 нэмэгдсэн , 3451 устгасан
  1. 0 5
      framework/pom.xml
  2. 0 78
      framework/src/main/java/com/hys/app/framework/ErpAppRunner.java
  3. 0 22
      framework/src/main/java/com/hys/app/framework/FrameworkApplication.java
  4. 58 2
      framework/src/main/java/com/hys/app/framework/context/user/AdminUserContext.java
  5. 6 0
      framework/src/main/java/com/hys/app/framework/database/mybatisplus/DefaultDBFieldHandler.java
  6. 6 0
      framework/src/main/java/com/hys/app/framework/database/mybatisplus/base/BaseDO.java
  7. 6 39
      framework/src/main/java/com/hys/app/framework/security/model/Admin.java
  8. 0 74
      framework/src/main/java/com/hys/app/framework/xxljob/XxlJobConfig.java
  9. 33 0
      module-erp/pom.xml
  10. 12 21
      module-erp/src/main/java/com/hys/app/controller/erp/use/AdminUserOperationManagerController.java
  11. 60 0
      module-erp/src/main/java/com/hys/app/controller/erp/use/CompanyController.java
  12. 58 0
      module-erp/src/main/java/com/hys/app/controller/erp/use/CompanyPackageController.java
  13. 17 24
      module-erp/src/main/java/com/hys/app/controller/erp/use/GoodsManagerController.java
  14. 55 6
      module-erp/src/main/java/com/hys/app/controller/erp/use/PayController.java
  15. 76 0
      module-erp/src/main/java/com/hys/app/controller/erp/use/SmsMailController.java
  16. 2 2
      module-erp/src/main/java/com/hys/app/controller/system/AdminUserManagerController.java
  17. 24 0
      module-erp/src/main/java/com/hys/app/converter/erp/CompanyConverter.java
  18. 19 0
      module-erp/src/main/java/com/hys/app/converter/erp/CompanyPackageConverter.java
  19. 19 0
      module-erp/src/main/java/com/hys/app/converter/erp/MailSmsCompanyConverter.java
  20. 21 0
      module-erp/src/main/java/com/hys/app/converter/erp/SmsMailConverter.java
  21. 0 60
      module-erp/src/main/java/com/hys/app/job/CleanSystemJobHandler.java
  22. 5 4
      module-erp/src/main/java/com/hys/app/mapper/erp/CompanyMapper.java
  23. 5 4
      module-erp/src/main/java/com/hys/app/mapper/erp/CompanyPackageMapper.java
  24. 16 0
      module-erp/src/main/java/com/hys/app/mapper/erp/MailSmsCountMapper.java
  25. 5 4
      module-erp/src/main/java/com/hys/app/mapper/erp/SmsMailMapper.java
  26. 2 0
      module-erp/src/main/java/com/hys/app/mapper/erp/StockTransferMapper.java
  27. 2 0
      module-erp/src/main/java/com/hys/app/mapper/erp/WarehouseAreaMapper.java
  28. 2 3
      module-erp/src/main/java/com/hys/app/mapper/erp/WarehouseEntryMapper.java
  29. 2 0
      module-erp/src/main/java/com/hys/app/mapper/erp/WarehouseMapper.java
  30. 3 0
      module-erp/src/main/java/com/hys/app/mapper/erp/WarehouseOutMapper.java
  31. 2 0
      module-erp/src/main/java/com/hys/app/mapper/goods/GoodsMapper.java
  32. 25 11
      module-erp/src/main/java/com/hys/app/model/erp/dos/MailSmsCountDO.java
  33. 5 8
      module-erp/src/main/java/com/hys/app/model/erp/dos/ProductStockDO.java
  34. 85 0
      module-erp/src/main/java/com/hys/app/model/erp/dos/SmsMailTemplate.java
  35. 2 1
      module-erp/src/main/java/com/hys/app/model/erp/dos/StockDamageReport.java
  36. 2 1
      module-erp/src/main/java/com/hys/app/model/erp/dos/StockInventory.java
  37. 2 5
      module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseAreaDO.java
  38. 17 19
      module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseEntryTypeDO.java
  39. 2 0
      module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseOutDO.java
  40. 10 12
      module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseOutTypeDO.java
  41. 0 4
      module-erp/src/main/java/com/hys/app/model/erp/dto/GoodsDTO.java
  42. 4 3
      module-erp/src/main/java/com/hys/app/model/erp/dto/ProductStockQueryParams.java
  43. 54 0
      module-erp/src/main/java/com/hys/app/model/erp/dto/SmsMailTemplateDTO.java
  44. 8 10
      module-erp/src/main/java/com/hys/app/model/erp/dto/WarehouseEntryDTO.java
  45. 10 15
      module-erp/src/main/java/com/hys/app/model/erp/dto/WarehouseEntryProductDTO.java
  46. 3 11
      module-erp/src/main/java/com/hys/app/model/erp/dto/WarehouseOutDTO.java
  47. 106 0
      module-erp/src/main/java/com/hys/app/model/erp/entity/Company.java
  48. 136 0
      module-erp/src/main/java/com/hys/app/model/erp/entity/CompanyDO.java
  49. 40 0
      module-erp/src/main/java/com/hys/app/model/erp/entity/CompanyPackage.java
  50. 42 0
      module-erp/src/main/java/com/hys/app/model/erp/entity/CompanyPackageDO.java
  51. 10 0
      module-erp/src/main/java/com/hys/app/model/erp/entity/CompanyPackageVO.java
  52. 35 0
      module-erp/src/main/java/com/hys/app/model/erp/entity/CompanyQuery.java
  53. 41 0
      module-erp/src/main/java/com/hys/app/model/erp/entity/CompanyRenewDO.java
  54. 72 0
      module-erp/src/main/java/com/hys/app/model/erp/entity/CompanyUpdateDO.java
  55. 117 0
      module-erp/src/main/java/com/hys/app/model/erp/entity/CompanyVO.java
  56. 20 0
      module-erp/src/main/java/com/hys/app/model/erp/entity/MailSmsCountQuery.java
  57. 35 0
      module-erp/src/main/java/com/hys/app/model/erp/enums/MsgTypeEnum.java
  58. 16 0
      module-erp/src/main/java/com/hys/app/model/erp/vo/MailSmsCountVO.java
  59. 40 0
      module-erp/src/main/java/com/hys/app/model/erp/vo/SmsMailTemplateQuery.java
  60. 76 0
      module-erp/src/main/java/com/hys/app/model/erp/vo/SmsMailTemplateVO.java
  61. 4 172
      module-erp/src/main/java/com/hys/app/model/system/dos/AdminUser.java
  62. 6 85
      module-erp/src/main/java/com/hys/app/model/system/vo/AdminLoginVO.java
  63. 62 0
      module-erp/src/main/java/com/hys/app/service/erp/CompanyManager.java
  64. 13 0
      module-erp/src/main/java/com/hys/app/service/erp/CompanyPackageManager.java
  65. 1 1
      module-erp/src/main/java/com/hys/app/service/erp/GoodsManager.java
  66. 25 0
      module-erp/src/main/java/com/hys/app/service/erp/MailSmsCountManager.java
  67. 47 0
      module-erp/src/main/java/com/hys/app/service/erp/SmsMailManager.java
  68. 118 0
      module-erp/src/main/java/com/hys/app/service/erp/impl/CompanyManagerImpl.java
  69. 38 0
      module-erp/src/main/java/com/hys/app/service/erp/impl/CompanyPackageManagerImpl.java
  70. 40 50
      module-erp/src/main/java/com/hys/app/service/erp/impl/GoodsManagerImpl.java
  71. 74 0
      module-erp/src/main/java/com/hys/app/service/erp/impl/MailSmsCountManagerImpl.java
  72. 38 27
      module-erp/src/main/java/com/hys/app/service/erp/impl/ProductStockManagerImpl.java
  73. 133 0
      module-erp/src/main/java/com/hys/app/service/erp/impl/SmsMailManagerImpl.java
  74. 40 39
      module-erp/src/main/java/com/hys/app/service/erp/impl/StockDamageReportManagerImpl.java
  75. 39 37
      module-erp/src/main/java/com/hys/app/service/erp/impl/StockInventoryManagerImpl.java
  76. 136 139
      module-erp/src/main/java/com/hys/app/service/erp/impl/WarehouseEntryManagerImpl.java
  77. 3 1
      module-erp/src/main/java/com/hys/app/service/erp/impl/WarehouseManagerImpl.java
  78. 52 65
      module-erp/src/main/java/com/hys/app/service/erp/impl/WarehouseOutManagerImpl.java
  79. 8 1
      module-erp/src/main/java/com/hys/app/service/system/AdminUserManager.java
  80. 69 51
      module-erp/src/main/java/com/hys/app/service/system/impl/AdminUserManagerImpl.java
  81. 99 0
      module-erp/src/main/java/com/hys/app/util/AliSmsUtil.java
  82. 101 0
      module-erp/src/main/java/com/hys/app/util/MailSmtpUtil.java
  83. 13 1
      module-erp/src/main/java/com/hys/app/util/ValidateUtil.java
  84. 25 22
      module-erp/src/main/resources/mapper/ProductStockMapper.xml
  85. 0 37
      module-openapi/src/main/java/com/hys/app/job/MessagePushJobHandler.java
  86. 1 14
      server/src/main/resources/application-local.yml
  87. 0 29
      v3studio-erp-api/.gitignore
  88. 0 661
      v3studio-erp-api/LICENSE
  89. 0 125
      v3studio-erp-api/README.md
  90. 0 403
      v3studio-erp-api/deploy-docs/api部署.md
  91. 0 27
      v3studio-erp-api/deploy-docs/git部署公钥.md
  92. 0 74
      v3studio-erp-api/deploy-docs/ui部署.md
  93. 0 167
      v3studio-erp-api/deploy-docs/基础设施部署.md
  94. 0 469
      v3studio-erp-api/framework/pom.xml
  95. 0 78
      v3studio-erp-api/framework/src/main/java/com/hys/app/framework/ErpAppRunner.java
  96. 0 109
      v3studio-erp-api/framework/src/main/java/com/hys/app/framework/ErpConfig.java
  97. 0 22
      v3studio-erp-api/framework/src/main/java/com/hys/app/framework/FrameworkApplication.java
  98. 0 29
      v3studio-erp-api/framework/src/main/java/com/hys/app/framework/apptoken/AccessTokenCache.java
  99. 0 32
      v3studio-erp-api/framework/src/main/java/com/hys/app/framework/apptoken/AccessTokenGetter.java
  100. 0 36
      v3studio-erp-api/framework/src/main/java/com/hys/app/framework/apptoken/AccessTokenGetterFactory.java

+ 0 - 5
framework/pom.xml

@@ -335,11 +335,6 @@
 
 
         <!-- todo 以下是从erp-core拿过来的,暂时先放这里 -->
-<!--        <dependency>-->
-<!--            <groupId>com.xuxueli</groupId>-->
-<!--            <artifactId>xxl-job-core</artifactId>-->
-<!--            <version>2.0.1</version>-->
-<!--        </dependency>-->
 
         <dependency>
             <groupId>com.jcraft</groupId>

+ 0 - 78
framework/src/main/java/com/hys/app/framework/ErpAppRunner.java

@@ -1,78 +0,0 @@
-//package com.hys.app.framework;
-//
-//import com.hys.app.framework.context.instance.InstanceContext;
-//import com.hys.app.framework.context.user.UserContext;
-//import com.hys.app.framework.context.user.UserHolder;
-//import com.hys.app.framework.elasticsearch.EsIndexInit;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.boot.ApplicationArguments;
-//import org.springframework.boot.ApplicationRunner;
-//import org.springframework.core.annotation.Order;
-//import org.springframework.stereotype.Component;
-//
-///**
-// * 项目启动配置
-// *
-// * @author kingapex
-// * @version 1.0
-// * @since 7.1.0
-// * 2019-05-28
-// */
-//
-//@Component
-//@Order(value = 1)
-//public class ErpAppRunner implements ApplicationRunner {
-//
-//
-//    /**
-//     * 用户信息holder,认证信息的获取者
-//     */
-//    @Autowired
-//    private UserHolder userHolder;
-//
-//    @Autowired
-//    private UserHolder chainUserHolder;
-//
-//    @Autowired
-//    private ErpConfig erpConfig;
-//
-//    @Autowired
-//    protected InstanceContext instanceContext;
-//
-//    @Autowired
-//    protected EsIndexInit esIndexInit;
-//
-//    /**
-//     * 在项目加载时指定认证信息获取者
-//     * 默认是由spring 安全上下文中获取
-//     *
-//     * @param args
-//     * @throws Exception
-//     */
-//    @Override
-//    public void run(ApplicationArguments args) throws Exception {
-//        if (erpConfig.getTokenSecret() == null) {
-//            String errorMsg = "配置异常:未配置token秘钥,请检查如下:\n";
-//            errorMsg += "===========================\n";
-//            errorMsg += "   erp.token-secret\n";
-//            errorMsg += "===========================";
-//
-//            throw new Exception(errorMsg);
-//        }
-//
-//            UserContext.setChainHolder(chainUserHolder);
-//
-//            UserContext.setHolder(userHolder);
-//
-//
-//
-//        //注册本实例
-//        instanceContext.register();
-//
-//        //初始ES索引
-////        esIndexInit.initEs();
-//
-//    }
-//
-//
-//}

+ 0 - 22
framework/src/main/java/com/hys/app/framework/FrameworkApplication.java

@@ -1,22 +0,0 @@
-//package com.hys.app.framework;
-//
-//import org.springframework.boot.SpringApplication;
-//import org.springframework.boot.autoconfigure.SpringBootApplication;
-//import org.springframework.scheduling.annotation.EnableScheduling;
-//
-///**
-// * Created by kingapex on 2018/3/21.
-// *
-// * @author kingapex
-// * @version 1.0
-// * @since 7.0.0
-// * 2018/3/21
-// */
-//@SpringBootApplication
-//@EnableScheduling
-//public class FrameworkApplication {
-//    public static void main(String[] args) {
-//        SpringApplication.run(FrameworkApplication.class, args);
-//    }
-//
-//}

+ 58 - 2
framework/src/main/java/com/hys/app/framework/context/user/AdminUserContext.java

@@ -1,5 +1,7 @@
 package com.hys.app.framework.context.user;
 
+import cn.hutool.core.util.ObjectUtil;
+import com.hys.app.framework.exception.ServiceException;
 import com.hys.app.framework.security.model.Admin;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
@@ -43,7 +45,7 @@ public class AdminUserContext {
      */
     public static Long getAdminUserId() {
         Admin admin = getAdmin();
-        if(admin == null){
+        if (admin == null) {
             return null;
         }
         return admin.getUid();
@@ -56,11 +58,65 @@ public class AdminUserContext {
      */
     public static String getAdminUserName() {
         Admin admin = getAdmin();
-        if(admin == null){
+        if (admin == null) {
             return null;
         }
         return admin.getUsername();
     }
 
+    /**
+     * 获取当前管理员账号
+     *
+     * @return
+     */
+    public static Long getCompanyId() {
+        Admin admin = getAdmin();
+        if (admin == null) {
+            return null;
+        }
+        return admin.getCompanyId();
+    }
+
+    /**
+     * 获取当前管理员账号
+     *
+     * @return
+     */
+    public static Long hasCompany() {
+        Admin admin = getAdmin();
+        if (admin == null) {
+            throw new ServiceException("未查询到人员信息");
+        }
+        if (ObjectUtil.isNull(admin.getCompanyId())) {
+            throw new ServiceException("平台工作人员不允许操作公司内部业务");
+        }
+        return admin.getCompanyId();
+    }
+
+    /**
+     * 获取当前管理员账号
+     *
+     * @return
+     */
+    public static void compareCompany(Long companyId) {
+        if (ObjectUtil.isNull(getCompanyId())) {
+            throw new ServiceException("平台工作人员不允许操作公司内部业务");
+        }
+        if (!getCompanyId().equals(companyId)) {
+            throw new ServiceException("你无权操作此数据");
+        }
+    }
 
+    /**
+     * 获取当前管理员
+     *
+     * @return
+     */
+    public static Boolean hasFound() {
+        Admin admin = getAdmin();
+        if (admin != null && admin.getFounder() == 1) {
+            return true;
+        }
+        return false;
+    }
 }

+ 6 - 0
framework/src/main/java/com/hys/app/framework/database/mybatisplus/DefaultDBFieldHandler.java

@@ -29,6 +29,8 @@ public class DefaultDBFieldHandler implements MetaObjectHandler {
             }
 
             String adminUserName = AdminUserContext.getAdminUserName();
+            Long companyId = AdminUserContext.getCompanyId();
+
             // 当前登录用户不为空,创建人为空,则当前登录用户为创建人
             if (Objects.nonNull(adminUserName) && Objects.isNull(baseDO.getCreator())) {
                 baseDO.setCreator(adminUserName);
@@ -37,6 +39,10 @@ public class DefaultDBFieldHandler implements MetaObjectHandler {
             if (Objects.nonNull(adminUserName) && Objects.isNull(baseDO.getUpdater())) {
                 baseDO.setUpdater(adminUserName);
             }
+            // 当前登录用户不为空,更新人为空,则当前登录用户为更新人
+            if (Objects.nonNull(companyId) && Objects.isNull(baseDO.getCompanyId())) {
+                baseDO.setCompanyId(companyId);
+            }
         }
     }
 

+ 6 - 0
framework/src/main/java/com/hys/app/framework/database/mybatisplus/base/BaseDO.java

@@ -21,6 +21,12 @@ public abstract class BaseDO implements Serializable {
      */
     @TableField(fill = FieldFill.INSERT)
     private Long createTime;
+
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Long companyId;
     /**
      * 最后更新时间
      */

+ 6 - 39
framework/src/main/java/com/hys/app/framework/security/model/Admin.java

@@ -2,6 +2,7 @@ package com.hys.app.framework.security.model;
 
 import cn.hutool.core.map.MapUtil;
 import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
 
 import java.util.HashMap;
 import java.util.List;
@@ -15,9 +16,13 @@ import java.util.Map;
  * @date 18/6/27 上午10:09
  * @since v7.0
  */
-
+@Data
 public class Admin extends User {
 
+    /**
+     * 公司id
+     */
+    private Long companyId;
     /**
      * 是否是超级管理员
      */
@@ -56,42 +61,4 @@ public class Admin extends User {
         return MapUtil.get(context, key, type);
     }
 
-    public Admin() {
-    }
-
-
-    public Integer getFounder() {
-        return founder;
-    }
-
-    public void setFounder(Integer founder) {
-        this.founder = founder;
-    }
-
-    public String getPlatformShopName() {
-        return platformShopName;
-    }
-
-    public void setPlatformShopName(String platformShopName) {
-        this.platformShopName = platformShopName;
-    }
-
-    public Long getPlatformShopId() {
-        return platformShopId;
-    }
-
-    public void setPlatformShopId(Long platformShopId) {
-        this.platformShopId = platformShopId;
-    }
-
-    @Override
-    public String toString() {
-        return "Admin{" +
-                "founder=" + founder +
-                ", roles=" + roles +
-                ", platformShopName='" + platformShopName + '\'' +
-                ", platformShopId=" + platformShopId +
-                '}' + super.toString();
-
-    }
 }

+ 0 - 74
framework/src/main/java/com/hys/app/framework/xxljob/XxlJobConfig.java

@@ -1,74 +0,0 @@
-//package com.hys.app.framework.xxljob;
-//
-//import org.slf4j.Logger;
-//import org.slf4j.LoggerFactory;
-//import com.xxl.job.core.executor.XxlJobExecutor;
-//import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
-//import org.springframework.beans.factory.annotation.Value;
-//import org.springframework.context.annotation.Bean;
-//import org.springframework.context.annotation.Configuration;
-//
-///**
-// * xxl-job config
-// *
-// * @author xuxueli 2017-04-28
-// */
-//@Configuration
-//public class XxlJobConfig {
-//    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
-//
-//    @Value("${xxl.job.admin.addresses}")
-//    private String adminAddresses;
-//
-//    @Value("${xxl.job.executor.appname}")
-//    private String appName;
-//
-//    @Value("${xxl.job.executor.ip}")
-//    private String ip;
-//
-//    @Value("${xxl.job.executor.port}")
-//    private int port;
-//
-//    @Value("${xxl.job.accessToken}")
-//    private String accessToken;
-//
-//    @Value("${xxl.job.executor.logpath}")
-//    private String logPath;
-//
-//    @Value("${xxl.job.executor.logretentiondays}")
-//    private int logRetentionDays;
-//
-//
-//    @Bean(initMethod = "start", destroyMethod = "destroy")
-//    public XxlJobExecutor xxlJobExecutor() {
-//        try {
-//            logger.info(">>>>>>>>>>> xxl-job config init.");
-//            logger.info(this.toString());
-//            XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
-//            xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
-//            xxlJobSpringExecutor.setAppName(appName);
-//            xxlJobSpringExecutor.setIp(ip);
-//            xxlJobSpringExecutor.setPort(port);
-//            xxlJobSpringExecutor.setAccessToken(accessToken);
-//            xxlJobSpringExecutor.setLogPath(logPath);
-//            xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
-//            return xxlJobSpringExecutor;
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        }
-//        return null;
-//    }
-//
-//    @Override
-//    public String toString() {
-//        return "XxlJobConfig{" +
-//                "adminAddresses='" + adminAddresses + '\'' +
-//                ", appName='" + appName + '\'' +
-//                ", ip='" + ip + '\'' +
-//                ", port=" + port +
-//                ", accessToken='" + accessToken + '\'' +
-//                ", logPath='" + logPath + '\'' +
-//                ", logRetentionDays=" + logRetentionDays +
-//                '}';
-//    }
-//}

+ 33 - 0
module-erp/pom.xml

@@ -51,6 +51,39 @@
             <artifactId>wxpay-sdk</artifactId>
             <version> 0.0.3</version>
         </dependency>
+
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+            <version>2.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>alibabacloud-dm20151123</artifactId>
+            <version>1.0.16</version>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.mail</groupId>
+            <artifactId>javax.mail</artifactId>
+            <version>1.6.2</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.activation</groupId>
+            <artifactId>activation</artifactId>
+            <version>1.1.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.8.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dysmsapi20170525</artifactId>
+            <version>2.0.24</version>
+        </dependency>
     </dependencies>
 
 

+ 12 - 21
module-erp/src/main/java/com/hys/app/controller/system/AdminUserOperationManagerController.java → module-erp/src/main/java/com/hys/app/controller/erp/use/AdminUserOperationManagerController.java

@@ -1,6 +1,8 @@
-package com.hys.app.controller.system;
+package com.hys.app.controller.erp.use;
 
+import com.hys.app.framework.context.user.AdminUserContext;
 import com.hys.app.framework.database.WebPage;
+import com.hys.app.framework.exception.ServiceException;
 import com.hys.app.model.support.LogClient;
 import com.hys.app.model.support.validator.annotation.Log;
 import com.hys.app.model.system.dos.AdminUser;
@@ -41,12 +43,6 @@ public class AdminUserOperationManagerController {
 
 
     @ApiOperation(value = "查询平台管理员列表", response = AdminUser.class)
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "page_no", value = "页码", required = true, dataType = "int", paramType = "query"),
-            @ApiImplicitParam(name = "page_size", value = "每页显示数量", required = true, dataType = "int", paramType = "query"),
-            @ApiImplicitParam(name = "keyword", value = "关键字", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "user_state", value = "是否删除,0为正常,-1为删除状态", dataType = "String", paramType = "query"),
-    })
     @GetMapping
     public WebPage list(@ApiIgnore Long pageNo, @ApiIgnore Long pageSize, @ApiIgnore String keyword, @ApiIgnore Integer userState) {
         return this.adminUserManager.list(pageNo, pageSize, keyword, userState);
@@ -57,14 +53,14 @@ public class AdminUserOperationManagerController {
     @PostMapping
     @Log(client = LogClient.admin, detail = "添加用户编号为[${adminUserVO.sn}]的管理员")
     public AdminUser add(@Valid AdminUserVO adminUserVO) {
+        if (AdminUserContext.hasFound()) {
+            throw new ServiceException("平台工作人员不允许创建账号");
+        }
         return this.adminUserManager.add(adminUserVO);
     }
 
     @PutMapping(value = "/{id}")
     @ApiOperation(value = "修改平台管理员", response = AdminUser.class)
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "id", value = "主键", required = true, dataType = "int", paramType = "path")
-    })
     @Log(client = LogClient.admin, detail = "修改ID为[${id}]的管理员信息")
     public AdminUser edit(@Valid AdminUserVO adminUserVO, @PathVariable Long id) {
         return this.adminUserManager.edit(adminUserVO, id);
@@ -73,9 +69,6 @@ public class AdminUserOperationManagerController {
 
     @DeleteMapping(value = "/{id}")
     @ApiOperation(value = "删除平台管理员")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "id", value = "要删除的平台管理员主键", required = true, dataType = "int", paramType = "path")
-    })
     @Log(client = LogClient.admin, detail = "删除ID为[${id}]的管理员信息")
     public String delete(@PathVariable Long id) {
         this.adminUserManager.delete(id);
@@ -84,9 +77,6 @@ public class AdminUserOperationManagerController {
 
     @PutMapping(value = "/{id}/recover")
     @ApiOperation(value = "恢复平台管理员")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "id", value = "平台管理员主键", required = true, dataType = "int", paramType = "path")
-    })
     @Log(client = LogClient.admin, detail = "恢复ID为[${id}]的管理员信息")
     public void recover(@PathVariable Long id) {
         this.adminUserManager.recover(id);
@@ -95,13 +85,8 @@ public class AdminUserOperationManagerController {
 
     @GetMapping(value = "/{id}")
     @ApiOperation(value = "查询一个平台管理员")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "id", value = "要查询的平台管理员主键", required = true, dataType = "int", paramType = "path")
-    })
     public AdminUser get(@PathVariable Long id) {
-
         AdminUser adminUser = this.adminUserManager.getModel(id);
-
         return adminUser;
     }
 
@@ -111,4 +96,10 @@ public class AdminUserOperationManagerController {
     public List<AdminUser> getUserByDept() {
         return this.adminUserManager.getUserByDept();
     }
+
+    @GetMapping(value = "/getUserByCompany")
+    @ApiOperation(value = "查询公司下所有的人员")
+    public List<AdminUser> getUserByCompany() {
+        return this.adminUserManager.getUserByCompany();
+    }
 }

+ 60 - 0
module-erp/src/main/java/com/hys/app/controller/erp/use/CompanyController.java

@@ -0,0 +1,60 @@
+package com.hys.app.controller.erp.use;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.hys.app.model.erp.entity.*;
+import com.hys.app.model.support.LogClient;
+import com.hys.app.model.support.validator.annotation.Log;
+import com.hys.app.service.erp.CompanyManager;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.math.BigDecimal;
+
+@Api(tags = "公司")
+@RestController
+@RequestMapping("/admin/erp/company")
+@AllArgsConstructor
+public class CompanyController {
+
+    private CompanyManager companyManager;
+    @PostMapping("createCompany")
+    @ApiOperation(value = "创建公司")
+    @Log(client = LogClient.admin, detail = "创建名称为[${companyDO.name}]的公司信息")
+    public Long createCompany(@Valid @RequestBody CompanyDO companyDO) {
+        return companyManager.createCompany(companyDO);
+    }
+
+    @PostMapping("updateCompany/{id}")
+    @ApiOperation(value = "更新公司")
+    @Log(client = LogClient.admin, detail = "修改名称为[${companyDO.name}]的公司信息")
+    public Long updateCompany(@Valid @RequestBody CompanyUpdateDO companyUpdateDO, @PathVariable Long id) {
+        return companyManager.updateCompany(companyUpdateDO, id);
+    }
+    @PostMapping("renewCompany/difference/{id}")
+    @ApiOperation(value = "公司续费未到期更换套餐")
+    @Log(client = LogClient.admin, detail = "名称为[${companyDO.name}]的公司进行了续费")
+    public BigDecimal renewCompanyDifference(@PathVariable Long id) {
+        return companyManager.renewCompanyDifference(id);
+    }
+
+    @PostMapping("renewCompany/{id}")
+    @ApiOperation(value = "公司续费")
+    @Log(client = LogClient.admin, detail = "名称为[${companyDO.name}]的公司进行了续费")
+    public Long renewCompany(@Valid @RequestBody CompanyRenewDO companyUpdateDO, @PathVariable Long id) {
+        return companyManager.renewCompany(companyUpdateDO, id);
+    }
+
+    @GetMapping("getOne/{id}")
+    @ApiOperation(value = "获取公司详情")
+    public CompanyVO getOneCompany(@PathVariable Long id) {
+        return companyManager.getOneCompany(id);
+    }
+    @GetMapping("getPage")
+    @ApiOperation(value = "分页")
+    public IPage<CompanyVO> getPage(CompanyQuery query) {
+        return companyManager.getPage(query);
+    }
+}

+ 58 - 0
module-erp/src/main/java/com/hys/app/controller/erp/use/CompanyPackageController.java

@@ -0,0 +1,58 @@
+package com.hys.app.controller.erp.use;
+
+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.hys.app.converter.erp.CompanyPackageConverter;
+import com.hys.app.framework.database.BaseQueryParam;
+import com.hys.app.model.erp.entity.*;
+import com.hys.app.model.support.LogClient;
+import com.hys.app.model.support.validator.annotation.Log;
+import com.hys.app.service.erp.CompanyPackageManager;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+@Api(tags = "套餐")
+@RestController
+@RequestMapping("/admin/erp/companyPackage")
+@AllArgsConstructor
+public class CompanyPackageController {
+
+    private CompanyPackageManager companyPackageManager;
+
+    @PostMapping("createCompanyPackage")
+    @ApiOperation(value = "创建套餐")
+    @Log(client = LogClient.admin, detail = "创建名称为[${companyDO.name}]的公司信息")
+    public Long createCompany(@Valid @RequestBody CompanyPackageDO packageDo) {
+        return companyPackageManager.createCompanyPackage(packageDo);
+    }
+
+    @PostMapping("disAbleUse/{id}")
+    @ApiOperation(value = "套餐启用禁用")
+    @Log(client = LogClient.admin, detail = "修改id为[${id}]套餐的状态")
+    public void disAbleUse(@PathVariable Long id) {
+        CompanyPackage byId = companyPackageManager.getById(id);
+        byId.setUseAble(!byId.getUseAble());
+        companyPackageManager.updateById(byId);
+    }
+
+    @GetMapping("{id}")
+    @ApiOperation(value = "获取套餐详情")
+    public CompanyPackageVO getPackage(@PathVariable Long id) {
+        return CompanyPackageConverter.INSTANCE.convert(companyPackageManager.getById(id));
+    }
+
+    @GetMapping()
+    @ApiOperation(value = "获取套餐列表")
+    public IPage<CompanyPackageVO> getPackageList(CompanyPackageDO packageDO, BaseQueryParam queryParam) {
+        return CompanyPackageConverter.INSTANCE.convert(companyPackageManager.page(new Page<>(queryParam.getPageNo(), queryParam.getPageSize()),
+                new LambdaQueryWrapper<CompanyPackage>().eq(ObjectUtil.isNotNull(packageDO.getUseAble()), CompanyPackage::getUseAble, packageDO.getUseAble())
+                        .like(StrUtil.isNotBlank(packageDO.getName()), CompanyPackage::getName, packageDO.getName())));
+    }
+}

+ 17 - 24
module-erp/src/main/java/com/hys/app/controller/erp/use/GoodsManagerController.java

@@ -1,9 +1,12 @@
 package com.hys.app.controller.erp.use;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hys.app.framework.context.user.AdminUserContext;
 import com.hys.app.framework.database.BaseQueryParam;
 import com.hys.app.framework.database.WebPage;
+import com.hys.app.mapper.goods.GoodsMapper;
 import com.hys.app.model.erp.dos.GoodsDO;
+import com.hys.app.model.erp.dos.WarehouseOutDO;
 import com.hys.app.model.erp.dto.GoodsDTO;
 import com.hys.app.model.erp.dto.GoodsQueryParams;
 import com.hys.app.model.erp.dto.GoodsSortDto;
@@ -14,6 +17,7 @@ import com.hys.app.model.erp.vo.ProductVO;
 import com.hys.app.model.support.LogClient;
 import com.hys.app.model.support.validator.annotation.Log;
 import com.hys.app.service.erp.GoodsManager;
+import com.hys.app.util.ValidateUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -37,6 +41,8 @@ public class GoodsManagerController {
 
     @Autowired
     private GoodsManager goodsManager;
+    @Autowired
+    private GoodsMapper goodsMapper;
 
     @ApiOperation(value = "分页列表")
     @GetMapping
@@ -46,40 +52,29 @@ public class GoodsManagerController {
 
     @ApiOperation(value = "添加")
     @PostMapping
-    @Log(client = LogClient.admin, detail = "新增商品")
+    @Log(client = LogClient.admin, detail = "新增名称为[${goodsDTO.name}]的商品")
     public void add(@RequestBody @Valid GoodsDTO goodsDTO) {
+        AdminUserContext.hasCompany();
         goodsManager.add(goodsDTO);
     }
 
     @ApiOperation(value = "更新上下架")
     @PostMapping("/update")
-    @Log(client = LogClient.admin, detail = "修改id为[${id}]的商品")
+    @Log(client = LogClient.admin, detail = "修改名称为[${goodsDTO.name}]的商品上下架状态")
     public void status(@RequestBody @Valid GoodsUpdateDTO request) {
-        GoodsDO goodsDO = goodsManager.getById(request.getId());
-        goodsDO.setMarketEnable(!goodsDO.getMarketEnable());
+        AdminUserContext.hasCompany();
+        GoodsDO goodsDO = ValidateUtil.getOne(goodsMapper, GoodsDO::getId, request.getId(), "商品");
+        AdminUserContext.compareCompany(goodsDO.getCompanyId());
+        goodsDO.setMarketEnable(!request.getMarketEnable());
         goodsManager.updateById(goodsDO);
     }
 
-    @ApiOperation(value = "更新商品排序")
-    @PostMapping("/sort")
-    @Log(client = LogClient.admin, detail = "更新商品排序")
-    public void sort(@RequestBody @Valid GoodsSortDto request) {
-        goodsManager.updateSort(request);
-    }
-
-    @ApiOperation(value = "更新上下架之前校验库存")
-    @PostMapping("/update/check")
-    @Log(client = LogClient.admin, detail = "修改id为[${id}]的商品")
-    public Boolean updateCheck(@RequestBody @Valid GoodsUpdateDTO request) {
-        return goodsManager.updateCheck(request.getId());
-    }
-
     @ApiOperation(value = "修改")
     @PutMapping("/{id}")
-    @Log(client = LogClient.admin, detail = "修改id为[${id}]的商品")
+    @Log(client = LogClient.admin, detail = "新增名称为[${goodsDTO.name}]的商品")
     public void edit(@PathVariable Long id, @RequestBody @Valid GoodsDTO goodsDTO) {
-        goodsDTO.setId(id);
-        goodsManager.edit(goodsDTO);
+        AdminUserContext.hasCompany();
+        goodsManager.edit(goodsDTO,id);
     }
 
     @ApiOperation(value = "查询")
@@ -92,6 +87,7 @@ public class GoodsManagerController {
     @DeleteMapping("/{id}")
     @Log(client = LogClient.admin, detail = "删除id为[${id}]的商品")
     public void delete(@PathVariable Long id) {
+        AdminUserContext.hasCompany();
         goodsManager.delete(id);
     }
 
@@ -102,8 +98,5 @@ public class GoodsManagerController {
     public Page<ProductStockVO> getSkuByWarehouse(@PathVariable Long wareHouseId, BaseQueryParam queryParam) {
         return goodsManager.getSkuByWarehouse( wareHouseId, queryParam);
     }
-
-
-
 }
 

+ 55 - 6
module-erp/src/main/java/com/hys/app/controller/erp/use/PayController.java

@@ -10,14 +10,20 @@ import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
 import com.hys.app.framework.exception.ServiceException;
+import com.hys.app.framework.util.DateUtil;
 import com.hys.app.framework.util.JsonUtil;
 import com.hys.app.framework.util.ScriptUtil;
+import com.hys.app.framework.util.StringUtil;
+import com.hys.app.mapper.system.AdminUserMapper;
 import com.hys.app.model.erp.dos.OrderCustomerFee;
 import com.hys.app.model.erp.dos.OrderDO;
 import com.hys.app.model.erp.dto.PayTypeUrl;
+import com.hys.app.model.erp.entity.Company;
+import com.hys.app.model.system.dos.AdminUser;
 import com.hys.app.pay.ali.AliPayService;
 import com.hys.app.pay.ali.PayOrder;
 import com.hys.app.pay.wx.WxPayServiceMy;
+import com.hys.app.service.erp.CompanyManager;
 import com.hys.app.service.erp.OrderCustomerFeeManager;
 import com.hys.app.service.erp.OrderManager;
 import io.swagger.annotations.Api;
@@ -25,6 +31,7 @@ import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -34,13 +41,11 @@ import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 import java.io.UnsupportedEncodingException;
 import java.math.BigDecimal;
+import java.net.URLDecoder;
 import java.net.URLEncoder;
 import java.net.UnknownHostException;
 import java.time.LocalDateTime;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @RestController
 @RequestMapping("/admin/erp/pay")
@@ -52,6 +57,8 @@ public class PayController extends HttpServlet {
     private AliPayService aliPayService;
     private WxPayServiceMy wxPayServiceMy;
     private OrderCustomerFeeManager orderCustomerFeeManager;
+    private CompanyManager companyManager;
+    private AdminUserMapper adminUserMapper;
 
     private static final Logger log = LoggerFactory.getLogger(ScriptUtil.class);
 
@@ -160,8 +167,50 @@ public class PayController extends HttpServlet {
         }
         String url = ip + "#/payType?id=" + aDo.getId() + "&sn=" + aDo.getSn() + "&price=" + price + "&openid=" + openId;
         response.sendRedirect(url);
+    }
 
-
-
+    @PostMapping("/aliReturnCall/createCompany")
+    @Transactional(rollbackFor = Exception.class)
+    public String aliReturnCallCreateCompany(HttpServletRequest request) throws Exception {
+        Map<String, String> params = new HashMap<>();
+        Map<String, String[]> requestParams = request.getParameterMap();
+        for (String name : requestParams.keySet()) {
+            String[] values = requestParams.get(name);
+            String valueStr = String.join(",", values);
+            params.put(name, valueStr);
+        }
+        if (aliPayService.checkReturnParam(params)) {
+            String passbackParams = URLDecoder.decode(params.get("passback_params"), "UTF-8");
+            if ("company".equals(passbackParams)){
+                Company company = companyManager.getById(params.get("out_trade_no"));
+                company.setEndUseTime(company.getEndUseTime().plusDays(company.getThisDay()));
+                company.setThisDay(null);
+                company.setThisMoney(null);
+                companyManager.updateById(company);
+                //给公司创建初始账号
+                String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+                StringBuilder sb = new StringBuilder();
+                Random random = new Random();
+                for (int i = 0; i < 6; i++) {
+                    int index = random.nextInt(characters.length());
+                    sb.append(characters.charAt(index));
+                }
+                String password = sb.toString();
+
+                //管理员信息入库
+                AdminUser adminUser = new AdminUser();
+                adminUser.setCompanyId(company.getId());
+                adminUser.setUsername("admin");
+                adminUser.setRoleId(company.getRoleId());
+                adminUser.setFounder(0);
+                adminUser.setNickname(company.getName()+"管理员");
+                adminUser.setPassword(StringUtil.md5(password + adminUser.getUsername().toLowerCase()));
+                adminUser.setDateLine(DateUtil.getDateline());
+                adminUser.setUserState(0);
+                adminUserMapper.insert(adminUser);
+                //todo  用短信和邮件把账号密码发给用户
+            }
+        }
+        return "success";
     }
 }

+ 76 - 0
module-erp/src/main/java/com/hys/app/controller/erp/use/SmsMailController.java

@@ -0,0 +1,76 @@
+package com.hys.app.controller.erp.use;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.hys.app.converter.erp.SmsMailConverter;
+import com.hys.app.model.erp.dos.SmsMailTemplate;
+import com.hys.app.model.erp.dto.SmsMailTemplateDTO;
+import com.hys.app.model.erp.entity.MailSmsCountQuery;
+import com.hys.app.model.erp.vo.MailSmsCountVO;
+import com.hys.app.model.erp.vo.SmsMailTemplateQuery;
+import com.hys.app.model.erp.vo.SmsMailTemplateVO;
+import com.hys.app.model.support.LogClient;
+import com.hys.app.model.support.validator.annotation.Log;
+
+import com.hys.app.service.erp.MailSmsCountManager;
+import com.hys.app.service.erp.SmsMailManager;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+@Api(tags = "公司")
+@RestController
+@RequestMapping("/admin/erp/SmsMailTemplate")
+@AllArgsConstructor
+public class SmsMailController {
+
+    private SmsMailManager smsMailManager;
+    private MailSmsCountManager mailSmsCountManager;
+
+    @PostMapping("createTemplate")
+    @ApiOperation(value = "创建模板")
+    @Log(client = LogClient.admin, detail = "创建名称为[${smsMailTemplateDTO.name}]的模板")
+    public Long createTemplate(@Valid @RequestBody SmsMailTemplateDTO smsMailTemplateDTO) {
+        return smsMailManager.createTemplate(smsMailTemplateDTO);
+    }
+
+    @PostMapping("updateTemplate/{id}")
+    @ApiOperation(value = "修改模板")
+    @Log(client = LogClient.admin, detail = "修改名称为[${companyDO.name}]的公司信息")
+    public Long updateTemplate(@Valid @RequestBody SmsMailTemplateDTO smsMailTemplateDTO, @PathVariable Long id) {
+        return smsMailManager.updateTemplate(smsMailTemplateDTO, id);
+    }
+
+    @GetMapping("getById/{id}")
+    @ApiOperation(value = "获取模板信息")
+    public SmsMailTemplateVO renewCompanyDifference(@PathVariable Long id) {
+        return SmsMailConverter.INSTANCE.convert(smsMailManager.getById(id));
+    }
+
+    @GetMapping()
+    @ApiOperation(value = "模板分页")
+    public IPage<SmsMailTemplateVO> queryTemplate(SmsMailTemplateQuery query) {
+        return smsMailManager.queryTemplate(query);
+    }
+
+    @PostMapping("delete/{id}")
+    @ApiOperation(value = "删除模板")
+    public void delete(@PathVariable Long id) {
+        smsMailManager.delete(id);
+    }
+
+    @PostMapping("alterStatus/{id}")
+    @ApiOperation(value = "修改模板状态")
+    public void alterStatus(@PathVariable Long id) {
+        SmsMailTemplate byId = smsMailManager.getById(id);
+        byId.setEnableStatus(!byId.getEnableStatus());
+        smsMailManager.updateById(byId);
+    }
+    @GetMapping("getSendNumByCompany")
+    @ApiOperation(value = "获取各公司")
+    public IPage<MailSmsCountVO> getSendNumByCompany(MailSmsCountQuery query) {
+        return mailSmsCountManager.getPage(query);
+    }
+}

+ 2 - 2
module-erp/src/main/java/com/hys/app/controller/system/AdminUserManagerController.java

@@ -51,11 +51,11 @@ public class AdminUserManagerController {
             @ApiImplicitParam(name = "username", value = "用户名", required = true, dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "password", value = "密码", required = true, dataType = "String", paramType = "query")
     })
-    public AdminLoginVO login(@NotEmpty(message = "用户名不能为空") String username, @NotEmpty(message = "密码不能为空") String password) {
+    public AdminLoginVO login(@NotEmpty(message = "用户名不能为空") String username, @NotEmpty(message = "密码不能为空") String password,String companyName) {
         //验证登录参数是否正确
         this.validatorManager.validate();
 
-        return adminUserManager.login(username, password);
+        return adminUserManager.login(username, password,companyName);
     }
 
     @ApiOperation(value = "刷新token")

+ 24 - 0
module-erp/src/main/java/com/hys/app/converter/erp/CompanyConverter.java

@@ -0,0 +1,24 @@
+package com.hys.app.converter.erp;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hys.app.model.erp.entity.Company;
+import com.hys.app.model.erp.entity.CompanyDO;
+import com.hys.app.model.erp.entity.CompanyUpdateDO;
+import com.hys.app.model.erp.entity.CompanyVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+import org.mapstruct.MappingTarget;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
+public interface CompanyConverter {
+    CompanyConverter INSTANCE = Mappers.getMapper(CompanyConverter.class);
+
+    Company convert(CompanyDO bean);
+
+    void convert(@MappingTarget Company company , CompanyUpdateDO updateDO);
+
+    CompanyVO convert(Company bean);
+
+    Page<CompanyVO> convert(Page<Company> bean);
+}

+ 19 - 0
module-erp/src/main/java/com/hys/app/converter/erp/CompanyPackageConverter.java

@@ -0,0 +1,19 @@
+package com.hys.app.converter.erp;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hys.app.model.erp.entity.CompanyPackage;
+import com.hys.app.model.erp.entity.CompanyPackageDO;
+import com.hys.app.model.erp.entity.CompanyPackageVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
+public interface CompanyPackageConverter {
+    CompanyPackageConverter INSTANCE = Mappers.getMapper(CompanyPackageConverter.class);
+
+    CompanyPackage convert(CompanyPackageDO bean);
+    CompanyPackageVO convert(CompanyPackage bean);
+    Page<CompanyPackageVO> convert(Page<CompanyPackage> bean);
+
+}

+ 19 - 0
module-erp/src/main/java/com/hys/app/converter/erp/MailSmsCompanyConverter.java

@@ -0,0 +1,19 @@
+package com.hys.app.converter.erp;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hys.app.model.erp.dos.MailSmsCountDO;
+import com.hys.app.model.erp.vo.MailSmsCountVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
+public interface MailSmsCompanyConverter {
+    MailSmsCompanyConverter INSTANCE = Mappers.getMapper(MailSmsCompanyConverter.class);
+
+    MailSmsCountVO convert(MailSmsCountDO bean);
+
+
+    Page<MailSmsCountVO> convert(Page<MailSmsCountDO> page);
+
+}

+ 21 - 0
module-erp/src/main/java/com/hys/app/converter/erp/SmsMailConverter.java

@@ -0,0 +1,21 @@
+package com.hys.app.converter.erp;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import com.hys.app.model.erp.dos.SmsMailTemplate;
+import com.hys.app.model.erp.dto.SmsMailTemplateDTO;
+import com.hys.app.model.erp.vo.SmsMailTemplateVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingConstants;
+import org.mapstruct.factory.Mappers;
+
+@Mapper(componentModel = MappingConstants.ComponentModel.SPRING)
+public interface SmsMailConverter {
+    SmsMailConverter INSTANCE = Mappers.getMapper(SmsMailConverter.class);
+
+    SmsMailTemplate convert(SmsMailTemplateDTO dto);
+
+    SmsMailTemplateVO convert(SmsMailTemplate dto);
+   Page<SmsMailTemplateVO> convert(Page<SmsMailTemplate> dto);
+
+}

+ 0 - 60
module-erp/src/main/java/com/hys/app/job/CleanSystemJobHandler.java

@@ -1,60 +0,0 @@
-//package com.hys.app.job;
-//
-//import com.hys.app.framework.util.DateUtil;
-//import com.hys.app.framework.util.JsonUtil;
-//import com.hys.app.model.base.SettingGroup;
-//import com.hys.app.model.system.vo.SiteSetting;
-//import com.hys.app.service.base.service.SettingManager;
-//import com.hys.app.service.system.SystemLogsManager;
-//import com.xxl.job.core.biz.model.ReturnT;
-//import com.xxl.job.core.handler.IJobHandler;
-//import com.xxl.job.core.handler.annotation.JobHandler;
-//import org.slf4j.Logger;
-//import org.slf4j.LoggerFactory;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.stereotype.Component;
-//
-///**
-// * 清理系统日志定时任务
-// *
-// * @author chopper
-// * @version v1.0
-// * @since v7.0
-// * 2018-07-06 上午4:24
-// */
-//@JobHandler(value = "cleanSystemJobHandler")
-//@Component
-//public class CleanSystemJobHandler extends IJobHandler {
-//
-//    private final Logger logger = LoggerFactory.getLogger(getClass());
-//
-//    @Autowired
-//    private SettingManager settingManager;
-//
-//    @Autowired
-//    private SystemLogsManager systemLogsManager;
-//
-//    @Override
-//    public ReturnT<String> execute(String param) throws Exception {
-//
-//        try {
-//            //获取站点信息
-//            String siteSettingJson = settingManager.get(SettingGroup.SITE);
-//            SiteSetting siteSetting = JsonUtil.jsonToObject(siteSettingJson, SiteSetting.class);
-//            //如果设置中的月份信息不为空,需要删除几个月之前的日志信息
-//            if (siteSetting.getMonthNum() != null) {
-//                //获取当前时间
-//                Long nowTime = DateUtil.getDateline();
-//                //获取几个月之前的时间
-//                Long time = nowTime - (30 * 24 * 60 * 60 * siteSetting.getMonthNum());
-//                //删除小于这个时间的日志信息
-//                this.systemLogsManager.deleteByTime(time);
-//            }
-//            return ReturnT.SUCCESS;
-//        } catch (Exception e) {
-//            logger.error("清理系统日志定时任务出错", e);
-//            return ReturnT.FAIL;
-//        }
-//
-//    }
-//}

+ 5 - 4
v3studio-erp-api/module-erp/src/main/java/com/hys/app/mapper/goods/SpecValuesMapper.java → module-erp/src/main/java/com/hys/app/mapper/erp/CompanyMapper.java

@@ -1,17 +1,18 @@
-package com.hys.app.mapper.goods;
+package com.hys.app.mapper.erp;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.hys.app.framework.cache.MybatisRedisCache;
-import com.hys.app.model.goods.dos.SpecValuesDO;
+import com.hys.app.model.erp.entity.Company;
 import org.apache.ibatis.annotations.CacheNamespace;
 
+
 /**
- * SpecValues的Mapper
+ * 品牌BrandDO的Mapper
  * @author fk
  * @version 1.0
  * @since 7.1.0
  * 2020/7/21
  */
 @CacheNamespace(implementation= MybatisRedisCache.class,eviction=MybatisRedisCache.class)
-public interface SpecValuesMapper extends BaseMapper<SpecValuesDO> {
+public interface CompanyMapper extends BaseMapper<Company> {
 }

+ 5 - 4
v3studio-erp-api/module-erp/src/main/java/com/hys/app/mapper/goods/GoodsGalleryMapper.java → module-erp/src/main/java/com/hys/app/mapper/erp/CompanyPackageMapper.java

@@ -1,17 +1,18 @@
-package com.hys.app.mapper.goods;
+package com.hys.app.mapper.erp;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.hys.app.framework.cache.MybatisRedisCache;
-import com.hys.app.model.goods.dos.GoodsGalleryDO;
+import com.hys.app.model.erp.entity.CompanyPackage;
 import org.apache.ibatis.annotations.CacheNamespace;
 
+
 /**
- * GoodsGallery的Mapper
+ * 品牌BrandDO的Mapper
  * @author fk
  * @version 1.0
  * @since 7.1.0
  * 2020/7/21
  */
 @CacheNamespace(implementation= MybatisRedisCache.class,eviction=MybatisRedisCache.class)
-public interface GoodsGalleryMapper extends BaseMapper<GoodsGalleryDO> {
+public interface CompanyPackageMapper extends BaseMapper<CompanyPackage> {
 }

+ 16 - 0
module-erp/src/main/java/com/hys/app/mapper/erp/MailSmsCountMapper.java

@@ -0,0 +1,16 @@
+package com.hys.app.mapper.erp;
+
+import com.hys.app.framework.database.mybatisplus.base.BaseMapperX;
+import com.hys.app.model.erp.dos.MailSmsCountDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 订单 Mapper
+ *
+ * @author 张崧
+ * 2024-01-24 15:58:31
+ */
+@Mapper
+public interface MailSmsCountMapper extends BaseMapperX<MailSmsCountDO> {
+}
+

+ 5 - 4
v3studio-erp-api/module-erp/src/main/java/com/hys/app/mapper/goods/CategorySpecMapper.java → module-erp/src/main/java/com/hys/app/mapper/erp/SmsMailMapper.java

@@ -1,17 +1,18 @@
-package com.hys.app.mapper.goods;
+package com.hys.app.mapper.erp;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.hys.app.framework.cache.MybatisRedisCache;
-import com.hys.app.model.goods.dos.CategorySpecDO;
+import com.hys.app.model.erp.dos.SmsMailTemplate;
 import org.apache.ibatis.annotations.CacheNamespace;
 
+
 /**
- * CategorySpec的Mapper
+ * 品牌BrandDO的Mapper
  * @author fk
  * @version 1.0
  * @since 7.1.0
  * 2020/7/21
  */
 @CacheNamespace(implementation= MybatisRedisCache.class,eviction=MybatisRedisCache.class)
-public interface CategorySpecMapper extends BaseMapper<CategorySpecDO> {
+public interface SmsMailMapper extends BaseMapper<SmsMailTemplate> {
 }

+ 2 - 0
module-erp/src/main/java/com/hys/app/mapper/erp/StockTransferMapper.java

@@ -2,6 +2,7 @@ package com.hys.app.mapper.erp;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hys.app.framework.context.user.AdminUserContext;
 import com.hys.app.framework.database.mybatisplus.base.BaseDO;
 import com.hys.app.framework.database.mybatisplus.base.BaseMapperX;
 import com.hys.app.model.erp.dos.StockTransferDO;
@@ -30,6 +31,7 @@ public interface StockTransferMapper extends BaseMapperX<StockTransferDO> {
                 .eqIfPresent(StockTransferDO::getInDeptId, params.getInDeptId())
                 .eqIfPresent(StockTransferDO::getInWarehouseId, params.getInWarehouseId())
                 .eqIfPresent(StockTransferDO::getInHandledByName, params.getInHandledBy())
+                .eqIfPresent(StockTransferDO::getCompanyId, AdminUserContext.getCompanyId())
                 .eqIfPresent(StockTransferDO::getStatus, params.getStatus())
                 .geIfPresent(BaseDO::getCreateTime, params.getStartTime())
                 .leIfPresent(BaseDO::getCreateTime, params.getEndTime())

+ 2 - 0
module-erp/src/main/java/com/hys/app/mapper/erp/WarehouseAreaMapper.java

@@ -1,5 +1,6 @@
 package com.hys.app.mapper.erp;
 
+import com.hys.app.framework.context.user.AdminUserContext;
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.framework.database.mybatisplus.base.BaseMapperX;
 import com.hys.app.model.erp.dos.WarehouseAreaDO;
@@ -19,6 +20,7 @@ public interface WarehouseAreaMapper extends BaseMapperX<WarehouseAreaDO> {
                 .likeIfPresent(WarehouseAreaDO::getCode, params.getCode())
                 .likeIfPresent(WarehouseAreaDO::getName, params.getName())
                 .eqIfPresent(WarehouseAreaDO::getStatus, params.getStatus())
+                .eqIfPresent(WarehouseAreaDO::getCompanyId, AdminUserContext.getCompanyId())
                 .orderByDesc(WarehouseAreaDO::getId)
                 .page(params);
     }

+ 2 - 3
module-erp/src/main/java/com/hys/app/mapper/erp/WarehouseEntryMapper.java

@@ -2,6 +2,7 @@ package com.hys.app.mapper.erp;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hys.app.framework.context.user.AdminUserContext;
 import com.hys.app.framework.database.mybatisplus.base.BaseMapperX;
 import com.hys.app.model.erp.dos.WarehouseEntryDO;
 import com.hys.app.model.erp.dto.WarehouseEntryQueryParams;
@@ -35,10 +36,8 @@ public interface WarehouseEntryMapper extends BaseMapperX<WarehouseEntryDO> {
                 .likeIfPresent(WarehouseEntryDO::getDeliveryNumber, params.getDeliveryNumber())
                 .likeIfPresent(WarehouseEntryDO::getContractAttachment, params.getContractAttachment())
                 .eqIfPresent(WarehouseEntryDO::getStatus, params.getStatus())
+                .eqIfPresent(WarehouseEntryDO::getCompanyId, AdminUserContext.getCompanyId())
                 .eqIfPresent(WarehouseEntryDO::getSupplierSettlementFlag, params.getSupplierSettlementFlag())
-                .likeIfPresent(WarehouseEntryDO::getCustomerName, params.getCustomerName())
-                .likeIfPresent(WarehouseEntryDO::getCustomerPhone, params.getCustomerPhone())
-                .eqIfPresent(WarehouseEntryDO::getType, params.getType())
                 .orderByDesc(WarehouseEntryDO::getEntryTime)
                 .page(params);
     }

+ 2 - 0
module-erp/src/main/java/com/hys/app/mapper/erp/WarehouseMapper.java

@@ -1,5 +1,6 @@
 package com.hys.app.mapper.erp;
 
+import com.hys.app.framework.context.user.AdminUserContext;
 import com.hys.app.framework.database.mybatisplus.base.BaseMapperX;
 import com.hys.app.model.erp.dos.WarehouseDO;
 import com.hys.app.model.erp.dto.WarehouseQueryParams;
@@ -21,6 +22,7 @@ public interface WarehouseMapper extends BaseMapperX<WarehouseDO> {
                 .likeIfPresent(WarehouseDO::getName, params.getName())
                 .likeIfPresent(WarehouseDO::getSn, params.getSn())
                 .eqIfPresent(WarehouseDO::getAdminId, params.getAdminId())
+                .eqIfPresent(WarehouseDO::getCompanyId, AdminUserContext.getCompanyId())
                 .likeIfPresent(WarehouseDO::getDescription, params.getDescription())
                 .orderByDesc(WarehouseDO::getId)
                 .page(params);

+ 3 - 0
module-erp/src/main/java/com/hys/app/mapper/erp/WarehouseOutMapper.java

@@ -2,7 +2,9 @@ package com.hys.app.mapper.erp;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.hys.app.framework.context.user.AdminUserContext;
 import com.hys.app.framework.database.mybatisplus.base.BaseMapperX;
+import com.hys.app.model.erp.dos.StockTransferDO;
 import com.hys.app.model.erp.dos.WarehouseOutDO;
 import com.hys.app.model.erp.dto.WarehouseOutQueryParams;
 import com.hys.app.framework.database.WebPage;
@@ -27,6 +29,7 @@ public interface WarehouseOutMapper extends BaseMapperX<WarehouseOutDO> {
                 .eqIfPresent(WarehouseOutDO::getWarehouseId, params.getWarehouseId())
                 .geIfPresent(WarehouseOutDO::getOutTime, params.getStartTime())
                 .leIfPresent(WarehouseOutDO::getOutTime, params.getEndTime())
+                .eqIfPresent(WarehouseOutDO::getCompanyId, AdminUserContext.getCompanyId())
 //                .likeIfPresent(WarehouseOutDO::getOrderSnList, params.getOrderSn())
                 .orderByDesc(WarehouseOutDO::getOutTime)
                 .page(params);

+ 2 - 0
module-erp/src/main/java/com/hys/app/mapper/goods/GoodsMapper.java

@@ -1,5 +1,6 @@
 package com.hys.app.mapper.goods;
 
+import com.hys.app.framework.context.user.AdminUserContext;
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.framework.database.mybatisplus.base.BaseMapperX;
 import com.hys.app.framework.util.StringUtil;
@@ -20,6 +21,7 @@ public interface GoodsMapper extends BaseMapperX<GoodsDO> {
                         w -> w.like(GoodsDO::getName, params.getKeyword()).or().like(GoodsDO::getSn, params.getKeyword()))
                 .eqIfPresent(GoodsDO::getSn, params.getSn())
                 .eqIfPresent(GoodsDO::getName, params.getName())
+                .eqIfPresent(GoodsDO::getCompanyId, AdminUserContext.getCompanyId())
                 .eqIfPresent(GoodsDO::getCategoryId, params.getCategoryId())
                 .orderByDesc(GoodsDO::getSort)
                 .page(params);

+ 25 - 11
v3studio-erp-api/module-erp/src/main/java/com/hys/app/model/erp/dos/GoodsLabelDO.java → module-erp/src/main/java/com/hys/app/model/erp/dos/MailSmsCountDO.java

@@ -3,31 +3,45 @@ package com.hys.app.model.erp.dos;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-
-import io.swagger.annotations.ApiModelProperty;
+import com.hys.app.framework.database.mybatisplus.base.BaseDO;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
-import com.hys.app.framework.database.mybatisplus.base.BaseDO;
 
 /**
- * 商品标签 DO
+ * 订单 DO
  *
  * @author 张崧
- * 2024-03-20 16:23:19
+ * 2024-01-24 15:58:30
  */
-@TableName("erp_goods_label")
+@TableName(value = "erp_mail_sms_count", autoResultMap = true)
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
-public class GoodsLabelDO extends BaseDO {
+public class MailSmsCountDO extends BaseDO {
 
     private static final long serialVersionUID = 1L;
-    
+
     @TableId(type = IdType.ASSIGN_ID)
     private Long id;
 
-    @ApiModelProperty(name = "name", value = "标签名称")
-    private String name;
-    
+    /**
+     * 公司id
+     */
+    private Long companyId;
+
+    /**
+     * 公司id
+     */
+    private Long companyName;
+
+    /**
+     * 邮件次数
+     */
+    private Integer mailNum = 0;
+
+    /**
+     * 短信次数
+     */
+    private Integer smsNum = 0;
 }

+ 5 - 8
module-erp/src/main/java/com/hys/app/model/erp/dos/ProductStockDO.java

@@ -3,6 +3,7 @@ package com.hys.app.model.erp.dos;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.hys.app.framework.database.mybatisplus.base.BaseDO;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -21,7 +22,7 @@ import java.io.Serializable;
 @Data
 @NoArgsConstructor
 @EqualsAndHashCode
-public class ProductStockDO implements Serializable  {
+public class ProductStockDO extends BaseDO implements Serializable  {
 
     private static final long serialVersionUID = 1L;
 
@@ -41,6 +42,9 @@ public class ProductStockDO implements Serializable  {
     @ApiModelProperty(name = "product_id", value = "产品id")
     private Long productId;
 
+    @ApiModelProperty(name = "hire_or_sail", value = "租赁sku还是售卖sku")
+    private String hireOrSail;
+
     @ApiModelProperty(name = "stock", value = "库存数量")
     private Integer num;
 
@@ -85,11 +89,4 @@ public class ProductStockDO implements Serializable  {
 
     @ApiModelProperty(name = "locked_stock", value = "预警库存")
     private Integer lockedStock =0;
-
-    public ProductStockDO(Long warehouseId, Long goodsId, Long productId, Integer num) {
-        this.setWarehouseId(warehouseId);
-        this.setGoodsId(goodsId);
-        this.setNum(num);
-    }
-
 }

+ 85 - 0
module-erp/src/main/java/com/hys/app/model/erp/dos/SmsMailTemplate.java

@@ -0,0 +1,85 @@
+package com.hys.app.model.erp.dos;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.hys.app.framework.database.mybatisplus.base.BaseDO;
+import com.hys.app.model.erp.enums.MsgTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+/**
+ * 短信模板实体
+ *
+ * @author zhangsong
+ * @version v1.0
+ * @since v7.3.0
+ * 2021-01-26 16:04:22
+ */
+@TableName("es_sms_mail_template")
+@ApiModel
+@Data
+public class SmsMailTemplate extends BaseDO implements Serializable {
+
+    private static final long serialVersionUID = 6526154401398092L;
+
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long id;
+    /**
+     * 模板类型短信还是邮件
+     */
+    @ApiModelProperty("模板类型短信还是邮件")
+    private MsgTypeEnum type;
+    /**
+     * 自定义模板code
+     */
+    @ApiModelProperty("自定义模板code")
+    private String code;
+    /**
+     * 短信类型,0为验证码,1为短信通知,2为推广短信
+     */
+    @ApiModelProperty("短信类型,0为验证码,1为短信通知,2为推广短信")
+    private Integer templateType;
+    /**
+     * 模板名称
+     */
+    @ApiModelProperty("模板名称")
+    private String name;
+    /**
+     * 模板内容
+     */
+    @ApiModelProperty("模板内容")
+    private String content;
+    /**
+     * 模板申请说明
+     */
+    @ApiModelProperty("模板申请说明")
+    private String remark;
+    /**
+     * 短信模板code
+     */
+    @ApiModelProperty("短信模板code")
+    private String templateCode;
+    /**
+     * 第三方审核状态
+     */
+    @ApiModelProperty("第三方审核状态")
+    private Boolean auditStatus;
+    /**
+     * 是否启用
+     */
+    @ApiModelProperty("是否启用")
+    private Boolean enableStatus;
+    /**
+     * 审核未通过原因
+     */
+    @ApiModelProperty("审核未通过原因")
+    private String failReason;
+}

+ 2 - 1
module-erp/src/main/java/com/hys/app/model/erp/dos/StockDamageReport.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.hys.app.framework.database.mybatisplus.base.BaseDO;
 import com.hys.app.model.erp.enums.DamageinventoryEnum;
 import com.hys.app.model.erp.enums.StockDamageReportTypeEnum;
 import com.hys.app.model.erp.vo.StockDamageReportAllowable;
@@ -27,7 +28,7 @@ import java.util.Objects;
 @TableName("es_stock_damage_report")
 @ApiModel
 @Data
-public class StockDamageReport implements Serializable {
+public class StockDamageReport extends BaseDO implements Serializable {
 
     private static final long serialVersionUID = -2812668888351646009L;
 

+ 2 - 1
module-erp/src/main/java/com/hys/app/model/erp/dos/StockInventory.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.hys.app.framework.database.mybatisplus.base.BaseDO;
 import com.hys.app.model.erp.enums.DamageinventoryEnum;
 import com.hys.app.model.erp.vo.StockInventoryAllowable;
 import io.swagger.annotations.ApiModel;
@@ -26,7 +27,7 @@ import java.util.Objects;
 @TableName("es_stock_inventory")
 @ApiModel
 @Data
-public class StockInventory implements Serializable {
+public class StockInventory extends BaseDO implements Serializable {
 
     private static final long serialVersionUID = -6325801216669289202L;
 

+ 2 - 5
module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseAreaDO.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.hys.app.framework.database.mybatisplus.base.BaseDO;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -19,7 +20,7 @@ import java.util.List;
  */
 @TableName("erp_warehouse_area")
 @Data
-public class WarehouseAreaDO implements Serializable {
+public class WarehouseAreaDO extends BaseDO implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
@@ -42,13 +43,9 @@ public class WarehouseAreaDO implements Serializable {
     @ApiModelProperty(name = "type", value = "类型")
     private String type;
 
-    @ApiModelProperty(name = "create_time", value = "创建时间")
-    private Integer createTime;
-
     @ApiModelProperty(name = "status", value = "状态")
     private String status;
 
-
     @ApiModelProperty(name = "status", value = "库存ID")
     @TableField(exist = false)
     private List<Long> stockIdList;

+ 17 - 19
v3studio-erp-api/module-erp/src/main/java/com/hys/app/model/erp/dos/PostDO.java → module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseEntryTypeDO.java

@@ -3,44 +3,42 @@ package com.hys.app.model.erp.dos;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.hys.app.framework.database.mybatisplus.base.BaseDO;
+import com.hys.app.model.erp.enums.OrderTypeEnum;
+import com.hys.app.model.erp.enums.WarehouseEntryStatusEnum;
+import com.hys.app.model.erp.enums.WarehouseEntyrTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
-import com.hys.app.framework.database.mybatisplus.base.BaseDO;
 
 
 /**
- * 岗位实体类
+ * 入库单实体类
  *
  * @author 张崧
- * 2023-11-29 17:15:22
+ * @since 2023-12-05 11:25:07
  */
-@TableName("erp_post")
+@TableName("erp_warehouse_entry_type")
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
-public class PostDO extends BaseDO {
+public class WarehouseEntryTypeDO extends BaseDO {
 
     private static final long serialVersionUID = 1L;
-    
+
     @TableId(type = IdType.ASSIGN_ID)
     @ApiModelProperty(hidden = true)
     private Long id;
 
-    @ApiModelProperty(name = "name", value = "岗位名称")
+    @ApiModelProperty(name = "入库类型标识,一旦创建不允许修改")
+    private String code;
+
+    @ApiModelProperty(name = "入库类型中文")
     private String name;
-    
-    @ApiModelProperty(name = "sn", value = "岗位编号")
-    private String sn;
-    
-    @ApiModelProperty(name = "sort", value = "顺序")
+
+    private String remark;
+
     private Integer sort;
-    
-    @ApiModelProperty(name = "description", value = "岗位描述")
-    private String description;
-    
-    @ApiModelProperty(name = "members", value = "岗位成员")
-    private String members;
-    
+
 }

+ 2 - 0
module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseOutDO.java

@@ -36,6 +36,8 @@ public class WarehouseOutDO extends BaseDO {
     @ApiModelProperty(hidden = true)
     private Long id;
 
+    private Long warehouseOutTypeId;
+
     @ApiModelProperty(name = "sn", value = "出库单编号")
     private String sn;
 

+ 10 - 12
v3studio-erp-api/module-erp/src/main/java/com/hys/app/model/erp/dos/UserMenuDO.java → module-erp/src/main/java/com/hys/app/model/erp/dos/WarehouseOutTypeDO.java

@@ -11,16 +11,16 @@ import lombok.ToString;
 
 
 /**
- * 商品实体类
+ * 入库单实体类
  *
  * @author 张崧
- * 2023-12-26 15:56:58
+ * @since 2023-12-05 11:25:07
  */
-@TableName("erp_user_menu")
+@TableName("erp_warehouse_out_type")
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
-public class UserMenuDO extends BaseDO {
+public class WarehouseOutTypeDO extends BaseDO {
 
     private static final long serialVersionUID = 1L;
 
@@ -28,16 +28,14 @@ public class UserMenuDO extends BaseDO {
     @ApiModelProperty(hidden = true)
     private Long id;
 
-    @ApiModelProperty(name = "menu_id", value = "菜单id")
-    private Long menuId;
+    @ApiModelProperty(name = "出库类型标识,一旦创建不允许修改")
+    private String code;
 
+    @ApiModelProperty(name = "出库类型中文")
+    private String name;
 
+    private String remark;
 
-    @ApiModelProperty(name = "user_id", value = "用户id")
-    private Long userId;
+    private Integer sort;
 
-
-
-    @ApiModelProperty(name = "create_time", value = "创建时间")
-    private Long createTime;
 }

+ 0 - 4
module-erp/src/main/java/com/hys/app/model/erp/dto/GoodsDTO.java

@@ -70,10 +70,6 @@ public class GoodsDTO {
     @ApiModelProperty(name = "description", value = "商品详情")
     private String description;
 
-    @ApiModelProperty(name = "freightTemplate_id", value = "运费模板id(0代表包邮)")
-    @NotNull(message = "运费模板id不能为空")
-    private Long freightTemplateId;
-
     @ApiModelProperty(name = "product_list", value = "产品列表")
     @NotEmpty(message = "产品列表不能为空")
     @Valid

+ 4 - 3
module-erp/src/main/java/com/hys/app/model/erp/dto/ProductStockQueryParams.java

@@ -27,11 +27,12 @@ public class ProductStockQueryParams extends BaseQueryParam {
     private Long goodsId;
 
     @ApiModelProperty(name = "keyword", value = "搜索关键字")
-    private String keyword;
+    private Long keyword;
 
-//
+    //
     @ApiModelProperty(name = "num", value = "库存数量")
     private Integer num;
-    
+
+    private Long companyId;
 }
 

+ 54 - 0
module-erp/src/main/java/com/hys/app/model/erp/dto/SmsMailTemplateDTO.java

@@ -0,0 +1,54 @@
+package com.hys.app.model.erp.dto;
+
+import com.hys.app.model.erp.enums.MsgTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * 短信模板实体
+ *
+ * @author zhangsong
+ * @version v1.0
+ * @since v7.3.0
+ * 2021-01-26 16:04:22
+ */
+@Data
+public class SmsMailTemplateDTO {
+
+    /**
+     * 模板类型短信还是邮件
+     */
+    @ApiModelProperty("模板类型短信还是邮件")
+    private MsgTypeEnum type;
+    /**
+     * 自定义模板code
+     */
+    @ApiModelProperty("自定义模板code")
+    private String code;
+    /**
+     * 短信类型,0为验证码,1为短信通知,2为推广短信
+     */
+    @ApiModelProperty("短信类型,0为验证码,1为短信通知,2为推广短信")
+    private Integer templateType;
+    /**
+     * 模板名称
+     */
+    @ApiModelProperty("模板名称")
+    private String name;
+    /**
+     * 模板内容
+     */
+    @ApiModelProperty("模板内容")
+    private String content;
+    /**
+     * 模板申请说明
+     */
+    @ApiModelProperty("模板申请说明")
+    private String remark;
+    /**
+     * 是否启用
+     */
+    @ApiModelProperty("是否启用")
+    private Boolean enableStatus;
+}

+ 8 - 10
module-erp/src/main/java/com/hys/app/model/erp/dto/WarehouseEntryDTO.java

@@ -34,21 +34,20 @@ public class WarehouseEntryDTO {
     @ApiModelProperty(hidden = true)
     private Long id;
 
-    @ApiModelProperty(name = "type", value = "入库类型")
-    private WarehouseEntyrTypeEnum type;
-
+    @ApiModelProperty("入库类型")
+    private Long  warehouseEntryTypeId;
 
     @ApiModelProperty(name = "memo", value = "订单备注")
     private String memo;
 
     @ApiModelProperty(name = "order_id", value = "扫码或者选择的单子ID")
     private Long orderId;
-
-    @ApiModelProperty(name = "scan_order_type", value = "单子的类型,扫码订单打出来的数据必传")
-    private OrderTypeEnum scanOrderType;
-
-    @ApiModelProperty(value = "扫描订单的sn")
-    private String scanOrderSn;
+//
+//    @ApiModelProperty(name = "scan_order_type", value = "单子的类型,扫码订单打出来的数据必传")
+//    private OrderTypeEnum scanOrderType;
+//
+//    @ApiModelProperty(value = "扫描订单的sn")
+//    private String scanOrderSn;
 
     @ApiModelProperty(name = "warehouse_id", value = "仓库id")
     @NotNull(message = "仓库不能为空")
@@ -63,6 +62,5 @@ public class WarehouseEntryDTO {
     @ApiModelProperty(value = "操作類型")
     @NotBlank(message = "操作类型不能为空,save保存submit入库")
     private String saveOrSubmit;
-
 }
 

+ 10 - 15
module-erp/src/main/java/com/hys/app/model/erp/dto/WarehouseEntryProductDTO.java

@@ -33,21 +33,16 @@ public class WarehouseEntryProductDTO {
     private Integer num;
 
 
-    @ApiModelProperty(name = "scan_order_id", value = "扫码的单号,扫码订单打出来的数据必传")
-    private Long scanOrderId;
-
-    @ApiModelProperty(name = "order_item_id", value = "订单项id,扫码订单打出来的数据必传")
-    private Long scanOrderItemId;
-
-    @ApiModelProperty(name = "scan_order_sn", value = "扫码的单号,扫码订单打出来的数据必传")
-    private String scanOrderSn;
-
-
-    @ApiModelProperty(name = "scan_iff_num", value = "差异数量,扫码订单打出来的数据必传")
-    private Integer scanDiffNum;
-
-    @ApiModelProperty(name = "scan_iff_num", value = "序列号")
-    List<GoodsSnDO>  snCodeList;
+//    @ApiModelProperty(name = "scan_order_id", value = "扫码的单号,扫码订单打出来的数据必传")
+//    private Long scanOrderId;
+//    @ApiModelProperty(name = "order_item_id", value = "订单项id,扫码订单打出来的数据必传")
+//    private Long scanOrderItemId;
+//    @ApiModelProperty(name = "scan_order_sn", value = "扫码的单号,扫码订单打出来的数据必传")
+//    private String scanOrderSn;
+//    @ApiModelProperty(name = "scan_iff_num", value = "差异数量,扫码订单打出来的数据必传")
+//    private Integer scanDiffNum;
+//    @ApiModelProperty(name = "scan_iff_num", value = "序列号")
+//    List<GoodsSnDO>  snCodeList;
 
     @ApiModelProperty(name = "product_stock_id", value = "product_stock_id不能为空")
     private Long productStockId;

+ 3 - 11
module-erp/src/main/java/com/hys/app/model/erp/dto/WarehouseOutDTO.java

@@ -29,12 +29,8 @@ public class WarehouseOutDTO {
     @ApiModelProperty(hidden = true)
     private Long id;
 
-    @ApiModelProperty(name = "out_time", value = "出库日期")
-    @NotNull(message = "出库日期不能为空")
-    private Long outTime;
-
-    @ApiModelProperty(name = "warehouse_consignee_id", value = "仓库提货人id")
-    private Long warehouseConsigneeId;
+    @ApiModelProperty(name = "出货类型id")
+    private Long warehouseOutTypeId;
 
     @ApiModelProperty(name = "notes", value = "备注")
     private String notes;
@@ -56,12 +52,8 @@ public class WarehouseOutDTO {
     private Long warehouseId;
 
 
-    @ApiModelProperty(value = "配送地址")
-//    @NotBlank(message = "配送地址")
-    private String address;
 
-    @ApiModelProperty(name = "order_id_list", value = "发货单id")
-    private Long orderIdList;
+
 
 
 }

+ 106 - 0
module-erp/src/main/java/com/hys/app/model/erp/entity/Company.java

@@ -0,0 +1,106 @@
+package com.hys.app.model.erp.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.hys.app.framework.database.mybatisplus.base.BaseDO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 部门表
+ */
+@TableName(value = "erp_company")
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class Company extends BaseDO {
+
+    public static final Long ROOT_ID = 0L;
+
+    private Long id;
+    /**
+     * 名称
+     */
+    private String name;
+    /**
+     * 营业执照
+     */
+    private String license;
+    /**
+     * 统一社会性用代码
+     */
+    private String creditCode;
+    /**
+     * 行业
+     */
+    private String industry;
+    /**
+     * 地址
+     */
+    private String address;
+    /**
+     * 省
+     */
+    private String province;
+    /**
+     * 市
+     */
+    private String city;
+    /**
+     * 县
+     */
+    private String area;
+    /**
+     * 邮政编码
+     */
+    private String postalCode;
+    /**
+     * 联系人
+     */
+    private String userName;
+    /**
+     * 联系人电话
+     */
+    private String phone;
+    /**
+     * 邮箱
+     */
+    private String email;
+    /**
+     * 官网
+     */
+    private String website;
+    /**
+     * 使用截止时间
+     */
+    private LocalDateTime endUseTime;
+
+    /**
+     * 最大创建账号数
+     */
+    private Integer userNum;
+    /**
+     * 累计付款金额
+     */
+    private BigDecimal money;
+    /**
+     * 权限id
+     */
+    private Long roleId;
+
+    /**
+     * 本次付款金额
+     */
+    private BigDecimal thisMoney;
+
+    /**
+     * 本次购买天数
+     */
+    private Integer thisDay;
+
+    /**
+     * 套餐id
+     */
+    private Long companyPackageId;
+}

+ 136 - 0
module-erp/src/main/java/com/hys/app/model/erp/entity/CompanyDO.java

@@ -0,0 +1,136 @@
+package com.hys.app.model.erp.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 公司表
+ */
+@Getter
+@Setter
+public class CompanyDO {
+    /**
+     * 名称
+     */
+    @ApiModelProperty("公司名称")
+    @NotBlank(message = "公司名称不能为空")
+    private String name;
+    /**
+     * 营业执照
+     */
+    @ApiModelProperty("营业执照")
+    @NotBlank(message = "营业执照不能为空")
+    private String license;
+    /**
+     * 统一社会性用代码
+     */
+    @ApiModelProperty("统一社会性用代码")
+    @NotBlank(message = "统一社会性用代码不能为空")
+    private String creditCode;
+    /**
+     * 行业
+     */
+    @ApiModelProperty("行业")
+    @NotBlank(message = "行业不能为空")
+    private String industry;
+    /**
+     * 地址
+     */
+    @ApiModelProperty("地址")
+    @NotBlank(message = "地址不能为空")
+    private String address;
+    /**
+     * 省
+     */
+    @ApiModelProperty("省")
+    @NotBlank(message = "省不能为空")
+    private String province;
+    /**
+     * 市
+     */
+    @ApiModelProperty("市")
+    @NotBlank(message = "市不能为空")
+    private String city;
+    /**
+     * 县
+     */
+    @ApiModelProperty("县")
+    @NotBlank(message = "县不能为空")
+    private String area;
+    /**
+     * 邮政编码
+     */
+    @ApiModelProperty("邮政编码")
+    private String postalCode;
+    /**
+     * 联系人
+     */
+    @ApiModelProperty("联系人")
+    @NotBlank(message = "联系人不能为空")
+    private String userName;
+    /**
+     * 联系人电话
+     */
+    @ApiModelProperty("联系人电话")
+    @NotBlank(message = "联系人电话不能为空")
+    private String phone;
+    /**
+     * 邮箱
+     */
+    @ApiModelProperty("邮箱")
+    private String email;
+    /**
+     * 官网
+     */
+    @ApiModelProperty("官网")
+    private String website;
+    /**
+     * 使用截止时间
+     */
+    @ApiModelProperty("使用截止时间")
+    @NotNull(message = "使用截止时间不能为空")
+    private LocalDateTime endUseTime;
+
+    /**
+     * 最大创建账号数
+     */
+    @ApiModelProperty("最大创建账号数")
+    @NotNull(message = "最大创建账号数不能为空")
+    private Integer userNum;
+    /**
+     * 付款金额
+     */
+    @ApiModelProperty("累计付款金额")
+    private BigDecimal money;
+    /**
+     * 权限id
+     */
+    @ApiModelProperty("套餐id")
+    @NotNull(message = "套餐不能为空")
+    private Long roleId;
+
+    /**
+     * 本次付款金额
+     */
+    @ApiModelProperty("本次付款金额")
+    @NotNull(message = "本次应付金额不能为空")
+    private BigDecimal thisMoney;
+
+    /**
+     * 本次购买天数
+     */
+    @ApiModelProperty("本次购买天数")
+    @NotNull(message = "本次购买天数不能为空")
+    private Integer thisDay;
+
+    @ApiModelProperty("套餐id")
+    @NotNull(message = "套餐不能为空")
+    private Long companyPackageId;
+
+}

+ 40 - 0
module-erp/src/main/java/com/hys/app/model/erp/entity/CompanyPackage.java

@@ -0,0 +1,40 @@
+package com.hys.app.model.erp.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.hys.app.framework.database.mybatisplus.base.BaseDO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+/**
+ * 部门表
+ */
+@TableName(value = "erp_company_package")
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class CompanyPackage extends BaseDO {
+
+    public static final Long ROOT_ID = 0L;
+
+    private Long id;
+    /**
+     * 权限id
+     */
+    private Long roleId;
+    /**
+     * 套餐金额
+     */
+    private BigDecimal money;
+    /**
+     * 购买天数
+     */
+    private Integer day;
+
+    /**
+     * 状态
+     */
+    private Boolean useAble;
+
+    private String name;
+}

+ 42 - 0
module-erp/src/main/java/com/hys/app/model/erp/entity/CompanyPackageDO.java

@@ -0,0 +1,42 @@
+package com.hys.app.model.erp.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ * 部门表
+ */
+@Data
+public class CompanyPackageDO {
+
+    /**
+     * 权限id
+     */
+    @ApiModelProperty("权限id")
+    @NotNull(message = "权限id不能为空")
+    private Long roleId;
+    /**
+     * 套餐金额
+     */
+    @ApiModelProperty("套餐金额")
+    @NotNull(message = "套餐金额不能为空")
+    private BigDecimal money;
+    /**
+     * 购买天数
+     */
+    @ApiModelProperty("购买天数")
+    @NotNull(message = "购买天数不能为空")
+    private Integer day;
+
+    @ApiModelProperty("状态")
+    @NotNull(message = "状态不能为空")
+    private Boolean useAble;
+
+    @ApiModelProperty("套餐名称")
+    @NotBlank(message = "套餐名称不能为空")
+    private String  name;
+}

+ 10 - 0
module-erp/src/main/java/com/hys/app/model/erp/entity/CompanyPackageVO.java

@@ -0,0 +1,10 @@
+package com.hys.app.model.erp.entity;
+
+import lombok.Data;
+
+/**
+ * 部门表
+ */
+@Data
+public class CompanyPackageVO extends CompanyPackage {
+}

+ 35 - 0
module-erp/src/main/java/com/hys/app/model/erp/entity/CompanyQuery.java

@@ -0,0 +1,35 @@
+package com.hys.app.model.erp.entity;
+
+import com.hys.app.framework.database.BaseQueryParam;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 部门表
+ */
+@Getter
+@Setter
+public class CompanyQuery extends BaseQueryParam {
+
+    /**
+     * 名称
+     */
+    @ApiModelProperty("名称")
+    private String name;
+    /**
+     * 行业
+     */
+    @ApiModelProperty("行业")
+    private String industry;
+    /**
+     * 联系人
+     */
+    @ApiModelProperty("联系人")
+    private String userName;
+    /**
+     * 是否启用
+     */
+    @ApiModelProperty("是否启用")
+    private Boolean hasUse;
+}

+ 41 - 0
module-erp/src/main/java/com/hys/app/model/erp/entity/CompanyRenewDO.java

@@ -0,0 +1,41 @@
+package com.hys.app.model.erp.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 公司表
+ */
+@Getter
+@Setter
+public class CompanyRenewDO {
+    /**
+     * 使用截止时间
+     */
+    @ApiModelProperty("使用截止时间")
+    @NotNull(message = "使用截止时间不能为空")
+    private LocalDateTime endUseTime;
+    /**
+     * 最大创建账号数
+     */
+    @ApiModelProperty("最大创建账号数")
+    @NotNull(message = "最大创建账号数不能为空")
+    private Integer userNum;
+    /**
+     * 付款金额
+     */
+    @ApiModelProperty("购买金额")
+    @NotNull(message = "购买金额不能为空")
+    private BigDecimal thisMoney;
+    /**
+     * 权限id
+     */
+    @ApiModelProperty("套餐id")
+    @NotNull(message = "套餐不能为空")
+    private Integer roleId;
+}

+ 72 - 0
module-erp/src/main/java/com/hys/app/model/erp/entity/CompanyUpdateDO.java

@@ -0,0 +1,72 @@
+package com.hys.app.model.erp.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 公司表
+ */
+@Getter
+@Setter
+public class CompanyUpdateDO {
+    /**
+     * 行业
+     */
+    @ApiModelProperty("行业")
+    @NotBlank(message = "行业不能为空")
+    private String industry;
+    /**
+     * 地址
+     */
+    @ApiModelProperty("地址")
+    @NotBlank(message = "地址不能为空")
+    private String address;
+    /**
+     * 省
+     */
+    @ApiModelProperty("省")
+    @NotBlank(message = "省不能为空")
+    private String province;
+    /**
+     * 市
+     */
+    @ApiModelProperty("市")
+    @NotBlank(message = "市不能为空")
+    private String city;
+    /**
+     * 县
+     */
+    @ApiModelProperty("县")
+    @NotBlank(message = "县不能为空")
+    private String area;
+    /**
+     * 邮政编码
+     */
+    @ApiModelProperty("邮政编码")
+    private String postalCode;
+    /**
+     * 联系人
+     */
+    @ApiModelProperty("联系人")
+    @NotBlank(message = "联系人不能为空")
+    private String userName;
+    /**
+     * 联系人电话
+     */
+    @ApiModelProperty("联系人电话")
+    @NotBlank(message = "联系人电话不能为空")
+    private String phone;
+    /**
+     * 邮箱
+     */
+    @ApiModelProperty("邮箱")
+    private String email;
+    /**
+     * 官网
+     */
+    @ApiModelProperty("官网")
+    private String website;
+}

+ 117 - 0
module-erp/src/main/java/com/hys/app/model/erp/entity/CompanyVO.java

@@ -0,0 +1,117 @@
+package com.hys.app.model.erp.entity;
+
+import com.hys.app.framework.database.mybatisplus.base.BaseDO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 部门表
+ */
+@Data
+public class CompanyVO extends BaseDO {
+
+    private Long id;
+    /**
+     * 名称
+     */
+    @ApiModelProperty("公司名称")
+    private String name;
+    /**
+     * 营业执照
+     */
+    @ApiModelProperty("营业执照")
+    private String license;
+    /**
+     * 统一社会性用代码
+     */
+    @ApiModelProperty("统一社会性用代码")
+    private String creditCode;
+    /**
+     * 行业
+     */
+    @ApiModelProperty("行业")
+    private String industry;
+    /**
+     * 地址
+     */
+    @ApiModelProperty("地址")
+    private String address;
+    /**
+     * 省
+     */
+    @ApiModelProperty("省")
+    private String province;
+    /**
+     * 市
+     */
+    @ApiModelProperty("市")
+    private String city;
+    /**
+     * 县
+     */
+    @ApiModelProperty("县")
+    private String area;
+    /**
+     * 邮政编码
+     */
+    @ApiModelProperty("邮政编码")
+    private String postalCode;
+    /**
+     * 联系人
+     */
+    @ApiModelProperty("联系人")
+    private String userName;
+    /**
+     * 联系人电话
+     */
+    @ApiModelProperty("联系人电话")
+    private String phone;
+    /**
+     * 邮箱
+     */
+    @ApiModelProperty("邮箱")
+    private String email;
+    /**
+     * 官网
+     */
+    @ApiModelProperty("官网")
+    private String website;
+    /**
+     * 使用截止时间
+     */
+    @ApiModelProperty("使用截止时间")
+    private LocalDateTime endUseTime;
+
+    /**
+     * 最大创建账号数
+     */
+    @ApiModelProperty("当前最大创建账号数")
+    private Integer userNum;
+    /**
+    /**
+     * 付款金额
+     */
+    @ApiModelProperty("累计付款金额")
+    private BigDecimal money;
+    /**
+     * 权限id
+     */
+    @ApiModelProperty("套餐id")
+    private Integer roleId;
+
+    /**
+     * 是否启用
+     */
+    @ApiModelProperty("是否使用")
+    private Boolean hasUse;
+
+    /**
+     * 在职人数
+     */
+    @ApiModelProperty("在职人数")
+    private Integer currentUserNum;
+
+}

+ 20 - 0
module-erp/src/main/java/com/hys/app/model/erp/entity/MailSmsCountQuery.java

@@ -0,0 +1,20 @@
+package com.hys.app.model.erp.entity;
+
+import com.hys.app.framework.database.BaseQueryParam;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 部门表
+ */
+@Getter
+@Setter
+public class MailSmsCountQuery extends BaseQueryParam {
+
+    /**
+     * 名称
+     */
+    @ApiModelProperty("公司id")
+    private String companyId;
+}

+ 35 - 0
module-erp/src/main/java/com/hys/app/model/erp/enums/MsgTypeEnum.java

@@ -0,0 +1,35 @@
+package com.hys.app.model.erp.enums;
+
+import lombok.Getter;
+
+/**
+ * 订单状态枚举
+ *
+ * @author 张崧
+ * @since 2024-01-25
+ */
+@Getter
+public enum MsgTypeEnum {
+
+    SMS("SMS", "短信"),
+    MAIL("MAIL", "邮件");
+
+    MsgTypeEnum(String value, String label) {
+        this.value = value;
+        this.label = label;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public String getLabel() {
+        return label;
+    }
+
+    private final String value;
+
+    private final String label;
+
+
+}

+ 16 - 0
module-erp/src/main/java/com/hys/app/model/erp/vo/MailSmsCountVO.java

@@ -0,0 +1,16 @@
+package com.hys.app.model.erp.vo;
+
+import com.hys.app.model.erp.dos.MailSmsCountDO;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 订单 DO
+ *
+ * @author 张崧
+ * 2024-01-24 15:58:30
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class MailSmsCountVO extends MailSmsCountDO {
+}

+ 40 - 0
module-erp/src/main/java/com/hys/app/model/erp/vo/SmsMailTemplateQuery.java

@@ -0,0 +1,40 @@
+package com.hys.app.model.erp.vo;
+
+import com.hys.app.framework.database.BaseQueryParam;
+import com.hys.app.model.erp.enums.MsgTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * 短信模板实体
+ *
+ * @author zhangsong
+ * @version v1.0
+ * @since v7.3.0
+ * 2021-01-26 16:04:22
+ */
+@Data
+public class SmsMailTemplateQuery extends BaseQueryParam {
+
+    /**
+     * 模板类型短信还是邮件
+     */
+    @ApiModelProperty("模板类型短信还是邮件")
+    private MsgTypeEnum type;
+    /**
+     * 自定义模板code
+     */
+    @ApiModelProperty("自定义模板code")
+    private String code;
+    /**
+     * 模板名称
+     */
+    @ApiModelProperty("模板名称")
+    private String name;
+    /**
+     * 是否启用
+     */
+    @ApiModelProperty("是否启用")
+    private Boolean enableStatus;
+}

+ 76 - 0
module-erp/src/main/java/com/hys/app/model/erp/vo/SmsMailTemplateVO.java

@@ -0,0 +1,76 @@
+package com.hys.app.model.erp.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.hys.app.model.erp.enums.MsgTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * 短信模板实体
+ *
+ * @author zhangsong
+ * @version v1.0
+ * @since v7.3.0
+ * 2021-01-26 16:04:22
+ */
+@Data
+public class SmsMailTemplateVO {
+
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long id;
+    /**
+     * 模板类型短信还是邮件
+     */
+    @ApiModelProperty("模板类型短信还是邮件")
+    private MsgTypeEnum type;
+    /**
+     * 自定义模板code
+     */
+    @ApiModelProperty("自定义模板code")
+    private String code;
+    /**
+     * 短信类型,0为验证码,1为短信通知,2为推广短信
+     */
+    @ApiModelProperty("短信类型,0为验证码,1为短信通知,2为推广短信")
+    private Integer templateType;
+    /**
+     * 模板名称
+     */
+    @ApiModelProperty("模板名称")
+    private String name;
+    /**
+     * 模板内容
+     */
+    @ApiModelProperty("模板内容")
+    private String content;
+    /**
+     * 模板申请说明
+     */
+    @ApiModelProperty("模板申请说明")
+    private String remark;
+    /**
+     * 短信模板code
+     */
+    @ApiModelProperty("短信模板code")
+    private String templateCode;
+    /**
+     * 第三方审核状态
+     */
+    @ApiModelProperty("第三方审核状态")
+    private Boolean auditStatus;
+    /**
+     * 是否启用
+     */
+    @ApiModelProperty("是否启用")
+    private Boolean enableStatus;
+    /**
+     * 审核未通过原因
+     */
+    @ApiModelProperty("审核未通过原因")
+    private String failReason;
+}

+ 4 - 172
module-erp/src/main/java/com/hys/app/model/system/dos/AdminUser.java

@@ -4,7 +4,6 @@ import java.io.Serializable;
 
 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.hys.app.framework.database.annotation.PrimaryKeyField;
 
@@ -14,6 +13,7 @@ import com.fasterxml.jackson.databind.annotation.JsonNaming;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 
 /**
@@ -27,6 +27,7 @@ import io.swagger.annotations.ApiModelProperty;
 @TableName("es_admin_user")
 @ApiModel
 @JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
+@Data
 public class AdminUser implements Serializable {
 
     private static final long serialVersionUID = 9076352194131639L;
@@ -71,7 +72,6 @@ public class AdminUser implements Serializable {
      * 是否删除
      */
     @ApiModelProperty(name = "user_state", value = "是否删除,0为正常,-1为删除状态", required = false)
-    @TableLogic
     private Integer userState;
     /**
      * 管理员真实姓名
@@ -114,158 +114,9 @@ public class AdminUser implements Serializable {
     @ApiModelProperty(name = "nickname", value = "昵称", required = false)
     private String nickname;
 
-    public String getEmail() {
-        return email;
-    }
-
-    public void setEmail(String email) {
-        this.email = email;
-    }
-
-    public String getPhone() {
-        return phone;
-    }
-
-    public void setPhone(String phone) {
-        this.phone = phone;
-    }
-
-    @ApiModelProperty(name = "email", value = "昵称", required = false)
-    private String  email;
-
-    @ApiModelProperty(name = "phone", value = "昵称", required = false)
-    private String  phone;
-
-
-    @PrimaryKeyField
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public String getUsername() {
-        return username;
-    }
-
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    @JsonIgnore
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    public String getDepartment() {
-        return department;
-    }
-
-    public void setDepartment(String department) {
-        this.department = department;
-    }
-
-    public Long getRoleId() {
-        return roleId;
-    }
-
-    public void setRoleId(Long roleId) {
-        this.roleId = roleId;
-    }
-
-    public Long getDateLine() {
-        return dateLine;
-    }
-
-    public void setDateLine(Long dateLine) {
-        this.dateLine = dateLine;
-    }
-
-    public String getRemark() {
-        return remark;
-    }
-
-    public void setRemark(String remark) {
-        this.remark = remark;
-    }
-
-    public Integer getUserState() {
-        return userState;
-    }
-
-    public void setUserState(Integer userState) {
-        this.userState = userState;
-    }
-
-    public String getRealName() {
-        return realName;
-    }
-
-    public void setRealName(String realName) {
-        this.realName = realName;
-    }
-
-    public String getFace() {
-        return face;
-    }
-
-    public void setFace(String face) {
-        this.face = face;
-    }
-
-    public Integer getFounder() {
-        return founder;
-    }
-
-    public void setFounder(Integer founder) {
-        this.founder = founder;
-    }
+    @ApiModelProperty(name = "nickname", value = "公司id", required = false)
+    private Long companyId;
 
-    public String getSn() {
-        return sn;
-    }
-
-    public void setSn(String sn) {
-        this.sn = sn;
-    }
-
-    public Long getDeptId() {
-        return deptId;
-    }
-
-    public void setDeptId(Long deptId) {
-        this.deptId = deptId;
-    }
-
-    public Long getPostId() {
-        return postId;
-    }
-
-    public void setPostId(Long postId) {
-        this.postId = postId;
-    }
-
-    public Integer getSort() {
-        return sort;
-    }
-
-    public void setSort(Integer sort) {
-        this.sort = sort;
-    }
-
-    public String getNickname() {
-        return nickname;
-    }
-
-    public void setNickname(String nickname) {
-        this.nickname = nickname;
-    }
 
     @Override
     public boolean equals(Object o) {
@@ -325,23 +176,4 @@ public class AdminUser implements Serializable {
         result = 31 * result + (founder != null ? founder.hashCode() : 0);
         return result;
     }
-
-    @Override
-    public String toString() {
-        return "AdminUserVO{" +
-                "id=" + id +
-                ", username='" + username + '\'' +
-                ", password='" + password + '\'' +
-                ", department='" + department + '\'' +
-                ", roleId=" + roleId +
-                ", dateLine=" + dateLine +
-                ", remark='" + remark + '\'' +
-                ", userState=" + userState +
-                ", realName='" + realName + '\'' +
-                ", face='" + face + '\'' +
-                ", founder=" + founder +
-                '}';
-    }
-
-
 }

+ 6 - 85
module-erp/src/main/java/com/hys/app/model/system/vo/AdminLoginVO.java

@@ -1,5 +1,9 @@
 package com.hys.app.model.system.vo;
 
+import com.hys.app.model.erp.entity.Company;
+import com.hys.app.model.erp.entity.CompanyDO;
+import lombok.Data;
+
 /**
  * 管理员登录vo
  *
@@ -8,7 +12,7 @@ package com.hys.app.model.system.vo;
  * @date 18/6/27 上午9:28
  * @since v7.0
  */
-
+@Data
 public class AdminLoginVO {
     /**
      * 平台管理员id
@@ -48,89 +52,6 @@ public class AdminLoginVO {
      */
     private Long deptId;
 
-    public Long getUid() {
-        return uid;
-    }
-
-    public void setUid(Long uid) {
-        this.uid = uid;
-    }
-
-    public String getUsername() {
-        return username;
-    }
-
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    public String getDepartment() {
-        return department;
-    }
-
-    public void setDepartment(String department) {
-        this.department = department;
-    }
-
-    public String getFace() {
-        return face;
-    }
-
-    public void setFace(String face) {
-        this.face = face;
-    }
-
-    public Long getRoleId() {
-        return roleId;
-    }
-
-    public void setRoleId(Long roleId) {
-        this.roleId = roleId;
-    }
-
-    public Integer getFounder() {
-        return founder;
-    }
-
-    public void setFounder(Integer founder) {
-        this.founder = founder;
-    }
-
-    public String getAccessToken() {
-        return accessToken;
-    }
-
-    public void setAccessToken(String accessToken) {
-        this.accessToken = accessToken;
-    }
-
-    public String getRefreshToken() {
-        return refreshToken;
-    }
-
-    public void setRefreshToken(String refreshToken) {
-        this.refreshToken = refreshToken;
-    }
-
-    public Long getDeptId() {
-        return deptId;
-    }
-
-    public void setDeptId(Long deptId) {
-        this.deptId = deptId;
-    }
+    private Company  companyVo;
 
-    @Override
-    public String toString() {
-        return "AdminLoginVO{" +
-                "uid=" + uid +
-                ", username='" + username + '\'' +
-                ", department='" + department + '\'' +
-                ", face='" + face + '\'' +
-                ", roleId=" + roleId +
-                ", founder=" + founder +
-                ", accessToken='" + accessToken + '\'' +
-                ", refreshToken='" + refreshToken + '\'' +
-                '}';
-    }
 }

+ 62 - 0
module-erp/src/main/java/com/hys/app/service/erp/CompanyManager.java

@@ -0,0 +1,62 @@
+package com.hys.app.service.erp;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.hys.app.framework.database.mybatisplus.base.BaseService;
+import com.hys.app.model.erp.entity.*;
+
+import java.math.BigDecimal;
+
+/**
+ * 部门 Service 接口
+ */
+public interface CompanyManager extends BaseService<Company> {
+    /**
+     * 创建公司
+     *
+     * @param companyDO
+     * @return
+     */
+    Long createCompany(CompanyDO companyDO);
+
+    /**
+     * 修改公司
+     *
+     * @param companyUpdateDO
+     * @param id
+     * @return
+     */
+    Long updateCompany(CompanyUpdateDO companyUpdateDO, Long id);
+
+    /**
+     * 公司续费
+     *
+     * @param companyUpdateDO
+     * @param id
+     * @return
+     */
+    Long renewCompany(CompanyRenewDO companyUpdateDO, Long id);
+
+    /**
+     * 获取公司详情
+     *
+     * @param id
+     * @return
+     */
+    CompanyVO getOneCompany(Long id);
+
+    /**
+     * 分页
+     *
+     * @param query
+     * @return
+     */
+    IPage<CompanyVO> getPage(CompanyQuery query);
+
+    /**
+     * 更改套餐获取差价
+     *
+     * @param id
+     * @return
+     */
+    BigDecimal renewCompanyDifference(Long id);
+}

+ 13 - 0
module-erp/src/main/java/com/hys/app/service/erp/CompanyPackageManager.java

@@ -0,0 +1,13 @@
+package com.hys.app.service.erp;
+
+import com.hys.app.framework.database.mybatisplus.base.BaseService;
+import com.hys.app.model.erp.entity.*;
+
+/**
+ * 部门 Service 接口
+ */
+public interface CompanyPackageManager extends BaseService<CompanyPackage> {
+
+    Long createCompanyPackage(CompanyPackageDO packageDo);
+
+}

+ 1 - 1
module-erp/src/main/java/com/hys/app/service/erp/GoodsManager.java

@@ -45,7 +45,7 @@ public interface GoodsManager extends BaseService<GoodsDO> {
      *
      * @param goodsDTO
      */
-    void edit(GoodsDTO goodsDTO);
+    void edit(GoodsDTO goodsDTO,Long id);
 
     /**
      * 查询详情

+ 25 - 0
module-erp/src/main/java/com/hys/app/service/erp/MailSmsCountManager.java

@@ -0,0 +1,25 @@
+package com.hys.app.service.erp;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.hys.app.framework.database.mybatisplus.base.BaseService;
+import com.hys.app.model.erp.dos.MailSmsCountDO;
+import com.hys.app.model.erp.entity.MailSmsCountQuery;
+import com.hys.app.model.erp.vo.MailSmsCountVO;
+
+import java.util.Map;
+
+/**
+ * 订单业务层接口
+ *
+ * @author 张崧
+ * 2024-01-24 15:58:31
+ */
+public interface MailSmsCountManager extends BaseService<MailSmsCountDO> {
+
+    IPage<MailSmsCountVO> getPage(MailSmsCountQuery query);
+
+    void sendSms(String rePhone, String templateCode, Map<String, String> map);
+
+    void sendEmail(String toMail, String subject, String content);
+}
+

+ 47 - 0
module-erp/src/main/java/com/hys/app/service/erp/SmsMailManager.java

@@ -0,0 +1,47 @@
+package com.hys.app.service.erp;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.hys.app.framework.database.mybatisplus.base.BaseService;
+import com.hys.app.model.erp.dos.SmsMailTemplate;
+import com.hys.app.model.erp.dto.SmsMailTemplateDTO;
+import com.hys.app.model.erp.vo.SmsMailTemplateQuery;
+import com.hys.app.model.erp.vo.SmsMailTemplateVO;
+
+/**
+ * 部门 Service 接口
+ */
+public interface SmsMailManager extends BaseService<SmsMailTemplate> {
+    /**
+     * 新增模板
+     *
+     * @param smsMailTemplateDTO
+     * @return
+     */
+    Long createTemplate(SmsMailTemplateDTO smsMailTemplateDTO);
+
+    /**
+     * 修改模板
+     *
+     * @param smsMailTemplateDTO
+     * @param id
+     * @return
+     */
+    Long updateTemplate(SmsMailTemplateDTO smsMailTemplateDTO, Long id);
+
+    /**
+     * 模板分页
+     *
+     * @param query
+     * @return
+     */
+    IPage<SmsMailTemplateVO> queryTemplate(SmsMailTemplateQuery query);
+
+    /**
+     * 删除模板
+     *
+     * @param id
+     * @return
+     */
+    void delete(Long id);
+}

+ 118 - 0
module-erp/src/main/java/com/hys/app/service/erp/impl/CompanyManagerImpl.java

@@ -0,0 +1,118 @@
+package com.hys.app.service.erp.impl;
+
+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.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.hys.app.converter.erp.CompanyConverter;
+import com.hys.app.framework.context.user.AdminUserContext;
+import com.hys.app.framework.exception.ServiceException;
+import com.hys.app.mapper.erp.CompanyMapper;
+import com.hys.app.model.erp.entity.*;
+import com.hys.app.service.erp.CompanyManager;
+import com.hys.app.service.erp.CompanyPackageManager;
+import com.hys.app.util.ValidateUtil;
+import lombok.AllArgsConstructor;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Date;
+import java.util.regex.Pattern;
+
+/**
+ * 平台管理员业务类
+ *
+ * @author zh
+ * @version v7.0
+ * @since v7.0.0
+ * 2018-06-20 20:38:26
+ */
+@Service
+@AllArgsConstructor
+public class CompanyManagerImpl extends ServiceImpl<CompanyMapper, Company> implements CompanyManager {
+
+    private RedisTemplate redisTemplate;
+    private CompanyPackageManager companyPackageManager;
+
+    @Override
+    public Long createCompany(CompanyDO companyDO) {
+        //todo 需要调起支付在支付的回调里面更改公司的使用状态
+        Company convert = CompanyConverter.INSTANCE.convert(companyDO);
+        checkParam(convert);
+        convert.setEndUseTime(LocalDateTime.now().plusDays(15));
+        save(convert);
+        return convert.getId();
+    }
+
+    @Override
+    public Long updateCompany(CompanyUpdateDO companyUpdateDO, Long id) {
+        Company company = ValidateUtil.getOne(baseMapper, Company::getId, id, "企业");
+        CompanyConverter.INSTANCE.convert(company, companyUpdateDO);
+        updateById(company);
+        return id;
+    }
+
+    @Override
+    public Long renewCompany(CompanyRenewDO companyUpdateDO, Long id) {
+        redisTemplate.opsForHash().put("company", id, companyUpdateDO);
+        //todo  如果没到期就续费并更改了套餐和人数需要计算出来差价,在付款了之后再回调里面更改状态和到期时间
+        return null;
+    }
+
+    @Override
+    public CompanyVO getOneCompany(Long id) {
+        return CompanyConverter.INSTANCE.convert(ValidateUtil.getOne(baseMapper, Company::getId, id, "企业"));
+    }
+
+    @Override
+    public IPage<CompanyVO> getPage(CompanyQuery query) {
+        Page<Company> page = page(new Page<>(query.getPageNo(), query.getPageSize()),
+                new LambdaQueryWrapper<Company>().like(StrUtil.isNotBlank(query.getName()), Company::getName, query.getName())
+                        .like(StrUtil.isNotBlank(query.getIndustry()), Company::getIndustry, query.getIndustry())
+                        .like(StrUtil.isNotBlank(query.getUserName()), Company::getUserName, query.getUserName())
+                        .ge(ObjectUtil.isNotNull(query. getHasUse()), Company::getEndUseTime, LocalDateTime.now())
+                        .eq(!AdminUserContext.hasFound(),Company::getId,AdminUserContext.getCompanyId()));
+        Page<CompanyVO> convert = CompanyConverter.INSTANCE.convert(page);
+        for (CompanyVO vo : convert.getRecords()) {
+            //todo 人员做好了之后统计人数
+            vo.setCurrentUserNum(1);
+        }
+        return convert;
+    }
+
+    @Override
+    public BigDecimal renewCompanyDifference(Long id) {
+        Company company =getById(AdminUserContext.getCompanyId());
+        CompanyPackage changePackage = companyPackageManager.getById(id);
+        CompanyPackage usePackage = companyPackageManager.getById(company.getCompanyPackageId());
+        BigDecimal subtract = changePackage.getMoney().divide(BigDecimal.valueOf(changePackage.getDay()))
+                .subtract(usePackage.getMoney().divide(BigDecimal.valueOf(usePackage.getDay())));
+        if (subtract.compareTo(BigDecimal.ZERO)<0){
+            return BigDecimal.ZERO;
+        }
+        long betweenDay = DateUtil.betweenDay(Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant()),
+                Date.from(company.getEndUseTime().atZone(ZoneId.systemDefault()).toInstant()),
+                true);
+        return subtract.multiply(BigDecimal.valueOf(betweenDay));
+    }
+
+
+
+    private void checkParam(Company convert) {
+        if (Pattern.matches(".*[\\u4e00-\\u9fa5\\p{P}].*", convert.getCreditCode())){
+            throw new ServiceException("统一社会信用代码不能包含中文和特殊符号");
+        }
+        if (ValidateUtil.checkRepeat(baseMapper, Company::getCreditCode, convert.getCreditCode(), Company::getId, convert.getId())) {
+            throw new ServiceException("统一社会代码已存在");
+        }
+        if (ValidateUtil.checkRepeat(baseMapper, Company::getName, convert.getName(), Company::getId, convert.getId())) {
+            throw new ServiceException("公司名称重复");
+        }
+    }
+}

+ 38 - 0
module-erp/src/main/java/com/hys/app/service/erp/impl/CompanyPackageManagerImpl.java

@@ -0,0 +1,38 @@
+package com.hys.app.service.erp.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.hys.app.converter.erp.CompanyPackageConverter;
+import com.hys.app.framework.exception.ServiceException;
+import com.hys.app.mapper.erp.CompanyPackageMapper;
+import com.hys.app.model.erp.entity.*;
+import com.hys.app.service.erp.CompanyPackageManager;
+import com.hys.app.util.ValidateUtil;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * 平台管理员业务类
+ *
+ * @author zh
+ * @version v7.0
+ * @since v7.0.0
+ * 2018-06-20 20:38:26
+ */
+@Service
+@AllArgsConstructor
+public class CompanyPackageManagerImpl extends ServiceImpl<CompanyPackageMapper, CompanyPackage> implements CompanyPackageManager {
+
+    @Override
+    public Long createCompanyPackage(CompanyPackageDO packageDo) {
+        CompanyPackage convert = CompanyPackageConverter.INSTANCE.convert(packageDo);
+        checkParam(convert);
+        save(convert);
+        return convert.getId();
+    }
+
+    private void checkParam(CompanyPackage convert) {
+        if (ValidateUtil.checkRepeat(baseMapper, CompanyPackage::getName, convert.getName(), CompanyPackage::getId, convert.getId())) {
+            throw new ServiceException("套餐名称重复");
+        }
+    }
+}

+ 40 - 50
module-erp/src/main/java/com/hys/app/service/erp/impl/GoodsManagerImpl.java

@@ -3,17 +3,16 @@ package com.hys.app.service.erp.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.hys.app.converter.erp.GoodsConverter;
 import com.hys.app.converter.erp.ProductStockConverter;
+import com.hys.app.framework.context.user.AdminUserContext;
 import com.hys.app.framework.database.BaseQueryParam;
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.framework.database.mybatisplus.base.BaseServiceImpl;
 import com.hys.app.framework.exception.ServiceException;
 import com.hys.app.framework.util.BeanUtils;
-import com.hys.app.mapper.goods.GoodsGalleryMapper;
 import com.hys.app.mapper.goods.GoodsMapper;
 import com.hys.app.model.erp.dos.AreaStock;
 import com.hys.app.model.erp.dos.GoodsDO;
@@ -28,6 +27,7 @@ import com.hys.app.service.erp.GoodsManager;
 import com.hys.app.service.erp.ProductManager;
 import com.hys.app.service.erp.ProductStockManager;
 import com.hys.app.service.goods.GoodsGalleryManager;
+import com.hys.app.util.ValidateUtil;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -54,7 +54,6 @@ public class GoodsManagerImpl extends BaseServiceImpl<GoodsMapper, GoodsDO> impl
     private ProductManager productManager;
     private GoodsGalleryManager goodsGalleryManager;
     private ProductStockConverter productStockConverter;
-    private GoodsGalleryMapper goodsGalleryMapper;
 
     @Override
     public WebPage<GoodsVO> list(GoodsQueryParams queryParams) {
@@ -70,32 +69,23 @@ public class GoodsManagerImpl extends BaseServiceImpl<GoodsMapper, GoodsDO> impl
         GoodsDO goodsDO = BeanUtil.copyProperties(goodsDTO, GoodsDO.class);
         List<ProductDO> bean = BeanUtils.toBean(goodsDTO.getProductList(), ProductDO.class);
         // 保存相册
-        super.save(goodsDO);
         this.goodsGalleryManager.add(goodsDTO.getImageList(), goodsDO.getId());
         GoodsGalleryDO goodsGallery = goodsGalleryManager.getGoodsGallery(goodsDTO.getImageList().get(0).getOriginal());
         goodsDO.setImageSmallList(goodsGallery.getSmall());
-        bean.forEach(item ->{
-            item.setGoodsId(goodsDO.getId());
-            item.setName(goodsDTO.getName());
-            item.setHireOrSail(goodsDO.getHireOrSail());
-        });
+        super.save(goodsDO);
+        bean.forEach(item ->item.setGoodsId(goodsDO.getId()));
         productManager.saveBatch(bean);
-        //前段skuid带不过来,先删除在新增在判断sku充不重复
-        for (ProductDO productDO : bean) {
-            long count = productManager.count(new LambdaQueryWrapper<ProductDO>().eq(ProductDO::getSku, productDO.getSku()));
-            if (count>1){
-                throw new ServiceException("sku已存在");
-            }
-        }
-
-
-
         for (int i = 1; i <= bean.size(); i++) {
             bean.get(i-1).setSort(bean.get(i-1).getId()+100000000*i);
         }
         productManager.updateBatchById(bean);
         //初始化库存
         productStockManager.intStock(bean,goodsDO);
+        ;
+
+        // 发送商品消息
+//        GoodsChangeMessage message = new GoodsChangeMessage(GoodsChangeMessage.GoodsChangeType.Add, goodsId);
+//        this.messageSender.send(new MqMessage(AmqpExchange.ERP_GOODS_CHANGE, AmqpExchange.ERP_GOODS_CHANGE + "_ROUTING", message));
     }
 
 
@@ -103,8 +93,9 @@ public class GoodsManagerImpl extends BaseServiceImpl<GoodsMapper, GoodsDO> impl
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void edit(GoodsDTO goodsDTO) {
-        GoodsDO goodsDO = getById(goodsDTO.getId());
+    public void edit(GoodsDTO goodsDTO,Long id) {
+        GoodsDO goodsDO = ValidateUtil.getOne(baseMapper, GoodsDO::getId, id, "商品");
+        AdminUserContext.compareCompany(goodsDO.getCompanyId());
         checkParams(goodsDTO);
         // 更新商品
         BeanUtil.copyProperties(goodsDTO, goodsDO);
@@ -112,21 +103,23 @@ public class GoodsManagerImpl extends BaseServiceImpl<GoodsMapper, GoodsDO> impl
         productManager.remove(new LambdaQueryWrapper<ProductDO>().eq(ProductDO::getGoodsId, goodsDTO.getId()));
         List<ProductDO> bean = BeanUtils.toBean(goodsDTO.getProductList(), ProductDO.class);
         // 保存相册
-        goodsGalleryMapper.delete(new LambdaQueryWrapper<GoodsGalleryDO>().eq(GoodsGalleryDO::getGoodsId,goodsDTO.getId()));
+        goodsGalleryManager.edit(goodsDTO.getImageList(), goodsDTO.getId());
         this.goodsGalleryManager.add(goodsDTO.getImageList(), goodsDO.getId());
         GoodsGalleryDO goodsGallery = goodsGalleryManager.getGoodsGallery(goodsDTO.getImageList().get(0).getOriginal());
         goodsDO.setImageSmallList(goodsGallery.getSmall());
         updateById(goodsDO);
-        bean.forEach(item ->{
-            item.setGoodsId(goodsDO.getId());
-            item.setName(goodsDTO.getName());
-            item.setHireOrSail(goodsDO.getHireOrSail());
-        });
+        bean.forEach(item -> item.setGoodsId(goodsDO.getId()));
         productManager.saveBatch(bean);
         for (int i = 1; i <= bean.size(); i++) {
             bean.get(i-1).setSort(bean.get(i-1).getId()+100000000*i);
         }
         productManager.updateBatchById(bean);
+
+
+
+        // 发送商品消息
+//        GoodsChangeMessage message = new GoodsChangeMessage(GoodsChangeMessage.GoodsChangeType.Edit, goodsDTO.getId());
+//        this.messageSender.send(new MqMessage(AmqpExchange.ERP_GOODS_CHANGE, AmqpExchange.ERP_GOODS_CHANGE + "_ROUTING", message));
     }
 
 
@@ -150,26 +143,26 @@ public class GoodsManagerImpl extends BaseServiceImpl<GoodsMapper, GoodsDO> impl
         }
 
         for (ProductDTO productDTO : goodsDTO.getProductList()) {
-//            ProductDO productDO = productManager.getOne(new LambdaQueryWrapper<ProductDO>()
-//                    .eq(ProductDO::getSku, productDTO.getSku())
-//                    .ne(ObjectUtil.isNotNull(productDTO.getId()), ProductDO::getId, productDTO.getId())
-//                    .last("limit 1"));
-//            if (ObjectUtil.isNotNull(productDO)) {
-//                throw new ServiceException("sku已存在");
-//            }
+            ProductDO productDO = productManager.getOne(new LambdaQueryWrapper<ProductDO>()
+                    .eq(ProductDO::getSku, productDTO.getSku())
+                    .ne(ObjectUtil.isNotNull(productDTO.getId()), ProductDO::getId, productDTO.getId())
+                    .last("limit 1"));
+            if (ObjectUtil.isNotNull(productDO)) {
+                throw new ServiceException("sku已存在");
+            }
             //校验sku是否包含中文
             Pattern pattern = Pattern.compile("[\\u4e00-\\u9fa5]");
             Matcher matcher = pattern.matcher(productDTO.getSku());
             if (matcher.find()){
                 throw new ServiceException("sku不能包含中文");
             }
-//            ProductDO codeOne = productManager.getOne(new LambdaQueryWrapper<ProductDO>()
-//                    .eq(ProductDO::getBarCode, productDTO.getBarCode())
-//                    .ne(ObjectUtil.isNotNull(productDTO.getId()), ProductDO::getId, productDTO.getId())
-//                    .last("limit 1"));
-//            if (ObjectUtil.isNotNull(codeOne)) {
-//                throw new ServiceException("条码已存在");
-//            }
+            ProductDO codeOne = productManager.getOne(new LambdaQueryWrapper<ProductDO>()
+                    .eq(ProductDO::getBarCode, productDTO.getBarCode())
+                    .ne(ObjectUtil.isNotNull(productDTO.getId()), ProductDO::getId, productDTO.getId())
+                    .last("limit 1"));
+            if (ObjectUtil.isNotNull(codeOne)) {
+                throw new ServiceException("条码已存在");
+            }
         }
     }
 
@@ -200,7 +193,8 @@ public class GoodsManagerImpl extends BaseServiceImpl<GoodsMapper, GoodsDO> impl
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void delete(Long id) {
-        GoodsDO goodsDO = getById(id);
+        GoodsDO goodsDO = ValidateUtil.getOne(baseMapper, GoodsDO::getId, id, "商品");
+        AdminUserContext.compareCompany(goodsDO.getCompanyId());
         if (goodsDO.getMarketEnable()) {
             throw new ServiceException("请先下架商品");
         }
@@ -232,18 +226,14 @@ public class GoodsManagerImpl extends BaseServiceImpl<GoodsMapper, GoodsDO> impl
 
     @Override
     public Page<ProductStockVO> getSkuByWarehouse(Long wareHouseId, BaseQueryParam queryParam) {
-        List<GoodsDO> list = list(new LambdaQueryWrapper<GoodsDO>().eq(GoodsDO::getMarketEnable, true));
+        List<GoodsDO> list = list(new LambdaQueryWrapper<GoodsDO>().eq(GoodsDO::getMarketEnable, true)
+                .eq(ObjectUtil.isNotNull(AdminUserContext.getCompanyId()),GoodsDO::getCompanyId,AdminUserContext.getCompanyId()));
         List<Long> collect = list.stream().map(GoodsDO::getId).collect(Collectors.toList());
         Page<ProductStockDO> page = new Page<>(queryParam.getPageNo(), queryParam.getPageSize());
         Page<ProductStockDO> page1 = productStockManager.page(page, new LambdaQueryWrapper<ProductStockDO>()
                 .eq(ObjectUtil.isNotNull(wareHouseId), ProductStockDO::getWarehouseId, wareHouseId)
-                .in(CollUtil.isNotEmpty(collect),ProductStockDO::getGoodsId, collect)
-                .and(StrUtil.isNotBlank(queryParam.getKeyWord()), wa -> wa
-                        .like(ProductStockDO::getGoodsName, queryParam.getKeyWord())
-                        .or()
-                        .like(ProductStockDO::getGoodsBarCode, queryParam.getKeyWord())
-                        .or()
-                        .like(ProductStockDO::getGoodsSnCode, queryParam.getKeyWord())));
+                .eq(ObjectUtil.isNotNull(AdminUserContext.getCompanyId()), ProductStockDO::getCompanyId, AdminUserContext.getCompanyId())
+                .in(CollUtil.isNotEmpty(collect),ProductStockDO::getGoodsId, collect));
         Page<ProductStockVO> convert = productStockConverter.convert(page1);
         for (ProductStockVO record : convert.getRecords()) {
             record.setGoodsVO(BeanUtil.copyProperties(getById(record.getGoodsId()),GoodsVO.class));

+ 74 - 0
module-erp/src/main/java/com/hys/app/service/erp/impl/MailSmsCountManagerImpl.java

@@ -0,0 +1,74 @@
+package com.hys.app.service.erp.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+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.hys.app.converter.erp.MailSmsCompanyConverter;
+import com.hys.app.framework.context.user.AdminUserContext;
+import com.hys.app.framework.database.mybatisplus.base.BaseServiceImpl;
+import com.hys.app.mapper.erp.MailSmsCountMapper;
+import com.hys.app.model.erp.dos.MailSmsCountDO;
+import com.hys.app.model.erp.entity.MailSmsCountQuery;
+import com.hys.app.model.erp.vo.MailSmsCountVO;
+import com.hys.app.service.erp.MailSmsCountManager;
+import com.hys.app.util.AliSmsUtil;
+import com.hys.app.util.MailSmtpUtil;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * 订单业务层实现
+ *
+ * @author 张崧
+ * 2024-01-24 15:58:31
+ */
+@Service
+@AllArgsConstructor
+public class MailSmsCountManagerImpl extends BaseServiceImpl<MailSmsCountMapper, MailSmsCountDO> implements MailSmsCountManager {
+
+    @Override
+    public IPage<MailSmsCountVO> getPage(MailSmsCountQuery query) {
+        Page<MailSmsCountDO> page = page(new Page<>(query.getPageNo(), query.getPageSize()),
+                new LambdaQueryWrapper<MailSmsCountDO>()
+                        .eq(ObjectUtil.isNotNull(query.getCompanyId()), MailSmsCountDO::getCompanyId, query.getCompanyId()));
+        return MailSmsCompanyConverter.INSTANCE.convert(page);
+    }
+
+    @Override
+    public void sendSms(String rePhone, String templateCode, Map<String, String> map) {
+        try {
+            if (AliSmsUtil.sendSms(rePhone, templateCode, map)) {
+                addNum("mail");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void sendEmail(String toMail, String subject, String content) {
+        if (MailSmtpUtil.sendEmail(toMail, subject, content)) {
+            addNum("sms");
+        }
+    }
+
+    private void addNum(String type) {
+        Long companyId = AdminUserContext.getCompanyId();
+        MailSmsCountDO mailSmsCountDO = getOne(new LambdaQueryWrapper<MailSmsCountDO>().eq(MailSmsCountDO::getCompanyId, companyId));
+        if (ObjectUtil.isNull(mailSmsCountDO)) {
+            mailSmsCountDO = new MailSmsCountDO();
+            mailSmsCountDO.setCompanyId(companyId);
+        }
+        if ("sms".equals(type)) {
+            mailSmsCountDO.setSmsNum(mailSmsCountDO.getSmsNum() + 1);
+        } else if ("mail".equals(type)) {
+            mailSmsCountDO.setMailNum(mailSmsCountDO.getMailNum() + 1);
+        }
+        saveOrUpdate(mailSmsCountDO);
+    }
+
+}
+

+ 38 - 27
module-erp/src/main/java/com/hys/app/service/erp/impl/ProductStockManagerImpl.java

@@ -7,11 +7,13 @@ 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.hys.app.converter.erp.ProductStockConverter;
+import com.hys.app.framework.context.user.AdminUserContext;
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.framework.exception.ServiceException;
 import com.hys.app.framework.database.mybatisplus.base.BaseServiceImpl;
 import com.hys.app.framework.util.PageConvert;
 import com.hys.app.mapper.erp.ProductStockMapper;
+import com.hys.app.mapper.goods.GoodsMapper;
 import com.hys.app.mapper.goods.ProductMapper;
 import com.hys.app.model.erp.dos.GoodsDO;
 import com.hys.app.model.erp.dos.ProductDO;
@@ -19,6 +21,7 @@ import com.hys.app.model.erp.dos.ProductStockDO;
 import com.hys.app.model.erp.dos.WarehouseDO;
 import com.hys.app.model.erp.dto.ProductStockQueryParams;
 import com.hys.app.model.erp.dto.StockDTO;
+import com.hys.app.model.erp.dto.WarehouseQueryParams;
 import com.hys.app.model.erp.enums.StockOperateEnum;
 import com.hys.app.model.erp.vo.ProductStockV1;
 import com.hys.app.model.erp.vo.ProductStockVO;
@@ -59,6 +62,9 @@ public class ProductStockManagerImpl extends BaseServiceImpl<ProductStockMapper,
     @Autowired
     private ProductStockMapper productStockMapper;
 
+    @Autowired
+    private GoodsMapper goodsMapper;
+
     @Override
     public WebPage<ProductStockVO> list(ProductStockQueryParams queryParams) {
         WebPage<ProductStockDO> webPage = baseMapper.selectPage(queryParams);
@@ -78,6 +84,7 @@ public class ProductStockManagerImpl extends BaseServiceImpl<ProductStockMapper,
      */
     @Override
     public List<ProductStockV1> selectList(ProductStockQueryParams request) {
+        request.setCompanyId(AdminUserContext.getCompanyId());
         List<ProductStockV1> productStockV1s = baseMapper.queryList(request);
         for (ProductStockV1 productStockV1 : productStockV1s) {
             productStockV1.setProductVO(productMapper.selectById(productStockV1.getProductId()));
@@ -114,18 +121,21 @@ public class ProductStockManagerImpl extends BaseServiceImpl<ProductStockMapper,
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void initStockByWarehouse(Long warehouseId) {
-        List<ProductDO> list = productMapper.selectList();
-        if (CollUtil.isNotEmpty(list)){
-            List<ProductStockDO> arrayList = new ArrayList<>();
-            for (ProductDO aDo : list) {
-                ProductStockDO aDo1 = new ProductStockDO();
-                aDo1.setWarehouseId(warehouseId);
-                aDo1.setGoodsId(aDo.getGoodsId());
-                aDo1.setProductId(aDo.getId());
-                arrayList.add(aDo1);
-            }
-            saveBatch(arrayList);
+        List<ProductDO> list = productMapper.selectList(new LambdaQueryWrapper<ProductDO>().eq(ProductDO::getCompanyId, AdminUserContext.hasCompany()));
+        List<ProductStockDO> arrayList = new ArrayList<>();
+        for (ProductDO aDo : list) {
+            GoodsDO goodsDO = goodsMapper.selectById(aDo.getGoodsId());
+            ProductStockDO aDo1 = new ProductStockDO();
+            aDo1.setWarehouseId(warehouseId);
+            aDo1.setGoodsId(aDo.getGoodsId());
+            aDo1.setGoodsName(goodsDO.getName());
+            aDo1.setGoodsBarCode(aDo.getSku());
+            aDo1.setGoodsSnCode(goodsDO.getSn());
+            aDo1.setHireOrSail(aDo.getHireOrSail());
+            aDo1.setProductId(aDo.getId());
+            arrayList.add(aDo1);
         }
+        saveBatch(arrayList);
     }
 
     @Override
@@ -228,9 +238,9 @@ public class ProductStockManagerImpl extends BaseServiceImpl<ProductStockMapper,
 
     @Override
     public void intStock(List<ProductDO> bean, GoodsDO goodsDO) {
-        List<ProductStockDO> arrayList = new ArrayList<>();
-        List<WarehouseDO> list = warehouseManager.list();
+        List<WarehouseDO> list = warehouseManager.list(new LambdaQueryWrapper<WarehouseDO>().eq(WarehouseDO::getCompanyId, AdminUserContext.hasCompany()));
         if (CollUtil.isNotEmpty(list)) {
+            List<ProductStockDO> arrayList = new ArrayList<>();
             for (ProductDO aDo : bean) {
                 for (WarehouseDO warehouseDO : list) {
                     ProductStockDO aDo1 = new ProductStockDO();
@@ -239,6 +249,7 @@ public class ProductStockManagerImpl extends BaseServiceImpl<ProductStockMapper,
                     aDo1.setGoodsName(goodsDO.getName());
                     aDo1.setGoodsBarCode(aDo.getSku());
                     aDo1.setGoodsSnCode(goodsDO.getSn());
+                    aDo1.setHireOrSail(aDo.getHireOrSail());
                     aDo1.setProductId(aDo.getId());
                     arrayList.add(aDo1);
                 }
@@ -248,35 +259,35 @@ public class ProductStockManagerImpl extends BaseServiceImpl<ProductStockMapper,
     }
 
     @Override
-    public void updateLockedStock(List<StockDTO>  ids ) {
+    public void updateLockedStock(List<StockDTO> ids) {
         List<Long> collect = ids.stream().map(StockDTO::getId).collect(Collectors.toList());
-        List<ProductStockDO> list = list(new LambdaQueryWrapper<ProductStockDO>().in(ProductStockDO::getId,collect));
-        if (list.size() != ids.size()){
+        List<ProductStockDO> list = list(new LambdaQueryWrapper<ProductStockDO>().in(ProductStockDO::getId, collect));
+        if (list.size() != ids.size()) {
             throw new ServiceException("部分库存信息记录未查询到");
         }
         for (ProductStockDO aDo : list) {
             StockDTO stockDTO = ids.stream().filter(item -> item.getId().equals(aDo.getId())).findFirst().get();
-           Integer currentLocked = aDo.getLockedStock()+stockDTO.getNum();
+            Integer currentLocked = aDo.getLockedStock() + stockDTO.getNum();
             aDo.setLockedStock(currentLocked);
-            aDo.setUsableStock(aDo.getActualStock()-currentLocked);
+            aDo.setUsableStock(aDo.getActualStock() - currentLocked);
         }
         updateBatchById(list);
     }
 
     @Override
-    public void updateActualStock(List<StockDTO>  ids,String inventory) {
+    public void updateActualStock(List<StockDTO> ids, String inventory) {
         List<Long> collect = ids.stream().map(StockDTO::getId).collect(Collectors.toList());
-        List<ProductStockDO> list = list(new LambdaQueryWrapper<ProductStockDO>().in(ProductStockDO::getId,collect));
-        if (list.size() != ids.size()){
+        List<ProductStockDO> list = list(new LambdaQueryWrapper<ProductStockDO>().in(ProductStockDO::getId, collect));
+        if (list.size() != ids.size()) {
             throw new ServiceException("部分库存信息记录未查询到");
         }
         for (ProductStockDO aDo : list) {
             StockDTO stockDTO = ids.stream().filter(item -> item.getId().equals(aDo.getId())).findFirst().get();
-            aDo.setActualStock(aDo.getActualStock()+stockDTO.getNum());
-            if (StrUtil.isNotBlank(inventory) && "inventory".equals(inventory)){
+            aDo.setActualStock(aDo.getActualStock() + stockDTO.getNum());
+            if (StrUtil.isNotBlank(inventory) && "inventory".equals(inventory)) {
                 aDo.setActualStock(stockDTO.getNum());
             }
-            aDo.setUsableStock(aDo.getActualStock()-aDo.getLockedStock());
+            aDo.setUsableStock(aDo.getActualStock() - aDo.getLockedStock());
         }
         updateBatchById(list);
     }
@@ -284,13 +295,13 @@ public class ProductStockManagerImpl extends BaseServiceImpl<ProductStockMapper,
     @Override
     public void updateTransitStock(List<StockDTO> ids) {
         List<Long> collect = ids.stream().map(StockDTO::getId).collect(Collectors.toList());
-        List<ProductStockDO> list = list(new LambdaQueryWrapper<ProductStockDO>().in(ProductStockDO::getId,collect));
-        if (list.size() != ids.size()){
+        List<ProductStockDO> list = list(new LambdaQueryWrapper<ProductStockDO>().in(ProductStockDO::getId, collect));
+        if (list.size() != ids.size()) {
             throw new ServiceException("部分库存信息记录未查询到");
         }
         for (ProductStockDO aDo : list) {
             StockDTO stockDTO = ids.stream().filter(item -> item.getId().equals(aDo.getId())).findFirst().get();
-            aDo.setTransitStock(aDo.getTransitStock()+stockDTO.getNum());
+            aDo.setTransitStock(aDo.getTransitStock() + stockDTO.getNum());
         }
         updateBatchById(list);
     }

+ 133 - 0
module-erp/src/main/java/com/hys/app/service/erp/impl/SmsMailManagerImpl.java

@@ -0,0 +1,133 @@
+package com.hys.app.service.erp.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.dysmsapi.model.v20170525.QuerySmsTemplateRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.QuerySmsTemplateResponse;
+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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.hys.app.converter.erp.SmsMailConverter;
+import com.hys.app.framework.exception.ServiceException;
+import com.hys.app.mapper.erp.SmsMailMapper;
+import com.hys.app.model.erp.dos.SmsMailTemplate;
+import com.hys.app.model.erp.dto.SmsMailTemplateDTO;
+import com.hys.app.model.erp.enums.MsgTypeEnum;
+
+import com.hys.app.model.erp.vo.SmsMailTemplateQuery;
+import com.hys.app.model.erp.vo.SmsMailTemplateVO;
+import com.hys.app.service.erp.SmsMailManager;
+import com.hys.app.util.AliSmsUtil;
+import com.hys.app.util.ValidateUtil;
+import lombok.AllArgsConstructor;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * 平台管理员业务类
+ *
+ * @author zh
+ * @version v7.0
+ * @since v7.0.0
+ * 2018-06-20 20:38:26
+ */
+@Service
+@AllArgsConstructor
+public class SmsMailManagerImpl extends ServiceImpl<SmsMailMapper, SmsMailTemplate> implements SmsMailManager {
+
+    @Override
+    public Long createTemplate(SmsMailTemplateDTO smsMailTemplateDTO) {
+        SmsMailTemplate convert = SmsMailConverter.INSTANCE.convert(smsMailTemplateDTO);
+        checkParam(convert);
+        //如果是短信模板向短信平台提交申请
+        String smsTemplateCode = AliSmsUtil.createSmsTemplate(smsMailTemplateDTO.getTemplateType(), smsMailTemplateDTO.getName(), smsMailTemplateDTO.getContent(), smsMailTemplateDTO.getRemark());
+        convert.setTemplateCode(smsTemplateCode);
+        save(convert);
+        return convert.getId();
+    }
+
+    @Override
+    public Long updateTemplate(SmsMailTemplateDTO smsMailTemplateDTO, Long id) {
+        SmsMailTemplate template = ValidateUtil.getOne(baseMapper, SmsMailTemplate::getId, id, "模板");
+        if (template.getType().equals(MsgTypeEnum.SMS) && template.getAuditStatus()) {
+            throw new ServiceException("已审核通过的模板不允许修改,如有需求变动另建模板");
+        }
+        BeanUtil.copyProperties(smsMailTemplateDTO, template);
+        if (template.getType().equals(MsgTypeEnum.SMS)) {
+            //如果是短信模板向短信平台提交申请
+            String smsTemplateCode = AliSmsUtil.createSmsTemplate(smsMailTemplateDTO.getTemplateType(), smsMailTemplateDTO.getName(), smsMailTemplateDTO.getContent(), smsMailTemplateDTO.getRemark());
+            template.setTemplateCode(smsTemplateCode);
+            updateById(template);
+            return template.getId();
+        }
+        return null;
+    }
+    @Override
+    public IPage<SmsMailTemplateVO> queryTemplate(SmsMailTemplateQuery query) {
+        Page<SmsMailTemplate> page = page(new Page<>(query.getPageNo(), query.getPageSize()), new LambdaQueryWrapper<SmsMailTemplate>()
+                .eq(ObjectUtil.isNotNull(query.getType()), SmsMailTemplate::getType, query.getType())
+                .eq(ObjectUtil.isNotNull(query.getEnableStatus()), SmsMailTemplate::getEnableStatus, query.getEnableStatus())
+                .like(StrUtil.isNotBlank(query.getCode()), SmsMailTemplate::getCode, query.getCode())
+                .like(StrUtil.isNotBlank(query.getName()), SmsMailTemplate::getName, query.getName()));
+        return SmsMailConverter.INSTANCE.convert(page);
+    }
+
+    @Override
+    public void delete(Long id) {
+        SmsMailTemplate template = ValidateUtil.getOne(baseMapper, SmsMailTemplate::getId, id, "模板");
+        if (template.getType().equals(MsgTypeEnum.SMS) && template.getAuditStatus()) {
+            throw new ServiceException("已审核通过的模板不允许修改和删除");
+        }
+        removeById(id);
+    }
+
+    private void checkParam(SmsMailTemplate smsMailTemplate) {
+        if (Pattern.matches(".*[\\u4e00-\\u9fa5\\p{P}].*", smsMailTemplate.getCode())) {
+            throw new ServiceException("自定义编码不能包含中文和特殊符号");
+        }
+        if (ValidateUtil.checkRepeat(baseMapper, SmsMailTemplate::getCode, smsMailTemplate.getCode(), SmsMailTemplate::getId, smsMailTemplate.getId())) {
+            throw new ServiceException("编码已存在");
+        }
+        if (ValidateUtil.checkRepeat(baseMapper, SmsMailTemplate::getName, smsMailTemplate.getName(), SmsMailTemplate::getId, smsMailTemplate.getId())) {
+            throw new ServiceException("模板名称重复");
+        }
+        if (smsMailTemplate.getType().equals(MsgTypeEnum.MAIL)) {
+            smsMailTemplate.setAuditStatus(true);
+        }
+    }
+
+
+    @Scheduled(cron = "0 0 1 * * ?")  // 每天凌晨1点执行查看哪些没有审核通过的模板的查询
+    public void updateTemplateStatus() throws Exception {
+        List<SmsMailTemplate> list = list(new LambdaQueryWrapper<SmsMailTemplate>()
+                .eq(SmsMailTemplate::getType, MsgTypeEnum.SMS).eq(SmsMailTemplate::getAuditStatus, false)
+                .eq(SmsMailTemplate::getEnableStatus, true));
+        for (SmsMailTemplate template : list) {
+            // 初始化客户端
+            IAcsClient client = AliSmsUtil.getIAcsClient();
+            // 创建查询请求并设置参数
+            QuerySmsTemplateRequest request = new QuerySmsTemplateRequest();
+            request.setTemplateCode(template.getTemplateCode());
+            // 发起请求并处理响应
+            QuerySmsTemplateResponse response = client.getAcsResponse(request);
+            if ("OK".equals(response.getCode())) {
+                System.out.println("查询成功");
+                if (response.getTemplateStatus() == 1) {
+                    template.setAuditStatus(true);
+                    template.setFailReason("");
+                }
+                if (response.getTemplateStatus() == 2) {
+                    template.setAuditStatus(false);
+                    template.setFailReason(response.getReason());
+                }
+            }
+        }
+        updateBatchById(list);
+    }
+}

+ 40 - 39
module-erp/src/main/java/com/hys/app/service/erp/impl/StockDamageReportManagerImpl.java

@@ -10,6 +10,7 @@ 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.hys.app.framework.context.user.AdminUserContext;
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.framework.exception.ServiceException;
 import com.hys.app.framework.rabbitmq.MessageSender;
@@ -77,6 +78,7 @@ public class StockDamageReportManagerImpl extends ServiceImpl<StockDamageReportM
     public WebPage list(StockDamageReportParam params) {
         Page<StockDamageReport> page = page(new Page<>(params.getPageNo(), params.getPageSize()), new LambdaQueryWrapper<StockDamageReport>()
                 .eq(ObjectUtil.isNotNull(params.getWarehouseId()), StockDamageReport::getWarehouseId, params.getWarehouseId())
+                .eq(ObjectUtil.isNotNull(AdminUserContext.getCompanyId()), StockDamageReport::getCompanyId, AdminUserContext.getCompanyId())
                 .between(ObjectUtil.isNotNull(params.getStartTime()) && ObjectUtil.isNotNull(params.getEndTime()), StockDamageReport::getReportTime, params.getStartTime(), params.getEndTime()));
         return PageConvert.convert(page);
     }
@@ -100,21 +102,20 @@ public class StockDamageReportManagerImpl extends ServiceImpl<StockDamageReportM
             if (aDo.getActualStock() < dto.getReportNum()) {
                 throw new ServiceException("报损数量不能能大于库存数量");
             }
-
-            ProductDO manager = productManager.getById(dto.getProductId());
-            if (manager.getHaveSn()) {
-                if (CollUtil.isEmpty(dto.getSnCodeList())) {
-                    throw new ServiceException(manager.getId() + ":有序列号的商品出库需要录入序列号");
-                }
-                if (dto.getReportNum() != dto.getSnCodeList().size()) {
-                    throw new ServiceException(manager.getId() + ":出库的数量须和序列号的个数相等");
-                }
-                Set<Long> set = dto.getSnCodeList().stream().map(GoodsSnDO::getId).collect(Collectors.toSet());
-                if (set.size() != dto.getSnCodeList().size()){
-                    throw new ServiceException("序列号重复");
-                }
-
-            }
+//            ProductDO manager = productManager.getById(dto.getProductId());
+//            if (manager.getHaveSn()) {
+//                if (CollUtil.isEmpty(dto.getSnCodeList())) {
+//                    throw new ServiceException(manager.getId() + ":有序列号的商品出库需要录入序列号");
+//                }
+//                if (dto.getReportNum() != dto.getSnCodeList().size()) {
+//                    throw new ServiceException(manager.getId() + ":出库的数量须和序列号的个数相等");
+//                }
+//                Set<Long> set = dto.getSnCodeList().stream().map(GoodsSnDO::getId).collect(Collectors.toSet());
+//                if (set.size() != dto.getSnCodeList().size()){
+//                    throw new ServiceException("序列号重复");
+//                }
+//
+//            }
         }
         //生成库存报损单编号
         String sn = noGenerateManager.generate(NoBusinessTypeEnum.StockDamageReport);
@@ -124,30 +125,30 @@ public class StockDamageReportManagerImpl extends ServiceImpl<StockDamageReportM
         bean.forEach(item -> item.setReportId(report.getId()));
         stockDamageReportProductManager.saveBatch(bean);
 
-        List<ItemSnCodeDO> itemSnCodeDOS = new ArrayList<>();
-        //更爱序列号的状态
-        List<GoodsSnDO> snList = new ArrayList<>();
-        //如果有序列号,保存序列号和入库单的关系,更爱序列号的状态
-        for (StockDamageReportProductDTO aDo : stockDamageReportDTO.getProductList()) {
-            if (CollUtil.isNotEmpty(aDo.getSnCodeList())) {
-                StockDamageReportProduct product = bean.stream().filter(item -> item.getProductId().equals(aDo.getProductId())).findFirst().get();
-                aDo.getSnCodeList().forEach(item -> {
-                    ItemSnCodeDO itemSnCodeDO = new ItemSnCodeDO();
-                    itemSnCodeDO.setItemId(product.getId());
-                    itemSnCodeDO.setEntryOutHouseId(report.getWarehouseId());
-                    itemSnCodeDO.setType("damage");
-                    itemSnCodeDO.setSnCodeId(item.getId());
-                    itemSnCodeDOS.add(itemSnCodeDO);
-                    item.setStatus(SnCodeStatusEnum.DISABLE_USE);
-                    item.setOutHouseId(null);
-                    item.setEntryHouseId(null);
-                    snList.add(item);
-                });
-            }
-        }
-        //保存序列号和子表的关系
-        itemSnCodeManager.saveBatch(itemSnCodeDOS);
-        goodsSnManager.updateBatchById(snList);
+//        List<ItemSnCodeDO> itemSnCodeDOS = new ArrayList<>();
+//        //更爱序列号的状态
+//        List<GoodsSnDO> snList = new ArrayList<>();
+//        //如果有序列号,保存序列号和入库单的关系,更爱序列号的状态
+//        for (StockDamageReportProductDTO aDo : stockDamageReportDTO.getProductList()) {
+//            if (CollUtil.isNotEmpty(aDo.getSnCodeList())) {
+//                StockDamageReportProduct product = bean.stream().filter(item -> item.getProductId().equals(aDo.getProductId())).findFirst().get();
+//                aDo.getSnCodeList().forEach(item -> {
+//                    ItemSnCodeDO itemSnCodeDO = new ItemSnCodeDO();
+//                    itemSnCodeDO.setItemId(product.getId());
+//                    itemSnCodeDO.setEntryOutHouseId(report.getWarehouseId());
+//                    itemSnCodeDO.setType("damage");
+//                    itemSnCodeDO.setSnCodeId(item.getId());
+//                    itemSnCodeDOS.add(itemSnCodeDO);
+//                    item.setStatus(SnCodeStatusEnum.DISABLE_USE);
+//                    item.setOutHouseId(null);
+//                    item.setEntryHouseId(null);
+//                    snList.add(item);
+//                });
+//            }
+//        }
+//        //保存序列号和子表的关系
+//        itemSnCodeManager.saveBatch(itemSnCodeDOS);
+//        goodsSnManager.updateBatchById(snList);
     }
 
 

+ 39 - 37
module-erp/src/main/java/com/hys/app/service/erp/impl/StockInventoryManagerImpl.java

@@ -7,6 +7,7 @@ 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.hys.app.framework.context.user.AdminUserContext;
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.framework.exception.ServiceException;
 
@@ -71,6 +72,7 @@ public class StockInventoryManagerImpl extends ServiceImpl<StockInventoryMapper,
     public WebPage list(StockInventoryParam params) {
         Page<StockInventory> page = page(new Page<>(params.getPageNo(), params.getPageSize()), new LambdaQueryWrapper<StockInventory>()
                 .eq(ObjectUtil.isNotNull(params.getWarehouseId()), StockInventory::getWarehouseId, params.getWarehouseId())
+                .eq(ObjectUtil.isNotNull(AdminUserContext.getCompanyId()), StockInventory::getCompanyId, AdminUserContext.getCompanyId())
                 .eq(ObjectUtil.isNotNull(params.getInventoryPersonId()), StockInventory::getInventoryPersonId, params.getWarehouseId())
                 .between(ObjectUtil.isNotNull(params.getStartTime()) && ObjectUtil.isNotNull(params.getEndTime()), StockInventory::getInventoryTime, params.getStartTime(), params.getEndTime()));
         return PageConvert.convert(page);
@@ -92,12 +94,12 @@ public class StockInventoryManagerImpl extends ServiceImpl<StockInventoryMapper,
         List<StockInventoryProduct> list = BeanUtils.toBean(stockInventoryDTO.getProductList(), StockInventoryProduct.class);
         list.forEach(item -> item.setInventoryId(copied.getId()));
         this.stockInventoryProductManager.saveBatch(list);
-        //如果这个商品有序列号补习不全序列号关系
-        for (StockInventoryProductDTO dto : stockInventoryDTO.getProductList()) {
-            StockInventoryProduct product = list.stream().filter(item -> item.getProductId().equals(dto.getProductId())).findFirst().get();
-            dto.setId(product.getId());
-        }
-        saveSnCode(copied.getId(), stockInventoryDTO.getProductList());
+//        //如果这个商品有序列号补习不全序列号关系
+//        for (StockInventoryProductDTO dto : stockInventoryDTO.getProductList()) {
+//            StockInventoryProduct product = list.stream().filter(item -> item.getProductId().equals(dto.getProductId())).findFirst().get();
+//            dto.setId(product.getId());
+//        }
+//        saveSnCode(copied.getId(), stockInventoryDTO.getProductList());
 
     }
 
@@ -119,13 +121,13 @@ public class StockInventoryManagerImpl extends ServiceImpl<StockInventoryMapper,
         List<StockInventoryProduct> list = BeanUtils.toBean(stockInventoryDTO.getProductList(), StockInventoryProduct.class);
         list.forEach(item -> item.setInventoryId(id));
         this.stockInventoryProductManager.saveBatch(list);
-        //如果这个商品有序列号补习不全序列号关系
-        for (StockInventoryProductDTO dto : stockInventoryDTO.getProductList()) {
-            StockInventoryProduct product = list.stream().filter(item -> item.getProductId().equals(dto.getProductId())).findFirst().get();
-            dto.setId(product.getId());
-        }
-        itemSnCodeManager.remove(new LambdaQueryWrapper<ItemSnCodeDO>().eq(ItemSnCodeDO::getEntryOutHouseId, id));
-        saveSnCode(id, stockInventoryDTO.getProductList());
+//        //如果这个商品有序列号补习不全序列号关系
+//        for (StockInventoryProductDTO dto : stockInventoryDTO.getProductList()) {
+//            StockInventoryProduct product = list.stream().filter(item -> item.getProductId().equals(dto.getProductId())).findFirst().get();
+//            dto.setId(product.getId());
+//        }
+//        itemSnCodeManager.remove(new LambdaQueryWrapper<ItemSnCodeDO>().eq(ItemSnCodeDO::getEntryOutHouseId, id));
+//        saveSnCode(id, stockInventoryDTO.getProductList());
     }
 
 
@@ -188,30 +190,30 @@ public class StockInventoryManagerImpl extends ServiceImpl<StockInventoryMapper,
         }
         productStockManager.updateActualStock(listStock, "inventory");
         //更新序列号的关系
-        GoodsSnDO snDO = new GoodsSnDO();
-        snDO.setEntryHouseId(null);
-        snDO.setInventoryId(null);
-        snDO.setOutHouseId(null);
-        snDO.setWarehouseId(null);
-        snDO.setStatus(SnCodeStatusEnum.NOT_USED);
-        goodsSnManager.update(snDO, new LambdaQueryWrapper<GoodsSnDO>()
-                .eq(GoodsSnDO::getWarehouseId, stockInventory.getWarehouseId())
-                .in(GoodsSnDO::getProductId, goodsList.stream().map(StockInventoryProduct::getProductId).collect(Collectors.toList())));
-        //找到这个订单关联的所有序列号
-        List<ItemSnCodeDO> listed = itemSnCodeManager.list(new LambdaQueryWrapper<ItemSnCodeDO>()
-                .eq(ItemSnCodeDO::getType, "inventory").eq(ItemSnCodeDO::getEntryOutHouseId, id));
-        if (CollUtil.isNotEmpty(listed)) {
-            List<GoodsSnDO> goodsSnDOS = goodsSnManager.list(new LambdaQueryWrapper<GoodsSnDO>().in(GoodsSnDO::getId, listed.stream().map(ItemSnCodeDO::getSnCodeId).collect(Collectors.toList())));
-            //更爱序列号状态
-            for (GoodsSnDO aDo : goodsSnDOS) {
-                aDo.setStatus(SnCodeStatusEnum.IN_WAREHOUSE);
-                aDo.setInventoryId(id);
-                aDo.setWarehouseId(stockInventory.getWarehouseId());
-                aDo.setInventoryId(id);
-            }
-            goodsSnManager.updateBatchById(goodsSnDOS);
-        }
-        redisTemplate.delete(id.toString());
+//        GoodsSnDO snDO = new GoodsSnDO();
+//        snDO.setEntryHouseId(null);
+//        snDO.setInventoryId(null);
+//        snDO.setOutHouseId(null);
+//        snDO.setWarehouseId(null);
+//        snDO.setStatus(SnCodeStatusEnum.NOT_USED);
+//        goodsSnManager.update(snDO, new LambdaQueryWrapper<GoodsSnDO>()
+//                .eq(GoodsSnDO::getWarehouseId, stockInventory.getWarehouseId())
+//                .in(GoodsSnDO::getProductId, goodsList.stream().map(StockInventoryProduct::getProductId).collect(Collectors.toList())));
+//        //找到这个订单关联的所有序列号
+//        List<ItemSnCodeDO> listed = itemSnCodeManager.list(new LambdaQueryWrapper<ItemSnCodeDO>()
+//                .eq(ItemSnCodeDO::getType, "inventory").eq(ItemSnCodeDO::getEntryOutHouseId, id));
+//        if (CollUtil.isNotEmpty(listed)) {
+//            List<GoodsSnDO> goodsSnDOS = goodsSnManager.list(new LambdaQueryWrapper<GoodsSnDO>().in(GoodsSnDO::getId, listed.stream().map(ItemSnCodeDO::getSnCodeId).collect(Collectors.toList())));
+//            //更爱序列号状态
+//            for (GoodsSnDO aDo : goodsSnDOS) {
+//                aDo.setStatus(SnCodeStatusEnum.IN_WAREHOUSE);
+//                aDo.setInventoryId(id);
+//                aDo.setWarehouseId(stockInventory.getWarehouseId());
+//                aDo.setInventoryId(id);
+//            }
+//            goodsSnManager.updateBatchById(goodsSnDOS);
+//        }
+//        redisTemplate.delete(id.toString());
     }
 
 

+ 136 - 139
module-erp/src/main/java/com/hys/app/service/erp/impl/WarehouseEntryManagerImpl.java

@@ -3,8 +3,6 @@ package com.hys.app.service.erp.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.IoUtil;
-import cn.hutool.core.util.IdUtil;
-import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.poi.excel.ExcelUtil;
 import cn.hutool.poi.excel.ExcelWriter;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -20,7 +18,6 @@ import com.hys.app.framework.database.mybatisplus.base.BaseServiceImpl;
 import com.hys.app.framework.exception.ServiceException;
 import com.hys.app.framework.rabbitmq.MessageSender;
 import com.hys.app.framework.rabbitmq.MqMessage;
-import com.hys.app.framework.util.BeanUtils;
 import com.hys.app.framework.util.CurrencyUtil;
 import com.hys.app.framework.util.JsonUtil;
 import com.hys.app.framework.util.PageConvert;
@@ -34,15 +31,15 @@ import com.hys.app.model.erp.dos.*;
 import com.hys.app.model.erp.dto.*;
 import com.hys.app.model.erp.dto.message.WarehouseEntryAuditPassMessage;
 import com.hys.app.model.erp.enums.*;
-import com.hys.app.model.erp.vo.*;
+import com.hys.app.model.erp.vo.WarehouseEntryAllowable;
+import com.hys.app.model.erp.vo.WarehouseEntryStatistics;
+import com.hys.app.model.erp.vo.WarehouseEntryVO;
 import com.hys.app.model.goods.dos.CategoryDO;
 import com.hys.app.model.system.vo.SiteSetting;
 import com.hys.app.service.base.service.SettingManager;
 import com.hys.app.service.erp.*;
 import com.hys.app.service.goods.CategoryManager;
 import lombok.AllArgsConstructor;
-import org.jetbrains.annotations.NotNull;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -103,7 +100,7 @@ public class WarehouseEntryManagerImpl extends BaseServiceImpl<WarehouseEntryMap
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long add(WarehouseEntryDTO warehouseEntryDTO) {
-        check(warehouseEntryDTO);
+//        check(warehouseEntryDTO);
         // 保存入库单
         WarehouseEntryDO warehouseEntryDO = BeanUtil.copyProperties(warehouseEntryDTO, WarehouseEntryDO.class);
         warehouseEntryDO.setSn(noGenerateManager.generate(NoBusinessTypeEnum.WarehouseEntry));
@@ -118,9 +115,9 @@ public class WarehouseEntryManagerImpl extends BaseServiceImpl<WarehouseEntryMap
             productList.add(productDO);
         }
         warehouseEntryProductManager.saveBatch(productList);
-        //保存子表和序列号的关系
-        warehouseEntryDTO.setId(warehouseEntryDO.getId());
-        saveSnCode(warehouseEntryDTO.getId(), productList);
+//        //保存子表和序列号的关系
+//        warehouseEntryDTO.setId(warehouseEntryDO.getId());
+//        saveSnCode(warehouseEntryDTO.getId(), productList);
 
         //如果是入库就要增加库存
         if ("submit".equals(warehouseEntryDTO.getSaveOrSubmit())) {
@@ -153,15 +150,15 @@ public class WarehouseEntryManagerImpl extends BaseServiceImpl<WarehouseEntryMap
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void edit(WarehouseEntryDTO warehouseEntryDTO) {
-        check(warehouseEntryDTO);
+//        check(warehouseEntryDTO);
         // 更新入库单
         WarehouseEntryDO warehouseEntryDO = BeanUtil.copyProperties(warehouseEntryDTO, WarehouseEntryDO.class);
         updateById(warehouseEntryDO);
         ArrayList<WarehouseEntryProductDO> productList = new ArrayList<>();
         //如果不是调拨入库,售后入库,调拨入库直接更爱入库单状态
-        if (!WarehouseEntyrTypeEnum.HAIL_ENTRY.equals(warehouseEntryDTO.getType()) &&
-                !WarehouseEntyrTypeEnum.SALE_AFTER.equals(warehouseEntryDTO.getType()) &&
-                !WarehouseEntyrTypeEnum.TRANSFER_ENTRY.equals(warehouseEntryDTO.getType())) {
+//        if (!WarehouseEntyrTypeEnum.HAIL_ENTRY.equals(warehouseEntryDTO.getType()) &&
+//                !WarehouseEntyrTypeEnum.SALE_AFTER.equals(warehouseEntryDTO.getType()) &&
+//                !WarehouseEntyrTypeEnum.TRANSFER_ENTRY.equals(warehouseEntryDTO.getType())) {
             warehouseEntryProductManager.deleteByWarehouseEntryIds(Collections.singletonList(warehouseEntryDTO.getId()));
             for (WarehouseEntryProductDTO dto : warehouseEntryDTO.getProductList()) {
                 WarehouseEntryProductDO productDO = BeanUtil.copyProperties(dto, WarehouseEntryProductDO.class);
@@ -170,18 +167,18 @@ public class WarehouseEntryManagerImpl extends BaseServiceImpl<WarehouseEntryMap
                 productList.add(productDO);
             }
             warehouseEntryProductManager.saveBatch(productList);
-        }else {
-            for (WarehouseEntryProductDTO dto : warehouseEntryDTO.getProductList()) {
-                WarehouseEntryProductDO productDO = BeanUtil.copyProperties(dto, WarehouseEntryProductDO.class);
-                productDO.setEntryNum(productDO.getEntryNum() + productDO.getNum());
-                productDO.setNotEntryNum(productDO.getOrderNum() - productDO.getEntryNum());
-                productList.add(productDO);
-            }
-            warehouseEntryProductManager.updateBatchById(productList);
-        }
-        //保存子表和序列号的关系
-        warehouseEntryDTO.setId(warehouseEntryDO.getId());
-        saveSnCode(warehouseEntryDTO.getId(), productList);
+//        }else {
+//            for (WarehouseEntryProductDTO dto : warehouseEntryDTO.getProductList()) {
+//                WarehouseEntryProductDO productDO = BeanUtil.copyProperties(dto, WarehouseEntryProductDO.class);
+//                productDO.setEntryNum(productDO.getEntryNum() + productDO.getNum());
+//                productDO.setNotEntryNum(productDO.getOrderNum() - productDO.getEntryNum());
+//                productList.add(productDO);
+//            }
+//            warehouseEntryProductManager.updateBatchById(productList);
+//        }
+//        //保存子表和序列号的关系
+//        warehouseEntryDTO.setId(warehouseEntryDO.getId());
+//        saveSnCode(warehouseEntryDTO.getId(), productList);
         if ("submit".equals(warehouseEntryDTO.getSaveOrSubmit())) {
             updateStock(warehouseEntryDTO, getById(warehouseEntryDO.getId()), productList);
         }
@@ -191,21 +188,21 @@ public class WarehouseEntryManagerImpl extends BaseServiceImpl<WarehouseEntryMap
         if ("Y".equals(warehouseEntryDO.getHasSubmit())) {
             throw new ServiceException("数据已入库,请勿重复操作");
         }
-        for (WarehouseEntryProductDO aDo : productList) {
-            ProductDO manager = productManager.getById(aDo.getProductId());
-            if (manager.getHaveSn()) {
-//                if (CollUtil.isEmpty(aDo.getSnCodeList())) {
-//                    throw new ServiceException(manager.getId() + ":有序列号的商品入库需要录入序列号");
+//        for (WarehouseEntryProductDO aDo : productList) {
+//            ProductDO manager = productManager.getById(aDo.getProductId());
+//            if (manager.getHaveSn()) {
+////                if (CollUtil.isEmpty(aDo.getSnCodeList())) {
+////                    throw new ServiceException(manager.getId() + ":有序列号的商品入库需要录入序列号");
+////                }
+//                if (aDo.getNum() != aDo.getSnCodeList().size()) {
+//                    throw new ServiceException(manager.getId() + ":入库的数量须和序列号的个数相等");
 //                }
-                if (aDo.getNum() != aDo.getSnCodeList().size()) {
-                    throw new ServiceException(manager.getId() + ":入库的数量须和序列号的个数相等");
-                }
-                Set<Long> set = aDo.getSnCodeList().stream().map(GoodsSnDO::getId).collect(Collectors.toSet());
-                if (set.size() != aDo.getSnCodeList().size()){
-                    throw new ServiceException("序列号重复");
-                }
-            }
-        }
+//                Set<Long> set = aDo.getSnCodeList().stream().map(GoodsSnDO::getId).collect(Collectors.toSet());
+//                if (set.size() != aDo.getSnCodeList().size()){
+//                    throw new ServiceException("序列号重复");
+//                }
+//            }
+//        }
 
         List<Long> collect = warehouseEntryDTO.getProductList().stream().map(WarehouseEntryProductDTO::getProductId).collect(Collectors.toList());
         List<ProductStockDO> stockDOList = productStockManager.list(new LambdaQueryWrapper<ProductStockDO>()
@@ -221,73 +218,73 @@ public class WarehouseEntryManagerImpl extends BaseServiceImpl<WarehouseEntryMap
         }
         productStockManager.updateActualStock(arrayList, null);
 
-        //如果不是调拨入库,售后入库,调拨入库直接更爱入库单状态
-        if (!WarehouseEntyrTypeEnum.HAIL_ENTRY.equals(warehouseEntryDTO.getType()) &&
-                !WarehouseEntyrTypeEnum.SALE_AFTER.equals(warehouseEntryDTO.getType()) &&
-                !WarehouseEntyrTypeEnum.TRANSFER_ENTRY.equals(warehouseEntryDTO.getType())) {
+//        //如果不是调拨入库,售后入库,调拨入库直接更爱入库单状态
+//        if (!WarehouseEntyrTypeEnum.HAIL_ENTRY.equals(warehouseEntryDTO.getType()) &&
+//                !WarehouseEntyrTypeEnum.SALE_AFTER.equals(warehouseEntryDTO.getType()) &&
+//                !WarehouseEntyrTypeEnum.TRANSFER_ENTRY.equals(warehouseEntryDTO.getType())) {
             //入库之后数据不能被操作
             warehouseEntryDO.setHasSubmit("Y");
             updateById(warehouseEntryDO);
-        }
-        //如果有序列号更爱序列号的使用状态
-        List<ItemSnCodeDO> list1 = itemSnCodeManager.list(new LambdaQueryWrapper<ItemSnCodeDO>().eq(ItemSnCodeDO::getEntryOutHouseId, warehouseEntryDO.getId()));
-        if (CollUtil.isNotEmpty(list1)) {
-            List<Long> collect1 = list1.stream().map(ItemSnCodeDO::getSnCodeId).collect(Collectors.toList());
-            List<GoodsSnDO> list = goodsSnManager.list(new LambdaQueryWrapper<GoodsSnDO>().in(GoodsSnDO::getId, collect1));
-            //更爱序列号状态
-            for (GoodsSnDO aDo : list) {
-                aDo.setStatus(SnCodeStatusEnum.IN_WAREHOUSE);
-                aDo.setWarehouseId(warehouseEntryDTO.getWarehouseId());
-                aDo.setEntryHouseId(warehouseEntryDO.getId());
-            }
-            goodsSnManager.updateBatchById(list);
-        }
+//        }
+//        //如果有序列号更爱序列号的使用状态
+//        List<ItemSnCodeDO> list1 = itemSnCodeManager.list(new LambdaQueryWrapper<ItemSnCodeDO>().eq(ItemSnCodeDO::getEntryOutHouseId, warehouseEntryDO.getId()));
+//        if (CollUtil.isNotEmpty(list1)) {
+//            List<Long> collect1 = list1.stream().map(ItemSnCodeDO::getSnCodeId).collect(Collectors.toList());
+//            List<GoodsSnDO> list = goodsSnManager.list(new LambdaQueryWrapper<GoodsSnDO>().in(GoodsSnDO::getId, collect1));
+//            //更爱序列号状态
+//            for (GoodsSnDO aDo : list) {
+//                aDo.setStatus(SnCodeStatusEnum.IN_WAREHOUSE);
+//                aDo.setWarehouseId(warehouseEntryDTO.getWarehouseId());
+//                aDo.setEntryHouseId(warehouseEntryDO.getId());
+//            }
+//            goodsSnManager.updateBatchById(list);
+//        }
 
         //所欲已入库的商品
         List<WarehouseEntryProductDO> entryProductDOS = warehouseEntryProductManager.list(new LambdaQueryWrapper<WarehouseEntryProductDO>()
                 .eq(WarehouseEntryProductDO::getScanOrderId, warehouseEntryDO.getOrderId()));
 
-        //售后订单如果是租赁订单 扣减在途库存 。判断更改售后订单的状态,入库单的状态
-        if (WarehouseEntyrTypeEnum.HAIL_ENTRY.equals(warehouseEntryDTO.getType())) {
-            //扣减在途库存
-            arrayList.forEach(item -> item.setNum(-item.getNum()));
-            productStockManager.updateTransitStock(arrayList);
-            long count = entryProductDOS.stream().filter(item -> item.getEntryNum() < item.getOrderNum()).count();
-            if (count == 0) {
-                OrderDO aDo = orderManager.getById(warehouseEntryDTO.getOrderId());
-                aDo.setStatus(SaleOrderStatusEnum.ORDER_END);
-                orderManager.updateById(aDo);
-                warehouseEntryDO.setHasSubmit("Y");
-                updateById(warehouseEntryDO);
-            }
-        }
-
-        //如果是租赁订单  扣减在途库存  判断更改订单的状态,入库单的状态
-        if (WarehouseEntyrTypeEnum.SALE_AFTER.equals(warehouseEntryDTO.getType())) {
-            OrderReturnDO orderReturnDO = orderReturnManager.getById(warehouseEntryDTO.getOrderId());
-
-            OrderDO aDo = orderManager.getById(orderReturnDO.getOrderId());
-            if (OrderTypeEnum.TO_C.equals(aDo.getType())) {
-                //若果售后订单类型是租赁订单更改在途库存状态
-                arrayList.forEach(item -> item.setNum(-item.getNum()));
-                productStockManager.updateTransitStock(arrayList);
-            }
-
-            long count = entryProductDOS.stream().filter(item -> item.getEntryNum() < item.getOrderNum()).count();
-            if (count == 0) {
-                orderReturnDO.setStatus(ReturnOrderStatusEnum.SALE_AFTER_END);
-                orderReturnManager.updateById(orderReturnDO);
-                warehouseEntryDO.setHasSubmit("Y");
-                updateById(warehouseEntryDO);
-            }
-            //如果这个订单没有正在进行中的守护订单,把订单的状态改为售后完成状态
-            long count1 = orderReturnManager.count(new LambdaQueryWrapper<OrderReturnDO>()
-                    .eq(OrderReturnDO::getStatus, ReturnOrderStatusEnum.SALE_AFTER_ING).eq(OrderReturnDO::getOrderId, aDo.getId()));
-            if (count1 <= 0) {
-                aDo.setStatus(SaleOrderStatusEnum.SALE_AFTER_END);
-                orderManager.updateById(aDo);
-            }
-        }
+//        //售后订单如果是租赁订单 扣减在途库存 。判断更改售后订单的状态,入库单的状态
+//        if (WarehouseEntyrTypeEnum.HAIL_ENTRY.equals(warehouseEntryDTO.getType())) {
+//            //扣减在途库存
+//            arrayList.forEach(item -> item.setNum(-item.getNum()));
+//            productStockManager.updateTransitStock(arrayList);
+//            long count = entryProductDOS.stream().filter(item -> item.getEntryNum() < item.getOrderNum()).count();
+//            if (count == 0) {
+//                OrderDO aDo = orderManager.getById(warehouseEntryDTO.getOrderId());
+//                aDo.setStatus(SaleOrderStatusEnum.ORDER_END);
+//                orderManager.updateById(aDo);
+//                warehouseEntryDO.setHasSubmit("Y");
+//                updateById(warehouseEntryDO);
+//            }
+//        }
+
+//        //如果是租赁订单  扣减在途库存  判断更改订单的状态,入库单的状态
+//        if (WarehouseEntyrTypeEnum.SALE_AFTER.equals(warehouseEntryDTO.getType())) {
+//            OrderReturnDO orderReturnDO = orderReturnManager.getById(warehouseEntryDTO.getOrderId());
+//
+//            OrderDO aDo = orderManager.getById(orderReturnDO.getOrderId());
+//            if (OrderTypeEnum.TO_C.equals(aDo.getType())) {
+//                //若果售后订单类型是租赁订单更改在途库存状态
+//                arrayList.forEach(item -> item.setNum(-item.getNum()));
+//                productStockManager.updateTransitStock(arrayList);
+//            }
+//
+//            long count = entryProductDOS.stream().filter(item -> item.getEntryNum() < item.getOrderNum()).count();
+//            if (count == 0) {
+//                orderReturnDO.setStatus(ReturnOrderStatusEnum.SALE_AFTER_END);
+//                orderReturnManager.updateById(orderReturnDO);
+//                warehouseEntryDO.setHasSubmit("Y");
+//                updateById(warehouseEntryDO);
+//            }
+//            //如果这个订单没有正在进行中的守护订单,把订单的状态改为售后完成状态
+//            long count1 = orderReturnManager.count(new LambdaQueryWrapper<OrderReturnDO>()
+//                    .eq(OrderReturnDO::getStatus, ReturnOrderStatusEnum.SALE_AFTER_ING).eq(OrderReturnDO::getOrderId, aDo.getId()));
+//            if (count1 <= 0) {
+//                aDo.setStatus(SaleOrderStatusEnum.SALE_AFTER_END);
+//                orderManager.updateById(aDo);
+//            }
+//        }
         //如果是调拨单得先出库才能入库,全部入库更改入库单的状态,调拨单得状态
         if (WarehouseEntyrTypeEnum.TRANSFER_ENTRY.equals(warehouseEntryDO.getType())) {
             WarehouseOutDO outDO = warehouseOutMapper.selectOne(new LambdaQueryWrapper<WarehouseOutDO>().eq(WarehouseOutDO::getOrderIdList, warehouseEntryDO.getOrderId()).last("limit 1"));
@@ -531,46 +528,46 @@ public class WarehouseEntryManagerImpl extends BaseServiceImpl<WarehouseEntryMap
         return lambdaQuery().eq(WarehouseEntryDO::getWarehouseId, warehouseId).count();
     }
 
-    private void check(WarehouseEntryDTO warehouseEntryDTO) {
-        if (WarehouseEntyrTypeEnum.HAIL_ENTRY.equals(warehouseEntryDTO.getType())) {
-            if (ObjectUtil.isNull(warehouseEntryDTO.getOrderId())) {
-                throw new ServiceException("租赁返回:订单不能为空");
-            }
-            OrderDO aDo = orderManager.getById(warehouseEntryDTO.getOrderId());
-            if (ObjectUtil.isNull(aDo)) {
-                throw new ServiceException("订单不存在");
-            }
-            if (!OrderTypeEnum.TO_C.equals(aDo.getType())) {
-                throw new ServiceException("该订单不是租赁订单");
-            }
-        }
-
-        //如果是售后订单
-        if (WarehouseEntyrTypeEnum.SALE_AFTER.equals(warehouseEntryDTO.getType())) {
-            if (ObjectUtil.isNull(warehouseEntryDTO.getOrderId())) {
-                throw new ServiceException("售后退货:订单不能为空");
-            }
-            OrderReturnDO byId = orderReturnManager.getById(warehouseEntryDTO.getOrderId());
-            if (ObjectUtil.isNull(byId)) {
-                throw new ServiceException("订单不存在");
-            }
-        }
-
-        WarehouseDO warehouseDO = warehouseManager.getById(warehouseEntryDTO.getWarehouseId());
-        if (warehouseDO == null) {
-            throw new ServiceException("仓库不存在");
-        }
-        for (WarehouseEntryProductDTO dto : warehouseEntryDTO.getProductList()) {
-            ProductDO productDO = productManager.getById(dto.getProductId());
-            if (CollUtil.isNotEmpty(dto.getSnCodeList())) {
-                List<GoodsSnDO> list = goodsSnManager.list(new LambdaQueryWrapper<GoodsSnDO>()
-                        .eq(GoodsSnDO::getProductId, dto.getProductId()).in(GoodsSnDO::getSnCode, dto.getSnCodeList().stream().map(GoodsSnDO::getSnCode).collect(Collectors.toList())));
-                if (list.size() != dto.getSnCodeList().size()) {
-                    throw new ServiceException(productDO.getSku() + "的部分序列号未查询到,请录入正确的序列号");
-                }
-            }
-        }
-    }
+//    private void check(WarehouseEntryDTO warehouseEntryDTO) {
+//        if (WarehouseEntyrTypeEnum.HAIL_ENTRY.equals(warehouseEntryDTO.getType())) {
+//            if (ObjectUtil.isNull(warehouseEntryDTO.getOrderId())) {
+//                throw new ServiceException("租赁返回:订单不能为空");
+//            }
+//            OrderDO aDo = orderManager.getById(warehouseEntryDTO.getOrderId());
+//            if (ObjectUtil.isNull(aDo)) {
+//                throw new ServiceException("订单不存在");
+//            }
+//            if (!OrderTypeEnum.TO_C.equals(aDo.getType())) {
+//                throw new ServiceException("该订单不是租赁订单");
+//            }
+//        }
+//
+//        //如果是售后订单
+//        if (WarehouseEntyrTypeEnum.SALE_AFTER.equals(warehouseEntryDTO.getType())) {
+//            if (ObjectUtil.isNull(warehouseEntryDTO.getOrderId())) {
+//                throw new ServiceException("售后退货:订单不能为空");
+//            }
+//            OrderReturnDO byId = orderReturnManager.getById(warehouseEntryDTO.getOrderId());
+//            if (ObjectUtil.isNull(byId)) {
+//                throw new ServiceException("订单不存在");
+//            }
+//        }
+//
+//        WarehouseDO warehouseDO = warehouseManager.getById(warehouseEntryDTO.getWarehouseId());
+//        if (warehouseDO == null) {
+//            throw new ServiceException("仓库不存在");
+//        }
+//        for (WarehouseEntryProductDTO dto : warehouseEntryDTO.getProductList()) {
+//            ProductDO productDO = productManager.getById(dto.getProductId());
+//            if (CollUtil.isNotEmpty(dto.getSnCodeList())) {
+//                List<GoodsSnDO> list = goodsSnManager.list(new LambdaQueryWrapper<GoodsSnDO>()
+//                        .eq(GoodsSnDO::getProductId, dto.getProductId()).in(GoodsSnDO::getSnCode, dto.getSnCodeList().stream().map(GoodsSnDO::getSnCode).collect(Collectors.toList())));
+//                if (list.size() != dto.getSnCodeList().size()) {
+//                    throw new ServiceException(productDO.getSku() + "的部分序列号未查询到,请录入正确的序列号");
+//                }
+//            }
+//        }
+//    }
 
     /**
      * 组装不在合同范围内商品数据

+ 3 - 1
module-erp/src/main/java/com/hys/app/service/erp/impl/WarehouseManagerImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.hys.app.converter.erp.WarehouseConverter;
+import com.hys.app.framework.context.user.AdminUserContext;
 import com.hys.app.framework.database.WebPage;
 import com.hys.app.framework.exception.ServiceException;
 import com.hys.app.framework.database.mybatisplus.base.BaseServiceImpl;
@@ -95,7 +96,8 @@ public class WarehouseManagerImpl extends BaseServiceImpl<WarehouseMapper, Wareh
 
     @Override
     public List<WarehouseVO> listAll(Long deptId) {
-        List<WarehouseDO> list = baseMapper.selectList();
+        List<WarehouseDO> list = baseMapper.selectList(new LambdaQueryWrapper<WarehouseDO>()
+                .eq(ObjectUtil.isNotNull(AdminUserContext.getCompanyId()),WarehouseDO::getCompanyId,AdminUserContext.getCompanyId()));
         return converter.convert(list);
     }
 

+ 52 - 65
module-erp/src/main/java/com/hys/app/service/erp/impl/WarehouseOutManagerImpl.java

@@ -2,7 +2,6 @@ package com.hys.app.service.erp.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
@@ -13,17 +12,15 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.hys.app.converter.erp.ProductStockConverter;
 import com.hys.app.converter.erp.WarehouseOutConverter;
-import com.hys.app.converter.erp.WarehouseOutItemConverter;
 import com.hys.app.framework.database.BaseQueryParam;
 import com.hys.app.framework.database.WebPage;
-import com.hys.app.framework.exception.ServiceException;
 import com.hys.app.framework.database.mybatisplus.base.BaseServiceImpl;
+import com.hys.app.framework.exception.ServiceException;
 import com.hys.app.framework.rabbitmq.MessageSender;
 import com.hys.app.framework.rabbitmq.MqMessage;
 import com.hys.app.framework.util.BeanUtils;
 import com.hys.app.framework.util.DateUtil;
 import com.hys.app.framework.util.PageConvert;
-import com.hys.app.framework.util.StringUtil;
 import com.hys.app.mapper.erp.WarehouseOutMapper;
 import com.hys.app.mapper.goods.GoodsMapper;
 import com.hys.app.model.base.rabbitmq.AmqpExchange;
@@ -32,18 +29,11 @@ import com.hys.app.model.erp.dto.*;
 import com.hys.app.model.erp.dto.message.WarehouseOutShipMessage;
 import com.hys.app.model.erp.enums.*;
 import com.hys.app.model.erp.vo.*;
-import com.hys.app.model.goods.dos.GoodsGalleryDO;
 import com.hys.app.model.system.dos.AdminUser;
-import com.hys.app.model.system.dos.LogisticsCompanyDO;
 import com.hys.app.service.erp.*;
 import com.hys.app.service.goods.GoodsGalleryManager;
-import com.hys.app.service.kuaidiniao.KuaiDiNiaoService;
-import com.hys.app.service.kuaidiniao.entity.PreOrderModel;
 import com.hys.app.service.system.AdminUserManager;
-import com.hys.app.service.system.LogisticsCompanyManager;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -52,11 +42,8 @@ import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.*;
-import java.util.function.Function;
 import java.util.stream.Collectors;
 
-import static com.hys.app.framework.util.CollectionUtils.*;
-
 /**
  * 出库单业务层实现
  *
@@ -109,9 +96,9 @@ public class WarehouseOutManagerImpl extends BaseServiceImpl<WarehouseOutMapper,
         List<WarehouseOutItemDO> productList = BeanUtils.toBean(warehouseOutDTO.getProductList(), WarehouseOutItemDO.class);
         productList.forEach(item -> item.setWarehouseOutId(warehouseOutDO.getId()));
         warehouseOutItemManager.saveBatch(productList);
-        //保存序列号和子表的关系
-        warehouseOutDTO.setId(warehouseOutDO.getId());
-        saveSnCode(warehouseOutDTO.getId(), productList);
+//        //保存序列号和子表的关系
+//        warehouseOutDTO.setId(warehouseOutDO.getId());
+//        saveSnCode(warehouseOutDTO.getId(), productList);
         //如果是出库就要扣减库存
         if ("submit".equals(warehouseOutDTO.getSaveOrSubmit())) {
             updateStock(warehouseOutDTO, getById(warehouseOutDO.getId()), productList);
@@ -132,7 +119,7 @@ public class WarehouseOutManagerImpl extends BaseServiceImpl<WarehouseOutMapper,
         warehouseOutItemManager.deleteByWarehouseOutId(Collections.singletonList(warehouseOutDTO.getId()));
         warehouseOutItemManager.saveBatch(productList);
         //保存序列号和子表的关系
-        saveSnCode(warehouseOutDO.getId(), productList);
+//        saveSnCode(warehouseOutDO.getId(), productList);
         //如果是出库就要扣减库存
         if ("submit".equals(warehouseOutDTO.getSaveOrSubmit())) {
             updateStock(warehouseOutDTO, getById(warehouseOutDO.getId()), productList);
@@ -144,21 +131,21 @@ public class WarehouseOutManagerImpl extends BaseServiceImpl<WarehouseOutMapper,
         if ("Y".equals(warehouseOutDO.getHasSubmit())) {
             throw new ServiceException("数据已出库,请勿重复操作");
         }
-        for (WarehouseOutItemDO aDo : productList) {
-            ProductDO manager = productManager.getById(aDo.getProductId());
-            if (manager.getHaveSn()) {
-                if (CollUtil.isEmpty(aDo.getSnCodeList())) {
-                    throw new ServiceException(manager.getId() + ":有序列号的商品出库需要录入序列号");
-                }
-                if (aDo.getOutNum() != aDo.getSnCodeList().size()) {
-                    throw new ServiceException(manager.getId() + ":出库的数量须和序列号的个数相等");
-                }
-                Set<Long> set = aDo.getSnCodeList().stream().map(GoodsSnDO::getId).collect(Collectors.toSet());
-                if (set.size() != aDo.getSnCodeList().size()){
-                    throw new ServiceException("序列号重复");
-                }
-            }
-        }
+//        for (WarehouseOutItemDO aDo : productList) {
+//            ProductDO manager = productManager.getById(aDo.getProductId());
+//            if (manager.getHaveSn()) {
+//                if (CollUtil.isEmpty(aDo.getSnCodeList())) {
+//                    throw new ServiceException(manager.getId() + ":有序列号的商品出库需要录入序列号");
+//                }
+//                if (aDo.getOutNum() != aDo.getSnCodeList().size()) {
+//                    throw new ServiceException(manager.getId() + ":出库的数量须和序列号的个数相等");
+//                }
+//                Set<Long> set = aDo.getSnCodeList().stream().map(GoodsSnDO::getId).collect(Collectors.toSet());
+//                if (set.size() != aDo.getSnCodeList().size()){
+//                    throw new ServiceException("序列号重复");
+//                }
+//            }
+//        }
 
         //如果是报损单改变报损单状态
         if (WarehouseOutTypeEnum.DAMAGE_OUT.equals(warehouseOutDTO.getType())) {
@@ -169,34 +156,34 @@ public class WarehouseOutManagerImpl extends BaseServiceImpl<WarehouseOutMapper,
 
         List<StockDTO> arrayList = new ArrayList<>();
         //修改凍結库存明细
-        List<LockedStockDetailDO> detailDOS = new ArrayList<>();
+//        List<LockedStockDetailDO> detailDOS = new ArrayList<>();
         for (WarehouseOutItemDO aDo : productList) {
-            if (WarehouseOutTypeEnum.SALE_OUT.equals(warehouseOutDO.getType()) ||
-                    WarehouseOutTypeEnum.TRANSFER_OUT.equals(warehouseOutDO.getType()) ||
-                    WarehouseOutTypeEnum.DAMAGE_OUT.equals(warehouseOutDO.getType()) ||
-                    WarehouseOutTypeEnum.HAIL_OUT.equals(warehouseOutDO.getType())) {
-                LockedStockDetailDO one = lockedStockDetailManager.getOne(new LambdaQueryWrapper<LockedStockDetailDO>()
-                        .eq(LockedStockDetailDO::getOrderId, aDo.getOrderId()).eq(LockedStockDetailDO::getOrderItemId, aDo.getOrderItemId()));
-                if (ObjectUtil.isNull(one)) {
-                    throw new ServiceException("未找到冻结记录");
-                }
-                one.setUnLockedTime(new Date());
-                if (one.getLockedNum() == (aDo.getOutNum() + one.getUnLockedNum())) {
-                    one.setStatus(true);
-                }
-                one.setUnLockedNum(one.getUnLockedNum() + aDo.getOutNum());
-                detailDOS.add(one);
-            }
+//            if (WarehouseOutTypeEnum.SALE_OUT.equals(warehouseOutDO.getType()) ||
+//                    WarehouseOutTypeEnum.TRANSFER_OUT.equals(warehouseOutDO.getType()) ||
+//                    WarehouseOutTypeEnum.DAMAGE_OUT.equals(warehouseOutDO.getType()) ||
+//                    WarehouseOutTypeEnum.HAIL_OUT.equals(warehouseOutDO.getType())) {
+//                LockedStockDetailDO one = lockedStockDetailManager.getOne(new LambdaQueryWrapper<LockedStockDetailDO>()
+//                        .eq(LockedStockDetailDO::getOrderId, aDo.getOrderId()).eq(LockedStockDetailDO::getOrderItemId, aDo.getOrderItemId()));
+//                if (ObjectUtil.isNull(one)) {
+//                    throw new ServiceException("未找到冻结记录");
+//                }
+//                one.setUnLockedTime(new Date());
+//                if (one.getLockedNum() == (aDo.getOutNum() + one.getUnLockedNum())) {
+//                    one.setStatus(true);
+//                }
+//                one.setUnLockedNum(one.getUnLockedNum() + aDo.getOutNum());
+//                detailDOS.add(one);
+//            }
             WarehouseOutProductDTO productDO = warehouseOutDTO.getProductList().stream().filter(item -> item.getProductId().equals(aDo.getProductId())).findFirst().get();
             StockDTO dto = new StockDTO();
             dto.setId(aDo.getProductStockId());
             dto.setNum(-productDO.getOutNum());
             arrayList.add(dto);
         }
-        lockedStockDetailManager.updateBatchById(detailDOS);
+//        lockedStockDetailManager.updateBatchById(detailDOS);
         //更爱可用库存实际库存冻结库存
         productStockManager.updateActualStock(arrayList, null);
-        productStockManager.updateLockedStock(arrayList);
+//        productStockManager.updateLockedStock(arrayList);
 //        //更改在途库存
 //        if (WarehouseOutTypeEnum.HAIL_OUT.equals(warehouseOutDTO.getType())) {
 //            arrayList.forEach(item -> item.setNum(-item.getNum()));
@@ -205,19 +192,19 @@ public class WarehouseOutManagerImpl extends BaseServiceImpl<WarehouseOutMapper,
         //入库之后数据不能被操作
         warehouseOutDO.setHasSubmit("Y");
         updateById(warehouseOutDO);
-        //更爱序列号的状态
-        List<ItemSnCodeDO> list1 = itemSnCodeManager.list(new LambdaQueryWrapper<ItemSnCodeDO>().eq(ItemSnCodeDO::getEntryOutHouseId, warehouseOutDO.getId()));
-        if (CollUtil.isNotEmpty(list1)) {
-            List<Long> collect1 = list1.stream().map(ItemSnCodeDO::getSnCodeId).collect(Collectors.toList());
-            List<GoodsSnDO> list = goodsSnManager.list(new LambdaQueryWrapper<GoodsSnDO>().in(GoodsSnDO::getId, collect1));
-            //更爱序列号状态
-            for (GoodsSnDO aDo : list) {
-                aDo.setStatus(SnCodeStatusEnum.OUT_WAREHOUSE);
-                aDo.setWarehouseId(warehouseOutDTO.getWarehouseId());
-                aDo.setOutHouseId(warehouseOutDO.getId());
-            }
-            goodsSnManager.updateBatchById(list);
-        }
+//        //更爱序列号的状态
+//        List<ItemSnCodeDO> list1 = itemSnCodeManager.list(new LambdaQueryWrapper<ItemSnCodeDO>().eq(ItemSnCodeDO::getEntryOutHouseId, warehouseOutDO.getId()));
+//        if (CollUtil.isNotEmpty(list1)) {
+//            List<Long> collect1 = list1.stream().map(ItemSnCodeDO::getSnCodeId).collect(Collectors.toList());
+//            List<GoodsSnDO> list = goodsSnManager.list(new LambdaQueryWrapper<GoodsSnDO>().in(GoodsSnDO::getId, collect1));
+//            //更爱序列号状态
+//            for (GoodsSnDO aDo : list) {
+//                aDo.setStatus(SnCodeStatusEnum.OUT_WAREHOUSE);
+//                aDo.setWarehouseId(warehouseOutDTO.getWarehouseId());
+//                aDo.setOutHouseId(warehouseOutDO.getId());
+//            }
+//            goodsSnManager.updateBatchById(list);
+//        }
         redisTemplate.delete(warehouseOutDO.getId().toString());
     }
 

+ 8 - 1
module-erp/src/main/java/com/hys/app/service/system/AdminUserManager.java

@@ -75,7 +75,7 @@ public interface AdminUserManager {
      * @param password 管理员密码
      * @return
      */
-    AdminLoginVO login(String name, String password);
+    AdminLoginVO login(String name, String password,String companyName);
 
     /**
      * 通过refreshToken重新获取accessToken
@@ -145,4 +145,11 @@ public interface AdminUserManager {
      * @return
      */
     List<AdminUser> getUserByDept();
+
+    /**
+     * 查看自己公司下的所有人员
+     *
+     * @return
+     */
+    List<AdminUser> getUserByCompany();
 }

+ 69 - 51
module-erp/src/main/java/com/hys/app/service/system/impl/AdminUserManagerImpl.java

@@ -20,6 +20,7 @@ import com.hys.app.framework.security.model.Admin;
 import com.hys.app.framework.security.model.Role;
 import com.hys.app.framework.util.*;
 import com.hys.app.mapper.system.AdminUserMapper;
+import com.hys.app.model.erp.entity.Company;
 import com.hys.app.model.errorcode.SystemErrorCode;
 import com.hys.app.model.support.LogClient;
 import com.hys.app.model.support.validator.annotation.LogLevel;
@@ -30,6 +31,7 @@ import com.hys.app.model.system.dos.SystemLogs;
 import com.hys.app.model.system.dto.AdminUserDTO;
 import com.hys.app.model.system.vo.AdminLoginVO;
 import com.hys.app.model.system.vo.AdminUserVO;
+import com.hys.app.service.erp.CompanyManager;
 import com.hys.app.service.system.AdminUserManager;
 import com.hys.app.service.system.DeptManager;
 import com.hys.app.service.system.RoleManager;
@@ -40,6 +42,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -65,7 +68,8 @@ public class AdminUserManagerImpl implements AdminUserManager {
     private TokenManager tokenManager;
     @Autowired
     private SystemLogsManager systemLogsManager;
-
+    @Autowired
+    private CompanyManager companyManager;
     private List<Long> ids = new ArrayList<>();
 
     /**
@@ -78,15 +82,9 @@ public class AdminUserManagerImpl implements AdminUserManager {
      */
     @Override
     public WebPage list(long page, long pageSize, String keyword, Integer userState) {
-        IPage<AdminUserDTO> iPage = adminUserMapper.selectPageDto(new Page<>(page, pageSize), keyword, userState);
-        for (AdminUserDTO record : iPage.getRecords()) {
-            if (record.getUsername().equals("superadmin")) {
-                iPage.getRecords().remove(record);
-            }
-        }
-        WebPage convert = PageConvert.convert(iPage);
 
-        return convert;
+        IPage<AdminUserDTO> iPage = adminUserMapper.selectPageDto(new Page<>(page, pageSize), keyword, userState);
+        return PageConvert.convert(iPage);
     }
 
     /**
@@ -111,25 +109,19 @@ public class AdminUserManagerImpl implements AdminUserManager {
         if (user != null) {
             throw new ServiceException(SystemErrorCode.E915.code(), "管理员名称重复");
         }
-
-        //校验用户名称是否重复
-        QueryWrapper<AdminUser> nicknameWrapper = new QueryWrapper<>();
-        nicknameWrapper.eq("nickname", adminUserVO.getUsername()).eq("user_state", 0);
-        AdminUser nicknameUser = adminUserMapper.selectOne(nicknameWrapper);
-        if (nicknameUser != null) {
-            throw new ServiceException(SystemErrorCode.E915.code(), "昵称重复");
-        }
-
         //不是超级管理员的情况下再校验权限是否存在
-        if (!adminUserVO.getFounder().equals(1)) {
-            RoleDO roleDO = roleManager.getModel(adminUserVO.getRoleId());
-            if (roleDO == null) {
-                throw new ResourceNotFoundException("所属权限不存在");
-            }
-        }
+//        if (!adminUserVO.getFounder().equals(1)) {
+//            RoleDO roleDO = roleManager.getModel(adminUserVO.getRoleId());
+//            if (roleDO == null) {
+//                throw new ResourceNotFoundException("所属权限不存在");
+//            }
+//        }
+        Company company = companyManager.getById(AdminUserContext.getCompanyId());
         //管理员信息入库
         String password = adminUserVO.getPassword();
         AdminUser adminUser = new AdminUser();
+        adminUser.setCompanyId(company.getId());
+        adminUser.setRoleId(company.getRoleId());
         BeanUtil.copyProperties(adminUserVO, adminUser);
         adminUser.setPassword(StringUtil.md5(password + adminUser.getUsername().toLowerCase()));
         adminUser.setDateLine(DateUtil.getDateline());
@@ -149,37 +141,36 @@ public class AdminUserManagerImpl implements AdminUserManager {
     @Override
     @Transactional(value = "systemTransactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     public AdminUser edit(AdminUserVO adminUserVO, Long id) {
-
         //对要修改的管理员是否存在进行校验
         AdminUser adminUser = this.getModel(id);
-        //校验用户名称是否重复
-        QueryWrapper<AdminUser> nicknameWrapper = new QueryWrapper<>();
-        nicknameWrapper.eq("nickname", adminUserVO.getUsername()).eq("user_state", 0).ne("id",id);
-        AdminUser nicknameUser = adminUserMapper.selectOne(nicknameWrapper);
-        if (nicknameUser != null) {
-            throw new ServiceException(SystemErrorCode.E915.code(), "昵称重复");
-        }
         if (adminUser == null) {
             throw new ResourceNotFoundException("当前管理员不存在");
         }
+        if (!Objects.equals(AdminUserContext.getAdminUserId(), id)){
+            throw new ServiceException("你无权修改此账号");
+        }
+        if ("admin".equals(adminUser.getUsername()) && !"admin".equals(adminUserVO.getUsername())){
+            throw new ServiceException("admin 登录名称不允许修改");
+        }
         //如果修改的是从超级管理员到普通管理员 需要校验此管理员是否是最后一个超级管理员
         if (adminUser.getFounder().equals(1) && !adminUserVO.getFounder().equals(1)) {
 
-//            QueryWrapper<AdminUser> wrapper = new QueryWrapper<>();
-//            wrapper.eq("founder", 1).eq("user_state", 0);
-            List<AdminUser> adminUsers = adminUserMapper.selectList(new LambdaQueryWrapper<AdminUser>().eq(AdminUser::getFounder,1).eq(AdminUser::getUserState,0));
+            QueryWrapper<AdminUser> wrapper = new QueryWrapper<>();
+            wrapper.eq("founder", 1).eq("user_state", 0);
+            List<AdminUser> adminUsers = adminUserMapper.selectList(wrapper);
+
             if (adminUsers.size() <= 1) {
                 throw new ServiceException(SystemErrorCode.E916.code(), "必须保留一个超级管理员");
             }
         }
-        if (!adminUserVO.getFounder().equals(1)) {
-            RoleDO roleDO = roleManager.getModel(adminUserVO.getRoleId());
-            if (roleDO == null) {
-                throw new ResourceNotFoundException("所属权限不存在");
-            }
-        } else {
-            adminUserVO.setRoleId(0L);
-        }
+//        if (!adminUserVO.getFounder().equals(1)) {
+//            RoleDO roleDO = roleManager.getModel(adminUserVO.getRoleId());
+//            if (roleDO == null) {
+//                throw new ResourceNotFoundException("所属权限不存在");
+//            }
+//        } else {
+//            adminUserVO.setRoleId(0L);
+//        }
         //管理员原密码
         String password = adminUser.getPassword();
         //对管理员是否修改密码进行校验
@@ -213,6 +204,9 @@ public class AdminUserManagerImpl implements AdminUserManager {
         if (adminUser == null) {
             throw new ResourceNotFoundException("当前管理员不存在");
         }
+        if ("admin".equals(adminUser.getUsername())){
+            throw new ResourceNotFoundException("管理员不能删除");
+        }
         //校验要删除的管理员是否是最后一个超级管理员
         QueryWrapper<AdminUser> wrapper = new QueryWrapper<>();
         wrapper.eq("founder", 1).eq("user_state", 0);
@@ -222,9 +216,8 @@ public class AdminUserManagerImpl implements AdminUserManager {
             throw new ServiceException(SystemErrorCode.E916.code(), "必须保留一个超级管理员");
         }
         // 设置管理员状态为删除
-//        adminUser.setUserState(-1);
-//        adminUserMapper.updateById(adminUser);
-        adminUserMapper.deleteById(id);
+        adminUser.setUserState(-1);
+        adminUserMapper.updateById(adminUser);
 
         //发送redis订阅消息,通知各个节点此用户已经禁用
         UserDisableMsg userDisableMsg = new UserDisableMsg(id, Role.ADMIN, UserDisableMsg.ADD);
@@ -260,7 +253,7 @@ public class AdminUserManagerImpl implements AdminUserManager {
      * @return
      */
     @Override
-    public AdminLoginVO login(String name, String password) {
+    public AdminLoginVO login(String name, String password,String companyName) {
         //查询管理员信息
         QueryWrapper<AdminUser> wrapper = new QueryWrapper<>();
         wrapper.eq("username", name).eq("password", StringUtil.md5(password + name.toLowerCase())).eq("user_state", 0);
@@ -269,10 +262,28 @@ public class AdminUserManagerImpl implements AdminUserManager {
         if (adminUser == null || !StringUtil.equals(adminUser.getUsername(), name)) {
             throw new ServiceException(SystemErrorCode.E918.code(), "管理员账号密码错误");
         }
+        Company company=null;
+        if (adminUser.getFounder() != 1){
+            if (ObjectUtil.isNull(companyName)){
+                throw new ServiceException("非平台工作人员公司必填");
+            }
+            company = companyManager.getOne(new LambdaQueryWrapper<Company>().eq(Company::getName,companyName));
+            if (ObjectUtil.isNull(company)){
+                throw new ServiceException("该公司未注册");
+            }
+            if (adminUser.getCompanyId() != company.getCompanyId()){
+                throw new ServiceException("此账号不属于该公司");
+            }
+            if (LocalDateTime.now().isAfter(company.getEndUseTime())){
+                throw new ServiceException("该公司使用已到期,请续费");
+            }
+        }
+
         //返回管理员信息
         AdminLoginVO adminLoginVO = new AdminLoginVO();
         adminLoginVO.setUid(adminUser.getId());
         adminLoginVO.setUsername(name);
+        adminLoginVO.setCompanyVo(company);
         adminLoginVO.setDepartment(adminUser.getDepartment());
         adminLoginVO.setFace(adminUser.getFace());
         adminLoginVO.setRoleId(adminUser.getRoleId());
@@ -339,6 +350,7 @@ public class AdminUserManagerImpl implements AdminUserManager {
     private Token createToken(AdminUser adminUser) {
         Admin admin = new Admin();
         admin.setUid(adminUser.getId());
+        admin.setCompanyId(adminUser.getCompanyId());
         admin.setUsername(adminUser.getUsername());
 //        admin.setPlatformShopId(platform.getShopId());
 //        admin.setPlatformShopName(platform.getShopName());
@@ -418,17 +430,23 @@ public class AdminUserManagerImpl implements AdminUserManager {
     @Override
     public List<AdminUser> getUserByDept() {
         AdminUser byId = adminUserMapper.selectById(AdminUserContext.getAdminUserId());
-        if (byId.getFounder() == 1){
-           return adminUserMapper.selectList(new LambdaQueryWrapper<>());
+        if (byId.getFounder() == 1) {
+            return adminUserMapper.selectList(new LambdaQueryWrapper<>());
         }
         //获取所有的部门
         List<Long> deptIds = adminUserMapper.getAllSubDept(byId.getDeptId());
         //找出所有人子部门下的所有人
-        List<AdminUser> adminUsers = adminUserMapper.selectList(new LambdaQueryWrapper<AdminUser>());
-//                .in(AdminUser::getDeptId, deptIds));
+        List<AdminUser> adminUsers = adminUserMapper.selectList(new LambdaQueryWrapper<AdminUser>().in(AdminUser::getDeptId, deptIds));
         return adminUsers;
     }
 
+    @Override
+    public List<AdminUser> getUserByCompany() {
+        //找出所有人子部门下的所有人
+        return adminUserMapper.selectList(new LambdaQueryWrapper<AdminUser>()
+                .eq(ObjectUtil.isNotNull(AdminUserContext.getAdminUserId()), AdminUser::getCompanyId, AdminUserContext.getAdminUserId()));
+    }
+
 
     /**
      * 记录登录日志

+ 99 - 0
module-erp/src/main/java/com/hys/app/util/AliSmsUtil.java

@@ -0,0 +1,99 @@
+package com.hys.app.util;
+
+
+import cn.hutool.json.JSONUtil;
+import com.aliyun.tea.TeaException;
+import com.aliyun.teautil.models.RuntimeOptions;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.dysmsapi.model.v20170525.AddSmsTemplateRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.AddSmsTemplateResponse;
+import com.aliyuncs.profile.DefaultProfile;
+import com.hys.app.framework.exception.ServiceException;
+
+import java.util.Map;
+
+public class AliSmsUtil {
+    private static String signName = "上海瑞赢旷视科技";
+    private static String access_id = "LTAI5t9RbXSuirMa8AkvHxQf";
+    private static String access_secret = "VCmMZvMKrcN2tBHXdenyEKJIoKbwQf";
+
+
+    /**
+     * <b>description</b> :
+     * <p>使用AK&amp;SK初始化账号Client</p>
+     *
+     * @return Client
+     * @throws Exception
+     */
+    public static com.aliyun.dysmsapi20170525.Client createClient() throws Exception {
+        // 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
+        // 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
+                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
+                .setAccessKeyId(access_id)
+                // 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
+                .setAccessKeySecret(access_secret);
+        // Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
+        config.endpoint = "dysmsapi.aliyuncs.com";
+        return new com.aliyun.dysmsapi20170525.Client(config);
+    }
+
+    /**
+     * 获取用于查询短信状态的客户端
+     *
+     * @return
+     * @throws Exception
+     */
+    public static IAcsClient getIAcsClient() throws Exception {
+        // 创建DefaultProfile实例,用于初始化客户端配置
+        DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", access_id, access_secret);
+        // 创建IAcsClient实例
+        return new DefaultAcsClient(profile);
+    }
+
+    public static Boolean sendSms(String rePhone, String templateCode, Map<String, String> map) throws Exception {
+        com.aliyun.dysmsapi20170525.Client client = AliSmsUtil.createClient();
+        com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
+                .setPhoneNumbers(rePhone)
+                .setTemplateCode(templateCode)
+                .setTemplateParam(JSONUtil.toJsonStr(map))
+                .setSignName(signName);
+        try {
+            // 复制代码运行请自行打印 API 的返回值
+            client.sendSmsWithOptions(sendSmsRequest, new RuntimeOptions());
+            return true;
+        } catch (Exception _error) {
+            TeaException error = new TeaException(_error.getMessage(), _error);
+            // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
+            // 错误 message
+            System.out.println(error.getMessage());
+            // 诊断地址
+            System.out.println(error.getData().get("Recommend"));
+            com.aliyun.teautil.Common.assertAsString(error.message);
+            return false;
+        }
+    }
+
+    public static String createSmsTemplate(Integer templateType, String templateName, String templateContent, String remark) {
+        try {
+            // 设置鉴权参数,初始化客户端
+            DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", access_id, access_secret);
+            IAcsClient client = new DefaultAcsClient(profile);
+            // 创建API请求并设置参数
+            AddSmsTemplateRequest request = new AddSmsTemplateRequest();
+            request.setTemplateType(templateType); // 短信类型,0为验证码,1为短信通知,2为推广短信
+            request.setTemplateName(templateName);
+            request.setTemplateContent(templateContent);
+            request.setRemark(remark); // 模板申请的备注信息,如用途、使用场景等
+            // 发起请求并处理响应
+            AddSmsTemplateResponse response = client.getAcsResponse(request);
+            if (!"OK".equals(response.getCode())) {
+                throw new ServiceException("申请提交失败, 错误信息: " + response.getMessage());
+            }
+            return response.getTemplateCode();
+        } catch (Exception e) {
+            throw new ServiceException("短信模板创建失败");
+        }
+    }
+}

+ 101 - 0
module-erp/src/main/java/com/hys/app/util/MailSmtpUtil.java

@@ -0,0 +1,101 @@
+package com.hys.app.util;
+
+import javax.mail.*;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+import java.util.Date;
+import java.util.Properties;
+import java.util.UUID;
+
+public class MailSmtpUtil {
+
+    private static String user="service@mail.raycos.com.cn";
+    private static String pwd="RayCos20230801";
+
+
+    /**
+     *
+     * @param toMail
+     * @param subject
+     * @param content
+     */
+
+    public static Boolean sendEmail(String toMail,String subject,String content) {
+        // 配置发送邮件的环境属性
+        final Properties props = new Properties();
+
+        // 表示SMTP发送邮件,需要进行身份验证
+        props.put("mail.smtp.auth", "true");
+        props.put("mail.smtp.host", "smtpdm.aliyun.com");
+        //设置端口:
+        props.put("mail.smtp.port", "80");//或"25", 如果使用ssl,则去掉使用80或25端口的配置,进行如下配置:
+        //加密方式:
+        //props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
+        //props.put("mail.smtp.socketFactory.port", "465");
+        //props.put("mail.smtp.port", "465");
+
+        props.put("mail.smtp.from", user);    //mailfrom 参数
+        props.put("mail.user", user);// 发件人的账号(在控制台创建的发信地址)
+        props.put("mail.password", pwd);// 发信地址的smtp密码(在控制台选择发信地址进行设置)
+        //props.setProperty("mail.smtp.ssl.enable", "true");  //请配合465端口使用
+        System.setProperty("mail.mime.splitlongparameters", "false");//用于解决附件名过长导致的显示异常
+        //props.put("mail.smtp.connectiontimeout", 1000);
+
+        // 构建授权信息,用于进行SMTP进行身份验证
+        Authenticator authenticator = new Authenticator() {
+            @Override
+            protected PasswordAuthentication getPasswordAuthentication() {
+                // 用户名、密码
+                String userName = props.getProperty("mail.user");
+                String password = props.getProperty("mail.password");
+                return new PasswordAuthentication(userName, password);
+            }
+        };
+        //使用环境属性和授权信息,创建邮件会话
+        Session mailSession = Session.getInstance(props, authenticator);
+        //mailSession.setDebug(true);//开启debug模式
+        final String messageIDValue = genMessageID(props.getProperty("mail.user"));
+        //创建邮件消息
+        MimeMessage message = new MimeMessage(mailSession) {
+            @Override
+            protected void updateMessageID() throws MessagingException {
+                //设置自定义Message-ID值
+                setHeader("Message-ID", messageIDValue);//创建Message-ID
+            }
+        };
+
+        try {
+            // 设置发件人邮件地址和名称。填写控制台配置的发信地址。和上面的mail.user保持一致。名称用户可以自定义填写。
+            InternetAddress from = new InternetAddress(user, "上海瑞赢旷视科技");//from 参数,可实现代发,注意:代发容易被收信方拒信或进入垃圾箱。
+            message.setFrom(from);
+            // 设置收件人邮件地址
+            InternetAddress to = new InternetAddress(toMail);
+            message.setRecipient(MimeMessage.RecipientType.TO, to);
+            message.setSentDate(new Date()); //设置时间
+            //设置邮件标题
+            message.setSubject(subject);
+            message.setContent(content, "text/html;charset=UTF-8");//html超文本;// "text/plain;charset=UTF-8" //纯文本。
+            // 发送邮件
+            Transport.send(message);
+            return true;
+        } catch (Exception e) {
+            String err = e.getMessage();
+            // 在这里处理message内容, 格式是固定的
+            System.out.println(err);
+            return false;
+        }
+    }
+    protected static String genMessageID(String mailFrom) {
+        // message-id 用于唯一地标识每一封邮件,其格式需要遵循RFC 5322标准,通常如 <uniquestring@example.com>,其中uniquestring是邮件服务器生成的唯一标识,可能包含时间戳、随机数等信息。
+        String[] mailInfo = mailFrom.split("@");
+        String domain = mailFrom;
+        int index = mailInfo.length - 1;
+        if (index >= 0) {
+            domain = mailInfo[index];
+        }
+        UUID uuid = UUID.randomUUID();
+        StringBuffer messageId = new StringBuffer();
+        messageId.append('<').append(uuid.toString()).append('@').append(domain).append('>');
+        return messageId.toString();
+    }
+}

+ 13 - 1
module-erp/src/main/java/com/hys/app/util/ValidateUtil.java

@@ -1,8 +1,10 @@
 package com.hys.app.util;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
+import com.hys.app.framework.exception.ServiceException;
 import com.hys.app.framework.util.StringUtil;
 import lombok.experimental.UtilityClass;
 
@@ -25,7 +27,7 @@ public class ValidateUtil {
      * @param idFieldValue id字段值
      * @return true:存在重复数据
      */
-    public <T> boolean checkRepeat(BaseMapper<T> mapper, SFunction<T, ?> field, Object fieldValue, SFunction<T, ?> idField, String idFieldValue) {
+    public <T> boolean checkRepeat(BaseMapper<T> mapper, SFunction<T, ?> field, Object fieldValue, SFunction<T, ?> idField, Object idFieldValue) {
         if (fieldValue == null) {
             return false;
         }
@@ -41,4 +43,14 @@ public class ValidateUtil {
         return count != 0;
     }
 
+    public <T> T getOne(BaseMapper<T> mapper, SFunction<T, ?> idField, Object idFieldValue, String msg) {
+        T one = new LambdaQueryChainWrapper<>(mapper)
+                .eq(idField, idFieldValue)
+                .last("limit 1").one();
+        if (ObjectUtil.isNull(one)) {
+            throw new ServiceException(msg + "相关信息未查询到记录");
+        }
+        return one;
+    }
+
 }

+ 25 - 22
module-erp/src/main/resources/mapper/ProductStockMapper.xml

@@ -11,34 +11,37 @@
     <!-- 查询产品预警库存信息分页列表 -->
     <select id="queryList" resultType="com.hys.app.model.erp.vo.ProductStockV1" useCache="false">
         select
-            ps.id,
-            ps.actual_stock,
-            ps.usable_stock,
-            ps.transit_Stock,
-            ps.warning_stock,
-            ps.locked_stock,
-            w.id as warehouse_id,
-            w.name as warehouse_name,
-            g.id as goods_id,
-            g.name as goodsName,
-            g.bar_code as goods_bar_code,
-            g.sn ,
-            p.id as product_id,
-            p.name as product_name,
-            p.unit goodsUnit
+        ps.id,
+        ps.actual_stock,
+        ps.usable_stock,
+        ps.transit_Stock,
+        ps.warning_stock,
+        ps.locked_stock,
+        w.id as warehouse_id,
+        w.name as warehouse_name,
+        g.id as goods_id,
+        g.name as goodsName,
+        g.bar_code as goods_bar_code,
+        g.sn ,
+        p.id as product_id,
+        p.name as product_name,
+        p.unit goodsUnit
         from erp_product_stock ps
         left join erp_warehouse w on ps.warehouse_id = w.id
         left join erp_product p on ps.product_id = p.id
         left join erp_goods g on ps.goods_id = g.id
         <where>
+            <if test="request.companyId != null and request.companyId != 0">
+                and ps.company_id = #{request.companyId}
+            </if>
             <if test="request.warehouseId != null and request.warehouseId != 0">
                 and ps.id = #{request.warehouseId}
             </if>
             <if test="request.keyword != null and request.keyword != ''">
                 and (
-                    p.bar_code like concat("%",#{request.keyword },"%")
-                    or g.sn like concat("%",#{request.keyword },"%")
-                    or p.sku like concat("%",#{request.keyword },"%")
+                g.name like concat("%",#{request.keyword },"%")
+                or g.bar_code like concat("%",#{request.keyword },"%")
+                or g.name like concat("%",#{request.keyword },"%")
                 )
             </if>
         </where>
@@ -52,7 +55,7 @@
     <select id="selectCount" resultType="Long" useCache="false">
         select
 
-            count(ps.id)
+        count(ps.id)
 
         from erp_product_stock ps
         left join erp_warehouse w on ps.warehouse_id = w.id
@@ -98,14 +101,14 @@
     <select id="transitDetail" resultType="com.hys.app.model.erp.vo.TransitVO">
         SELECT
             eo.sn order_sn,
-            eoi.stock_num num,
-            eo.end_time
+            eoi.num,
+            eoi.end_time
         FROM
             erp_order_item eoi
                 LEFT JOIN erp_order eo ON eoi.order_id = eo.id
         WHERE
             eoi.product_stock_id = #{stockId}
-            and eoi.has_return = 0
+          and eoi.has_return = 0
           AND eo.type = "TO_C"
     </select>
 

+ 0 - 37
module-openapi/src/main/java/com/hys/app/job/MessagePushJobHandler.java

@@ -1,37 +0,0 @@
-//package com.hys.app.job;
-//
-//import com.hys.app.service.datasync.push.common.MessagePushManager;
-//import com.xxl.job.core.biz.model.ReturnT;
-//import com.xxl.job.core.handler.IJobHandler;
-//import com.xxl.job.core.handler.annotation.JobHandler;
-//import org.slf4j.Logger;
-//import org.slf4j.LoggerFactory;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.stereotype.Component;
-//
-///**
-// * 定时任务对推送失败的消息做补偿
-// *
-// * @author 张崧
-// * @since 2023-12-19
-// */
-//@JobHandler("messagePushJobHandler")
-//@Component
-//public class MessagePushJobHandler extends IJobHandler {
-//
-//    private final Logger logger = LoggerFactory.getLogger(getClass());
-//
-//    @Autowired
-//    private MessagePushManager messagePushManager;
-//
-//    @Override
-//    public ReturnT<String> execute(String param) throws Exception {
-//        try {
-//            messagePushManager.scanFailedAndRetry();
-//            return ReturnT.SUCCESS;
-//        } catch (Exception e) {
-//            logger.error("消息推送定时任务执行失败", e);
-//            return ReturnT.FAIL;
-//        }
-//    }
-//}

+ 1 - 14
server/src/main/resources/application-local.yml

@@ -8,7 +8,7 @@ spring:
       ds0:
         type: com.alibaba.druid.pool.DruidDataSource
         driver-class-name: com.mysql.jdbc.Driver
-        url: jdbc:mysql://127.0.0.1:3306/erp-standard?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true&useSSL=false
+        url: jdbc:mysql://127.0.0.1:3306/erp-warehouse?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true&useSSL=false
         username: root
         password: root
 
@@ -37,19 +37,6 @@ logging:
   level:
     com.hys.app: DEBUG
 
-xxl:
-  job:
-    admin:
-      addresses:  http://127.0.0.1:8080/xxl-job-admin
-    executor:
-      appname: erp-job-executer
-      ip:
-      port: 6998
-      logpath:  /opt/erp/xxl-serverlogs
-      logretentiondays: -1
-    accessToken:
-
-
 
 kuaidianiao:
   id: 1663339

+ 0 - 29
v3studio-erp-api/.gitignore

@@ -1,29 +0,0 @@
-/.idea/
-target
-*.iml
-*.class
-.DS_Store
-*.classpath
-*.project
-*.log
-.settings/
-.factorypath
-
-log/
-node_modules/
-gifs/
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
-
-test/unit/coverage
-test/e2e/reports
-selenium-debug.log
-
-*.factorypath
-*.log
-*.out
-
-server/target
-module-erp/target
-module-openapi/target

+ 0 - 661
v3studio-erp-api/LICENSE

@@ -1,661 +0,0 @@
-                    GNU AFFERO GENERAL PUBLIC LICENSE
-                       Version 3, 19 November 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The GNU Affero General Public License is a free, copyleft license for
-software and other kinds of works, specifically designed to ensure
-cooperation with the community in the case of network server software.
-
-  The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works.  By contrast,
-our General Public Licenses are intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
-  Developers that use our General Public Licenses protect your rights
-with two steps: (1) assert copyright on the software, and (2) offer
-you this License which gives you legal permission to copy, distribute
-and/or modify the software.
-
-  A secondary benefit of defending all users' freedom is that
-improvements made in alternate versions of the program, if they
-receive widespread use, become available for other developers to
-incorporate.  Many developers of free software are heartened and
-encouraged by the resulting cooperation.  However, in the case of
-software used on network servers, this result may fail to come about.
-The GNU General Public License permits making a modified version and
-letting the public access it on a server without ever releasing its
-source code to the public.
-
-  The GNU Affero General Public License is designed specifically to
-ensure that, in such cases, the modified source code becomes available
-to the community.  It requires the operator of a network server to
-provide the source code of the modified version running there to the
-users of that server.  Therefore, public use of a modified version, on
-a publicly accessible server, gives the public access to the source
-code of the modified version.
-
-  An older license, called the Affero General Public License and
-published by Affero, was designed to accomplish similar goals.  This is
-a different license, not a version of the Affero GPL, but Affero has
-released a new version of the Affero GPL which permits relicensing under
-this license.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                       TERMS AND CONDITIONS
-
-  0. Definitions.
-
-  "This License" refers to version 3 of the GNU Affero General Public License.
-
-  "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
-  "The Program" refers to any copyrightable work licensed under this
-License.  Each licensee is addressed as "you".  "Licensees" and
-"recipients" may be individuals or organizations.
-
-  To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy.  The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
-  A "covered work" means either the unmodified Program or a work based
-on the Program.
-
-  To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy.  Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
-  To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies.  Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
-  An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License.  If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
-  1. Source Code.
-
-  The "source code" for a work means the preferred form of the work
-for making modifications to it.  "Object code" means any non-source
-form of a work.
-
-  A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
-  The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form.  A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
-  The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities.  However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work.  For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
-  The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
-  The Corresponding Source for a work in source code form is that
-same work.
-
-  2. Basic Permissions.
-
-  All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met.  This License explicitly affirms your unlimited
-permission to run the unmodified Program.  The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work.  This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
-  You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force.  You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright.  Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
-  Conveying under any other circumstances is permitted solely under
-the conditions stated below.  Sublicensing is not allowed; section 10
-makes it unnecessary.
-
-  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
-  No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
-  When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
-  4. Conveying Verbatim Copies.
-
-  You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
-  You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
-  5. Conveying Modified Source Versions.
-
-  You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
-    a) The work must carry prominent notices stating that you modified
-    it, and giving a relevant date.
-
-    b) The work must carry prominent notices stating that it is
-    released under this License and any conditions added under section
-    7.  This requirement modifies the requirement in section 4 to
-    "keep intact all notices".
-
-    c) You must license the entire work, as a whole, under this
-    License to anyone who comes into possession of a copy.  This
-    License will therefore apply, along with any applicable section 7
-    additional terms, to the whole of the work, and all its parts,
-    regardless of how they are packaged.  This License gives no
-    permission to license the work in any other way, but it does not
-    invalidate such permission if you have separately received it.
-
-    d) If the work has interactive user interfaces, each must display
-    Appropriate Legal Notices; however, if the Program has interactive
-    interfaces that do not display Appropriate Legal Notices, your
-    work need not make them do so.
-
-  A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit.  Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
-  6. Conveying Non-Source Forms.
-
-  You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
-    a) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by the
-    Corresponding Source fixed on a durable physical medium
-    customarily used for software interchange.
-
-    b) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by a
-    written offer, valid for at least three years and valid for as
-    long as you offer spare parts or customer support for that product
-    model, to give anyone who possesses the object code either (1) a
-    copy of the Corresponding Source for all the software in the
-    product that is covered by this License, on a durable physical
-    medium customarily used for software interchange, for a price no
-    more than your reasonable cost of physically performing this
-    conveying of source, or (2) access to copy the
-    Corresponding Source from a network server at no charge.
-
-    c) Convey individual copies of the object code with a copy of the
-    written offer to provide the Corresponding Source.  This
-    alternative is allowed only occasionally and noncommercially, and
-    only if you received the object code with such an offer, in accord
-    with subsection 6b.
-
-    d) Convey the object code by offering access from a designated
-    place (gratis or for a charge), and offer equivalent access to the
-    Corresponding Source in the same way through the same place at no
-    further charge.  You need not require recipients to copy the
-    Corresponding Source along with the object code.  If the place to
-    copy the object code is a network server, the Corresponding Source
-    may be on a different server (operated by you or a third party)
-    that supports equivalent copying facilities, provided you maintain
-    clear directions next to the object code saying where to find the
-    Corresponding Source.  Regardless of what server hosts the
-    Corresponding Source, you remain obligated to ensure that it is
-    available for as long as needed to satisfy these requirements.
-
-    e) Convey the object code using peer-to-peer transmission, provided
-    you inform other peers where the object code and Corresponding
-    Source of the work are being offered to the general public at no
-    charge under subsection 6d.
-
-  A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
-  A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling.  In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage.  For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product.  A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
-  "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source.  The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
-  If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information.  But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
-  The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed.  Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
-  Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
-  7. Additional Terms.
-
-  "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law.  If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
-  When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it.  (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.)  You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
-  Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
-    a) Disclaiming warranty or limiting liability differently from the
-    terms of sections 15 and 16 of this License; or
-
-    b) Requiring preservation of specified reasonable legal notices or
-    author attributions in that material or in the Appropriate Legal
-    Notices displayed by works containing it; or
-
-    c) Prohibiting misrepresentation of the origin of that material, or
-    requiring that modified versions of such material be marked in
-    reasonable ways as different from the original version; or
-
-    d) Limiting the use for publicity purposes of names of licensors or
-    authors of the material; or
-
-    e) Declining to grant rights under trademark law for use of some
-    trade names, trademarks, or service marks; or
-
-    f) Requiring indemnification of licensors and authors of that
-    material by anyone who conveys the material (or modified versions of
-    it) with contractual assumptions of liability to the recipient, for
-    any liability that these contractual assumptions directly impose on
-    those licensors and authors.
-
-  All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10.  If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term.  If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
-  If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
-  Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
-  8. Termination.
-
-  You may not propagate or modify a covered work except as expressly
-provided under this License.  Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
-  However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
-  Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
-  Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License.  If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
-  9. Acceptance Not Required for Having Copies.
-
-  You are not required to accept this License in order to receive or
-run a copy of the Program.  Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance.  However,
-nothing other than this License grants you permission to propagate or
-modify any covered work.  These actions infringe copyright if you do
-not accept this License.  Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
-  10. Automatic Licensing of Downstream Recipients.
-
-  Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License.  You are not responsible
-for enforcing compliance by third parties with this License.
-
-  An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations.  If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
-  You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License.  For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
-  11. Patents.
-
-  A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based.  The
-work thus licensed is called the contributor's "contributor version".
-
-  A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version.  For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
-  Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
-  In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement).  To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
-  If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients.  "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
-  If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
-  A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License.  You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
-  Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
-  12. No Surrender of Others' Freedom.
-
-  If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all.  For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
-  13. Remote Network Interaction; Use with the GNU General Public License.
-
-  Notwithstanding any other provision of this License, if you modify the
-Program, your modified version must prominently offer all users
-interacting with it remotely through a computer network (if your version
-supports such interaction) an opportunity to receive the Corresponding
-Source of your version by providing access to the Corresponding Source
-from a network server at no charge, through some standard or customary
-means of facilitating copying of software.  This Corresponding Source
-shall include the Corresponding Source for any work covered by version 3
-of the GNU General Public License that is incorporated pursuant to the
-following paragraph.
-
-  Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU General Public License into a single
-combined work, and to convey the resulting work.  The terms of this
-License will continue to apply to the part which is the covered work,
-but the work with which it is combined will remain governed by version
-3 of the GNU General Public License.
-
-  14. Revised Versions of this License.
-
-  The Free Software Foundation may publish revised and/or new versions of
-the GNU Affero General Public License from time to time.  Such new versions
-will be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-  Each version is given a distinguishing version number.  If the
-Program specifies that a certain numbered version of the GNU Affero General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation.  If the Program does not specify a version number of the
-GNU Affero General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
-  If the Program specifies that a proxy can decide which future
-versions of the GNU Affero General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
-  Later license versions may give you additional or different
-permissions.  However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
-  15. Disclaimer of Warranty.
-
-  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. Limitation of Liability.
-
-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
-  17. Interpretation of Sections 15 and 16.
-
-  If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU Affero General Public License as published
-    by the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU Affero General Public License for more details.
-
-    You should have received a copy of the GNU Affero General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
-  If your software can interact with users remotely through a computer
-network, you should also make sure that it provides a way for users to
-get its source.  For example, if your program is a web application, its
-interface could display a "Source" link that leads users to an archive
-of the code.  There are many ways you could offer source, and different
-solutions will be better for different programs; see section 13 for the
-specific requirements.
-
-  You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU AGPL, see
-<http://www.gnu.org/licenses/>.

+ 0 - 125
v3studio-erp-api/README.md

@@ -1,125 +0,0 @@
-# MagicErp
-
-## ERP简介
-
-MagicErp是使用java语言开发,基于SpringBoot2.X架构体系构建的一套erp系统,主要包含采购管理、仓库管理、销售管理、商品管理、库存报表、基础配置和系统配置等功能,细节上包含采购入库、订单销售、出库发货、库存盘点、库存报损、商品调拨、库存预警等基础进销存功能,同时可以根据不同的用户角色展示不同的数据以及按钮权限。致力于为广大企业提供高效便捷的ERP库存管理系统。
-
-## 使用须知
-
-1. 允许个人学习使用。
-
-2. 允许用于学习、毕业设计等。
-
-3. 禁止将本开源的代码和资源进行任何形式任何名义的出售。
-
-4. 限制商业使用,如需联系QQ:2025555598 或微信扫一扫加我微信。
-
-   ![](https://shoptnt-bbc.oss-cn-beijing.aliyuncs.com/tnt/12261709021247_.pic.jpg?x-oss-process=style/300x300)
-
-## 交流、反馈
-
-官方QQ群:
-<a target="_blank" href="https://qm.qq.com/q/JLXlUb0GMa"><img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="magicErp开源交流群" title="magicErp开源交流群"></a> 827733509
-
-
-
-## ui仓库地址
-
-https://gitee.com/javastore/magic-erp-ui.git
-
-
-
-## 演示
-
-### 演示地址
-
-http://erp.javastore.cn 
-
-账号:superadmin
-
-密码:111111
-
-
-## 技术栈
-
-### 服务端
-| 框架             | 备注           | 版本          |
-| ---------------- | -------------- | ------------- |
-| Spring  Boot     | 核心框架       | 2.0.1.RELEASE |
-| mybatis  plus    | 持久框架       | 3.4.2         |
-| sharding  sphere | 分库分表       | 4.1.0         |
-| Maven            | 程序构建       |               |
-| Mysql            | 数据库         | 5.6/5.7       |
-| RabbitMQ         | 消息中间件AMQP | 3.x(3.6.14)   |
-| Redis            | 缓存           | 5.x           |
-| Spring Security  | 安全框架       | 2.0.1.RELEASE |
-| Druid            | 数据库连接池   | 1.1.22        |
-| xxl-job          | 定时任务       | 2.0.0         |
-### 客户端
-| 框架              | 备注         | 版本   |
-| ----------------- | ------------ | ------ |
-| webpack           | 构建工具     | 3.10.0 |
-| ES6               | JS版本       |        |
-| Vue.js            | 基础JS框架   | 2.6.14 |
-| jQuery            | 辅助JS库     | 2.1.4  |
-| Vue Router        | 路由管理     | 3.0.1  |
-| Vuex              | 状态管理     | 3.0.1  |
-| Element UI        | 基础UI库     | 2.15.5 |
-| vue-element-admin | UI界面基于   |        |
-| Axios             | 网络请求     | 0.18.0 |
-| Scss              | CSS预处理    | 4.13.0 |
-| ESLint            | 代码检查     | 4.13.1 |
-| ECharts           | 报表系统     | 3.8.5  |
-| 百度 UEditor      | 富文本编辑器 |        |
-| 百度 Web Uploader | 图片上传插件 |        |
-
-## 功能介绍
-| 功能   | 描述                                                                                           |
-|------|----------------------------------------------------------------------------------------------|
-| 采购管理 | 包括采购计划、合同管理、采购入库、供应商退货、供应商结算等采购相关模块,管理员可根据采购计划以及和三方签订的采购合同进行采购入库,和供应商根据采购入库单进行结算。            |
-| 仓库管理 | 包括商品调拨、商品借出、商品换货、库存盘点、库存报损、库存预警等库存相关模块,管理员可以将商品在不同的仓库之间进行调拨,对单个仓库商品进行盘点,对需要商品进行报损和查看库存预警的商品。 |
-| 库存报表 | 包括库存统计、库存成本统计、总入库统计、供应商退货统计、出库统计、订单退货统计、调拨统计、库存调整统计、商品换货统计等库存变动报表。                           |
-| 销售管理 | 包括订单列表、出库管理、订单退货模块,管理员可以创建销售订单,对订单进行发货、付款处理,也可对订单进行退货处理。                                     |
-| 商品管理 | 包括商品档案、规格管理、品牌管理模块,管理员新增/编辑商品基础信息,维护库存预警数量,管理商品分类、规格参数、品牌等信息。                                |
-| 基础设置 | 包括供应商管理、营销经理管理、仓库管理、编号规则设置、会员管理、支付方式管理、地区管理、物流公司管理、门店管理、运费模板模块。                              |
-| 系统管理 | 包括系统设置、存储方案、数据字典、日志管理、openapi秘钥配置、人员管理、权限管理、菜单维护、部门管理、岗位管理模块。                                |
-
-
-
-## 部署文档
-
-### 原生部署
-
-[基础设施部署](deploy-docs/基础设施部署.md)
-
-[api部署](deploy-docs/api部署.md)
-
-[ui部署](deploy-docs/ui部署.md)
-
-[git公钥部署](deploy-docs/git公钥部署.md)
-
-### 宝塔方式部署
-
-[宝塔部署](https://blog.csdn.net/MagicErp/article/details/136940050?spm=1001.2014.3001.5501)
-
-## 效果图
-
-![首页](https://hys-project.oss-cn-beijing.aliyuncs.com/erp/%E9%A6%96%E9%A1%B5.png)
-![采购入库](https://hys-project.oss-cn-beijing.aliyuncs.com/erp/%E9%87%87%E8%B4%AD%E5%85%A5%E5%BA%93.png)
-![订单退货](https://hys-project.oss-cn-beijing.aliyuncs.com/erp/%E8%AE%A2%E5%8D%95%E9%80%80%E8%B4%A7.png)
-![订单列表](https://hys-project.oss-cn-beijing.aliyuncs.com/erp/%E8%AE%A2%E5%8D%95%E5%88%97%E8%A1%A8.png)
-![新增商品](https://hys-project.oss-cn-beijing.aliyuncs.com/erp/%E6%96%B0%E5%A2%9E%E5%95%86%E5%93%81.png)
-![库存盘点](https://hys-project.oss-cn-beijing.aliyuncs.com/erp/%E5%BA%93%E5%AD%98%E7%9B%98%E7%82%B9.png)
-![商品调拨](https://hys-project.oss-cn-beijing.aliyuncs.com/erp/%E5%95%86%E5%93%81%E8%B0%83%E6%8B%A8.png)
-![商品列表](https://hys-project.oss-cn-beijing.aliyuncs.com/erp/%E5%95%86%E5%93%81%E5%88%97%E8%A1%A8.png)
-![创建订单](https://hys-project.oss-cn-beijing.aliyuncs.com/erp/%E5%88%9B%E5%BB%BA%E8%AE%A2%E5%8D%95.png)
-![仓库管理](https://hys-project.oss-cn-beijing.aliyuncs.com/erp/%E4%BB%93%E5%BA%93%E7%AE%A1%E7%90%86.png)
-![供应商管理](https://hys-project.oss-cn-beijing.aliyuncs.com/erp/%E4%BE%9B%E5%BA%94%E5%95%86%E7%AE%A1%E7%90%86.png)
-![供应商结算](https://hys-project.oss-cn-beijing.aliyuncs.com/erp/%E4%BE%9B%E5%BA%94%E5%95%86%E7%BB%93%E7%AE%97.png)
-![供应商退货](https://hys-project.oss-cn-beijing.aliyuncs.com/erp/%E4%BE%9B%E5%BA%94%E5%95%86%E9%80%80%E8%B4%A7.png)
-![入库统计](https://hys-project.oss-cn-beijing.aliyuncs.com/erp/%E5%85%A5%E5%BA%93%E5%95%86%E5%93%81%E7%BB%9F%E8%AE%A1.png)
-
-
-##博客
-
-[CSDN](https://blog.csdn.net/magicerp/category_12614700.html?spm=1001.2014.3001.5482)

+ 0 - 403
v3studio-erp-api/deploy-docs/api部署.md

@@ -1,403 +0,0 @@
-# API部署
-
-安装常用工具
-
-```bash
-sudo yum install  -y  yum-utils wget vim mtr curl telnet lsof git
-```
-
-## 安装jdk
-
-下载jdk
-
-```
-mkdir -p /opt
-cd /opt
-wget https://file.shoptnt.cn/jdk/jdk-8u281-linux-x64.tar.gz
-```
-
-解压缩并重命名:
-
-```
-tar -xzvf jdk-8u281-linux-x64.tar.gz  
-mv jdk1.8.0_281/ jdk8
-```
-
-
-> 如果不正确,可能需要退出重新登录
-
-## 安装maven
-
-~~~
-cd /opt
-wget https://mirrors.huaweicloud.com/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
-yum install -y vim 
-~~~
-
-~~~
-tar -xzvf apache-maven-3.6.3-bin.tar.gz
-~~~
-
-配置环境变量:
-
-```
-vi /etc/profile
-```
-
-在文件的最后配置如下内容:
-
-```
-JAVA_HOME=/opt/jdk8
-JRE_HOME=/opt/jdk8/jre
-CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
-MAVEN_HOME=/opt/apache-maven-3.6.3
-PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$MAVEN_HOME/bin
-export JAVA_HOME JRE_HOME CLASS_PATH PATH
-``` 
-> 注意可能存在已有配置,请修改为正确的路径
-
-使配置文件生效:
-
-```
-source /etc/profile
-```
-
-验证
-
-```
-java -version
-```
-
-验证
-
-```
-mvn -v
-```
-
-### 配置maven私服
-
-~~~bash
-vim /opt/apache-maven-3.6.3/conf/settings.xml
-~~~
-
-在mirrors节点中新增mirror节点:
-
-~~~xml
-<mirror>
-    <id>alimaven</id>
-    <mirrorOf>central</mirrorOf>
-    <name>aliyun maven</name>
-    <url>https://maven.aliyun.com/repository/central</url>
-</mirror>
-~~~
-
-在profiles节点中新增一个profile节点:
-
-~~~xml
-<profile>  
-  <id>alimaven</id>  
-  <repositories>  
-    <repository>  
-        <id>alimaven</id>  
-      <name>aliyun maven</name>
-      <url>https://maven.aliyun.com/repository/central</url>
-        <releases><enabled>true</enabled></releases>  
-        <snapshots><enabled>true</enabled></snapshots>  
-    </repository>  
-  </repositories>  
-</profile>  
-~~~
-
-在activeProfiles节点中新增一个activeProfile 节点:
-
-~~~xml
-<activeProfiles>
-  <activeProfile>alimaven</activeProfile>
-</activeProfiles>  
-~~~
-
-注意:以上代码不要写到注释里,请仔细检查!
-
-
-## clone源码
-
-在这之前,请您参考"[git部署公钥指南](/deploy/nok8s/create-ssh-rsa)"
-
->  作为规范,我们约定源码全部放在  /opt/erp/source目录中,jar放在/opt/erp/server中
-
-```
-mkdir -p /opt/erp/server
-mkdir -p /opt/erp/source
-cd /opt/erp/source
-```
-
-
-import Tabs from '@theme/Tabs';
-import TabItem from '@theme/TabItem';
-
-<Tabs>
- <TabItem value="erp" label="erp" default>
-
-clone我们需要的源码:
-
-```
-git clone git@gitee.com:javastore/magic-erp.git
-```
-
-或者
-
-```
-git clone https://gitee.com/javastore/magic-erp.git
-```
-
-进行初次编译
-
-~~~bash
-cd /opt/erp/source/api
-mvn clean install -DskipTests -f pom.xml
-~~~
-
-
-  </TabItem>
-</Tabs>
-
-
-### 配置config
-
-```
-配置源码中 server/src/main/resources/application-dev.yml文件
-如果是生产环境则配置 application-prod.yml
-配置好后提交代码,服务器这边记得重新拉一下代码
-```
-
-### 建立其它配置文件
-
-~~~
-mkdir -p /opt/erp/server/{config,logs}
-~~~
-
-~~~
-vim /opt/erp/server/config/application.yml
-~~~
-
-粘贴如下配置
-
-~~~
-spring:
-  profiles:
-    active: dev
-~~~
-
- 如果是生产环境,将dev改为prod     
-
-### 建立执行脚本
-
-~~~
-vim /opt/erp/server/start.sh
-~~~
-
-<Tabs>
-<TabItem value="erp" label="erp">
-
-粘贴如下内容:
-
-```sh
-#!/bin/bash
-
-#版本
-verson=7.2.2
-
-#要部署的分支
-branch=master
-
-#源文件存储目录
-source_dir=/opt/erp/source/api
-
-#程序运行时目录
-server_dir=/opt/erp/server
-mkdir -p $server_dir"/logs/"
-#要运行的api
-apis=("server")
-# 杀死进程
-killone(){
-ps -ef |grep java |grep $1  |grep -v 'grep'|awk '{print $2}'  | xargs kill -9
-echo '停止'$1
-}
-# 启动程序
-startone(){
-nohup java -Xmx512m -Xms256m -Xss1024k  -jar $1"-"$verson.jar > $server_dir"/logs/"$1".out"  2>&1 &
-echo '启动'$1
-}
-# 默认全部启动
-startall="yes"
-for api_name in  ${apis[@]}
-do
-if [[ "$1" != "" && "$1" = $api_name  && "$1" != "dontbuild" ]]
-then
-startall="no"
-break
-fi
-done
-
-echo "startall is "$startall
-
-if [[ "$startall" = "yes" ]]; then
-#杀死进程
-for api_name in  ${apis[@]}
-do
-killone "$api_name"
-echo "$api_name stop success"
-
-    done
-else
-killone "$1"
-fi
-
-#检测端口状态
-checkPort(){
-r=`netstat -ntlp | awk '{print $4}' | grep :$1`
-if [ "$r" == "" ]
-then
-return 0
-else
-return 1
-fi
-
-}
-
-if [ "$1" != "dontbuild" ]
-then
-#更新源码
-cd  $source_dir
-git reset --hard $branch
-git pull
-mvn -T 1C clean install -DskipTests -f pom.xml
-rm -rf $server_dir"/*.jar"
-
-    for api_name in  ${apis[@]}
-    do
-        mv $source_dir"/"$api_name"/target/"$api_name"-"$verson.jar $server_dir
-    done
-else
-echo "不构建,直接重启"    
-fi
-
-cd $server_dir
-
-if [[ "$startall" == "yes" ]]; then
-for api_name in  ${apis[@]}
-do
-startone "$api_name"
-done
-else
-startone "$1"
-fi
-
-#进度条
-progressBar(){
-
-label=('|' '/' '-' '\')
-
-per=$1
-ii=0
-str=''
-myTimes=$2
-text=$3
-let index=myTimes%4
-#拼接#字
-while [ $ii -le  $per ]
-do
-str=#$str
-let ii++
-done
-
-printf "[%-100s]%d%%  %s %s\r" $str $per ${label[$index]} $text
-
-
-if [[ $per == 100 ]]; then
-echo
-fi
-
-}
-
-#声明所有的服务和端口号,以便检测
-serviceMap["9999"]="server"
-
-
-totalPer=0
-
-#是否全部启动成功的标识
-all_is_ok=""
-last_text=''
-times=0
-processNum=0
-processItem=100/1 #七个任务中每个任务所占进度
-while :
-do
-all_is_ok="yes"
-progressBar $totalPer $times $last_text
-
-    #100次检查一下
-    checked=$(($times%100))
-
-    if [[ $checked == 0 ]]; then
-        for key in ${!serviceMap[*]};do
-           checkPort "$key"
-           started_result=`echo $?`
-           if [ "$started_result" == "1" ]
-           then
-             processNum=$(($processNum+1))
-             #每启动一个服务进度
-             totalPer=$(($processNum*$processItem))
-             #显示启动成功的程序
-             printf "%-57s%57s\n" ${serviceMap[$key]} '已启动' | sed 's/[ ]/-/g'
-             #将启动成功的服务移除掉
-             unset serviceMap["$key"]
-           fi
-        done
-    fi
-
-
-    sleep 0.1
-    let times++
-    if [[ ${#serviceMap[*]} == 0 ]]; then
-        progressBar 100 1 "全部启动完成"
-        break
-    fi
-done
-
-
-
-```
-
-</TabItem>
-</Tabs>
-
-
-
-
-进入脚本文件夹中:
-
-~~~
-cd /opt/erp/server
-~~~
-
-更新源码并且部署执行如下脚本:
-
-~~~
-sh start.sh
-~~~
-
-不更新源码直接重启执行如下脚本
-
-~~~
-sh start.sh dontbuild
-~~~
-
-
-### 验证
-
-
-全部启动成功后,通过以下网址检查API是否成功。
-
- http://ip:9999/swagger-ui.html

+ 0 - 27
v3studio-erp-api/deploy-docs/git部署公钥.md

@@ -1,27 +0,0 @@
-## git部署公钥指南
-
-执行此命令,会生成公钥和私钥两个文件
-
-```
- ssh-keygen -t rsa
-```
-
-执行此命令,进入目录
-
-```
- cd /root/.ssh/
-```
-
-执行此命令,查看公钥
-
-```
- cat id_rsa.pub
-```
-
-复制公钥信息
-
-
-登录码云-点击设置-找到安全设置下的ssh公钥-把复制的公钥粘贴到公钥出,点击确定按钮
-
-
-安全连接建立完成

+ 0 - 74
v3studio-erp-api/deploy-docs/ui部署.md

@@ -1,74 +0,0 @@
-# UI脚本部署
-
-## 下载源码
-
-```bash
-# 克隆项目
-mkdir /opt/erp/source && cd /opt/erp/source
-git clone https://gitee.com/javastore/magic-erp-ui.git --branch 2.0.1
-git clone https://gitee.com/bbc-se/deploy-script.git
-```
-
-## 安装基础环境
-
-> 基础环境包括nodejs、pm2、nginx
-> 注意:这个命令会禁用centos7的防火墙,如果不需要禁用防火墙,请编辑deploy.sh中第66行相关代码再运行。
-
-```bash
-cd /opt/erp/source/ui
-bash ./deploy.sh base
-```
-
-## 修改域名配置
-
-在这之前您需要规划好您的域名
-
-~~~bash
-vi /opt/erp/source/deploy-script/nginx/create-cfg.sh
-~~~
-
-修改其中的 域名及端口信息。
-
-然后进入到脚本目录下:
-
-```bash
-cd /opt/erp/source/deploy-script/nginx/
-```
-
-非SSL站点,执行脚本生成配置文件:
-
-~~~bash
-sh create-cfg.sh
-~~~
-
-SSL站点,执行脚本生成配置文件:
-
-~~~bash
-sh create-cfg.sh ssl
-~~~
-
-## 启动ui
-
-```bash
-cd /opt/erp/source/ui
-bash ./deploy.sh
-```
-
-## 启动nginx
-
-```bash
-/usr/local/nginx/sbin/nginx
-```
-
-### 验证
-
-访问相应域名
-
-如果重起nginx,则:
-
-~~~bash
-/usr/local/nginx/sbin/nginx -s reload
-~~~
-
-
-

+ 0 - 167
v3studio-erp-api/deploy-docs/基础设施部署.md

@@ -1,167 +0,0 @@
-# 基础设施部署
-
-### 前言
-
-> **一**、基础设施请基于Docker安装部署
-
-> **二**、请注意关闭防火墙或开放相关端口
-
-关闭防火墙
-
-```
-systemctl stop firewalld &&\
-systemctl disable firewalld
-```
-
-### 安装Docker
-
-```bash
-sudo yum install -y yum-utils device-mapper-persistent-data lvm2
-```
-
-```bash
-sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-```
-
-```bash
-sudo yum install -y docker-ce-18.03.1.ce
-```
-
-设置开机自启,并启动docker
-
-```bash
-systemctl enable docker
-systemctl start docker
-```
-
-### 部署RabbitMQ
-
-##### 1.建立数据存储目录
-
-```bash
-mkdir -p /opt/data/mqdata
-chmod -R 777 /opt/data/mqdata
-```
-
-##### 2.运行mq
-
-> 安全起见,请修改上述 RABBITMQ_ERLANG_COOKIE 的值(任意字串)
->
-> 默认用户名密码是guest/guest
->
-> 建议修改guest的密码,且创建自己的vhost和用户
-
-```bash
-docker run --rm -d --hostname rabbit \
- -p 15672:15672  -p 5672:5672 -p 25672:25672 -p 4369:4369 -p 35672:35672 \
- -v /opt/data/mqdata:/var/lib/rabbitmq \
- -e RABBITMQ_ERLANG_COOKIE='MY-SECRET-KEY' \
- --name rabbitmq   registry.cn-beijing.aliyuncs.com/shoptnt/rabbitmq:3.8.9
-```
-
-### 部署Redis
-
-> 注意修改redis的密码,如果不想要密码,可以删除命令末尾的 --requirepass "123456"
-
-##### 1.建立数据存储目录
-
-```bash
-mkdir -p /opt/data/redisdata
-chmod -R 777 /opt/data/redisdata
-```
-
-##### 2.运行redis
-
-```bash
-docker run --rm -d -p 6379:6379 \
--v /opt/data/redisdata:/data \
---name redis registry.cn-beijing.aliyuncs.com/shoptnt/redis:6.0.10 \
-redis-server --appendonly yes --requirepass "Iayq@742295"
-```
-
-### 部署MySQL
-
-> 如果您使用阿里云数据库,则可以跳过此步骤
->
-> 如您需要使用本地安装MySQL,请执行以下步骤
-
-##### 1.建立数据存储目录
-
-```bash
-mkdir -p /home/mysql/{conf,logs,data/mysql}
-```
-
-```bash
-vi /home/mysql/conf/my.cnf
-```
-
-将粘贴以下内容
-
-```
-[mysqld]
-pid-file        = /var/run/mysqld/mysqld.pid
-socket          = /var/run/mysqld/mysqld.sock
-datadir         = /var/lib/mysql
-secure-file-priv= NULL
-# Disabling symbolic-links is recommended to prevent assorted security risks
-symbolic-links=0
-lower_case_table_names=1
-# Custom config should go here
-!includedir /etc/mysql/conf.d/
-```
-
-##### 2.运行MySQL
-
-> 请修改 MYSQL_ROOT_PASSWORD 的值来修改root的密码
-
-```bash
-docker run --rm -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql -v /home/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /home/mysql/logs:/logs -v /home/mysql/data/mysql:/var/lib/mysql   registry.cn-beijing.aliyuncs.com/shoptnt/mysql:5.6.35
-```
-
-##### 3.创建数据库
-
-```
-CREATE DATABASE `erp`
-```
-
-##### 4.安装数据
-
-* 执行项目源码中 sql 文件夹下的 database.sql 文件,进行建表以及安装基础数据
-
-### 部署xxl-job
-
-
-
-> 在您部署的MySQL中建立xxl-job的数据库
-
-
-```
-CREATE DATABASE `xxl_job`
-```
-
-
-
->在xxl-job数据库中执行项目源码中 sql 文件夹下的 xxl_job.sql 文件,进行建表以及安装基础数据
-
-```bash
-docker run --rm -e PARAMS="--spring.datasource.url=jdbc:mysql://ip:3306/xxl_job?Unicode=true&characterEncoding=UTF-8  --spring.datasource.username=root --spring.datasource.password=123456" -p 8080:8080 -v /tmp:/data/applogs --name xxl-job-admin  -d  registry.cn-beijing.aliyuncs.com/shoptnt/xxl-job-admin:2.2.0
-```
-
-
-> 请修改相应密码为在"安装数据"步骤中设定的xxl-job数据库的密码
->
-> 请注意数据ip使用实际ip,不要使用127.0.0.1等字
->
-> 注意:这里的密码不支持特殊字符
-
-
-如果要设置xxl-job的账号和密码
-
-可以在docker启动参数的PARAMS中添加
-
-```yaml
- --xxl.job.login.username=用户名 
- --xxl.job.login.password=密码
-```
-
-> 2.2.0版本默认的账户是admin,密码是123456

+ 0 - 469
v3studio-erp-api/framework/pom.xml

@@ -1,469 +0,0 @@
-<?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>erp</artifactId>
-        <groupId>com.hys.app</groupId>
-        <version>7.2.2</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>framework</artifactId>
-
-
-    <dependencies>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-test</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.googlecode.owasp-java-html-sanitizer</groupId>
-            <artifactId>owasp-java-html-sanitizer</artifactId>
-            <version>r136</version>
-        </dependency>
-        <dependency>
-            <groupId>org.jsoup</groupId>
-            <artifactId>jsoup</artifactId>
-            <version>1.11.3</version>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-jdbc</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-configuration-processor</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-redis</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-amqp</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.cloud</groupId>
-            <artifactId>spring-cloud-starter-config</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-actuator</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>druid</artifactId>
-            <version>1.1.22</version>
-        </dependency>
-        <dependency>
-            <groupId>io.seata</groupId>
-            <artifactId>seata-spring-boot-starter</artifactId>
-            <version>1.0.0</version>
-        </dependency>
-        <dependency>
-            <groupId>mysql</groupId>
-            <artifactId>mysql-connector-java</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.google.code.gson</groupId>
-            <artifactId>gson</artifactId>
-            <version>2.8.2</version>
-        </dependency>
-        <dependency>
-            <groupId>commons-beanutils</groupId>
-            <artifactId>commons-beanutils</artifactId>
-            <version>1.8.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-codec</groupId>
-            <artifactId>commons-codec</artifactId>
-            <version>1.10</version>
-        </dependency>
-
-
-        <dependency>
-            <groupId>com.aliyun.oss</groupId>
-            <artifactId>aliyun-sdk-oss</artifactId>
-            <version>2.6.1</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-security</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>io.jsonwebtoken</groupId>
-            <artifactId>jjwt</artifactId>
-            <version>0.7.0</version>
-        </dependency>
-        <dependency>
-            <groupId>io.springfox</groupId>
-            <artifactId>springfox-swagger2</artifactId>
-            <version>2.8.0</version>
-        </dependency>
-        <dependency>
-            <groupId>io.springfox</groupId>
-            <artifactId>springfox-swagger-ui</artifactId>
-            <version>2.8.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>io.springfox</groupId>
-            <artifactId>springfox-bean-validators</artifactId>
-            <version>2.8.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>redis.clients</groupId>
-            <artifactId>jedis</artifactId>
-            <version>2.9.0</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.apache.commons</groupId>
-                    <artifactId>commons-pool2</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-pool2</artifactId>
-            <version>2.5.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.aspectj</groupId>
-            <artifactId>aspectjweaver</artifactId>
-            <version>1.8.9</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.redisson</groupId>
-            <artifactId>redisson</artifactId>
-            <version>3.5.5</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.hibernate.validator</groupId>
-            <artifactId>hibernate-validator</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.ant</groupId>
-            <artifactId>ant</artifactId>
-            <version>1.10.2</version>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-io</groupId>
-            <artifactId>commons-io</artifactId>
-            <version>2.6</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.sun.mail</groupId>
-            <artifactId>javax.mail</artifactId>
-            <version>1.6.2</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-core</artifactId>
-            <version>2.18.3</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi-ooxml</artifactId>
-            <version>3.17</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.poi</groupId>
-            <artifactId>poi</artifactId>
-            <version>3.17</version>
-        </dependency>
-        <dependency>
-            <groupId>org.ehcache</groupId>
-            <artifactId>ehcache</artifactId>
-            <version>3.8.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-freemarker</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.janino</groupId>
-            <artifactId>janino</artifactId>
-            <version>3.0.7</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.shardingsphere</groupId>
-            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
-            <version>${shardingsphere.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>com.baomidou</groupId>
-            <artifactId>mybatis-plus-boot-starter</artifactId>
-            <version>3.5.4</version>
-        </dependency>
-        <dependency>
-            <groupId>com.alipay.sdk</groupId>
-            <artifactId>alipay-easysdk</artifactId>
-            <version>2.1.0</version>
-        </dependency>
-        <dependency>
-            <groupId>io.minio</groupId>
-            <artifactId>minio</artifactId>
-            <version>8.0.3</version>
-        </dependency>
-        <!--加入log4j2依赖-->
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-log4j2</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.apache.logging.log4j</groupId>
-                    <artifactId>log4j-core</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.logging.log4j</groupId>
-                    <artifactId>log4j-api</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.logging.log4j</groupId>
-                    <artifactId>log4j-slf4j-impl</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <!-- 2.17.0修复漏洞版本 -->
-        <dependency>
-            <groupId>org.apache.logging.log4j</groupId>
-            <artifactId>log4j-api</artifactId>
-            <version>${log4j2.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.logging.log4j</groupId>
-            <artifactId>log4j-core</artifactId>
-            <version>${log4j2.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.logging.log4j</groupId>
-            <artifactId>log4j-slf4j-impl</artifactId>
-            <version>${log4j2.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.logging.log4j</groupId>
-            <artifactId>log4j-spring-boot</artifactId>
-            <version>${log4j2.version}</version>
-        </dependency>
-
-        <!--websocket-->
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-websocket</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.apache.logging.log4j</groupId>
-                    <artifactId>log4j-core</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.logging.log4j</groupId>
-                    <artifactId>log4j-api</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.logging.log4j</groupId>
-                    <artifactId>log4j-slf4j-impl</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.logging.log4j</groupId>
-                    <artifactId>log4j-to-slf4j</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.mapstruct</groupId>
-            <artifactId>mapstruct</artifactId>
-            <version>1.5.5.Final</version>
-        </dependency>
-        <dependency>
-            <groupId>org.mapstruct</groupId>
-            <artifactId>mapstruct-jdk8</artifactId> <!-- use mapstruct-jdk8 for Java 8 or higher -->
-            <version>1.5.5.Final</version>
-        </dependency>
-        <dependency>
-            <groupId>org.mapstruct</groupId>
-            <artifactId>mapstruct-processor</artifactId>
-            <version>1.5.5.Final</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.github.yulichang</groupId>
-            <artifactId>mybatis-plus-join-boot-starter</artifactId> <!-- MyBatis 联表查询 -->
-            <version>1.4.6</version>
-        </dependency>
-
-        <dependency>
-            <groupId>cn.hutool</groupId>
-            <artifactId>hutool-all</artifactId>
-            <version>5.3.5</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>transmittable-thread-local</artifactId>
-            <version>2.14.2</version>
-        </dependency>
-
-
-        <!-- todo 以下是从erp-core拿过来的,暂时先放这里 -->
-        <dependency>
-            <groupId>com.xuxueli</groupId>
-            <artifactId>xxl-job-core</artifactId>
-            <version>2.0.1</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.jcraft</groupId>
-            <artifactId>jsch</artifactId>
-            <version>0.1.53</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.integration</groupId>
-            <artifactId>spring-integration-http</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>dom4j</groupId>
-            <artifactId>dom4j</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.google.zxing</groupId>
-            <artifactId>core</artifactId>
-            <version>3.3.0</version>
-        </dependency>
-        <dependency>
-            <groupId>com.google.zxing</groupId>
-            <artifactId>javase</artifactId>
-            <version>3.3.0</version>
-        </dependency>
-        <dependency>
-            <groupId>net.sf.barcode4j</groupId>
-            <artifactId>barcode4j-light</artifactId>
-            <version>2.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.belerweb</groupId>
-            <artifactId>pinyin4j</artifactId>
-            <version>2.5.0</version>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-httpclient</groupId>
-            <artifactId>commons-httpclient</artifactId>
-            <version>3.1</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-            <version>23.0</version>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.xfire</groupId>
-            <artifactId>xfire-core</artifactId>
-            <version>1.2.6</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.bouncycastle</groupId>
-            <artifactId>bcprov-jdk16</artifactId>
-            <version>1.46</version>
-        </dependency>
-        <dependency>
-            <groupId>com.aliyun</groupId>
-            <artifactId>aliyun-java-sdk-core</artifactId>
-            <version>2.2.5</version>
-        </dependency>
-        <dependency>
-            <groupId>com.aliyun</groupId>
-            <artifactId>aliyun-java-sdk-afs</artifactId>
-            <version>1.0.0</version>
-        </dependency>
-
-        <!-- API, java.xml.bind module -->
-        <dependency>
-            <groupId>jakarta.xml.bind</groupId>
-            <artifactId>jakarta.xml.bind-api</artifactId>
-            <version>2.3.2</version>
-        </dependency>
-        <dependency>
-            <groupId>net.bytebuddy</groupId>
-            <artifactId>byte-buddy</artifactId>
-            <version>1.11.13</version>
-        </dependency>
-        <dependency>
-            <groupId>net.bytebuddy</groupId>
-            <artifactId>byte-buddy-agent</artifactId>
-            <version>1.11.13</version>
-            <scope>test</scope>
-        </dependency>
-        <!-- Runtime, com.sun.xml.bind module -->
-        <dependency>
-            <groupId>org.glassfish.jaxb</groupId>
-            <artifactId>jaxb-runtime</artifactId>
-            <version>2.3.2</version>
-        </dependency>
-        <dependency>
-            <groupId>com.aliyun</groupId>
-            <artifactId>dysmsapi20170525</artifactId>
-            <version>2.0.1</version>
-        </dependency>
-        <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>easyexcel</artifactId>
-            <version>3.0.5</version>
-        </dependency>
-    </dependencies>
-
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>com.spotify</groupId>
-                <artifactId>docker-maven-plugin</artifactId>
-                <version>1.1.1</version>
-                <configuration>
-                    <skipDocker>true</skipDocker>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-
-</project>

+ 0 - 78
v3studio-erp-api/framework/src/main/java/com/hys/app/framework/ErpAppRunner.java

@@ -1,78 +0,0 @@
-package com.hys.app.framework;
-
-import com.hys.app.framework.context.instance.InstanceContext;
-import com.hys.app.framework.context.user.UserContext;
-import com.hys.app.framework.context.user.UserHolder;
-import com.hys.app.framework.elasticsearch.EsIndexInit;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.ApplicationArguments;
-import org.springframework.boot.ApplicationRunner;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-
-/**
- * 项目启动配置
- *
- * @author kingapex
- * @version 1.0
- * @since 7.1.0
- * 2019-05-28
- */
-
-@Component
-@Order(value = 1)
-public class ErpAppRunner implements ApplicationRunner {
-
-
-    /**
-     * 用户信息holder,认证信息的获取者
-     */
-    @Autowired
-    private UserHolder userHolder;
-
-    @Autowired
-    private UserHolder chainUserHolder;
-
-    @Autowired
-    private ErpConfig erpConfig;
-
-    @Autowired
-    protected InstanceContext instanceContext;
-
-    @Autowired
-    protected EsIndexInit esIndexInit;
-
-    /**
-     * 在项目加载时指定认证信息获取者
-     * 默认是由spring 安全上下文中获取
-     *
-     * @param args
-     * @throws Exception
-     */
-    @Override
-    public void run(ApplicationArguments args) throws Exception {
-        if (erpConfig.getTokenSecret() == null) {
-            String errorMsg = "配置异常:未配置token秘钥,请检查如下:\n";
-            errorMsg += "===========================\n";
-            errorMsg += "   erp.token-secret\n";
-            errorMsg += "===========================";
-
-            throw new Exception(errorMsg);
-        }
-
-            UserContext.setChainHolder(chainUserHolder);
-
-            UserContext.setHolder(userHolder);
-
-
-
-        //注册本实例
-        instanceContext.register();
-
-        //初始ES索引
-//        esIndexInit.initEs();
-
-    }
-
-
-}

+ 0 - 109
v3studio-erp-api/framework/src/main/java/com/hys/app/framework/ErpConfig.java

@@ -1,109 +0,0 @@
-package com.hys.app.framework;
-
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Configuration;
-
-/**
- * 配置
- *
- * @author zh
- * @version v7.0
- * @date 18/4/13 下午8:19
- * @since v7.0
- */
-@Configuration
-@ConfigurationProperties(prefix = "erp")
-@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
-@SuppressWarnings("ConfigurationProperties")
-public class ErpConfig {
-
-    /**
-     * token加密秘钥
-     */
-    private String tokenSecret;
-
-    /**
-     * 访问token失效时间
-     */
-    @Value("${erp.timeout.accessTokenTimeout:#{null}}")
-    private Integer accessTokenTimeout;
-
-    @Value("${erp.timeout.refreshTokenTimeout:#{null}}")
-    private Integer refreshTokenTimeout;
-
-    @Value("${erp.timeout.captchaTimout:#{null}}")
-    private Integer captchaTimout;
-
-    @Value("${erp.timeout.smscodeTimout:#{null}}")
-    private Integer smscodeTimout;
-
-    @Value("${erp.debugger:#{false}}")
-    private boolean debugger;
-
-
-    public ErpConfig() {
-    }
-
-
-    @Override
-    public String toString() {
-        return "erpConfig{" +
-                "accessTokenTimeout=" + accessTokenTimeout +
-                ", refreshTokenTimeout=" + refreshTokenTimeout +
-                ", captchaTimout=" + captchaTimout +
-                ", smscodeTimout=" + smscodeTimout +
-                '}';
-    }
-
-    public String getTokenSecret() {
-        return tokenSecret;
-    }
-
-    public void setTokenSecret(String tokenSecret) {
-        this.tokenSecret = tokenSecret;
-    }
-
-    public Integer getAccessTokenTimeout() {
-        return accessTokenTimeout;
-    }
-
-    public void setAccessTokenTimeout(Integer accessTokenTimeout) {
-        this.accessTokenTimeout = accessTokenTimeout;
-    }
-
-    public Integer getRefreshTokenTimeout() {
-        return refreshTokenTimeout;
-    }
-
-    public void setRefreshTokenTimeout(Integer refreshTokenTimeout) {
-        this.refreshTokenTimeout = refreshTokenTimeout;
-    }
-
-    public Integer getCaptchaTimout() {
-        return captchaTimout;
-    }
-
-    public void setCaptchaTimout(Integer captchaTimout) {
-        this.captchaTimout = captchaTimout;
-    }
-
-    public Integer getSmscodeTimout() {
-        return smscodeTimout;
-    }
-
-    public void setSmscodeTimout(Integer smscodeTimout) {
-        this.smscodeTimout = smscodeTimout;
-    }
-
-    public boolean isDebugger() {
-        return debugger;
-    }
-
-    public void setDebugger(boolean debugger) {
-        this.debugger = debugger;
-    }
-
-}

+ 0 - 22
v3studio-erp-api/framework/src/main/java/com/hys/app/framework/FrameworkApplication.java

@@ -1,22 +0,0 @@
-package com.hys.app.framework;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.scheduling.annotation.EnableScheduling;
-
-/**
- * Created by kingapex on 2018/3/21.
- *
- * @author kingapex
- * @version 1.0
- * @since 7.0.0
- * 2018/3/21
- */
-@SpringBootApplication
-@EnableScheduling
-public class FrameworkApplication {
-    public static void main(String[] args) {
-        SpringApplication.run(FrameworkApplication.class, args);
-    }
-
-}

+ 0 - 29
v3studio-erp-api/framework/src/main/java/com/hys/app/framework/apptoken/AccessTokenCache.java

@@ -1,29 +0,0 @@
-package com.hys.app.framework.apptoken;
-
-import com.hys.app.framework.apptoken.model.AccessToken;
-
-/**
- * access token缓存接口<br/>
- * 专门面向access token的缓存
- * @author kingapex
- * @data 2021/8/29 13:36
- * @version 1.0
- **/
-public interface AccessTokenCache {
-
-    /**
-     * 向缓存中压入token
-     * @param accessTokenIdentifier token的唯一标识
-     * @param accessToken 要缓存的token
-     */
-    void put(AccessTokenIdentifier accessTokenIdentifier, AccessToken accessToken);
-
-    /**
-     * 由缓存中获取token
-     * @param accessTokenIdentifier token的唯一标识
-     * @return 缓存的token
-     */
-    AccessToken get(AccessTokenIdentifier accessTokenIdentifier);
-
-
-}

+ 0 - 32
v3studio-erp-api/framework/src/main/java/com/hys/app/framework/apptoken/AccessTokenGetter.java

@@ -1,32 +0,0 @@
-package com.hys.app.framework.apptoken;
-
-import com.hys.app.framework.apptoken.model.AccessToken;
-import com.hys.app.framework.apptoken.model.AppTypeEnum;
-
-/**
- * access token获取器<br/>
- * 1、为了统一对外提供token的获取接口<br/>
- * 2、兼容各种第三方应用access token获取的情况<br/>
- * 3、提供统一的token缓存管理
- *
- * @author kingapex
- * @data 2021/8/29 11:51
- * @version 1.0
- **/
-public interface AccessTokenGetter {
-
-    /**
-     * 由第三方服务api获取token
-     * @param accessTokenIdentifier token唯一标识
-     * @return
-     */
-    AccessToken getToken(AccessTokenIdentifier accessTokenIdentifier);
-
-    /**
-     * 定一个这个token getter的唯一凭证
-     * 是和AccesssTokenAppEnum 一一对应的,
-     * 也就是说有一个第三方应用,就有一个token getter
-     * @return
-     */
-    AppTypeEnum id();
-}

+ 0 - 36
v3studio-erp-api/framework/src/main/java/com/hys/app/framework/apptoken/AccessTokenGetterFactory.java

@@ -1,36 +0,0 @@
-package com.hys.app.framework.apptoken;
-
-import com.hys.app.framework.apptoken.model.AppTypeEnum;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * AccessTokenGetter Bean工厂
- * 根据AccesssTokenAppEnum获取唯一的 TokenGetter
- * @author kingapex
- * @version 1.0
- * @description TODO
- * @data 2021/8/29 13:03
- **/
-@Service
-public class AccessTokenGetterFactory {
-
-    @Autowired(required = false)
-    private List<AccessTokenGetter> getterList;
-
-    /**
-     * 根据AccesssTokenAppEnum获取唯一的 TokenGetter
-     * @param appTypeEnum token app类型枚举
-     * @return
-     */
-    public AccessTokenGetter getBean(AppTypeEnum appTypeEnum) {
-        List<AccessTokenGetter> list = getterList.stream().filter(getter -> getter.id().equals(appTypeEnum)).collect(Collectors.toList());
-        if (list.isEmpty()) {
-            return null;
-        }
-        return list.get(0);
-    }
-}

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно