Browse Source

代码合并

chenw 7 years ago
parent
commit
edff8fd21b
100 changed files with 2480 additions and 455 deletions
  1. 7 5
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/po/Status.java
  2. 2 1
      applications/commons/commons-server/src/main/resources/application.yml
  3. 0 1
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/DocumentApplication.java
  4. 1 1
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/BankinformationController.java
  5. 29 5
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/CustomerController.java
  6. 3 3
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/VendorController.java
  7. 6 2
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/CustomerService.java
  8. 1 1
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/VendorService.java
  9. 48 2
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/CustomerServiceImpl.java
  10. 15 2
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/VendorServiceImpl.java
  11. 2 2
      applications/document/document-server/src/main/resources/application.yml
  12. 1 1
      applications/document/document-server/src/main/resources/mapper/CustomeraddressMapper.xml
  13. 1 1
      applications/document/document-server/src/main/resources/mapper/CustomercontactMapper.xml
  14. 1 1
      applications/document/document-server/src/main/resources/mapper/VendorMapper.xml
  15. 8 0
      applications/money/money-server/pom.xml
  16. 4 4
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/controller/ProdInOutController.java
  17. 1 2
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/ProdInOutService.java
  18. 17 17
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/ProdInOutServiceImpl.java
  19. 4 11
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/SaleApplication.java
  20. 3 2
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/controller/ProdInOutController.java
  21. 4 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/ProdInOutMapper.java
  22. 56 10
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/ProdInOutService.java
  23. 123 73
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/ProdInOutServiceImpl.java
  24. 3 1
      applications/sale/sale-server/src/main/resources/mapper/ProdInOutListMapper.xml
  25. 14 1
      applications/sale/sale-server/src/main/resources/mapper/ProdInOutMapper.xml
  26. 8 2
      applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/po/ProdInOut.java
  27. 177 0
      applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/po/ProdInOutExample.java
  28. 6 0
      applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/po/ProdInOutList.java
  29. 4 0
      base-servers/account/account-dto/pom.xml
  30. 48 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/constant/ResourceClassify.java
  31. 26 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/constant/RoleType.java
  32. 100 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/ResourceDTO.java
  33. 169 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/ResourceGroupDTO.java
  34. 49 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/ResourceModuleDTO.java
  35. 0 10
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/ResourcesDTO.java
  36. 75 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/RoleDTO.java
  37. 57 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/RoleSaveDTO.java
  38. 67 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/RoleUpdateDTO.java
  39. 57 0
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/UrlResourceDTO.java
  40. 5 5
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/AccountController.java
  41. 47 5
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/CompanyController.java
  42. 0 8
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/ResourceController.java
  43. 56 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/ResourcesController.java
  44. 115 1
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/RoleController.java
  45. 12 2
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/AccountCompanyMapper.java
  46. 7 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/AccountRoleMapper.java
  47. 33 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/CompanyAppMapper.java
  48. 10 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/CompanyMapper.java
  49. 21 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/ResourceGroupMapper.java
  50. 29 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/ResourceMapper.java
  51. 20 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/ResourceModuleMapper.java
  52. 0 11
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/ResourcesMapper.java
  53. 10 1
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/RoleResourceMapper.java
  54. 31 36
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/Resource.java
  55. 40 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/ResourceGroup.java
  56. 40 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/ResourceModule.java
  57. 13 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/Role.java
  58. 24 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/CompanyService.java
  59. 29 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/ResourceService.java
  60. 28 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/RoleService.java
  61. 2 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/AccountServiceImpl.java
  62. 27 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/CompanyServiceImpl.java
  63. 104 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/ResourceServiceImpl.java
  64. 58 0
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/RoleServiceImpl.java
  65. 17 2
      base-servers/account/account-server/src/main/resources/application.yml
  66. 3 0
      base-servers/account/account-server/src/main/resources/mapper/AccountCompanyMapper.xml
  67. 3 0
      base-servers/account/account-server/src/main/resources/mapper/AccountRoleMapper.xml
  68. 13 0
      base-servers/account/account-server/src/main/resources/mapper/CompanyAppMapper.xml
  69. 7 4
      base-servers/account/account-server/src/main/resources/mapper/CompanyMapper.xml
  70. 15 0
      base-servers/account/account-server/src/main/resources/mapper/ResourceGroupMapper.xml
  71. 24 0
      base-servers/account/account-server/src/main/resources/mapper/ResourceMapper.xml
  72. 15 0
      base-servers/account/account-server/src/main/resources/mapper/ResourceModuleMapper.xml
  73. 0 4
      base-servers/account/account-server/src/main/resources/mapper/ResourcesMapper.xml
  74. 98 1
      base-servers/account/account-server/src/main/resources/mapper/RoleMapper.xml
  75. 3 0
      base-servers/account/account-server/src/main/resources/mapper/RoleResourceMapper.xml
  76. 1 2
      base-servers/account/account-server/src/test/java/com/usoftchina/saas/account/controller/AccountControllerTest.java
  77. 32 5
      base-servers/account/account-server/src/test/java/com/usoftchina/saas/account/controller/CompanyControllerTest.java
  78. 33 0
      base-servers/account/account-server/src/test/java/com/usoftchina/saas/account/controller/ResourcesControllerTest.java
  79. 47 0
      base-servers/account/account-server/src/test/java/com/usoftchina/saas/account/service/ResourceServiceTest.java
  80. 1 0
      base-servers/auth/auth-client/src/main/java/com/usoftchina/saas/auth/client/interceptor/AuthRestInterceptor.java
  81. 2 0
      base-servers/auth/auth-common/src/main/java/com/usoftchina/saas/auth/common/jwt/JwtHelper.java
  82. 11 1
      base-servers/auth/auth-common/src/main/java/com/usoftchina/saas/auth/common/jwt/JwtInfo.java
  83. 1 1
      base-servers/auth/auth-server/src/main/java/com/usoftchina/saas/auth/controller/AuthController.java
  84. 4 0
      framework/core/src/main/java/com/usoftchina/saas/constant/CommonConstants.java
  85. 9 0
      framework/core/src/main/java/com/usoftchina/saas/context/BaseContextHolder.java
  86. 1 0
      framework/core/src/main/java/com/usoftchina/saas/exception/ExceptionCode.java
  87. 13 11
      framework/core/src/main/java/com/usoftchina/saas/utils/CollectionUtils.java
  88. 1 1
      framework/core/src/main/java/com/usoftchina/saas/utils/ObjectUtils.java
  89. 1 1
      framework/core/src/main/java/com/usoftchina/saas/utils/StringUtils.java
  90. 4 4
      framework/test-starter/src/main/java/com.usoftchina.saas.test/BaseControllerTest.java
  91. 10 0
      framework/test-starter/src/main/java/com.usoftchina.saas.test/TestConstant.java
  92. 1 0
      framework/test-starter/src/main/java/com.usoftchina.saas.test/TestContextListener.java
  93. 7 2
      frontend/saas-web/Readme.md
  94. 13 0
      frontend/saas-web/app/model/document/vendorcontact.js
  95. 1 1
      frontend/saas-web/app/util/FormUtil.js
  96. 3 153
      frontend/saas-web/app/view/core/baseform/FormPanelController.js
  97. 89 5
      frontend/saas-web/app/view/core/baseform/GridPanel.js
  98. 1 0
      frontend/saas-web/app/view/core/dbfind/DbfindTrigger.js
  99. 31 20
      frontend/saas-web/app/view/core/form/FormPanel.js
  100. 7 7
      frontend/saas-web/app/view/core/form/FormPanelController.js

+ 7 - 5
applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/po/Status.java

@@ -11,6 +11,12 @@ public enum Status {
      */
     CLOSE("已关闭"),
 
+    /**
+     * 已开启
+     */
+    OPEN("已开启"),
+
+
     /**
      * 已审核
      */
@@ -44,12 +50,8 @@ public enum Status {
     /**
      * 未出库
      */
-    UNTURNOUT("未出库"),
+    UNTURNOUT("未出库");
 
-    /**
-     * 开启
-     */
-    OPEN("开启")
 
     ;
     private String display;

+ 2 - 1
applications/commons/commons-server/src/main/resources/application.yml

@@ -45,7 +45,8 @@ eureka:
   client:
     registryFetchIntervalSeconds: 5
     serviceUrl:
-      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.0.181:8510/eureka/
+#      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.0.181:8510/eureka/
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.253.31:8500/eureka/
 server:
   port: 8920
   tomcat:

+ 0 - 1
applications/document/document-server/src/main/java/com/usoftchina/saas/document/DocumentApplication.java

@@ -18,5 +18,4 @@ public class DocumentApplication {
     public static void main(String[] args) {
         SpringApplication.run(DocumentApplication.class);
     }
-
 }

+ 1 - 1
applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/BankinformationController.java

@@ -13,7 +13,7 @@ import java.util.List;
  * @date 2018/10/25 15:33
  **/
 @RestController
-@RequestMapping("/Bankinformation")
+@RequestMapping("/bankinformation")
 public class BankinformationController {
     @Autowired
     BankinformationService bankinformationService;

+ 29 - 5
applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/CustomerController.java

@@ -66,12 +66,36 @@ public class CustomerController {
      * @param id
      * @return
      */
-    @GetMapping("/delete/{id}")
+    @PostMapping("/delete/{id}")
     public Result delete(@PathVariable("id") Long id) {
         customerService.delete(id);
         return Result.success();
     }
 
+    /**
+     * 客户联系人删除
+     *
+     * @param id
+     * @return
+     */
+    @PostMapping("/deletecontact/{id}")
+    public Result deletecontact(@PathVariable("id") Long id) {
+        customerService.deletecontact(id);
+        return Result.success();
+    }
+
+    /**
+     * 客户地址删除
+     *
+     * @param id
+     * @return
+     */
+    @PostMapping("/deleteaddress/{id}")
+    public Result deleteaddress(@PathVariable("id") Long id) {
+        customerService.deleteaddress(id);
+        return Result.success();
+    }
+
     /**
      * 采购订单批量删除
      *
@@ -92,8 +116,8 @@ public class CustomerController {
      */
     @PostMapping("/close/{id}")
     public Result close(@PathVariable(value = "id") long id){
-        customerService.close(id);
-        return Result.success();
+        DocBaseDTO close = customerService.close(id);
+        return Result.success(close);
     }
 
     /**
@@ -104,8 +128,8 @@ public class CustomerController {
      */
     @PostMapping("/open/{id}")
     public Result open(@PathVariable(value = "id") long id){
-        customerService.open(id);
-        return Result.success();
+        DocBaseDTO open = customerService.open(id);
+        return Result.success(open);
     }
 
 

+ 3 - 3
applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/VendorController.java

@@ -51,9 +51,9 @@ public class VendorController {
      * @param listReqDTO
      * @return
      */
-    @GetMapping("/getListDataByCondition")
-    public Result<List<VendorList>> getListDataByCondition(ListReqDTO listReqDTO){
-        return Result.success(vendorService.getListDataByCondition(listReqDTO));
+    @GetMapping("/list")
+    public Result<PageInfo<VendorList>> getListDataByCondition(PageRequest page, ListReqDTO listReqDTO){
+        return Result.success(vendorService.getListDataByCondition(page, listReqDTO));
     }
 
     /**

+ 6 - 2
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/CustomerService.java

@@ -24,9 +24,13 @@ public interface CustomerService extends CommonBaseService<CustomerMapper, Custo
 
     void delete(Long id);
 
-    void close(long id);
+    DocBaseDTO close(long id);
 
-    void open(long id);
+    DocBaseDTO open(long id);
 
     void batchDelete(BatchDealBaseDTO baseDTOs);
+
+    void deletecontact(Long id);
+
+    void deleteaddress(Long id);
 }

+ 1 - 1
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/VendorService.java

@@ -38,7 +38,7 @@ public interface VendorService extends CommonBaseService<VendorMapper, Vendor>{
      * @param listReqDTO  条件对象
      * @return List<VendorList>
      */
-    List<VendorList> getListDataByCondition(ListReqDTO listReqDTO);
+    PageInfo<VendorList> getListDataByCondition(PageRequest page, ListReqDTO listReqDTO);
 
     /**
      * 保存主从表数据

+ 48 - 2
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/CustomerServiceImpl.java

@@ -6,6 +6,8 @@ import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.dto.BatchDealBaseDTO;
 import com.usoftchina.saas.commons.dto.DocBaseDTO;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
+import com.usoftchina.saas.commons.exception.BizExceptionCode;
+import com.usoftchina.saas.commons.po.Status;
 import com.usoftchina.saas.context.BaseContextHolder;
 import com.usoftchina.saas.document.dto.CustomerDTO;
 import com.usoftchina.saas.document.dto.CustomerFormDTO;
@@ -238,13 +240,53 @@ public class CustomerServiceImpl extends CommonBaseServiceImpl<CustomerMapper, C
     }
 
     @Override
-    public void close(long id) {
+    public void deletecontact(Long id) {
+        customercontactMapper.deleteByPrimaryKey(id);
+        DocBaseDTO docBaseDTO = getBaseDTOById(id);
+        //日志
+//        messageLogService.deleteDetail(docBaseDTO);
+    }
 
+    @Override
+    public void deleteaddress(Long id) {
+        customeraddressMapper.deleteByPrimaryKey(id);
+        DocBaseDTO docBaseDTO = getBaseDTOById(id);
+        //日志
+//        messageLogService.deleteDetail(docBaseDTO);
     }
 
     @Override
-    public void open(long id) {
+    public DocBaseDTO close(long id) {
+        Customer customer = getMapper().selectByPrimaryKey(id);
+        if(Status.CLOSE.name().equals(customer.getCu_statuscode())){
+            throw new BizException(BizExceptionCode.BIZ_CLOSE);
+        }
+        customer = new Customer();
+        customer.setId(id);
+        customer.setCu_statuscode(Status.CLOSE.name());
+        customer.setCu_status(Status.CLOSE.getDisplay());
+        getMapper().updateByPrimaryKeySelective(customer);
+        DocBaseDTO docBaseDTO = getBaseDTOById(id);
+        //日志
+//        messageLogService.close(docBaseDTO);
+        return docBaseDTO;
+    }
 
+    @Override
+    public DocBaseDTO open(long id) {
+        Customer customer = getMapper().selectByPrimaryKey(id);
+        if(Status.OPEN.name().equals(customer.getCu_statuscode())){
+            throw new BizException(BizExceptionCode.BIZ_OPEN);
+        }
+        customer = new Customer();
+        customer.setId(id);
+        customer.setCu_statuscode(Status.OPEN.name());
+        customer.setCu_status(Status.OPEN.getDisplay());
+        getMapper().updateByPrimaryKeySelective(customer);
+        DocBaseDTO docBaseDTO = getBaseDTOById(id);
+        //日志
+//        messageLogService.close(docBaseDTO);
+        return docBaseDTO;
     }
 
     private List<CustomerList> getListByMode(ListReqDTO req) {
@@ -278,4 +320,8 @@ public class CustomerServiceImpl extends CommonBaseServiceImpl<CustomerMapper, C
         return baseDTO;
     }
 
+
+
+
+
 }

+ 15 - 2
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/VendorServiceImpl.java

@@ -71,9 +71,19 @@ public class VendorServiceImpl extends CommonBaseServiceImpl<VendorMapper, Vendo
      * 返回列表数据
      * @return
      */
-    public List<VendorList> getListDataByCondition(ListReqDTO listReqDTO){
+    public PageInfo<VendorList> getListDataByCondition(PageRequest page, ListReqDTO listReqDTO){
+        //设置分页
+        if (null == page || page.getSize() == 0 || page.getNumber() == 0) {
+            page = new PageRequest();
+            page.setNumber(1);
+            page.setSize(10);
+        }
+        PageHelper.startPage(page.getNumber(), page.getSize());
+        //取分页信息
         String condition = listReqDTO.getFinalCondition();
-        return getMapper().getListDataByCondition(condition, BaseContextHolder.getCompanyId());
+        List<VendorList> list = getMapper().getListDataByCondition(condition, BaseContextHolder.getCompanyId());
+        PageInfo<VendorList> pageInfo = new PageInfo<VendorList>(list);
+        return pageInfo;
     }
 
     /**
@@ -82,6 +92,9 @@ public class VendorServiceImpl extends CommonBaseServiceImpl<VendorMapper, Vendo
      */
     @Override
     public DocBaseDTO saveFormData(VendorListDTO vendorListDTO) {
+        if (null == vendorListDTO || null == vendorListDTO.getMain()){
+            throw new BizException(500, "数据为空,请填写后再保存");
+        }
         Vendor main = vendorListDTO.getMain();
         main.setCompanyId(BaseContextHolder.getCompanyId());
         List<Vendorcontact> items = vendorListDTO.getItems();

+ 2 - 2
applications/document/document-server/src/main/resources/application.yml

@@ -47,8 +47,8 @@ eureka:
   client:
     registryFetchIntervalSeconds: 5
     serviceUrl:
-      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.0.181:8510/eureka/
-#      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.253.31:8510/eureka/
+#      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.0.181:8510/eureka/
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.253.31:8500/eureka/
 server:
   port: 9480
   tomcat:

+ 1 - 1
applications/document/document-server/src/main/resources/mapper/CustomeraddressMapper.xml

@@ -33,7 +33,7 @@
     from customeraddress
     where ca_id = #{ca_id,jdbcType=INTEGER}
   </select>
-  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
     delete from customeraddress
     where ca_id = #{ca_id,jdbcType=INTEGER}
   </delete>

+ 1 - 1
applications/document/document-server/src/main/resources/mapper/CustomercontactMapper.xml

@@ -29,7 +29,7 @@
     from customercontact
     where cc_id = #{cc_id,jdbcType=INTEGER}
   </select>
-  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
     delete from customercontact
     where cc_id = #{cc_id,jdbcType=INTEGER}
   </delete>

+ 1 - 1
applications/document/document-server/src/main/resources/mapper/VendorMapper.xml

@@ -89,7 +89,7 @@
     </resultMap>
 
     <select id="getListDataByCondition" resultMap="VendorListResultMapper">
-        SELECT * FROM VENDOR LEFT JOIN VENDORCONTACT ON VE_ID = VC_VEID
+        SELECT * FROM VENDOR LEFT JOIN VENDORCONTACT ON VE_ID = VC_VEID and vc_default = 1
         <where>
             <if test="condition!=null">
                 ${condition}

+ 8 - 0
applications/money/money-server/pom.xml

@@ -21,6 +21,14 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>auth-client</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>server-starter</artifactId>
+        </dependency>
 
         <!-- db -->
         <dependency>

+ 4 - 4
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/controller/ProdInOutController.java

@@ -3,7 +3,7 @@ package com.usoftchina.saas.purchase.controller;
 import com.github.pagehelper.PageInfo;
 import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.commons.dto.BatchDealBaseDTO;
-import com.usoftchina.saas.commons.dto.DocSavedDTO;
+import com.usoftchina.saas.commons.dto.DocBaseDTO;
 import com.usoftchina.saas.page.PageRequest;
 import com.usoftchina.saas.purchase.dto.ProdInOutFormDTO;
 import com.usoftchina.saas.purchase.dto.ProdInOutReqDTO;
@@ -56,8 +56,8 @@ public class ProdInOutController {
      * @return
      */
     @PostMapping("/save")
-    public Result<DocSavedDTO> saveFormData(@RequestBody ProdInOutFormDTO data) {
-        DocSavedDTO savedDTO = prodInOutService.saveFormData(data,false);
+    public Result<DocBaseDTO> saveFormData(@RequestBody ProdInOutFormDTO data) {
+        DocBaseDTO savedDTO = prodInOutService.saveFormData(data);
         return Result.success(savedDTO);
     }
 
@@ -94,7 +94,7 @@ public class ProdInOutController {
      */
     @PostMapping("/audit")
     public Result audit(@RequestBody ProdInOutFormDTO formData) {
-        DocSavedDTO audit = prodInOutService.audit(formData);
+        DocBaseDTO audit = prodInOutService.audit(formData);
         return Result.success(audit);
     }
 

+ 1 - 2
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/ProdInOutService.java

@@ -5,7 +5,6 @@ import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseService;
 import com.usoftchina.saas.commons.dto.BatchDealBaseDTO;
 import com.usoftchina.saas.commons.dto.DocBaseDTO;
-import com.usoftchina.saas.commons.dto.DocSavedDTO;
 import com.usoftchina.saas.page.PageRequest;
 import com.usoftchina.saas.purchase.dto.ProdInOutFormDTO;
 import com.usoftchina.saas.purchase.dto.ProdInOutReqDTO;
@@ -46,7 +45,7 @@ public interface ProdInOutService extends CommonBaseService<ProdInOutMapper, Pro
      * @param formData
      * @return
      */
-    DocSavedDTO audit(ProdInOutFormDTO formData);
+    DocBaseDTO audit(ProdInOutFormDTO formData);
 
     /**
      * 反审核出入库单

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

@@ -7,7 +7,6 @@ import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.api.MaxnumberService;
 import com.usoftchina.saas.commons.dto.BatchDealBaseDTO;
 import com.usoftchina.saas.commons.dto.DocBaseDTO;
-import com.usoftchina.saas.commons.dto.DocSavedDTO;
 import com.usoftchina.saas.commons.exception.BizExceptionCode;
 import com.usoftchina.saas.context.BaseContextHolder;
 import com.usoftchina.saas.document.api.WarehouseApi;
@@ -19,7 +18,9 @@ import com.usoftchina.saas.purchase.dto.ProdInOutDTO;
 import com.usoftchina.saas.purchase.dto.ProdInOutFormDTO;
 import com.usoftchina.saas.purchase.dto.ProdInOutReqDTO;
 import com.usoftchina.saas.purchase.mapper.*;
-import com.usoftchina.saas.purchase.po.*;
+import com.usoftchina.saas.purchase.po.ProdIODetail;
+import com.usoftchina.saas.purchase.po.ProdInOut;
+import com.usoftchina.saas.purchase.po.ProdInOutList;
 import com.usoftchina.saas.purchase.service.ProdInOutService;
 import com.usoftchina.saas.utils.BeanMapper;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -96,7 +97,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
     }
 
     @Override
-    public DocSavedDTO saveFormData(ProdInOutFormDTO formdata,Boolean isbfaudit) {
+    public DocBaseDTO saveFormData(ProdInOutFormDTO formdata) {
         if (null == formdata || null == formdata.getMain()){
             throw new BizException(500, "数据为空,请填写后再保存");
         }
@@ -111,7 +112,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         List<ProdIODetail> insertDetails = new ArrayList<>();
         //更新从表数据
         List<ProdIODetail> updateDetails = new ArrayList<>();
-        DocSavedDTO saveDTO = new DocSavedDTO();
+        DocBaseDTO baseDTO = new DocBaseDTO();
         Long pi_id = main.getId();
         String pi_inoutno = main.getPi_inoutno();
         ProdInOut prodInOut = BeanMapper.map(main,ProdInOut.class);
@@ -124,7 +125,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         //编号获取
         pi_inoutno = pushMaxnubmer(pi_inoutno, pi_id);
         prodInOut.setPi_inoutno(pi_inoutno);
-        saveDTO.setCode(pi_inoutno);
+        baseDTO.setCode(pi_inoutno);
         //判断更新与保存动作
         if (StringUtils.isEmpty(pi_id) || "0".equals(pi_id.toString())){
             //插入操作
@@ -143,8 +144,8 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
             if (insertDetails.size()>0) {
                 prodIODetailMapper.batchInsert(insertDetails);
             }
-            saveDTO.setId(pi_id);
-            return saveDTO;
+            baseDTO.setId(pi_id);
+            return baseDTO;
         }
         //更新操作
         getMapper().updateByPrimaryKeySelective(prodInOut);
@@ -168,11 +169,10 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         if (updateDetails.size()>0) {
             prodIODetailMapper.batchUpdate(updateDetails);
         }
-        saveDTO.setId(pi_id);
+        baseDTO.setId(pi_id);
         //更新已转数
-        if (!isbfaudit)
-            updateYqty(prodInOut);
-        return saveDTO;
+        updateYqty(prodInOut);
+        return baseDTO;
     }
 
     @Override
@@ -195,19 +195,19 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
 
 
     @Override
-    public DocSavedDTO audit(ProdInOutFormDTO formData) {
+    public DocBaseDTO audit(ProdInOutFormDTO formData) {
         Long id = null;
-        DocSavedDTO savedDTO = new DocSavedDTO();
+        DocBaseDTO baseDTO = new DocBaseDTO();
         if (null != formData) {
             id = formData.getMain().getId();
             if (StringUtils.isEmpty(id)) {
-                DocSavedDTO saveDTO = saveFormData(formData,true);
-                id = saveDTO.getId();
+                baseDTO = saveFormData(formData);
+                id = baseDTO.getId();
             }
             singleAudit(formData.getMain());
         }
-        savedDTO.setId(id);
-        return savedDTO;
+        baseDTO.setId(id);
+        return baseDTO;
     }
 
     @Override

+ 4 - 11
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/SaleApplication.java

@@ -4,8 +4,8 @@ import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
-import org.springframework.web.servlet.config.annotation.CorsRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
 
 /**
  * @author: guq
@@ -14,16 +14,9 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
 @SpringBootApplication
 @MapperScan("com.usoftchina.saas.sale.mapper")
 @EnableEurekaClient
-public class SaleApplication extends WebMvcConfigurerAdapter{
+@EnableFeignClients("com.usoftchina.saas")
+public class SaleApplication{
     public static void main(String[] args) {
         SpringApplication.run(SaleApplication.class, args);
     }
-    @Override
-    public void addCorsMappings(CorsRegistry registry) {
-        registry.addMapping("/**")
-                .allowCredentials(true)
-                .allowedHeaders("*")
-                .allowedOrigins("*")
-                .allowedMethods("*");
-    }
 }

+ 3 - 2
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/controller/ProdInOutController.java

@@ -3,6 +3,7 @@ package com.usoftchina.saas.sale.controller;
 import com.github.pagehelper.PageInfo;
 import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.commons.dto.BatchDealBaseDTO;
+import com.usoftchina.saas.commons.dto.DocBaseDTO;
 import com.usoftchina.saas.commons.dto.DocSavedDTO;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
 import com.usoftchina.saas.page.PageRequest;
@@ -59,7 +60,7 @@ public class ProdInOutController {
      */
     @PostMapping("/save")
     public Result<DocSavedDTO> saveFormData(@RequestBody ProdInOutFormDTO data) {
-        DocSavedDTO savedDTO = prodInOutService.saveFormData(data,false);
+        DocBaseDTO savedDTO = prodInOutService.saveFormData(data);
         return Result.success(savedDTO);
     }
 
@@ -96,7 +97,7 @@ public class ProdInOutController {
      */
     @PostMapping("/audit")
     public Result audit(@RequestBody ProdInOutFormDTO formData) {
-        DocSavedDTO audit = prodInOutService.audit(formData);
+        DocBaseDTO audit = prodInOutService.audit(formData);
         return Result.success(audit);
     }
 

+ 4 - 0
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/ProdInOutMapper.java

@@ -50,4 +50,8 @@ public interface ProdInOutMapper extends CommonBaseMapper<ProdInOut> {
     String validateAudit(List<DocBaseDTO> baseDTOs);
 
     String validateBatchUnAudit(List<DocBaseDTO> baseDTOs);
+
+    String validateBatchClose(List<DocBaseDTO> baseDTOs);
+
+    String validateBatchOpen(List<DocBaseDTO> baseDTOs);
 }

+ 56 - 10
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/ProdInOutService.java

@@ -22,7 +22,6 @@ import com.usoftchina.saas.storage.po.ProdInOutList;
  */
 public interface ProdInOutService extends CommonBaseService<ProdInOutMapper, ProdInOut>  {
 
-
     /**
      * 获取出入单表单
      *
@@ -45,6 +44,19 @@ public interface ProdInOutService extends CommonBaseService<ProdInOutMapper, Pro
      */
     void delete(Long id);
 
+    /**
+     * 批量删除出入库单
+     * @param baseDTOs
+     */
+    void batchDelete(BatchDealBaseDTO baseDTOs);
+
+    /**
+     * 删除明细
+     * @param id
+     * @return
+     */
+    Integer deleteItem(Long id);
+
     /**
      * 审核出入库单
      * @param formData
@@ -52,25 +64,59 @@ public interface ProdInOutService extends CommonBaseService<ProdInOutMapper, Pro
      */
     DocBaseDTO audit(ProdInOutFormDTO formData);
 
+    /**
+     * 批量审核出入库
+     * @param baseDTOs
+     * @return
+     */
+    void batchAudit(BatchDealBaseDTO baseDTOs);
+
     /**
      * 反审核出入库单
      * @param id
      */
     Result unAudit(Long id);
 
-    void batchAudit(BatchDealBaseDTO baseDTOs);
-
-    Integer deleteItem(Long id);
+    /**
+     * 批量反审核出入库单
+     * @param baseDTOs
+     */
+    void batchUnAudit(BatchDealBaseDTO baseDTOs);
 
-    void batchDelete(BatchDealBaseDTO baseDTOs);
+    /**
+     * 启用出入库单
+     * @param id
+     */
+    Result open(Long id);
 
-    PageInfo<ProdInOutList> getListData(PageRequest page, ListReqDTO req);
+    /**
+     * 关闭出入库单
+     * @param
+     */
+    Result close(Long id);
 
-    Result turnProdin(Long id);
+    /**
+     * 批量启用出入库单
+     * @param baseDTOs
+     */
+    void batchOpen(BatchDealBaseDTO baseDTOs);
 
-    void batchUnAudit(BatchDealBaseDTO baseDTOs);
+    /**
+     * 批量关闭出入库单
+     * @param baseDTOs
+     */
+    void batchClose(BatchDealBaseDTO baseDTOs);
 
-    void open(Long id);
+    /**
+     * 获取列表信息
+     * @param page 分页
+     * @param req
+     */
+    PageInfo<ProdInOutList> getListData(PageRequest page, ListReqDTO req);
 
-    void close(Long id);
+    /**
+     * 出库单转退货单
+     * @param id
+     */
+    Result turnProdin(Long id);
 }

+ 123 - 73
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/ProdInOutServiceImpl.java

@@ -12,7 +12,6 @@ import com.usoftchina.saas.commons.dto.DocSavedDTO;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
 import com.usoftchina.saas.commons.exception.BizExceptionCode;
 import com.usoftchina.saas.commons.po.BillCodeSeq;
-import com.usoftchina.saas.commons.po.Maxnumbers;
 import com.usoftchina.saas.commons.po.Status;
 import com.usoftchina.saas.context.BaseContextHolder;
 import com.usoftchina.saas.document.api.WarehouseApi;
@@ -22,7 +21,6 @@ import com.usoftchina.saas.page.PageRequest;
 import com.usoftchina.saas.sale.dto.ProdIODetailDTO;
 import com.usoftchina.saas.sale.dto.ProdInOutDTO;
 import com.usoftchina.saas.sale.dto.ProdInOutFormDTO;
-import com.usoftchina.saas.sale.dto.ProdInOutReqDTO;
 import com.usoftchina.saas.sale.mapper.*;
 import com.usoftchina.saas.sale.service.ProdInOutService;
 import com.usoftchina.saas.storage.po.ProdIODetail;
@@ -56,7 +54,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
     public ProdInOutFormDTO getFormData(Long id) {
         ProdInOutFormDTO prodInOutFormDTO = new ProdInOutFormDTO();
         //查询主表
-        ProdInOut prodInOut = getMapper().selectByPrimaryKey(id);
+        ProdInOut prodInOut = checkAndReturnOrder(id);
         //将prodInOut实体对象转化为传输对象
         ProdInOutDTO main = BeanMapper.map(prodInOut,ProdInOutDTO.class);
         //查询从表
@@ -166,7 +164,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         singleDelete(id);
     }
     private void singleDelete(Long id) {
-        ProdInOut prodInOut = getMapper().selectByPrimaryKey(id);
+        ProdInOut prodInOut = checkAndReturnOrder(id);
         //从表删除
         prodIODetailMapper.deleteByForeignKey(id);
         //主表删除
@@ -175,8 +173,9 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         //更新已转数
         updateYqty(prodInOut);
         //日志
-        messageLogService.deleteDetail(docBaseDTO);
+       messageLogService.deleteDetail(docBaseDTO);
     }
+
     @Override
     @Transactional
     public DocBaseDTO audit(ProdInOutFormDTO formData) {
@@ -216,16 +215,14 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
             return "";
         }
     }
+
     @Override
     public Result unAudit(Long id) {
-        if (null == id) {
-            return Result.error(BizExceptionCode.SALE_NULL_BILL);
-        }
+        ProdInOut prodInOut = checkAndReturnOrder(id);
         String code = prodInOutMapper.validateUnAudit(id);
-        if (null != code) {
+        if (!prodInOut.getPi_statuscode().equals(Status.AUDITED.name())) {
             throw new BizException(BizExceptionCode.SALE_NULL_BILL);
         }
-        ProdInOut prodInOut = prodInOutMapper.selectByPrimaryKey(id);
         ProdInOutDTO prodInOutDTO = BeanMapper.map(prodInOut, ProdInOutDTO.class);
         String res =  singleUnAudit(prodInOutDTO);
         if(res!=null){
@@ -247,6 +244,13 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         if(result!=null){
             return result.toString();
         }else{
+            //更新状态为未审核
+            ProdInOut prodInOut = BeanMapper.map(prodInOutDTO, ProdInOut.class);
+            prodInOut.setPi_statuscode(Status.UNAUDITED.name());
+            prodInOut.setPi_status(Status.UNAUDITED.getDisplay());
+            prodInOut.setUpdateTime(new Date());
+            prodInOut.setUpdaterId(BaseContextHolder.getUserId());
+            getMapper().updateByPrimaryKeySelective(prodInOut);
             //记录日志
             DocBaseDTO docBaseDTO = getBaseDTOById(prodInOutDTO.getId(),pi_class);
             //日志
@@ -254,6 +258,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
             return "";
         }
     }
+
     @Override
     public void batchAudit(BatchDealBaseDTO baseDTOs) {
         if (null == baseDTOs || null == baseDTOs.getBaseDTOs() ||
@@ -271,7 +276,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
             ProdInOutDTO prodInOutDTO = BeanMapper.map(prodInOut,ProdInOutDTO.class);
             error+=singleAudit(prodInOutDTO);
         }
-        if(error!=null&&!error.equals("")){
+        if(!StringUtils.isEmpty(error)){
             new BizException(501,error);
         }
     }
@@ -294,7 +299,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
             ProdInOutDTO prodInOutDTO = BeanMapper.map(prodInOut,ProdInOutDTO.class);
             error+=singleUnAudit(prodInOutDTO);
         }
-        if(error!=null&&!error.equals("")){
+        if(!StringUtils.isEmpty(error)){
             new BizException(501,error);
         }
     }
@@ -302,15 +307,16 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
     @Override
     public Integer deleteItem(Long id) {
         ProdIODetail prodIODetail = prodIODetailMapper.selectByPrimaryKey(id);
-        ProdInOut prodInOut = prodInOutMapper.selectByPrimaryKey(prodIODetail.getPd_piid());
+        ProdInOut prodInOut = checkAndReturnOrder(prodIODetail.getPd_piid());
         Integer num = prodIODetailMapper.deleteByPrimaryKey(id);
         //更新已转数
         updateYqty(prodInOut);
         DocBaseDTO docBaseDTO = getBaseDTOById(id,prodInOut.getPi_class());
         //日志
-        messageLogService.deleteDetail(docBaseDTO);
+       messageLogService.deleteDetail(docBaseDTO);
         return num;
     }
+
     @Override
     public void batchDelete(BatchDealBaseDTO baseDTOs) {
         if (null == baseDTOs || null == baseDTOs.getBaseDTOs() ||
@@ -337,6 +343,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         PageInfo<ProdInOutList> pageInfo = new PageInfo<ProdInOutList>(lists);
         return pageInfo;
     }
+
     private List<ProdInOutList> getListByMode(ListReqDTO req) {
         List<ProdInOutList> list = null;
         Long companyId = BaseContextHolder.getCompanyId();
@@ -351,12 +358,13 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         }
         return list;
     }
+
     @Override
     public Result turnProdin(Long id) {
         Integer count=0;
         double pdOutqty=0;
         double pdYqty=0;
-        ProdInOut sourcePi = prodInOutMapper.selectByPrimaryKey(id);
+        ProdInOut sourcePi = checkAndReturnOrder(id);
         List<ProdIODetail> sourceDetails =prodIODetailMapper.selectByFK(id);
         if (null == sourcePi || StringUtils.isEmpty(sourcePi.getPi_inoutno()) || sourceDetails.size() == 0) {
             throw new BizException(BizExceptionCode.SALE_NULL_BILL);
@@ -383,7 +391,9 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         //插入销售退货单主表
         ProdInOut targetPi = new ProdInOut();
         //生成单号
-        String piInoutno =  maxnumberService.getMaxnumber(BillCodeSeq.SALEIN.getCaller(),true).getData();
+        String piInoutno =
+                //BillCodeSeq.SALEIN.getCaller() + Math.abs(Math.random()*100);
+                maxnumberService.getMaxnumber(BillCodeSeq.SALEIN.getCaller(),true).getData();
         targetPi.setPi_inoutno(piInoutno);
         targetPi.setPi_class(BillCodeSeq.SALEIN.getName());
         targetPi.setPi_date(new Date());
@@ -442,81 +452,96 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
 
     @Override
     @Transactional
-    public void close(Long id) {
-        if(id == null || id <= 0) {
-            throw new BizException(BizExceptionCode.ILLEGAL_ID);
-        }
-        ProdInOut prodInOut =  prodInOutMapper.selectByPrimaryKey(id);
-        if(prodInOut==null){
-            throw new BizException(BizExceptionCode.NO_DATA);
+    public Result close(Long id) {
+        String res = singleClose(id);
+        if(StringUtils.hasText(res)){
+            return Result.error(res);
+        }else{
+            return Result.success();
         }
+    }
+
+    private String singleClose(Long id){
+        ProdInOut prodInOut = checkAndReturnOrder(id);
+        //状态校验
         if(Status.CLOSE.name().equals(prodInOut.getPi_status())){
-            throw new BizException(BizExceptionCode.BIZ_CLOSE);
+            return BizExceptionCode.BIZ_CLOSE.getMessage();
         }
+        //更新状态
         prodInOut.setPi_status(Status.CLOSE.getDisplay());
         prodInOut.setPi_statuscode(Status.CLOSE.name());
 
         prodInOutMapper.updateByPrimaryKeySelective(prodInOut);
-        DocBaseDTO docBaseDTO = getBaseDTOById(id,prodInOut.getPi_class());
-        //日志
-        messageLogService.close(docBaseDTO);
+        //记录日志
+        DocBaseDTO docBaseDTO = getBaseDTOById(prodInOut.getId(),prodInOut.getPi_class());
+       messageLogService.close(docBaseDTO);
+        return "";
     }
 
     @Override
-    @Transactional
-    public void open(Long id){
-        ProdInOut prodInOut = prodInOutMapper.selectByPrimaryKey(id);
-        if(prodInOut==null){
-            throw new BizException(BizExceptionCode.NO_DATA);
+    public  void batchClose(BatchDealBaseDTO baseDTOs){
+        if (null == baseDTOs || null == baseDTOs.getBaseDTOs() ||
+                baseDTOs.getBaseDTOs().size() == 0) {
+            return;
         }
-        List<ProdIODetail> prodIODetailList = prodIODetailMapper.selectByFK(id);
-        //部分入库、全部入库
-        int partTurnCount = 0,turnCount = 0;
-        Double yqty=0.0,qty=0.0;
-        Boolean isIn = false;
-        if(BillCodeSeq.SALEIN.getName().equals(prodInOut.getPi_class())){
-            isIn=true;
-        }
-        if(prodIODetailList!=null&&prodIODetailList.size()>0){
-            for (ProdIODetail prodiodetail :prodIODetailList){
-                yqty = prodiodetail.getPd_yqty() ==null?0.0:prodiodetail.getPd_yqty();
-                if(isIn){
-                    qty = prodiodetail.getPd_inqty() ==null?0.0:prodiodetail.getPd_yqty();
-                }else{
-                    qty = prodiodetail.getPd_outqty() ==null?0.0:prodiodetail.getPd_outqty();
-                }
-                if(yqty >= qty){
-                    turnCount++;
-                }else if(yqty>0&&yqty<qty){
-                    partTurnCount++;
-                }
-            }
+        String validate = prodInOutMapper.validateBatchClose(baseDTOs.getBaseDTOs());
+        if (!StringUtils.isEmpty(validate)) {
+            throw new BizException(503, "存在非已审核单据,单据编号:" + validate);
         }
-        if(partTurnCount>0){
-            if(isIn){
-                prodInOut.setPi_status(Status.PART2IN.getDisplay());
-                prodInOut.setPi_statuscode(Status.PART2IN.name());
-            }else {
-                prodInOut.setPi_status(Status.PARTOUT.getDisplay());
-                prodInOut.setPi_statuscode(Status.PARTOUT.name());
-            }
-        }else if(turnCount == prodIODetailList.size()){
-            if(isIn){
-                prodInOut.setPi_status(Status.TURNIN.getDisplay());
-                prodInOut.setPi_statuscode(Status.TURNIN.name());
-            }else {
-                prodInOut.setPi_status(Status.TURNOUT.getDisplay());
-                prodInOut.setPi_statuscode(Status.TURNOUT.name());
-            }
+        String error = null;
+        for (DocBaseDTO base : baseDTOs.getBaseDTOs()) {
+            error+=singleClose(base.getId());
+        }
+        if(!StringUtils.isEmpty(error)){
+            new BizException(501,error);
+        }
+    }
+
+    @Override
+    @Transactional
+    public Result open(Long id){
+        String res = singleOpen(id);
+        if(StringUtils.hasText(res)){
+            return Result.error(res);
         }else{
-            prodInOut.setPi_status(Status.AUDITED.getDisplay());
-            prodInOut.setPi_statuscode(Status.AUDITED.getDisplay());
+            return Result.success();
         }
+    }
+
+    private String singleOpen(Long id){
+        ProdInOut prodInOut = checkAndReturnOrder(id);
+        String pi_statuscode = prodInOut.getPi_statuscode();
+        if(!StringUtils.isEmpty(pi_statuscode)&&!pi_statuscode.equals(Status.CLOSE.getDisplay())){
+            return BizExceptionCode.BIZ_OPEN.getMessage();
+        };
+        prodInOut.setPi_status(Status.AUDITED.getDisplay());
+        prodInOut.setPi_statuscode(Status.AUDITED.getDisplay());
         prodInOutMapper.updateByPrimaryKeySelective(prodInOut);
-        DocBaseDTO docBaseDTO = getBaseDTOById(id,prodInOut.getPi_class());
         //记录日志
+        DocBaseDTO docBaseDTO = getBaseDTOById(prodInOut.getId(),prodInOut.getPi_class());
         messageLogService.open(docBaseDTO);
+        return "";
     }
+
+    @Override
+    public void batchOpen(BatchDealBaseDTO baseDTOs){
+        if (null == baseDTOs || null == baseDTOs.getBaseDTOs() ||
+                baseDTOs.getBaseDTOs().size() == 0) {
+            return;
+        }
+        String validate = prodInOutMapper.validateBatchOpen(baseDTOs.getBaseDTOs());
+        if (!StringUtils.isEmpty(validate)) {
+            throw new BizException(503, "存在非已关闭单据,单据编号:" + validate);
+        }
+        String error = null;
+        for (DocBaseDTO base : baseDTOs.getBaseDTOs()) {
+            error+=singleOpen(base.getId());
+        }
+        if(!StringUtils.isEmpty(error)){
+            new BizException(501,error);
+        }
+    }
+
     /**
      * @Description: 检验获取并更新单号
      * @Param: [code, id]
@@ -528,6 +553,10 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         if (null == code) {
             throw new BizException(BizExceptionCode.NULL_CODE);
         }
+        ProdInOut prodInOut = prodInOutMapper.selectByPrimaryKey(id);
+        if(prodInOut==null){
+            throw new BizException(BizExceptionCode.NO_DATA);
+        }
         Integer count = "0".equals(String.valueOf(id)) ? prodInOutMapper.validateCodeWhenInsert(code,pi_class) :
                 prodInOutMapper.validateCodeWhenUpdate(code, id);
         String caller ="";
@@ -537,7 +566,9 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
             caller = BillCodeSeq.SALEIN.getCaller();
         }
         return maxnumberService.pushMaxnubmer(count, code, caller).getData();
+        //return  caller+Math.abs(Math.random()*100);
     }
+
     /**
      * @Description: 更新已转数
      * @Param: [code, id]
@@ -573,6 +604,7 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         baseDTO.setName(caller);
         return baseDTO;
     }
+
     //更新最新明细总额
     private void getTotal(Long id,String pi_class) {
         if(BillCodeSeq.SALEOUT.getName().equals(pi_class)){
@@ -581,4 +613,22 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
             prodIODetailMapper.updatePDSaleIN(id);
         }
     }
+
+    /**
+     * @Description
+     * @Param: [id]
+     * @return: com.usoftchina.saas.commons.dto.DocBaseDTO
+     * @Author: wuyx
+     * @Date: 2018/10/25
+     * */
+    private ProdInOut checkAndReturnOrder (Long id){
+        if(id == null || id <= 0) {
+            throw new BizException(BizExceptionCode.ILLEGAL_ID);
+        }
+        ProdInOut prodInOut = getMapper().selectByPrimaryKey(id);
+        if(prodInOut==null){
+            throw new BizException(BizExceptionCode.NO_DATA);
+        }
+        return prodInOut;
+    }
 }

+ 3 - 1
applications/sale/sale-server/src/main/resources/mapper/ProdInOutListMapper.xml

@@ -68,7 +68,9 @@
     <result column="pd_ym" jdbcType="INTEGER" property="pd_ym" />
     <result column="pd_yqty" jdbcType="INTEGER" property="pd_yqty" />
     <result column="pd_ioid" jdbcType="INTEGER" property="pd_ioid" />
-
+    <result column="pi_nettotal" jdbcType="DOUBLE" property="pi_nettotal" />
+    <result column="pi_auditdate" jdbcType="TIMESTAMP" property="pi_auditdate" />
+    <result column="pi_auditman" jdbcType="VARCHAR" property="pi_auditman" />
   </resultMap>
 
 

+ 14 - 1
applications/sale/sale-server/src/main/resources/mapper/ProdInOutMapper.xml

@@ -32,7 +32,8 @@
     <result column="pi_text3" jdbcType="VARCHAR" property="pi_text3" />
     <result column="pi_text4" jdbcType="VARCHAR" property="pi_text4" />
     <result column="pi_text5" jdbcType="VARCHAR" property="pi_text5" />
-
+    <result column="pi_auditdate" jdbcType="TIMESTAMP" property="pi_auditdate" />
+    <result column="pi_auditman" jdbcType="VARCHAR" property="pi_auditman" />
 
 
   </resultMap>
@@ -743,5 +744,17 @@
     </foreach>
   </select>
 
+  <select id="validateBatchClose" parameterType="com.usoftchina.saas.commons.dto.DocBaseDTO" resultType="java.lang.String">
+    select GROUP_CONCAT(pi_inoutno) from prodinout where pi_statuscode!='AUDITED' and pi_id in
+    <foreach collection="list" item="item" open="(" close=")" separator=",">
+      #{item.id}
+    </foreach>
+  </select>
 
+  <select id="validateBatchOpen" parameterType="com.usoftchina.saas.commons.dto.DocBaseDTO" resultType="java.lang.String">
+    select GROUP_CONCAT(pi_inoutno) from prodinout where pi_statuscode!='CLOSE' and pi_id in
+    <foreach collection="list" item="item" open="(" close=")" separator=",">
+      #{item.id}
+    </foreach>
+  </select>
 </mapper>

+ 8 - 2
applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/po/ProdInOut.java

@@ -37,6 +37,8 @@ public class ProdInOut extends CommonBaseEntity implements Serializable {
 
     private Double pi_total;
 
+    private String pi_address;
+
     private Integer pi_recordmanid;
 
     private String pi_recordman;
@@ -61,8 +63,12 @@ public class ProdInOut extends CommonBaseEntity implements Serializable {
 
     private String pi_text5;
 
-    private String pi_address;
-
     private Long pi_inid;
 
+    private Double pi_nettotal;
+
+    private Date pi_auditdate;
+
+    private String pi_auditman;
+
 }

+ 177 - 0
applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/po/ProdInOutExample.java

@@ -2085,6 +2085,183 @@ public class ProdInOutExample {
             addCriterion("pi_text5 not between", value1, value2, "pi_text5");
             return (Criteria) this;
         }
+        public Criteria andPi_nettotalIsNull() {
+            addCriterion("Pi_nettotal is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_nettotalIsNotNull() {
+            addCriterion("Pi_nettotal is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_nettotalEqualTo(Integer value) {
+            addCriterion("Pi_nettotal =", value, "Pi_nettotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_nettotalNotEqualTo(Integer value) {
+            addCriterion("Pi_nettotal <>", value, "Pi_nettotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_nettotalGreaterThan(Integer value) {
+            addCriterion("Pi_nettotal >", value, "Pi_nettotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_nettotalGreaterThanOrEqualTo(Integer value) {
+            addCriterion("Pi_nettotal >=", value, "Pi_nettotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_nettotalLessThan(Integer value) {
+            addCriterion("Pi_nettotal <", value, "Pi_nettotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_nettotalLessThanOrEqualTo(Integer value) {
+            addCriterion("Pi_nettotal <=", value, "Pi_nettotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_nettotalIn(List<Integer> values) {
+            addCriterion("Pi_nettotal in", values, "Pi_nettotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_nettotalNotIn(List<Integer> values) {
+            addCriterion("Pi_nettotal not in", values, "Pi_nettotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_nettotalBetween(Integer value1, Integer value2) {
+            addCriterion("Pi_nettotal between", value1, value2, "Pi_nettotal");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_nettotalNotBetween(Integer value1, Integer value2) {
+            addCriterion("Pi_nettotal not between", value1, value2, "Pi_nettotal");
+            return (Criteria) this;
+        }
+        public Criteria andPi_auditdateIsNull() {
+            addCriterion("Pi_auditdate is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditdateIsNotNull() {
+            addCriterion("Pi_auditdate is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditdateEqualTo(Integer value) {
+            addCriterion("Pi_auditdate =", value, "Pi_auditdate");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditdateNotEqualTo(Integer value) {
+            addCriterion("Pi_auditdate <>", value, "Pi_auditdate");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditdateGreaterThan(Integer value) {
+            addCriterion("Pi_auditdate >", value, "Pi_auditdate");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditdateGreaterThanOrEqualTo(Integer value) {
+            addCriterion("Pi_auditdate >=", value, "Pi_auditdate");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditdateLessThan(Integer value) {
+            addCriterion("Pi_auditdate <", value, "Pi_auditdate");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditdateLessThanOrEqualTo(Integer value) {
+            addCriterion("Pi_auditdate <=", value, "Pi_auditdate");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditdateIn(List<Integer> values) {
+            addCriterion("Pi_auditdate in", values, "Pi_auditdate");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditdateNotIn(List<Integer> values) {
+            addCriterion("Pi_auditdate not in", values, "Pi_auditdate");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditdateBetween(Integer value1, Integer value2) {
+            addCriterion("Pi_auditdate between", value1, value2, "Pi_auditdate");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditdateNotBetween(Integer value1, Integer value2) {
+            addCriterion("Pi_auditdate not between", value1, value2, "Pi_auditdate");
+            return (Criteria) this;
+        }
+        public Criteria andPi_auditmanIsNull() {
+            addCriterion("Pi_auditman is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditmanIsNotNull() {
+            addCriterion("Pi_auditman is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditmanEqualTo(Integer value) {
+            addCriterion("Pi_auditman =", value, "Pi_auditman");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditmanNotEqualTo(Integer value) {
+            addCriterion("Pi_auditman <>", value, "Pi_auditman");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditmanGreaterThan(Integer value) {
+            addCriterion("Pi_auditman >", value, "Pi_auditman");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditmanGreaterThanOrEqualTo(Integer value) {
+            addCriterion("Pi_auditman >=", value, "Pi_auditman");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditmanLessThan(Integer value) {
+            addCriterion("Pi_auditman <", value, "Pi_auditman");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditmanLessThanOrEqualTo(Integer value) {
+            addCriterion("Pi_auditman <=", value, "Pi_auditman");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditmanIn(List<Integer> values) {
+            addCriterion("Pi_auditman in", values, "Pi_auditman");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditmanNotIn(List<Integer> values) {
+            addCriterion("Pi_auditman not in", values, "Pi_auditman");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditmanBetween(Integer value1, Integer value2) {
+            addCriterion("Pi_auditman between", value1, value2, "Pi_auditman");
+            return (Criteria) this;
+        }
+
+        public Criteria andPi_auditmanNotBetween(Integer value1, Integer value2) {
+            addCriterion("Pi_auditman not between", value1, value2, "Pi_auditman");
+            return (Criteria) this;
+        }
     }
 
     public static class Criteria extends GeneratedCriteria {

+ 6 - 0
applications/storage/storage-dto/src/main/java/com/usoftchina/saas/storage/po/ProdInOutList.java

@@ -140,4 +140,10 @@ public class ProdInOutList extends CommonBaseEntity{
 
     private Long pd_ioid;
 
+    private Double pi_nettotal;
+
+    private Date pi_auditdate;
+
+    private String pi_auditman;
+
 }

+ 4 - 0
base-servers/account/account-dto/pom.xml

@@ -18,6 +18,10 @@
             <artifactId>springfox-swagger2</artifactId>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>com.usoftchina.saas</groupId>
+            <artifactId>commons-dto</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 48 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/constant/ResourceClassify.java

@@ -0,0 +1,48 @@
+package com.usoftchina.saas.account.constant;
+
+/**
+ * @author yingp
+ * @date 2018/10/26
+ */
+public enum ResourceClassify {
+    /**
+     * 查询
+     */
+    QUERY,
+    /**
+     * 新增
+     */
+    ADD,
+    /**
+     * 保存
+     */
+    UPDATE,
+    /**
+     * 删除
+     */
+    DELETE,
+    /**
+     * (批量)审批
+     */
+    AUDIT,
+    /**
+     * (批量)反审批
+     */
+    UNAUDIT,
+    /**
+     * 导入
+     */
+    IMPORT,
+    /**
+     * 导出
+     */
+    EXPORT,
+    /**
+     * 打印
+     */
+    PRINT,
+    /**
+     * 其它
+     */
+    OTHER
+}

+ 26 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/constant/RoleType.java

@@ -0,0 +1,26 @@
+package com.usoftchina.saas.account.constant;
+
+/**
+ * @author yingp
+ * @date 2018/10/23
+ */
+public enum RoleType {
+    /**
+     * 管理角色
+     */
+    ADMIN(0),
+    /**
+     * 普通角色
+     */
+    NORMAL(1);
+
+    private final int type;
+
+    RoleType(int type) {
+        this.type = type;
+    }
+
+    public int getType() {
+        return type;
+    }
+}

+ 100 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/ResourceDTO.java

@@ -0,0 +1,100 @@
+package com.usoftchina.saas.account.dto;
+
+import java.io.Serializable;
+
+/**
+ * 用于资源权限分配
+ *
+ * @author yingp
+ * @date 2018/10/10
+ */
+public class ResourceDTO implements Serializable {
+    private Long id;
+    /**
+     * 名称
+     */
+    private String name;
+    /**
+     * 资源类型
+     * MENU - 菜单
+     * DIR - 目录
+     * BUTTON - 按钮
+     * URI - 页面上的url
+     * API - api
+     */
+    private String type;
+    /**
+     * url
+     */
+    private String url;
+
+    /**
+     * 资源请求方式 POST/GET/PUT/DELETE
+     */
+    private String method;
+    /**
+     * 资源分组
+     * @see com.usoftchina.saas.account.constant.ResourceClassify
+     */
+    private String classify;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getMethod() {
+        return method;
+    }
+
+    public void setMethod(String method) {
+        this.method = method;
+    }
+
+    public String getClassify() {
+        return classify;
+    }
+
+    public void setClassify(String classify) {
+        this.classify = classify;
+    }
+
+    @Override
+    public String toString() {
+        return "ResourceDTO{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", type='" + type + '\'' +
+                ", url='" + url + '\'' +
+                ", method='" + method + '\'' +
+                ", classify='" + classify + '\'' +
+                '}';
+    }
+}

+ 169 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/ResourceGroupDTO.java

@@ -0,0 +1,169 @@
+package com.usoftchina.saas.account.dto;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 用于资源权限分配
+ *
+ * @author yingp
+ * @date 2018/10/26
+ */
+public class ResourceGroupDTO implements Serializable{
+    private Long id;
+    private String name;
+    /**
+     * 查询
+     */
+    private List<ResourceDTO> queries;
+    /**
+     * 新增
+     */
+    private List<ResourceDTO> adds;
+    /**
+     * 修改
+     */
+    private List<ResourceDTO> updates;
+    /**
+     * 删除
+     */
+    private List<ResourceDTO> deletes;
+    /**
+     * 审核
+     */
+    private List<ResourceDTO> audits;
+    /**
+     * 反审核
+     */
+    private List<ResourceDTO> unAudits;
+    /**
+     * 打印
+     */
+    private List<ResourceDTO> prints;
+    /**
+     * 导出
+     */
+    private List<ResourceDTO> exports;
+    /**
+     * 导入
+     */
+    private List<ResourceDTO> imports;
+    /**
+     * 其它
+     */
+    private List<ResourceDTO> others;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public List<ResourceDTO> getQueries() {
+        return queries;
+    }
+
+    public void setQueries(List<ResourceDTO> queries) {
+        this.queries = queries;
+    }
+
+    public List<ResourceDTO> getAdds() {
+        return adds;
+    }
+
+    public void setAdds(List<ResourceDTO> adds) {
+        this.adds = adds;
+    }
+
+    public List<ResourceDTO> getUpdates() {
+        return updates;
+    }
+
+    public void setUpdates(List<ResourceDTO> updates) {
+        this.updates = updates;
+    }
+
+    public List<ResourceDTO> getDeletes() {
+        return deletes;
+    }
+
+    public void setDeletes(List<ResourceDTO> deletes) {
+        this.deletes = deletes;
+    }
+
+    public List<ResourceDTO> getAudits() {
+        return audits;
+    }
+
+    public void setAudits(List<ResourceDTO> audits) {
+        this.audits = audits;
+    }
+
+    public List<ResourceDTO> getUnAudits() {
+        return unAudits;
+    }
+
+    public void setUnAudits(List<ResourceDTO> unAudits) {
+        this.unAudits = unAudits;
+    }
+
+    public List<ResourceDTO> getPrints() {
+        return prints;
+    }
+
+    public void setPrints(List<ResourceDTO> prints) {
+        this.prints = prints;
+    }
+
+    public List<ResourceDTO> getExports() {
+        return exports;
+    }
+
+    public void setExports(List<ResourceDTO> exports) {
+        this.exports = exports;
+    }
+
+    public List<ResourceDTO> getImports() {
+        return imports;
+    }
+
+    public void setImports(List<ResourceDTO> imports) {
+        this.imports = imports;
+    }
+
+    public List<ResourceDTO> getOthers() {
+        return others;
+    }
+
+    public void setOthers(List<ResourceDTO> others) {
+        this.others = others;
+    }
+
+    @Override
+    public String toString() {
+        return "ResourceGroupDTO{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", queries=" + queries +
+                ", adds=" + adds +
+                ", updates=" + updates +
+                ", deletes=" + deletes +
+                ", audits=" + audits +
+                ", unAudits=" + unAudits +
+                ", prints=" + prints +
+                ", exports=" + exports +
+                ", imports=" + imports +
+                ", others=" + others +
+                '}';
+    }
+}

+ 49 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/ResourceModuleDTO.java

@@ -0,0 +1,49 @@
+package com.usoftchina.saas.account.dto;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 用于资源权限分配
+ *
+ * @author yingp
+ * @date 2018/10/26
+ */
+public class ResourceModuleDTO implements Serializable{
+    private Long id;
+    private String name;
+    private List<ResourceGroupDTO> groups;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public List<ResourceGroupDTO> getGroups() {
+        return groups;
+    }
+
+    public void setGroups(List<ResourceGroupDTO> groups) {
+        this.groups = groups;
+    }
+
+    @Override
+    public String toString() {
+        return "ResourceModuleDTO{" +
+                "id=" + id +
+                ", name='" + name + '\'' +
+                ", groups=" + groups +
+                '}';
+    }
+}

+ 0 - 10
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/ResourcesDTO.java

@@ -1,10 +0,0 @@
-package com.usoftchina.saas.account.dto;
-
-import java.io.Serializable;
-
-/**
- * @author yingp
- * @date 2018/10/10
- */
-public class ResourcesDTO implements Serializable{
-}

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

@@ -0,0 +1,75 @@
+package com.usoftchina.saas.account.dto;
+
+import com.usoftchina.saas.base.dto.CommonBaseDTO;
+
+import java.io.Serializable;
+
+/**
+ * @author yingp
+ * @date 2018/10/24
+ */
+public class RoleDTO extends CommonBaseDTO implements Serializable{
+    /**
+     * 公司
+     */
+    private Long companyId;
+    /**
+     * 角色编码
+     */
+    private String code;
+    /**
+     * 角色名称
+     */
+    private String name;
+    /**
+     * 描述
+     */
+    private String description;
+
+    public Long getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Long companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @Override
+    public String toString() {
+        return "RoleDTO{" +
+                "companyId=" + companyId +
+                ", code='" + code + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                ", id=" + id +
+                ", createTime=" + createTime +
+                ", creatorName='" + creatorName + '\'' +
+                ", updateTime=" + updateTime +
+                ", updaterName='" + updaterName + '\'' +
+                '}';
+    }
+}

+ 57 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/RoleSaveDTO.java

@@ -0,0 +1,57 @@
+package com.usoftchina.saas.account.dto;
+
+import java.io.Serializable;
+
+/**
+ * 角色新增 数据传输对象
+ *
+ * @author yingp
+ * @date 2018/10/24
+ */
+public class RoleSaveDTO implements Serializable {
+    /**
+     * 编号
+     */
+    private String code;
+    /**
+     * 名称
+     */
+    private String name;
+    /**
+     * 描述
+     */
+    private String description;
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @Override
+    public String toString() {
+        return "RoleSaveDTO{" +
+                "code='" + code + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                '}';
+    }
+}

+ 67 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/RoleUpdateDTO.java

@@ -0,0 +1,67 @@
+package com.usoftchina.saas.account.dto;
+
+import java.io.Serializable;
+
+/**
+ * 角色修改 数据传输对象
+ *
+ * @author yingp
+ * @date 2018/10/24
+ */
+public class RoleUpdateDTO implements Serializable {
+    private Long id;
+    /**
+     * 编号
+     */
+    private String code;
+    /**
+     * 名称
+     */
+    private String name;
+    /**
+     * 描述
+     */
+    private String description;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @Override
+    public String toString() {
+        return "RoleSaveDTO{" +
+                "id=" + id +
+                ", code='" + code + '\'' +
+                ", name='" + name + '\'' +
+                ", description='" + description + '\'' +
+                '}';
+    }
+}

+ 57 - 0
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/UrlResourceDTO.java

@@ -0,0 +1,57 @@
+package com.usoftchina.saas.account.dto;
+
+import java.io.Serializable;
+
+/**
+ * 用于url拦截判断的属性
+ *
+ * @author yingp
+ * @date 2018/10/26
+ */
+public class UrlResourceDTO implements Serializable{
+    /**
+     * 名称
+     */
+    private String name;
+    /**
+     * url
+     */
+    private String url;
+    /**
+     * 资源请求方式 POST/GET/PUT/DELETE
+     */
+    private String method;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getMethod() {
+        return method;
+    }
+
+    public void setMethod(String method) {
+        this.method = method;
+    }
+
+    @Override
+    public String toString() {
+        return "UrlResourceDTO{" +
+                "name='" + name + '\'' +
+                ", url='" + url + '\'' +
+                ", method='" + method + '\'' +
+                '}';
+    }
+}

+ 5 - 5
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/AccountController.java

@@ -110,7 +110,7 @@ public class AccountController {
      * @param username
      * @return
      */
-    @GetMapping
+    @GetMapping("/read")
     public Result<AccountDTO> getAccount(@RequestParam(value = "username") String username) {
         Account account = getAccountByUsername(username);
         if (null == account) {
@@ -204,12 +204,12 @@ public class AccountController {
     /**
      * 账户删除
      *
-     * @param accountId
+     * @param id
      * @return
      */
-    @PostMapping("/delete")
-    public Result deleteAccount(@RequestParam long accountId) {
-        accountService.removeByPrimaryKey(accountId);
+    @PostMapping("/delete/{id}")
+    public Result deleteAccount(@PathVariable Long id) {
+        accountService.removeByPrimaryKey(id);
         return Result.success();
     }
 }

+ 47 - 5
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/CompanyController.java

@@ -5,6 +5,7 @@ import com.usoftchina.saas.account.dto.CompanyRegDTO;
 import com.usoftchina.saas.account.po.Company;
 import com.usoftchina.saas.account.service.CompanyService;
 import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.context.BaseContextHolder;
 import com.usoftchina.saas.exception.ExceptionCode;
 import com.usoftchina.saas.utils.BeanMapper;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -51,7 +52,7 @@ public class CompanyController {
      * @param name
      * @return
      */
-    @GetMapping(params = "name")
+    @GetMapping(path = "/read", params = "name")
     public Result<CompanyDTO> getByName(@RequestParam String name) {
         Company company = companyService.findByName(name);
         if (null != company) {
@@ -67,7 +68,7 @@ public class CompanyController {
      * @param businessCode
      * @return
      */
-    @GetMapping(params = "businessCode")
+    @GetMapping(path = "/read", params = "businessCode")
     public Result<CompanyDTO> getByBusinessCode(@RequestParam String businessCode) {
         Company company = companyService.findByBusinessCode(businessCode);
         if (null != company) {
@@ -77,15 +78,56 @@ public class CompanyController {
         return Result.error(ExceptionCode.COMPANY_NOT_EXIST);
     }
 
+    /**
+     * 当前登录的公司的信息
+     *
+     * @return
+     */
+    @GetMapping(path = "/read/current")
+    public Result<CompanyDTO> getCurrentCompany() {
+        Company company = companyService.findByPrimaryKey(BaseContextHolder.getCompanyId());
+        if (null != company) {
+            CompanyDTO companyDTO = BeanMapper.map(company, CompanyDTO.class);
+            return Result.success(companyDTO);
+        }
+        return Result.error(ExceptionCode.COMPANY_NOT_EXIST);
+    }
+
     /**
      * 删除
      *
+     * @param id
+     * @return
+     */
+    @PostMapping("/delete/{id}")
+    public Result delete(@PathVariable Long id) {
+        companyService.removeByPrimaryKey(id);
+        return Result.success();
+    }
+
+    /**
+     * 公司绑定应用
+     *
+     * @param companyId
+     * @param appId
+     * @return
+     */
+    @PostMapping("/bind/app")
+    public Result bindApp(@RequestParam long companyId, @RequestParam String appId) {
+        companyService.bindApp(companyId, appId);
+        return Result.success();
+    }
+
+    /**
+     * 公司解除绑定应用
+     *
      * @param companyId
+     * @param appId
      * @return
      */
-    @PostMapping("/delete")
-    public Result delete(@RequestParam Long companyId) {
-        companyService.removeByPrimaryKey(companyId);
+    @PostMapping("/unbind/app")
+    public Result unbindApp(@RequestParam long companyId, @RequestParam String appId) {
+        companyService.unbindApp(companyId, appId);
         return Result.success();
     }
 }

+ 0 - 8
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/ResourceController.java

@@ -1,8 +0,0 @@
-package com.usoftchina.saas.account.controller;
-
-/**
- * @author yingp
- * @date 2018/10/2
- */
-public class ResourceController {
-}

+ 56 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/ResourcesController.java

@@ -0,0 +1,56 @@
+package com.usoftchina.saas.account.controller;
+
+import com.usoftchina.saas.account.dto.ResourceModuleDTO;
+import com.usoftchina.saas.account.dto.UrlResourceDTO;
+import com.usoftchina.saas.account.service.ResourceService;
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.context.BaseContextHolder;
+import com.usoftchina.saas.utils.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @author yingp
+ * @date 2018/10/2
+ */
+@RestController
+@RequestMapping("/resource")
+public class ResourcesController {
+
+    @Autowired
+    private ResourceService resourcesService;
+
+    /**
+     * 查找应用分模块的全部资源
+     *
+     * @return
+     */
+    @GetMapping("/module/list")
+    public Result<List<ResourceModuleDTO>> getModulesByAppId(String appId) {
+        if (StringUtils.isEmpty(appId)) {
+            // 查找当前登录应用的全部资源
+            appId = BaseContextHolder.getAppId();
+        }
+        return Result.success(resourcesService.findModulesByAppId(appId));
+    }
+
+    /**
+     * 查找应用的全部url资源
+     *
+     * @param appId
+     * @return
+     */
+    @GetMapping("/url/list")
+    public Result<List<UrlResourceDTO>> getUrlResourcesByAppId(String appId) {
+        if (StringUtils.isEmpty(appId)) {
+            // 查找当前登录应用的全部资源
+            appId = BaseContextHolder.getAppId();
+        }
+        return Result.success(resourcesService.findUrlResourcesByAppId(appId));
+    }
+
+}

+ 115 - 1
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/controller/RoleController.java

@@ -1,8 +1,122 @@
 package com.usoftchina.saas.account.controller;
 
+import com.usoftchina.saas.account.dto.RoleDTO;
+import com.usoftchina.saas.account.dto.RoleSaveDTO;
+import com.usoftchina.saas.account.dto.RoleUpdateDTO;
+import com.usoftchina.saas.account.po.Role;
+import com.usoftchina.saas.account.service.RoleService;
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.commons.dto.DocBaseDTO;
+import com.usoftchina.saas.context.BaseContextHolder;
+import com.usoftchina.saas.exception.ExceptionCode;
+import com.usoftchina.saas.utils.BeanMapper;
+import com.usoftchina.saas.utils.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
 /**
  * @author yingp
  * @date 2018/10/2
  */
+@RestController
+@RequestMapping("/role")
 public class RoleController {
-}
+
+    @Autowired
+    private RoleService roleService;
+
+    /**
+     * 保存
+     *
+     * @param roleSaveDTO
+     * @return
+     */
+    @PostMapping("/save")
+    public Result<DocBaseDTO> save(@RequestBody RoleSaveDTO roleSaveDTO) {
+        Role role = BeanMapper.map(roleSaveDTO, Role.class);
+        roleService.save(role);
+        return Result.success(BeanMapper.map(role, DocBaseDTO.class));
+    }
+
+    /**
+     * 修改
+     *
+     * @param roleUpdateDTO
+     * @return
+     */
+    @PostMapping("/update")
+    public Result update(@RequestBody RoleUpdateDTO roleUpdateDTO) {
+        Role role = BeanMapper.map(roleUpdateDTO, Role.class);
+        roleService.updateByPrimaryKey(role);
+        return Result.success();
+    }
+
+    /**
+     * 删除
+     *
+     * @param id
+     * @return
+     */
+    @PostMapping("/delete/{id}")
+    public Result delete(@PathVariable Long id) {
+        roleService.removeByPrimaryKey(id);
+        return Result.success();
+    }
+
+    /**
+     * 查找
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping("/read/{id}")
+    public Result<RoleDTO> get(@PathVariable Long id) {
+        Role role = roleService.findByPrimaryKey(id);
+        if (null == role) {
+            return Result.error(ExceptionCode.ROLE_NOT_EXIST);
+        }
+        return Result.success(BeanMapper.map(role, RoleDTO.class));
+    }
+
+    /**
+     * 查找当前登录公司的全部角色
+     *
+     * @return
+     */
+    @GetMapping("/list")
+    public Result<List<RoleDTO>> getByCompany() {
+        List<Role> roles = roleService.findByCompanyId(BaseContextHolder.getCompanyId());
+        if (CollectionUtils.isEmpty(roles)) {
+            return Result.success();
+        }
+        return Result.success(BeanMapper.mapList(roles, RoleDTO.class));
+    }
+
+    /**
+     * 角色绑定资源
+     *
+     * @param roleId
+     * @param resourceId
+     * @return
+     */
+    @PostMapping("/bind/resource")
+    public Result bindResource(@RequestParam long roleId, @RequestParam long resourceId) {
+        roleService.bindResource(roleId, resourceId);
+        return Result.success();
+    }
+
+    /**
+     * 角色解除绑定资源
+     *
+     * @param roleId
+     * @param resourceId
+     * @return
+     */
+    @PostMapping("/unbind/resource")
+    public Result unbindResource(@RequestParam long roleId, @RequestParam long resourceId) {
+        roleService.unbindResource(roleId, resourceId);
+        return Result.success();
+    }
+}

+ 12 - 2
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/AccountCompanyMapper.java

@@ -22,13 +22,23 @@ public interface AccountCompanyMapper {
      *
      * @param accountId
      * @param companyId
+     * @return
      */
-    void delete(@Param("accountId") Long accountId, @Param("companyId") Long companyId);
+    int delete(@Param("accountId") Long accountId, @Param("companyId") Long companyId);
 
     /**
      * 按账户删除
      *
      * @param accountId
+     * @return
+     */
+    int deleteByAccountId(@Param("accountId") Long accountId);
+
+    /**
+     * 按公司删除
+     *
+     * @param companyId
+     * @return
      */
-    void deleteByAccountId(@Param("accountId") Long accountId);
+    int deleteByCompanyId(@Param("companyId") Long companyId);
 }

+ 7 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/AccountRoleMapper.java

@@ -30,4 +30,11 @@ public interface AccountRoleMapper {
      * @param accountId
      */
     void deleteByAccountId(@Param("accountId") Long accountId);
+
+    /**
+     * 按角色删除
+     *
+     * @param roleId
+     */
+    void deleteByRoleId(@Param("roleId") Long roleId);
 }

+ 33 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/CompanyAppMapper.java

@@ -0,0 +1,33 @@
+package com.usoftchina.saas.account.mapper;
+
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author yingp
+ * @date 2018/10/24
+ */
+public interface CompanyAppMapper {
+    /**
+     * 新增
+     *
+     * @param companyId
+     * @param appId
+     * @return
+     */
+    int insert(@Param("companyId") Long companyId, @Param("appId") String appId);
+
+    /**
+     * 删除
+     *
+     * @param companyId
+     * @param appId
+     */
+    void delete(@Param("companyId") Long companyId, @Param("appId") String appId);
+    /**
+     * 按公司删除
+     *
+     * @param companyId
+     * @return
+     */
+    int deleteByCompanyId(@Param("companyId") Long companyId);
+}

+ 10 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/CompanyMapper.java

@@ -27,6 +27,14 @@ public interface CompanyMapper {
      */
     int insertSelective(Company record);
 
+    /**
+     * 按主键查询
+     *
+     * @param id
+     * @return
+     */
+    Company selectByPrimaryKey(@Param("id") Long id);
+
     /**
      * 按名称查询
      *
@@ -58,4 +66,6 @@ public interface CompanyMapper {
      * @return
      */
     int deleteByPrimaryKey(@Param("id") Long id);
+
+
 }

+ 21 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/ResourceGroupMapper.java

@@ -0,0 +1,21 @@
+package com.usoftchina.saas.account.mapper;
+
+import com.usoftchina.saas.account.po.ResourceGroup;
+import com.usoftchina.saas.account.po.ResourceModule;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author yingp
+ * @date 2018/10/26
+ */
+public interface ResourceGroupMapper {
+    /**
+     * 按资源模块查找
+     *
+     * @param moduleId
+     * @return
+     */
+    List<ResourceGroup> selectByModuleId(@Param("moduleId") Long moduleId);
+}

+ 29 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/ResourceMapper.java

@@ -0,0 +1,29 @@
+package com.usoftchina.saas.account.mapper;
+
+import com.usoftchina.saas.account.po.Resource;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author yingp
+ * @date 2018/10/2
+ */
+public interface ResourceMapper {
+
+    /**
+     * 按资源组查找
+     *
+     * @param groupId
+     * @return
+     */
+    List<Resource> selectByGroupId(@Param("groupId") Long groupId);
+
+    /**
+     * 按应用查找
+     *
+     * @param appId
+     * @return
+     */
+    List<Resource> selectByAppId(@Param("appId") String appId);
+}

+ 20 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/ResourceModuleMapper.java

@@ -0,0 +1,20 @@
+package com.usoftchina.saas.account.mapper;
+
+import com.usoftchina.saas.account.po.ResourceModule;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author yingp
+ * @date 2018/10/26
+ */
+public interface ResourceModuleMapper {
+    /**
+     * 按应用查找
+     *
+     * @param appId
+     * @return
+     */
+    List<ResourceModule> selectByAppId(@Param("appId") String appId);
+}

+ 0 - 11
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/ResourcesMapper.java

@@ -1,11 +0,0 @@
-package com.usoftchina.saas.account.mapper;
-
-import com.usoftchina.saas.account.po.Resources;
-import com.usoftchina.saas.base.mapper.CommonBaseMapper;
-
-/**
- * @author yingp
- * @date 2018/10/2
- */
-public interface ResourcesMapper extends CommonBaseMapper<Resources> {
-}

+ 10 - 1
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/mapper/RoleResourceMapper.java

@@ -21,6 +21,15 @@ public interface RoleResourceMapper {
      *
      * @param roleId
      * @param resourceId
+     * @return
+     */
+    int delete(@Param("roleId") Long roleId, @Param("resourceId") Long resourceId);
+
+    /**
+     * 按角色删除
+     *
+     * @param roleId
+     * @return
      */
-    void delete(@Param("roleId") Long roleId, @Param("resourceId") Long resourceId);
+    int deleteByRoleId(@Param("roleId") Long roleId);
 }

+ 31 - 36
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/Resources.java → base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/Resource.java

@@ -1,7 +1,5 @@
 package com.usoftchina.saas.account.po;
 
-import com.usoftchina.saas.base.entity.CommonBaseEntity;
-
 import java.io.Serializable;
 
 /**
@@ -10,15 +8,12 @@ import java.io.Serializable;
  * @author yingp
  * @date 2018/10/2
  */
-public class Resources extends CommonBaseEntity implements Serializable {
+public class Resource implements Serializable {
+    private Long id;
     /**
-     * 编号
+     * 资源组
      */
-    private String code;
-    /**
-     * 名称
-     */
-    private String name;
+    private Long groupId;
     /**
      * 资源类型
      * MENU - 菜单
@@ -28,6 +23,11 @@ public class Resources extends CommonBaseEntity implements Serializable {
      * API - api
      */
     private String type;
+    /**
+     * 资源分类
+     * @see com.usoftchina.saas.account.constant.ResourceClassify
+     */
+    private String classify;
     /**
      * url
      */
@@ -39,29 +39,16 @@ public class Resources extends CommonBaseEntity implements Serializable {
     private String method;
 
     /**
-     * 排序
-     */
-    private Integer orderNum;
-
-    /**
-     * 描述
+     * 名称
      */
-    private String description;
-
-    public String getCode() {
-        return code;
-    }
-
-    public void setCode(String code) {
-        this.code = code;
-    }
+    private String name;
 
-    public String getName() {
-        return name;
+    public Long getId() {
+        return id;
     }
 
-    public void setName(String name) {
-        this.name = name;
+    public void setId(Long id) {
+        this.id = id;
     }
 
     public String getType() {
@@ -72,6 +59,14 @@ public class Resources extends CommonBaseEntity implements Serializable {
         this.type = type;
     }
 
+    public String getClassify() {
+        return classify;
+    }
+
+    public void setClassify(String classify) {
+        this.classify = classify;
+    }
+
     public String getUrl() {
         return url;
     }
@@ -88,19 +83,19 @@ public class Resources extends CommonBaseEntity implements Serializable {
         this.method = method;
     }
 
-    public Integer getOrderNum() {
-        return orderNum;
+    public String getName() {
+        return name;
     }
 
-    public void setOrderNum(Integer orderNum) {
-        this.orderNum = orderNum;
+    public void setName(String name) {
+        this.name = name;
     }
 
-    public String getDescription() {
-        return description;
+    public Long getGroupId() {
+        return groupId;
     }
 
-    public void setDescription(String description) {
-        this.description = description;
+    public void setGroupId(Long groupId) {
+        this.groupId = groupId;
     }
 }

+ 40 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/ResourceGroup.java

@@ -0,0 +1,40 @@
+package com.usoftchina.saas.account.po;
+
+import java.io.Serializable;
+
+/**
+ * 资源组
+ * 可以按单据分组
+ *
+ * @author yingp
+ * @date 2018/10/25
+ */
+public class ResourceGroup implements Serializable {
+    private Long id;
+    private Long moduleId;
+    private String name;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getModuleId() {
+        return moduleId;
+    }
+
+    public void setModuleId(Long moduleId) {
+        this.moduleId = moduleId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 40 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/ResourceModule.java

@@ -0,0 +1,40 @@
+package com.usoftchina.saas.account.po;
+
+import java.io.Serializable;
+
+/**
+ * 资源模块
+ * 按采购、销售、资金...分模块
+ *
+ * @author yingp
+ * @date 2018/10/25
+ */
+public class ResourceModule implements Serializable {
+    private Long id;
+    private String appId;
+    private String name;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 13 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/po/Role.java

@@ -24,6 +24,11 @@ public class Role extends CommonBaseEntity implements Serializable {
      */
     private String description;
 
+    /**
+     * 角色类型:0 - 管理员角色, 1 - 普通角色
+     */
+    private Integer type;
+
     public String getCode() {
         return code;
     }
@@ -47,4 +52,12 @@ public class Role extends CommonBaseEntity implements Serializable {
     public void setDescription(String description) {
         this.description = description;
     }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
 }

+ 24 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/CompanyService.java

@@ -34,6 +34,14 @@ public interface CompanyService {
      */
     Company findByBusinessCode(String businessCode);
 
+    /**
+     * 按ID查找
+     *
+     * @param id
+     * @return
+     */
+    Company findByPrimaryKey(Long id);
+
     /**
      * 按个人账户查找全部绑定企业
      *
@@ -49,4 +57,20 @@ public interface CompanyService {
      * @return
      */
     boolean removeByPrimaryKey(Long id);
+
+    /**
+     * 公司绑定应用
+     *
+     * @param companyId
+     * @param appId
+     */
+    void bindApp(long companyId, String appId);
+
+    /**
+     * 公司解除绑定应用
+     *
+     * @param companyId
+     * @param appId
+     */
+    void unbindApp(long companyId, String appId);
 }

+ 29 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/ResourceService.java

@@ -0,0 +1,29 @@
+package com.usoftchina.saas.account.service;
+
+import com.usoftchina.saas.account.dto.ResourceModuleDTO;
+import com.usoftchina.saas.account.dto.UrlResourceDTO;
+import com.usoftchina.saas.account.po.Resource;
+
+import java.util.List;
+
+/**
+ * @author yingp
+ * @date 2018/10/24
+ */
+public interface ResourceService {
+    /**
+     * 按应用查找资源模块,以及模块下的资源分组 + 资源
+     *
+     * @param appId
+     * @return
+     */
+    List<ResourceModuleDTO> findModulesByAppId(String appId);
+
+    /**
+     * 按应用查找资源的url属性
+     *
+     * @param appId
+     * @return
+     */
+    List<UrlResourceDTO> findUrlResourcesByAppId(String appId);
+}

+ 28 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/RoleService.java

@@ -0,0 +1,28 @@
+package com.usoftchina.saas.account.service;
+
+import com.usoftchina.saas.account.mapper.RoleMapper;
+import com.usoftchina.saas.account.po.Role;
+import com.usoftchina.saas.base.service.CommonBaseService;
+
+/**
+ * @author yingp
+ * @date 2018/10/24
+ */
+public interface RoleService extends CommonBaseService<RoleMapper, Role>{
+
+    /**
+     * 角色绑定资源
+     *
+     * @param roleId
+     * @param resourceId
+     */
+    void bindResource(long roleId, long resourceId);
+
+    /**
+     * 角色解除绑定资源
+     *
+     * @param roleId
+     * @param resourceId
+     */
+    void unbindResource(long roleId, long resourceId);
+}

+ 2 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/AccountServiceImpl.java

@@ -7,6 +7,7 @@ import com.usoftchina.saas.account.po.Account;
 import com.usoftchina.saas.account.service.AccountService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.DigestUtils;
 
 /**
@@ -82,6 +83,7 @@ public class AccountServiceImpl implements AccountService {
         accountRoleMapper.delete(accountId, roleId);
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public boolean removeByPrimaryKey(Long id) {
         accountRoleMapper.deleteByAccountId(id);

+ 27 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/CompanyServiceImpl.java

@@ -1,5 +1,7 @@
 package com.usoftchina.saas.account.service.impl;
 
+import com.usoftchina.saas.account.mapper.AccountCompanyMapper;
+import com.usoftchina.saas.account.mapper.CompanyAppMapper;
 import com.usoftchina.saas.account.mapper.CompanyMapper;
 import com.usoftchina.saas.account.po.Company;
 import com.usoftchina.saas.account.service.CompanyService;
@@ -7,6 +9,7 @@ import com.usoftchina.saas.account.vo.CompanyBaseVO;
 import com.usoftchina.saas.context.BaseContextHolder;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Date;
 import java.util.List;
@@ -21,6 +24,12 @@ public class CompanyServiceImpl implements CompanyService{
     @Autowired
     private CompanyMapper companyMapper;
 
+    @Autowired
+    private AccountCompanyMapper accountCompanyMapper;
+
+    @Autowired
+    private CompanyAppMapper companyAppMapper;
+
     @Override
     public boolean save(Company company) {
         Date nowDate = new Date();
@@ -42,13 +51,31 @@ public class CompanyServiceImpl implements CompanyService{
         return companyMapper.selectByBusinessCode(businessCode);
     }
 
+    @Override
+    public Company findByPrimaryKey(Long id) {
+        return companyMapper.selectByPrimaryKey(id);
+    }
+
     @Override
     public List<CompanyBaseVO> findBaseByAccountId(Long accountId) {
         return companyMapper.selectBaseByAccountId(accountId);
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public boolean removeByPrimaryKey(Long id) {
+        accountCompanyMapper.deleteByCompanyId(id);
+        companyAppMapper.deleteByCompanyId(id);
         return companyMapper.deleteByPrimaryKey(id) > 0;
     }
+
+    @Override
+    public void bindApp(long companyId, String appId) {
+        companyAppMapper.insert(companyId, appId);
+    }
+
+    @Override
+    public void unbindApp(long companyId, String appId) {
+        companyAppMapper.delete(companyId, appId);
+    }
 }

+ 104 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/ResourceServiceImpl.java

@@ -0,0 +1,104 @@
+package com.usoftchina.saas.account.service.impl;
+
+import com.usoftchina.saas.account.constant.ResourceClassify;
+import com.usoftchina.saas.account.dto.ResourceDTO;
+import com.usoftchina.saas.account.dto.ResourceGroupDTO;
+import com.usoftchina.saas.account.dto.ResourceModuleDTO;
+import com.usoftchina.saas.account.dto.UrlResourceDTO;
+import com.usoftchina.saas.account.mapper.ResourceGroupMapper;
+import com.usoftchina.saas.account.mapper.ResourceMapper;
+import com.usoftchina.saas.account.mapper.ResourceModuleMapper;
+import com.usoftchina.saas.account.po.Resource;
+import com.usoftchina.saas.account.po.ResourceGroup;
+import com.usoftchina.saas.account.po.ResourceModule;
+import com.usoftchina.saas.account.service.ResourceService;
+import com.usoftchina.saas.utils.BeanMapper;
+import com.usoftchina.saas.utils.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author yingp
+ * @date 2018/10/24
+ */
+@Service
+public class ResourceServiceImpl implements ResourceService {
+
+    @Autowired
+    private ResourceMapper resourceMapper;
+
+    @Autowired
+    private ResourceModuleMapper resourceModuleMapper;
+
+    @Autowired
+    private ResourceGroupMapper resourceGroupMapper;
+
+    @Override
+    public List<ResourceModuleDTO> findModulesByAppId(String appId) {
+        List<ResourceModule> modules = resourceModuleMapper.selectByAppId(appId);
+        if (!CollectionUtils.isEmpty(modules)) {
+            List<ResourceModuleDTO> moduleDTOS = BeanMapper.mapList(modules, ResourceModuleDTO.class);
+            moduleDTOS.parallelStream().forEach(moduleDTO -> {
+                moduleDTO.setGroups(findGroupsByModuleId(moduleDTO.getId()));
+            });
+            return moduleDTOS;
+        }
+        return null;
+    }
+
+    /**
+     * 模块下的资源分组
+     *
+     * @param moduleId
+     * @return
+     */
+    private List<ResourceGroupDTO> findGroupsByModuleId(Long moduleId) {
+        List<ResourceGroup> groups = resourceGroupMapper.selectByModuleId(moduleId);
+        if (!CollectionUtils.isEmpty(groups)) {
+            List<ResourceGroupDTO> groupDTOS = BeanMapper.mapList(groups, ResourceGroupDTO.class);
+            groupDTOS.parallelStream().forEach(groupDTO -> {
+                List<ResourceDTO> resources = findResourcesByGroupId(groupDTO.getId());
+                // 分类(分类后,方便快速设置)
+                Map<String, List<ResourceDTO>> map = CollectionUtils.groupBy(resources, ResourceDTO::getClassify);
+                groupDTO.setQueries(map.get(ResourceClassify.QUERY.name()));
+                groupDTO.setAdds(map.get(ResourceClassify.ADD.name()));
+                groupDTO.setUpdates(map.get(ResourceClassify.UPDATE.name()));
+                groupDTO.setDeletes(map.get(ResourceClassify.DELETE.name()));
+                groupDTO.setAudits(map.get(ResourceClassify.AUDIT.name()));
+                groupDTO.setUnAudits(map.get(ResourceClassify.UNAUDIT.name()));
+                groupDTO.setExports(map.get(ResourceClassify.EXPORT.name()));
+                groupDTO.setImports(map.get(ResourceClassify.IMPORT.name()));
+                groupDTO.setPrints(map.get(ResourceClassify.PRINT.name()));
+                groupDTO.setOthers(map.get(ResourceClassify.OTHER.name()));
+            });
+            return groupDTOS;
+        }
+        return null;
+    }
+
+    /**
+     * 资源组下的资源
+     *
+     * @param groupId
+     * @return
+     */
+    private List<ResourceDTO> findResourcesByGroupId(Long groupId) {
+        List<Resource> resources = resourceMapper.selectByGroupId(groupId);
+        if (!CollectionUtils.isEmpty(resources)) {
+            return BeanMapper.mapList(resources, ResourceDTO.class);
+        }
+        return null;
+    }
+
+    @Override
+    public List<UrlResourceDTO> findUrlResourcesByAppId(String appId) {
+        List<Resource> resources = resourceMapper.selectByAppId(appId);
+        if (!CollectionUtils.isEmpty(resources)) {
+            return BeanMapper.mapList(resources, UrlResourceDTO.class);
+        }
+        return null;
+    }
+}

+ 58 - 0
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/RoleServiceImpl.java

@@ -0,0 +1,58 @@
+package com.usoftchina.saas.account.service.impl;
+
+import com.usoftchina.saas.account.constant.RoleType;
+import com.usoftchina.saas.account.mapper.AccountRoleMapper;
+import com.usoftchina.saas.account.mapper.RoleMapper;
+import com.usoftchina.saas.account.mapper.RoleResourceMapper;
+import com.usoftchina.saas.account.po.Role;
+import com.usoftchina.saas.account.service.RoleService;
+import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
+import com.usoftchina.saas.utils.StringUtils;
+import org.apache.commons.lang.RandomStringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author yingp
+ * @date 2018/10/24
+ */
+@Service
+public class RoleServiceImpl extends CommonBaseServiceImpl<RoleMapper, Role> implements RoleService{
+
+    private static final String ROLE_CODE_PREFIX = "ROLE_";
+
+    @Autowired
+    private RoleResourceMapper roleResourceMapper;
+
+    @Autowired
+    private AccountRoleMapper accountRoleMapper;
+
+    @Override
+    public boolean save(Role role) {
+        if (StringUtils.isEmpty(role.getCode())) {
+            role.setCode(ROLE_CODE_PREFIX + RandomStringUtils.randomAlphabetic(8));
+        }
+        // 新增的都是普通角色
+        role.setType(RoleType.NORMAL.getType());
+        return super.save(role);
+    }
+
+    @Override
+    public void bindResource(long roleId, long resourceId) {
+        roleResourceMapper.insert(roleId, resourceId);
+    }
+
+    @Override
+    public void unbindResource(long roleId, long resourceId) {
+        roleResourceMapper.delete(roleId, resourceId);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean removeByPrimaryKey(Long id) {
+        accountRoleMapper.deleteByRoleId(id);
+        roleResourceMapper.deleteByRoleId(id);
+        return super.removeByPrimaryKey(id);
+    }
+}

+ 17 - 2
base-servers/account/account-server/src/main/resources/application.yml

@@ -7,8 +7,23 @@ spring:
     user:
       name: admin
       password: select111***
+  rabbitmq:
+    host: 192.168.0.176
+    port: 5672
+    virtual-host: dev
+    username: saas
+    password: select123***
+  zipkin:
+    sender:
+      type: rabbit
+    locator:
+      discovery:
+        enabled: true
+  sleuth:
+    sampler:
+      probability: 1.0
   datasource:
-    driver-class-name: com.mysql.jdbc.Driver
+    driver-class-name: com.mysql.cj.jdbc.Driver
     url: jdbc:mysql://192.168.253.12:3306/saas_account?characterEncoding=utf-8&useSSL=false
     username: root
     password: select111***
@@ -31,7 +46,7 @@ eureka:
   client:
     registryFetchIntervalSeconds: 5
     serviceUrl:
-      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.0.181:8500/eureka/
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@192.168.0.181:8510/eureka/
 server:
   port: 8580
   tomcat:

+ 3 - 0
base-servers/account/account-server/src/main/resources/mapper/AccountCompanyMapper.xml

@@ -10,4 +10,7 @@
     <delete id="deleteByAccountId" parameterType="java.lang.Long">
         delete from ac_account_company where account_id=#{accountId}
     </delete>
+    <delete id="deleteByCompanyId" parameterType="java.lang.Long">
+        delete from ac_account_company where company_id=#{companyId}
+    </delete>
 </mapper>

+ 3 - 0
base-servers/account/account-server/src/main/resources/mapper/AccountRoleMapper.xml

@@ -10,4 +10,7 @@
     <delete id="deleteByAccountId" parameterType="java.lang.Long">
         delete from ac_account_role where account_id=#{accountId}
     </delete>
+    <delete id="deleteByRoleId" parameterType="java.lang.Long">
+        delete from ac_account_role where role_id=#{roleId}
+    </delete>
 </mapper>

+ 13 - 0
base-servers/account/account-server/src/main/resources/mapper/CompanyAppMapper.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.usoftchina.saas.account.mapper.CompanyAppMapper">
+    <insert id="insert">
+        insert into ac_company_app(company_id,app_id) values (#{companyId,jdbcType=BIGINT}, #{appId,jdbcType=VARCHAR})
+    </insert>
+    <delete id="delete">
+        delete from ac_company_app where company_id=#{companyId,jdbcType=BIGINT} and app_id=#{appId,jdbcType=VARCHAR}
+    </delete>
+    <delete id="deleteByCompanyId" parameterType="java.lang.Long">
+        delete from ac_company_app where company_id=#{companyId}
+    </delete>
+</mapper>

+ 7 - 4
base-servers/account/account-server/src/main/resources/mapper/CompanyMapper.xml

@@ -80,17 +80,20 @@
             </if>
         </trim>
     </insert>
+    <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="FullResultMap">
+        select <include refid="baseColumns"/> from ac_company where id=#{id,jdbcType=BIGINT}
+    </select>
     <select id="selectByName" parameterType="java.lang.String" resultMap="FullResultMap">
-        select <include refid="baseColumns"/> from ac_company where name=#{name}
+        select <include refid="baseColumns"/> from ac_company where name=#{name,jdbcType=VARCHAR}
     </select>
     <select id="selectByBusinessCode" parameterType="java.lang.String" resultMap="FullResultMap">
-        select <include refid="baseColumns"/> from ac_company where business_code=#{businessCode}
+        select <include refid="baseColumns"/> from ac_company where business_code=#{businessCode,jdbcType=VARCHAR}
     </select>
     <select id="selectBaseByAccountId" parameterType="java.lang.Long" resultMap="BaseResultMap">
         select ac_company.id,ac_company.name,ac_company.logo_url from ac_account_company,ac_company
-        where ac_account_company.company_id=ac_company.id and ac_account_company.account_id=#{accountId}
+        where ac_account_company.company_id=ac_company.id and ac_account_company.account_id=#{accountId,jdbcType=BIGINT}
     </select>
     <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
-        delete from ac_company where id=#{id}
+        delete from ac_company where id=#{id,jdbcType=BIGINT}
     </delete>
 </mapper>

+ 15 - 0
base-servers/account/account-server/src/main/resources/mapper/ResourceGroupMapper.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.usoftchina.saas.account.mapper.ResourceGroupMapper">
+    <resultMap id="BaseResultMap" type="com.usoftchina.saas.account.po.ResourceGroup">
+        <id column="id" jdbcType="BIGINT" property="id"/>
+        <result column="name" jdbcType="VARCHAR" property="name"/>
+        <result column="module_id" jdbcType="BIGINT" property="moduleId"/>
+    </resultMap>
+    <sql id="baseColumns">
+        id,name,module_id
+    </sql>
+    <select id="selectByModuleId" parameterType="java.lang.Long" resultMap="BaseResultMap">
+        select <include refid="baseColumns"/> from ac_resource_group where module_id=#{moduleId,jdbcType=VARCHAR} order by id
+    </select>
+</mapper>

+ 24 - 0
base-servers/account/account-server/src/main/resources/mapper/ResourceMapper.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.usoftchina.saas.account.mapper.ResourceMapper">
+    <resultMap id="BaseResultMap" type="com.usoftchina.saas.account.po.Resource">
+        <id column="id" jdbcType="BIGINT" property="id"/>
+        <result column="name" jdbcType="VARCHAR" property="name"/>
+        <result column="group_id" jdbcType="BIGINT" property="groupId"/>
+        <result column="type" jdbcType="VARCHAR" property="type"/>
+        <result column="url" jdbcType="VARCHAR" property="url"/>
+        <result column="method" jdbcType="VARCHAR" property="method"/>
+        <result column="classify" jdbcType="VARCHAR" property="classify"/>
+    </resultMap>
+    <sql id="baseColumns">
+        ac_resource.id,ac_resource.name,ac_resource.group_id,ac_resource.type,ac_resource.url,ac_resource.method,ac_resource.classify
+    </sql>
+    <select id="selectByGroupId" parameterType="java.lang.Long" resultMap="BaseResultMap">
+        select <include refid="baseColumns"/> from ac_resource where group_id=#{groupId,jdbcType=BIGINT}
+    </select>
+    <select id="selectByAppId" parameterType="java.lang.String" resultMap="BaseResultMap">
+        select <include refid="baseColumns"/> from ac_resource,ac_resource_module,ac_resource_group where
+        ac_resource_module.id=ac_resource_group.module_id and ac_resource_group.id=ac_resource.group_id
+        and ac_resource_module.app_id=#{appId,jdbcType=VARCHAR}
+    </select>
+</mapper>

+ 15 - 0
base-servers/account/account-server/src/main/resources/mapper/ResourceModuleMapper.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.usoftchina.saas.account.mapper.ResourceModuleMapper">
+    <resultMap id="BaseResultMap" type="com.usoftchina.saas.account.po.ResourceModule">
+        <id column="id" jdbcType="BIGINT" property="id"/>
+        <result column="name" jdbcType="VARCHAR" property="name"/>
+        <result column="app_id" jdbcType="VARCHAR" property="appId"/>
+    </resultMap>
+    <sql id="baseColumns">
+        id,name,app_id
+    </sql>
+    <select id="selectByAppId" parameterType="java.lang.String" resultMap="BaseResultMap">
+        select <include refid="baseColumns"/> from ac_resource_module where app_id=#{appId,jdbcType=VARCHAR} order by id
+    </select>
+</mapper>

+ 0 - 4
base-servers/account/account-server/src/main/resources/mapper/ResourcesMapper.xml

@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
-<mapper namespace="com.usoftchina.saas.account.mapper.ResourcesMapper">
-</mapper>

+ 98 - 1
base-servers/account/account-server/src/main/resources/mapper/RoleMapper.xml

@@ -1,5 +1,102 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="com.usoftchina.saas.account.mapper.RoleMapper">
-
+    <resultMap id="BaseResultMap" type="com.usoftchina.saas.account.po.Role">
+        <id column="id" jdbcType="BIGINT" property="id"/>
+        <result column="code" jdbcType="VARCHAR" property="code"/>
+        <result column="name" jdbcType="VARCHAR" property="name"/>
+        <result column="description" jdbcType="VARCHAR" property="description"/>
+        <result column="type" jdbcType="INTEGER" property="type"/>
+        <result column="company_id" jdbcType="BIGINT" property="companyId"/>
+        <result column="creator_id" jdbcType="BIGINT" property="creatorId"/>
+        <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
+        <result column="updater_id" jdbcType="BIGINT" property="updaterId"/>
+        <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
+    </resultMap>
+    <sql id="baseColumns">
+        id,code,name,description,type,company_id,creator_id,create_time,updater_id,update_time
+    </sql>
+    <insert id="insert" parameterType="com.usoftchina.saas.account.po.Role"
+            useGeneratedKeys="true" keyProperty="id">
+        insert into ac_role(code,name,description,type,company_id,creator_id,create_time,updater_id,update_time)
+        values (#{code,jdbcType=VARCHAR},#{name,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, #{type,jdbcType=INTEGER}, #{companyId,jdbcType=BIGINT},
+        #{creatorId,jdbcType=BIGINT}, #{createTime,jdbcType=TIMESTAMP}, #{updaterId,jdbcType=BIGINT}, #{updateTime,jdbcType=TIMESTAMP})
+    </insert>
+    <insert id="insertSelective" parameterType="com.usoftchina.saas.account.po.Role"
+            useGeneratedKeys="true" keyProperty="id">
+        insert into ac_role
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="code != null">
+                code,
+            </if>
+            <if test="name != null">
+                name,
+            </if>
+            <if test="description != null">
+                description,
+            </if>
+            <if test="type != null">
+                type,
+            </if>
+            <if test="companyId != null">
+                company_id,
+            </if>
+            <if test="creatorId != null">
+                creator_id,
+            </if>
+            <if test="createTime != null">
+                create_time,
+            </if>
+            <if test="updaterId != null">
+                updater_id,
+            </if>
+            <if test="updateTime != null">
+                update_time,
+            </if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="code != null">
+                #{code,jdbcType=VARCHAR},
+            </if>
+            <if test="name != null">
+                #{name,jdbcType=VARCHAR},
+            </if>
+            <if test="description != null">
+                #{description,jdbcType=VARCHAR},
+            </if>
+            <if test="type != null">
+                #{type,jdbcType=INTEGER},
+            </if>
+            <if test="companyId != null">
+                #{companyId,jdbcType=BIGINT},
+            </if>
+            <if test="creatorId != null">
+                #{creatorId,jdbcType=BIGINT},
+            </if>
+            <if test="createTime != null">
+                #{createTime,jdbcType=TIMESTAMP},
+            </if>
+            <if test="updaterId != null">
+                #{updaterId,jdbcType=BIGINT},
+            </if>
+            <if test="updateTime != null">
+                #{updateTime,jdbcType=TIMESTAMP},
+            </if>
+        </trim>
+    </insert>
+    <update id="updateByPrimaryKey" parameterType="com.usoftchina.saas.account.po.Role">
+        update ac_role set code=#{code,jdbcType=VARCHAR},name=#{name,jdbcType=VARCHAR},
+        description=#{description,jdbcType=VARCHAR},type=#{type,jdbcType=INTEGER},company_id=#{companyId,jdbcType=BIGINT},
+        creator_id=#{creatorId,jdbcType=BIGINT},create_time=#{createTime,jdbcType=TIMESTAMP},
+        updater_id=#{updaterId,jdbcType=BIGINT},update_time=#{updateTime,jdbcType=TIMESTAMP} where id=#{id,jdbcType=BIGINT}
+    </update>
+    <delete id="deleteByPrimaryKey" parameterType="java.lang.Long">
+        delete from ac_role where id=#{id,jdbcType=BIGINT}
+    </delete>
+    <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap">
+        select <include refid="baseColumns"/> from ac_role where id=#{id,jdbcType=BIGINT}
+    </select>
+    <select id="selectByCompanyId" parameterType="java.lang.Long" resultMap="BaseResultMap">
+        select <include refid="baseColumns"/> from ac_role where company_id=#{companyId,jdbcType=BIGINT}
+    </select>
 </mapper>

+ 3 - 0
base-servers/account/account-server/src/main/resources/mapper/RoleResourceMapper.xml

@@ -7,4 +7,7 @@
     <delete id="delete">
         delete from ac_role_resource where role_id=#{roleId} and resource_id=#{resourceId}
     </delete>
+    <delete id="deleteByRoleId" parameterType="java.lang.Long">
+        delete from ac_role_resource where role_id=#{roleId}
+    </delete>
 </mapper>

+ 1 - 2
base-servers/account/account-server/src/test/java/com/usoftchina/saas/account/controller/AccountControllerTest.java

@@ -111,8 +111,7 @@ public class AccountControllerTest extends BaseControllerTest {
     @Test
     public void testI_deleteAccount() throws Exception {
         AccountDTO accountDTO = getAccountDTO();
-        mockMvc.perform(post("/account/delete")
-                .param("accountId", String.valueOf(accountDTO.getId())))
+        mockMvc.perform(post("/account/delete/{id}", accountDTO.getId()))
                 .andExpect(isSuccess());
     }
 }

+ 32 - 5
base-servers/account/account-server/src/test/java/com/usoftchina/saas/account/controller/CompanyControllerTest.java

@@ -3,6 +3,7 @@ package com.usoftchina.saas.account.controller;
 import com.usoftchina.saas.account.dto.CompanyDTO;
 import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.test.BaseControllerTest;
+import com.usoftchina.saas.test.TestConstant;
 import org.junit.Assert;
 import org.junit.FixMethodOrder;
 import org.junit.Test;
@@ -39,7 +40,7 @@ public class CompanyControllerTest extends BaseControllerTest {
     }
 
     private CompanyDTO getByName() throws Exception {
-        MvcResult mvcResult = mockMvc.perform(get("/company")
+        MvcResult mvcResult = mockMvc.perform(get("/company/read")
                 .param("name", name))
                 .andExpect(isSuccess())
                 .andReturn();
@@ -49,7 +50,7 @@ public class CompanyControllerTest extends BaseControllerTest {
     }
 
     private CompanyDTO getByBusinessCode() throws Exception {
-        MvcResult mvcResult = mockMvc.perform(get("/company")
+        MvcResult mvcResult = mockMvc.perform(get("/company/read")
                 .param("businessCode", businessCode))
                 .andExpect(isSuccess())
                 .andReturn();
@@ -65,10 +66,36 @@ public class CompanyControllerTest extends BaseControllerTest {
     }
 
     @Test
-    public void testD_delete() throws Exception {
+    public void testD_getCurrentCompany() throws Exception {
+        MvcResult mvcResult = mockMvc.perform(get("/company/read/current"))
+                .andExpect(isSuccess())
+                .andReturn();
+        Result<CompanyDTO> result = result(mvcResult, CompanyDTO.class);
+        System.out.println(result.getData());
+    }
+
+    @Test
+    public void testE_bindApp() throws Exception {
+        CompanyDTO companyDTO = getByName();
+        mockMvc.perform(post("/company/bind/app")
+                .param("companyId", String.valueOf(companyDTO.getId()))
+                .param("appId", TestConstant.DEFAULT_APP_ID))
+                .andExpect(isSuccess());
+    }
+
+    @Test
+    public void testF_unbindApp() throws Exception {
+        CompanyDTO companyDTO = getByName();
+        mockMvc.perform(post("/company/unbind/app")
+                .param("companyId", String.valueOf(companyDTO.getId()))
+                .param("appId", TestConstant.DEFAULT_APP_ID))
+                .andExpect(isSuccess());
+    }
+
+    @Test
+    public void testG_delete() throws Exception {
         CompanyDTO companyDTO = getByName();
-        mockMvc.perform(post("/company/delete")
-                .param("companyId", String.valueOf(companyDTO.getId())))
+        mockMvc.perform(post("/company/delete/{id}", companyDTO.getId()))
                 .andExpect(isSuccess());
     }
 

+ 33 - 0
base-servers/account/account-server/src/test/java/com/usoftchina/saas/account/controller/ResourcesControllerTest.java

@@ -0,0 +1,33 @@
+package com.usoftchina.saas.account.controller;
+
+import com.usoftchina.saas.test.BaseControllerTest;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MvcResult;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class ResourcesControllerTest extends BaseControllerTest{
+
+    @Test
+    public void testA_getModulesByAppId() throws Exception {
+        MvcResult mvcResult = mockMvc.perform(get("/resource/module/list"))
+                .andExpect(isSuccess())
+                .andReturn();
+        System.out.println(mvcResult.getResponse().getContentAsString());
+    }
+
+    @Test
+    public void testB_getUrlResourcesByAppId() throws Exception {
+        MvcResult mvcResult = mockMvc.perform(get("/resource/url/list"))
+                .andExpect(isSuccess())
+                .andReturn();
+        System.out.println(mvcResult.getResponse().getContentAsString());
+    }
+
+}

+ 47 - 0
base-servers/account/account-server/src/test/java/com/usoftchina/saas/account/service/ResourceServiceTest.java

@@ -0,0 +1,47 @@
+package com.usoftchina.saas.account.service;
+
+import com.usoftchina.saas.account.dto.ResourceModuleDTO;
+import com.usoftchina.saas.account.dto.UrlResourceDTO;
+import com.usoftchina.saas.context.BaseContextHolder;
+import org.junit.FixMethodOrder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.MethodSorters;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.List;
+import java.util.stream.IntStream;
+
+import static org.junit.Assert.*;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+public class ResourceServiceTest {
+
+    @Autowired
+    private ResourceService resourceService;
+
+    @Test
+    public void testA_findModulesByAppId() throws Exception {
+        // 测试方法性能
+        IntStream.range(1, 21).forEach( i -> {
+            long time = System.currentTimeMillis();
+            List<ResourceModuleDTO> moduleDTOS = resourceService.findModulesByAppId(BaseContextHolder.getAppId());
+            System.out.println(String.format("----%s: %s, %s", i, moduleDTOS.size(), (System.currentTimeMillis() - time)));
+        });
+    }
+
+    @Test
+    public void testB_findUrlResourcesByAppId() throws Exception {
+        // 测试方法性能
+        IntStream.range(1, 21).forEach( i -> {
+            long time = System.currentTimeMillis();
+            List<UrlResourceDTO> resourceDTOS = resourceService.findUrlResourcesByAppId(BaseContextHolder.getAppId());
+            System.out.println(String.format("----%s: %s, %s", i, resourceDTOS.size(), (System.currentTimeMillis() - time)));
+        });
+    }
+
+}

+ 1 - 0
base-servers/auth/auth-client/src/main/java/com/usoftchina/saas/auth/client/interceptor/AuthRestInterceptor.java

@@ -38,6 +38,7 @@ public class AuthRestInterceptor extends HandlerInterceptorAdapter {
         }
         String token = request.getHeader(authConfig.getAuthHeader());
         JwtInfo infoFromToken = JwtHelper.getInfoFromToken(token, authConfig.getPublicKey());
+        BaseContextHolder.setAppId(infoFromToken.getAppId());
         BaseContextHolder.setUserId(infoFromToken.getUserId());
         BaseContextHolder.setCompanyId(infoFromToken.getCompanyId());
         BaseContextHolder.setToken(token);

+ 2 - 0
base-servers/auth/auth-common/src/main/java/com/usoftchina/saas/auth/common/jwt/JwtHelper.java

@@ -37,6 +37,7 @@ public class JwtHelper {
                     Jwts.builder()
                             // 设置主题
                             .setSubject(jwtInfo.getUserName())
+                            .claim("appId", jwtInfo.getAppId())
                             .claim("userId", jwtInfo.getUserId())
                             .claim("companyId", jwtInfo.getCompanyId())
                             .claim("userName", jwtInfo.getUserName())
@@ -93,6 +94,7 @@ public class JwtHelper {
         Jws<Claims> claimsJws = parserToken(token, pubKeyPath);
         Claims body = claimsJws.getBody();
         return new JwtInfo(
+                ObjectUtils.getStringValue(body.get("appId")),
                 ObjectUtils.getLongValue(body.get("userId")),
                 ObjectUtils.getLongValue(body.get("companyId")),
                 ObjectUtils.getStringValue(body.get("userName"))

+ 11 - 1
base-servers/auth/auth-common/src/main/java/com/usoftchina/saas/auth/common/jwt/JwtInfo.java

@@ -7,16 +7,26 @@ import java.io.Serializable;
  * @date 2018/10/2
  */
 public class JwtInfo implements Serializable{
+    private String appId;
     private Long companyId;
     private Long userId;
     private String userName;
 
-    public JwtInfo(Long companyId, Long userId, String userName) {
+    public JwtInfo(String appId, Long companyId, Long userId, String userName) {
+        this.appId = appId;
         this.companyId = companyId;
         this.userId = userId;
         this.userName = userName;
     }
 
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
     public Long getCompanyId() {
         return companyId;
     }

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

@@ -42,7 +42,7 @@ public class AuthController {
         if (result.isSuccess()) {
             AccountDTO accountDTO = result.getData();
             // TODO
-            JwtInfo info = new JwtInfo(null, accountDTO.getId(), accountDTO.getUsername());
+            JwtInfo info = new JwtInfo(null, null, accountDTO.getId(), accountDTO.getUsername());
             TokenVO tokenVO = JwtHelper.generateToken(info, privateKeyPath, expire);
             TokenDTO tokenDTO = BeanMapper.map(tokenVO, TokenDTO.class);
             return Result.success(tokenDTO);

+ 4 - 0
framework/core/src/main/java/com/usoftchina/saas/constant/CommonConstants.java

@@ -15,6 +15,10 @@ public class CommonConstants {
      * ThreadLocal中的登录用户Id key
      */
     public static final String CONTEXT_KEY_USER_ID = "currentUserId";
+    /***
+     * ThreadLocal中的登录应用Id key
+     */
+    public static final String CONTEXT_KEY_APP_ID = "currentAppId";
     /***
      * ThreadLocal中的登录用户Id key
      */

+ 9 - 0
framework/core/src/main/java/com/usoftchina/saas/context/BaseContextHolder.java

@@ -49,6 +49,15 @@ public class BaseContextHolder {
         set(CommonConstants.CONTEXT_KEY_COMPANY_ID, companyId);
     }
 
+    public static String getAppId() {
+        Object value = get(CommonConstants.CONTEXT_KEY_APP_ID);
+        return ObjectUtils.getStringValue(value);
+    }
+
+    public static void setAppId(String appId) {
+        set(CommonConstants.CONTEXT_KEY_APP_ID, appId);
+    }
+
     public static String getToken() {
         Object value = get(CommonConstants.CONTEXT_KEY_TOKEN);
         return ObjectUtils.getStringValue(value);

+ 1 - 0
framework/core/src/main/java/com/usoftchina/saas/exception/ExceptionCode.java

@@ -33,6 +33,7 @@ public enum ExceptionCode implements BaseExceptionCode {
     USER_PWD_NOT_EQUALS(53004, "密码与确认密码不一致"),
     USER_NOT_EXIST(53005, "用户不存在"),
     USER_NOT_ENABLE(53006, "用户禁止使用"),
+    ROLE_NOT_EXIST(53020, "角色不存在"),
 
     // 文件相关
     FOLDER_NULL(55000, "文件夹为空"),

+ 13 - 11
framework/core/src/main/java/com/usoftchina/saas/utils/ListUtils.java → framework/core/src/main/java/com/usoftchina/saas/utils/CollectionUtils.java

@@ -10,7 +10,7 @@ import java.util.function.Function;
  * @author yingp
  * @date 2018/10/10
  */
-public class ListUtils {
+public abstract class CollectionUtils extends org.springframework.util.CollectionUtils{
     /**
      * 按指定方法,将list分组返回map
      *
@@ -22,16 +22,18 @@ public class ListUtils {
      */
     public static <K, V> Map<K, List<V>> groupBy(List<V> sources, Function<V, K> keyGetter) {
         Map<K, List<V>> map = new HashMap<>(1);
-        sources.forEach(source -> {
-            K key = keyGetter.apply(source);
-            if (map.containsKey(key)) {
-                map.get(key).add(source);
-            } else {
-                List<V> childList = new ArrayList<>();
-                childList.add(source);
-                map.put(key, childList);
-            }
-        });
+        if (!isEmpty(sources)) {
+            sources.forEach(source -> {
+                K key = keyGetter.apply(source);
+                if (map.containsKey(key)) {
+                    map.get(key).add(source);
+                } else {
+                    List<V> childList = new ArrayList<>();
+                    childList.add(source);
+                    map.put(key, childList);
+                }
+            });
+        }
         return map;
     }
 }

+ 1 - 1
framework/core/src/main/java/com/usoftchina/saas/utils/ObjectUtils.java

@@ -4,7 +4,7 @@ package com.usoftchina.saas.utils;
  * @author yingp
  * @date 2018/10/2
  */
-public class ObjectUtils {
+public abstract class ObjectUtils extends org.springframework.util.ObjectUtils{
     public static String getStringValue(Object obj) {
         return null == obj ? "" : obj.toString();
     }

+ 1 - 1
framework/core/src/main/java/com/usoftchina/saas/utils/StringUtils.java

@@ -4,7 +4,7 @@ package com.usoftchina.saas.utils;
  * @author yingp
  * @date 2018/10/10
  */
-public class StringUtils {
+public abstract class StringUtils extends org.springframework.util.StringUtils{
     /**
      * 为空取值
      *

+ 4 - 4
framework/test-starter/src/main/java/com.usoftchina.saas.test/BaseControllerTest.java

@@ -41,8 +41,8 @@ public abstract class BaseControllerTest {
      * @param urlTemplate
      * @return
      */
-    public static MockHttpServletRequestBuilder get(String urlTemplate) {
-        return MockMvcRequestBuilders.get(urlTemplate);
+    public static MockHttpServletRequestBuilder get(String urlTemplate, Object... uriVars) {
+        return MockMvcRequestBuilders.get(urlTemplate, uriVars);
     }
 
     /**
@@ -51,8 +51,8 @@ public abstract class BaseControllerTest {
      * @param urlTemplate
      * @return
      */
-    public static MockHttpServletRequestBuilder post(String urlTemplate) {
-        return MockMvcRequestBuilders.post(urlTemplate);
+    public static MockHttpServletRequestBuilder post(String urlTemplate, Object... uriVars) {
+        return MockMvcRequestBuilders.post(urlTemplate, uriVars);
     }
 
     /**

+ 10 - 0
framework/test-starter/src/main/java/com.usoftchina.saas.test/TestConstant.java

@@ -13,4 +13,14 @@ public class TestConstant {
      * 默认账户ID
      */
     public static final long DEFAULT_ACCOUNT_ID = 1;
+    /**
+     * 默认应用ID
+     * <p>
+     * trade-app - 贸易云
+     * manufacture-app - 制造云
+     * solution-app - 方案云
+     * ...
+     * </p>
+     */
+    public static final String DEFAULT_APP_ID = "trade-app";
 }

+ 1 - 0
framework/test-starter/src/main/java/com.usoftchina.saas.test/TestContextListener.java

@@ -14,5 +14,6 @@ public class TestContextListener extends AbstractTestExecutionListener {
         // 设置测试环境默认用户
         BaseContextHolder.setCompanyId(TestConstant.DEFAULT_COMPANY_ID);
         BaseContextHolder.setUserId(TestConstant.DEFAULT_ACCOUNT_ID);
+        BaseContextHolder.setAppId(TestConstant.DEFAULT_APP_ID);
     }
 }

+ 7 - 2
frontend/saas-web/Readme.md

@@ -70,7 +70,6 @@ viewModel: view.core.form.FormPanelModel
 | saveUrl | 保存接口 | √ | basePath + "purchase/purchase/save" |
 | auditUrl | 审核接口 | √ | basePath + "purchase/purchase/audit" |
 | deleteUrl | 删除接口 | √ | basePath + "purchase/purchase/delete" |
-| deleteDetailUrl | 删除明细接口 | √ | basePath + "purchase/purchase/deleteItem" |
 | toolBtns | 自定义按钮 | x | [ Button ] |
 | defaultItems | 界面字段 | √ | [ Field ]|
 
@@ -93,7 +92,7 @@ viewModel: view.core.form.FormPanelModel
 | storeModel | grid model | √ | "saas.model.purchase.purchasedetail" |
 | detnoColumn | 序号列 | √ | "pud_detno" |
 | columns[i].ignore | 是否忽略,为真时在调用保存方法时不会取到该列值 | x | true |
-
+| deleteDetailUrl | 删除明细接口 | √ | basePath + "purchase/purchase/deleteItem" |
 - 需要根据columns在models文件夹下添加storeModel对应的Model
 
 ---
@@ -145,3 +144,9 @@ viewModel: view.core.query.QueryPanelModel
 | baseColumn | 基础列配置 | √ | [ Column ] |
 | relativeColumn | 关联列设置 | x | [ Column ] |
 
+---
+
+### 前端配置调整日志
+
+2018-10-20 deleteDetailUrl 配置调整 formpanel.form->formpanel.detailGridField
+

+ 13 - 0
frontend/saas-web/app/model/document/vendorcontact.js

@@ -0,0 +1,13 @@
+Ext.define('saas.model.document.vendorcontact', {
+    extend: 'saas.model.Base',
+    fields: [
+        { name: 'id', type: 'int' },
+        { name: 'vc_detno', type: 'int' },
+        { name: 'vc_name', type: 'string' },
+        { name: 'vc_tel', type: 'string' },
+        { name: 'vc_qq', type: 'string' },
+        { name: 'vc_email', type: 'string' },
+        { name: 'vc_default', type: 'string' },
+        { name: 'vc_veid', type: 'int' }
+    ]
+});

+ 1 - 1
frontend/saas-web/app/util/FormUtil.js

@@ -135,7 +135,7 @@ Ext.define('saas.util.FormUtil', {
                         grid.add10EmptyRow();
                     });
                     if(code){
-                        viewModel.set('form.' + form._codeField,code);
+                        viewModel.set(form._codeField,code);
                     }
                 }
             }).catch(function() {

+ 3 - 153
frontend/saas-web/app/view/core/baseform/FormPanelController.js

@@ -5,164 +5,14 @@ Ext.define('saas.view.core.baseform.FormPanelController', {
     BaseUtil: Ext.create('saas.util.BaseUtil'),
     FormUtil: Ext.create('saas.util.FormUtil'),
 
-    auditBtnClick: function() {
-        var me = this,
-        form = me.getView(),
-        statusCodeField = form._statusCodeField,
-        viewModel = me.getViewModel(),
-        status = viewModel.get(statusCodeField);
-
-        status == 'AUDITED' ? me.unAudit() : me.audit();
+    query: function() {
+        var grid = this.view.down('[name=baseGrid]');
+        grid.store.loadPage(1);
     },
 
     add: function(){
         var form = this.getView();
         var id = form.xtype + '_add';
         openTab(form.xtype,'新增' + form._title,id);
-    },
-    
-    delete: function(){
-        var me = this;
-        var form = this.getView();
-        var id = form.getForm().findField(form._idField);
-        var code = form.getForm().findField(form._codeField);
-        if(id&&id.value!=0){
-            me.BaseUtil.request({
-                url: form._deleteUrl+id.value,
-                method: 'GET',
-            })
-            .then(function(res) {
-                var localJson = new Ext.decode(res.responseText);
-                if(localJson.success){
-                    var mainTab = Ext.getCmp('main-tab-panel');
-                    mainTab.getActiveTab().close();
-                    //解析参数
-                    Ext.Msg.alert('提示','删除成功');
-                }
-            })
-            .catch(function() {
-                Ext.Msg.alert('提示','删除失败');
-            });
-        }
-    },
-
-    onSave: function() {
-        var me = this,
-        form = this.getView(),
-        viewModel = me.getViewModel(),
-        modelData = viewModel.getData(),
-        detailBindFields = modelData._detailBindFields;
-
-        if(form.getForm().wasDirty==false){
-            Ext.Msg.alert('提示','未修改数据,请修改后保存');
-            return false;
-        }
-        if(form.getForm().wasValid==false){
-            Ext.Msg.alert('提示','表单校验有误,请检查');
-            return false;
-        }
-        //form里面数据
-        var formData = form.getFormData();
-        
-        me.save(formData);
-    },
-
-    save:function(formData){
-        var me = this,
-        form = this.getView(),
-        viewModel = me.getViewModel(),
-        modelData = viewModel.getData(),
-        detailBindFields = modelData._detailBindFields;
-
-        var gridData = formData.detail?formData.detail:[];
-        var dirtyGridData = [];
-        if(gridData.length>0){
-            Ext.each(gridData, function(item,index){
-                var d = Object.assign({}, item.data),
-                dirty = item.dirty;
-                if(dirty){
-                    if((typeof d.id) != "number" && d.id.indexOf('-')>-1){
-                        d.id = 0;
-                    }
-                    for(k in d) {
-                        if(!Ext.Array.contains(detailBindFields, k)) {
-                            delete d[k];
-                        }
-                    }
-                    dirtyGridData.push(d);
-                }
-            });
-        }
-        var params = {
-            main:formData.main,
-            items:dirtyGridData
-        }
-        me.BaseUtil.request({
-            url: form._saveUrl,
-            params: JSON.stringify(params),
-            method: 'POST',
-        })
-        .then(function(res) {
-            var localJson = new Ext.decode(res.responseText);
-            if(localJson.success){
-                Ext.Msg.alert('提示','保存成功');
-                form.initId = localJson.data.id;
-                form.FormUtil.loadData(form);
-            }
-        })
-        .catch(function() {
-            Ext.Msg.alert('提示','保存失败');
-        });
-    },
-
-    audit: function(){
-        var me = this;
-        var form = this.getView();
-        if(form.getForm().wasDirty==false){
-            Ext.Msg.alert('提示','未修改数据,请修改后保存');
-            return false;
-        }
-        if(form.getForm().wasValid==false){
-            Ext.Msg.alert('提示','表单校验有误,请检查');
-            return false;
-        }
-        //form里面数据
-        var formData = form.getFormData();
-        var gridData = formData.detail?formData.detail:[];
-        var dirtyGridData = [];
-        if(gridData.length>0){
-            Ext.each(gridData, function(item,index){
-                if(item.dirty){
-                    if((typeof item.data.id) != "number" && item.data.id.indexOf('extMode')>-1){
-                        item.data.id = 0;
-                    }
-                    dirtyGridData.push(item.data)
-                }
-            });
-        }   
-        var params = {
-            main:formData.main,
-            items:dirtyGridData
-        }
-        me.BaseUtil.request({
-            url: form._auditUrl,
-            params: JSON.stringify(params),
-            method: 'POST',
-        })
-        .then(function(res) {
-            var localJson = new Ext.decode(res.responseText);
-            if(localJson.success){
-                Ext.Msg.alert('提示','审核成功');
-                form.initId = localJson.data.id;
-                form.FormUtil.loadData(form);
-            }
-        })
-        .catch(function() {
-            Ext.Msg.alert('提示','审核失败');
-        });
-    },
-    unAudit: function() {
-        console.log('反审核');
-        return;
     }
 });

+ 89 - 5
frontend/saas-web/app/view/core/baseform/GridPanel.js

@@ -24,6 +24,7 @@ Ext.define('saas.view.core.baseform.GridPanel', {
                 pageSize: 10,
                 data: [],
                 proxy: {
+                    timeout:8000,
                     type: 'ajax',
                     url: me.dataUrl,
                     actionMethods: {
@@ -54,10 +55,26 @@ Ext.define('saas.view.core.baseform.GridPanel', {
                 dockedItems:[{
                     xtype:'toolbar',
                     dock:'top',
+                    defaults: { // defaults 将会应用所有的子组件上,而不是父容器
+                        listeners: {
+                            'mouseover':function(){
+                                this.showMenu(); 
+                            },
+                            'mouseout':function(btn,e){
+                                var cx = e.browserEvent.clientX, cy = e.browserEvent.clientY;
+                                var btnLayout = btn.el.dom.getBoundingClientRect();
+                                if(cx <= btnLayout.left || cx >= btnLayout.left+btnLayout.width || cy <= btnLayout.top) {
+                                    btn.hideMenu();
+                                }
+                            }
+                        }
+                    },
                     items:['->',{
                         xtype:'button',
                         text:'新增',
                         handler:function(b){
+                            var form = b.ownerCt.ownerCt.ownerCt;
+                            openTab(form._formXtype, '新增' + form._title, form._formXtype+'_add'); 
                         }
                     }, {
                         text: '导入',
@@ -78,13 +95,17 @@ Ext.define('saas.view.core.baseform.GridPanel', {
                         }
                     },{
                         text: '禁用',
-                        handler: me.onCloseOrder,
+                        handler: function(){
+                            var form = this.ownerCt.ownerCt.ownerCt;
+                            me.onVastDeal(form._batchCloseUrl);
+                        },
                         menu: {
                             width: 80,
                             items: [{
                                 text:'启用',
                                 handler:function(){
-                                    me.onOpenOrder(this)
+                                    var form = this.ownerCt.ownerCmp.ownerCt.ownerCt.ownerCt;
+                                    me.onVastDeal(form._batchOpenUrl);
                                 }
                             }],
                             listeners: {
@@ -95,7 +116,10 @@ Ext.define('saas.view.core.baseform.GridPanel', {
                         }
                     }, {
                         text: '删除',
-                        handler: me.onDelete
+                        handler: function(){
+                            var form = this.ownerCt.ownerCt.ownerCt;
+                            me.onVastDeal(form._batchDeleteUrl);
+                        }
                     }, {
                         text: '刷新',
                         handler: me.onLoad
@@ -115,6 +139,30 @@ Ext.define('saas.view.core.baseform.GridPanel', {
         me.callParent(arguments);
     },
 
+    onVastDeal:function(url){
+        var form = this.ownerCt;
+        var grid = this;
+        var data = grid.getGridSelected();
+        if(data&&data.length>0){
+            var params = JSON.stringify({baseDTOs:data});
+            form.BaseUtil.request({
+                    url: url,
+                    params: params,
+                    method: 'POST',
+                    async:false
+                })
+                .then(function() {
+                    Ext.Msg.alert('提示','操作成功');
+                })
+                .catch(function(response) {
+                    Ext.Msg.alert('提示','操作失败');
+                });
+                grid.store.load();
+        }else{
+            Ext.Msg.alert('提示','请勾选至少一条明细。');
+        }
+    },
+
     listeners:{
         itemClick: function(view,record,a,index,c) {
             var classList = c.target.classList.value;
@@ -125,7 +173,24 @@ Ext.define('saas.view.core.baseform.GridPanel', {
                 openTab(form._formXtype, '修改'+form._title, form._formXtype+config.initId, config);
             }else if(classList.indexOf('fa-trash-o')>-1){
                 //删除
-                debugger
+                var id = record.get('id');
+                if(id){
+                    form.BaseUtil.request({
+                        url: form._deleteUrl+id,
+                        method: 'POST',
+                    })
+                    .then(function(res) {
+                        var localJson = new Ext.decode(res.responseText);
+                        if(localJson.success){
+                            //解析参数
+                            Ext.Msg.alert('提示','删除成功');
+                            view.ownerCt.store.load();
+                        }
+                    })
+                    .catch(function() {
+                        Ext.Msg.alert('提示','删除失败');
+                    });
+                }
             }
         }
     },
@@ -163,5 +228,24 @@ Ext.define('saas.view.core.baseform.GridPanel', {
             }]);
         }
         return columns;
-    }
+    },
+
+    getGridSelected:function(){
+        var me = this,
+            items = me.selModel.getSelection(),
+            data = new Array() ;
+            Ext.each(items, function(item, index){
+                if(!Ext.isEmpty(item.data[me.idField])&&!Ext.isEmpty(item.data[me.codeField])){
+                    var o = new Object();
+                    if(me.idField){
+                        o['id'] = item.data[me.idField];
+                    }
+                    if(me.codeField){
+                        o['code'] = item.data[me.codeField];
+                    }
+                    data.push(o);
+                }
+            });
+		return data;
+    } 
 });

+ 1 - 0
frontend/saas-web/app/view/core/dbfind/DbfindTrigger.js

@@ -77,6 +77,7 @@ Ext.define('saas.view.core.dbfind.DbfindTrigger', {
                     params: {
                         keyword:dbCondition
                     },
+                    method: 'GET',
                     success: function(response, opts) {
                         data = Ext.decode(response.responseText);
                         data = data.data.list;

+ 31 - 20
frontend/saas-web/app/view/core/form/FormPanel.js

@@ -53,7 +53,7 @@ Ext.define('saas.view.core.form.FormPanel', {
                     xtype: 'tbtext',
                     bind: {
                         html: '<span class="x-tb x-no">NO. </span>' +
-                            '<span class="x-tb x-code">{base.codeEditable ? "" : form.' + me._codeField + '}</span>'
+                            '<span class="x-tb x-code">{base.codeEditable ? "" : ' + me._codeField + '}</span>'
                     }
                 }, {
                     xtype: 'textfield',
@@ -63,7 +63,7 @@ Ext.define('saas.view.core.form.FormPanel', {
                     cls: 'x-codeeditor',
                     hidden: true,
                     bind: {
-                        value: '{form.' + me._codeField + '}',
+                        value: '{' + me._codeField + '}',
                         hidden: '{!base.codeEditable}'
                     },
                     listeners: {
@@ -93,7 +93,7 @@ Ext.define('saas.view.core.form.FormPanel', {
                     cls: 'x-audited',
                     hidden: true,
                     bind: {
-                        hidden: '{!(form.' + me._statusCodeField + ' == "AUDITED")}'
+                        hidden: '{!(' + me._statusCodeField + ' == "AUDITED")}'
                     }
                 }, {
                     xtype: 'button',
@@ -146,21 +146,21 @@ Ext.define('saas.view.core.form.FormPanel', {
             statusCodeField = me._statusCodeField,
             viewModel = me.getViewModel();
 
-        viewModel.set('form.' + codeField, '');
-        viewModel.set('form.createTime', new Date());
-        viewModel.set('form.updateTime', new Date());
+        viewModel.set(codeField, '');
+        viewModel.set('createTime', new Date());
+        viewModel.set('updateTime', new Date());
 
         if (statusCodeField) {
             var o = {};
             o['auditBtnText'] = {
-                bind: '{form.' + statusCodeField + '}',
+                bind: '{' + statusCodeField + '}',
                 get: function(value) {
-                    viewModel.set('form.' + statusField, value == 'AUDITED' ? '已审核' : '未审核');
+                    viewModel.set(statusField, value == 'AUDITED' ? '已审核' : '未审核');
                     return value == 'AUDITED' ? '反审核' : '审核'
                 }
             };
             viewModel.setFormulas(o);
-            viewModel.set('form.' + statusCodeField, "UNAUDITED");
+            viewModel.set(statusCodeField, "UNAUDITED");
         } else {
             viewModel.set('auditBtnText', "审核");
         }
@@ -179,11 +179,17 @@ Ext.define('saas.view.core.form.FormPanel', {
         var me = this,
             viewModel = me.getViewModel(),
             allData = viewModel.getData(),
-            formData = allData['form'],
+            bindFields = allData.base.bindFields,
             detailCount = me.detailCount,
-            data = {
-                main: formData,
-            };
+            formData = {};
+
+        Ext.Array.each(bindFields, function(field) {
+            formData[field] = allData[field];
+        });
+
+        var data = {
+            main: formData,
+        };
 
         for (var i = 0; i < detailCount; i++) {
             var detail = allData['detail' + i],
@@ -202,7 +208,7 @@ Ext.define('saas.view.core.form.FormPanel', {
             viewModel = me.getViewModel(),
             viewData = viewModel.getData();
 
-        viewModel.set('form', main);
+        viewModel.setData(main);
 
         for (var i = 0; i < detailCount; i++) {
             var detailData = formData['detail' + i] || [],
@@ -220,7 +226,8 @@ Ext.define('saas.view.core.form.FormPanel', {
      */
     setBindFields: function (items) {
         var me = this,
-            viewModel = me.getViewModel();
+            viewModel = me.getViewModel(),
+            bindFields = ['id', me._codeField, me._statusCodeField, me._statusField];
 
         Ext.Array.each(items, function (item) {
             var xtype = item.xtype,
@@ -238,20 +245,24 @@ Ext.define('saas.view.core.form.FormPanel', {
                 if (bind) {
                     if (!Ext.isString(bind)) {
                         Ext.apply(bind, {
-                            value: '{form.' + name + '}'
+                            value: '{' + name + '}'
                         });
                     } else {
-                        item.bind = '{form.' + name + '}';
+                        item.bind = '{' + name + '}';
                     }
                 } else {
-                    item.bind = '{form.' + name + '}';
+                    item.bind = '{' + name + '}';
                 }
                 // 设置默认值
                 if (defaultValue) {
-                    viewModel.set('form.' + name, defaultValue);
+                    viewModel.set(name, defaultValue);
+                }
+                if(!Ext.Array.contains(bindFields, name)) {
+                    bindFields.push(name);
                 }
             }
-
+            
         });
+        viewModel.set('base.bindFields', bindFields);
     },
 });

+ 7 - 7
frontend/saas-web/app/view/core/form/FormPanelController.js

@@ -29,7 +29,7 @@ Ext.define('saas.view.core.form.FormPanelController', {
         if(id&&id.value!=0){
             me.BaseUtil.request({
                 url: form._deleteUrl+id.value,
-                method: 'GET',
+                method: 'POST',
             })
             .then(function(res) {
                 var localJson = new Ext.decode(res.responseText);
@@ -114,13 +114,13 @@ Ext.define('saas.view.core.form.FormPanelController', {
         .then(function(res) {
             var localJson = new Ext.decode(res.responseText);
             if(localJson.success){
-                Ext.Msg.alert('提示','保存成功');
+                Ext.toast('提示','保存成功');
                 form.initId = localJson.data.id;
                 form.FormUtil.loadData(form);
             }
         })
         .catch(function() {
-            Ext.Msg.alert('提示','保存失败');
+            Ext.toast('提示','保存失败');
         });
     },
 
@@ -132,11 +132,11 @@ Ext.define('saas.view.core.form.FormPanelController', {
         modelData = viewModel.getData();
         
         if(form.getForm().wasDirty==false){
-            Ext.Msg.alert('提示','未修改数据,请修改后保存');
+            Ext.toast('提示','未修改数据,请修改后保存');
             return false;
         }
         if(form.getForm().wasValid==false){
-            Ext.Msg.alert('提示','表单校验有误,请检查');
+            Ext.toast('提示','表单校验有误,请检查');
             return false;
         }
         //form里面数据
@@ -184,14 +184,14 @@ Ext.define('saas.view.core.form.FormPanelController', {
         .then(function(res) {
             var localJson = new Ext.decode(res.responseText);
             if(localJson.success){
-                Ext.Msg.alert('提示','审核成功');
+                Ext.toast('提示','审核成功');
                 form.initId = localJson.data.id;
                 form.FormUtil.loadData(form);
                 viewModel.set('base.editable', false);
             }
         })
         .catch(function() {
-            Ext.Msg.alert('提示','审核失败');
+            Ext.toast('提示','审核失败');
         });
     },
     unAudit: function() {

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