作者 陈志颖

fix:共创申请校验

@@ -14,11 +14,11 @@ type ApplyForCooperationCommand struct { @@ -14,11 +14,11 @@ type ApplyForCooperationCommand struct {
14 // 共创申请描述 14 // 共创申请描述
15 CooperationApplicationDescription string `cname:"共创申请描述" json:"cooperationApplicationDescription,omitempty"` 15 CooperationApplicationDescription string `cname:"共创申请描述" json:"cooperationApplicationDescription,omitempty"`
16 // 申请人ID 16 // 申请人ID
17 - UserId int64 `cname:"申请人ID" json:"userId" valid:"Required"` 17 + UserId int64 `cname:"申请人ID" json:"userId"`
18 // 用户基本id 18 // 用户基本id
19 - UserBaseId int64 `cname:"用户基本数据ID" json:"userBaseId" valid:"Required"` 19 + UserBaseId int64 `cname:"用户基本数据ID" json:"userBaseId"`
20 // 组织机构ID 20 // 组织机构ID
21 - OrgId int64 `cname:"组织机构ID" json:"orgId" valid:"Required"` 21 + OrgId int64 `cname:"组织机构ID" json:"orgId"`
22 // 公司ID,通过集成REST上下文获取 22 // 公司ID,通过集成REST上下文获取
23 CompanyId int64 `cname:"公司ID" json:"companyId"` 23 CompanyId int64 `cname:"公司ID" json:"companyId"`
24 // 共创项目ID 24 // 共创项目ID
@@ -10,6 +10,7 @@ import ( @@ -10,6 +10,7 @@ import (
10 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/application/factory" 10 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/application/factory"
11 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/domain" 11 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/domain"
12 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/domain/service" 12 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/domain/service"
  13 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/infrastructure/dao"
13 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/infrastructure/utils" 14 "gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/infrastructure/utils"
14 "strconv" 15 "strconv"
15 "time" 16 "time"
@@ -53,14 +54,6 @@ func (cooperationApplicationService *CooperationApplicationService) ApplyForCoop @@ -53,14 +54,6 @@ func (cooperationApplicationService *CooperationApplicationService) ApplyForCoop
53 userService = value 54 userService = value
54 } 55 }
55 56
56 - // 获取申请人  
57 - var applicant *domain.User  
58 - if data, err := userService.UserFrom(applyForCooperationCommand.CompanyId, applyForCooperationCommand.OrgId, applyForCooperationCommand.UserId); err != nil {  
59 - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取申请人失败")  
60 - } else {  
61 - applicant = data  
62 - }  
63 -  
64 // 公司REST服务初始化 57 // 公司REST服务初始化
65 var companyService service.CompanyService 58 var companyService service.CompanyService
66 if value, err := factory.CreateCompanyService(map[string]interface{}{}); err != nil { 59 if value, err := factory.CreateCompanyService(map[string]interface{}{}); err != nil {
@@ -69,14 +62,6 @@ func (cooperationApplicationService *CooperationApplicationService) ApplyForCoop @@ -69,14 +62,6 @@ func (cooperationApplicationService *CooperationApplicationService) ApplyForCoop
69 companyService = value 62 companyService = value
70 } 63 }
71 64
72 - // 获取公司信息  
73 - var company *domain.Company  
74 - if data, err := companyService.CompanyFrom(applyForCooperationCommand.CompanyId); err != nil {  
75 - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取公司信息失败")  
76 - } else {  
77 - company = data  
78 - }  
79 -  
80 // 组织机构REST服务初始化 65 // 组织机构REST服务初始化
81 var organizationService service.OrgService 66 var organizationService service.OrgService
82 if value, err := factory.CreateOrganizationService(map[string]interface{}{}); err != nil { 67 if value, err := factory.CreateOrganizationService(map[string]interface{}{}); err != nil {
@@ -85,12 +70,24 @@ func (cooperationApplicationService *CooperationApplicationService) ApplyForCoop @@ -85,12 +70,24 @@ func (cooperationApplicationService *CooperationApplicationService) ApplyForCoop
85 organizationService = value 70 organizationService = value
86 } 71 }
87 72
88 - // 获取组织机构信息  
89 - var organization *domain.Org  
90 - if data, err := organizationService.OrgFrom(applyForCooperationCommand.CompanyId, applyForCooperationCommand.OrgId); err != nil {  
91 - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取组织机构数据失败") 73 + // 共创申请仓储初始化
  74 + var cooperationApplicationRepository domain.CooperationApplicationRepository
  75 + if value, err := factory.CreateCooperationApplicationRepository(map[string]interface{}{
  76 + "transactionContext": transactionContext,
  77 + }); err != nil {
  78 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
92 } else { 79 } else {
93 - organization = data 80 + cooperationApplicationRepository = value
  81 + }
  82 +
  83 + // 共创申请DAO初始化
  84 + var cooperationApplicationDao *dao.CooperationApplicationDao
  85 + if value, err := factory.CreateCooperationApplicationDao(map[string]interface{}{
  86 + "transactionContext": transactionContext,
  87 + }); err != nil {
  88 + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
  89 + } else {
  90 + cooperationApplicationDao = value
94 } 91 }
95 92
96 // 获取共创项目 93 // 获取共创项目
@@ -102,36 +99,95 @@ func (cooperationApplicationService *CooperationApplicationService) ApplyForCoop @@ -102,36 +99,95 @@ func (cooperationApplicationService *CooperationApplicationService) ApplyForCoop
102 return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", strconv.FormatInt(applyForCooperationCommand.CooperationProjectId, 10))) 99 return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", strconv.FormatInt(applyForCooperationCommand.CooperationProjectId, 10)))
103 } 100 }
104 101
105 - // TODO 校验:同一个用户,不能多次申请同一个项目 102 + var newCooperationApplication *domain.CooperationApplication
  103 +
  104 + if applyForCooperationCommand.CompanyId == 0 && applyForCooperationCommand.OrgId == 0 && applyForCooperationCommand.UserId == 0 { // 游客操作
  105 + // TODO 获取申请人信息
  106 +
  107 + // TODO 校验:同一个用户,不能多次申请同一个项目
  108 +
  109 + // TODO 校验:判断用户类型是否属于承接对象
  110 + //if !utils.IsContain(cooperationProject.CooperationProjectUndertakerTypes, applicant.UserType) {
  111 + // return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "抱歉,您不属于当前项目的承接对象")
  112 + //}
  113 +
  114 + newCooperationApplication = &domain.CooperationApplication{
  115 + CooperationApplicationApplicant: nil, // TODO 获取游客(申请人)信息
  116 + CooperationApplicationAttachment: applyForCooperationCommand.CooperationApplicationAttachment,
  117 + CooperationApplicationDescription: applyForCooperationCommand.CooperationApplicationDescription,
  118 + CooperationApplicationStatus: 1,
  119 + CooperationApplicationVerifier: nil,
  120 + CooperationApplicationVerifyDescription: "",
  121 + CooperationApplicationVerifyTime: time.Time{},
  122 + CooperationApplyTime: time.Now(),
  123 + CooperationProject: cooperationProject,
  124 + Org: cooperationProject.Org,
  125 + IsCanceled: 1,
  126 + Company: cooperationProject.Company,
  127 + CreatedAt: time.Now(),
  128 + DeletedAt: time.Time{},
  129 + UpdatedAt: time.Time{},
  130 + }
  131 + } else {
  132 + // 获取申请人
  133 + var applicant *domain.User
  134 + if data, err := userService.UserFrom(applyForCooperationCommand.CompanyId, applyForCooperationCommand.OrgId, applyForCooperationCommand.UserId); err != nil {
  135 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取申请人失败")
  136 + } else {
  137 + applicant = data
  138 + }
106 139
107 - // TODO 校验:判断用户类型是否属于承接对象 140 + // 获取公司信息
  141 + var company *domain.Company
  142 + if data, err := companyService.CompanyFrom(applyForCooperationCommand.CompanyId); err != nil {
  143 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取公司信息失败")
  144 + } else {
  145 + company = data
  146 + }
108 147
109 - newCooperationApplication := &domain.CooperationApplication{  
110 - CooperationApplicationApplicant: applicant,  
111 - CooperationApplicationAttachment: applyForCooperationCommand.CooperationApplicationAttachment,  
112 - CooperationApplicationDescription: applyForCooperationCommand.CooperationApplicationDescription,  
113 - CooperationApplicationStatus: 1,  
114 - CooperationApplicationVerifier: nil,  
115 - CooperationApplicationVerifyDescription: "",  
116 - CooperationApplicationVerifyTime: time.Time{},  
117 - CooperationApplyTime: time.Now(),  
118 - CooperationProject: cooperationProject,  
119 - Org: organization,  
120 - IsCanceled: 1,  
121 - Company: company,  
122 - CreatedAt: time.Now(),  
123 - DeletedAt: time.Time{},  
124 - UpdatedAt: time.Time{},  
125 - } 148 + // 获取组织机构信息
  149 + var organization *domain.Org
  150 + if data, err := organizationService.OrgFrom(applyForCooperationCommand.CompanyId, applyForCooperationCommand.OrgId); err != nil {
  151 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取组织机构数据失败")
  152 + } else {
  153 + organization = data
  154 + }
126 155
127 - var cooperationApplicationRepository domain.CooperationApplicationRepository  
128 - if value, err := factory.CreateCooperationApplicationRepository(map[string]interface{}{  
129 - "transactionContext": transactionContext,  
130 - }); err != nil {  
131 - return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())  
132 - } else {  
133 - cooperationApplicationRepository = value 156 + // 校验:同一个用户,不能多次申请同一个项目
  157 + applicationExist, _ := cooperationApplicationDao.CheckApplicationExist(map[string]interface{}{
  158 + "companyId": applyForCooperationCommand.CompanyId,
  159 + "orgId": applyForCooperationCommand.OrgId,
  160 + "cooperationApplicationId": cooperationProject.CooperationProjectId,
  161 + })
  162 + if applicationExist {
  163 + return nil, application.ThrowError(application.TRANSACTION_ERROR, "抱歉,您已经申请过该项目")
  164 + }
  165 +
  166 + // 校验:判断用户类型是否属于承接对象
  167 + if !utils.IsContain(cooperationProject.CooperationProjectUndertakerTypes, applicant.UserType) {
  168 + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "抱歉,您不属于当前项目的承接对象")
  169 + }
  170 +
  171 + newCooperationApplication = &domain.CooperationApplication{
  172 + CooperationApplicationApplicant: applicant,
  173 + CooperationApplicationAttachment: applyForCooperationCommand.CooperationApplicationAttachment,
  174 + CooperationApplicationDescription: applyForCooperationCommand.CooperationApplicationDescription,
  175 + CooperationApplicationStatus: 1,
  176 + CooperationApplicationVerifier: nil,
  177 + CooperationApplicationVerifyDescription: "",
  178 + CooperationApplicationVerifyTime: time.Time{},
  179 + CooperationApplyTime: time.Now(),
  180 + CooperationProject: cooperationProject,
  181 + Org: organization,
  182 + IsCanceled: 1,
  183 + Company: company,
  184 + CreatedAt: time.Now(),
  185 + DeletedAt: time.Time{},
  186 + UpdatedAt: time.Time{},
  187 + }
134 } 188 }
  189 +
  190 + // 保存共创申请
135 if cooperationApplication, err := cooperationApplicationRepository.Save(newCooperationApplication); err != nil { 191 if cooperationApplication, err := cooperationApplicationRepository.Save(newCooperationApplication); err != nil {
136 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) 192 return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
137 } else { 193 } else {
@@ -60,3 +60,11 @@ func CreateDividendsEstimateDao(options map[string]interface{}) (*dao.DividendsE @@ -60,3 +60,11 @@ func CreateDividendsEstimateDao(options map[string]interface{}) (*dao.DividendsE
60 } 60 }
61 return dao.NewDividendsEstimateDao(transactionContext) 61 return dao.NewDividendsEstimateDao(transactionContext)
62 } 62 }
  63 +
  64 +func CreateCooperationApplicationDao(options map[string]interface{}) (*dao.CooperationApplicationDao, error) {
  65 + var transactionContext *pg.TransactionContext
  66 + if value, ok := options["transactionContext"]; ok {
  67 + transactionContext = value.(*pg.TransactionContext)
  68 + }
  69 + return dao.NewCooperationApplicationDao(transactionContext)
  70 +}
  1 +package dao
  2 +
  3 +import (
  4 + "fmt"
  5 + pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  6 + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/infrastructure/pg/models"
  7 +)
  8 +
  9 +type CooperationApplicationDao struct {
  10 + transactionContext *pgTransaction.TransactionContext
  11 +}
  12 +
  13 +// CheckApplicationExist 判断该申请人是否提交过申请
  14 +func (dao *CooperationApplicationDao) CheckApplicationExist(queryOptions map[string]interface{}) (bool, error) {
  15 + tx := dao.transactionContext.PgTx
  16 + var cooperationApplicationModels []*models.CooperationApplication
  17 + query := tx.Model(&cooperationApplicationModels)
  18 + if cooperationApplicationId, ok := queryOptions["cooperationApplicationId"]; ok && cooperationApplicationId != "" {
  19 + query = query.Where("cooperation_application_id = ?", cooperationApplicationId)
  20 + }
  21 + if companyId, ok := queryOptions["companyId"]; ok && companyId.(int64) != 0 {
  22 + query = query.Where(`cooperation_application.company @> '{"companyId":"?"}'`, companyId)
  23 + }
  24 + if orgId, ok := queryOptions["orgId"]; ok && orgId.(int64) != 0 {
  25 + query = query.Where(`cooperation_application.org @> '{"orgId":"?"}'`, orgId)
  26 + }
  27 + if applicantId, ok := queryOptions["applicantId"]; ok && applicantId.(int64) != 0 {
  28 + query = query.Where(`cooperation_application.cooperation_application_applicant @>'{"userId":"?"}'`, applicantId)
  29 + }
  30 + if applicantBaseId, ok := queryOptions["applicantBaseId"]; ok && applicantBaseId.(int64) != 0 {
  31 + query = query.Where(`cooperation_application.cooperation_application_applicant @>'{"userBaseId":"?"}'`, applicantBaseId)
  32 + }
  33 + ok, err := query.Exists()
  34 + return ok, err
  35 +}
  36 +
  37 +func NewCooperationApplicationDao(transactionContext *pgTransaction.TransactionContext) (*CooperationApplicationDao, error) {
  38 + if transactionContext == nil {
  39 + return nil, fmt.Errorf("transactionContext参数不能为nil")
  40 + } else {
  41 + return &CooperationApplicationDao{
  42 + transactionContext: transactionContext,
  43 + }, nil
  44 + }
  45 +}
@@ -125,3 +125,13 @@ func RemoveDuplication(arr []string) []string { @@ -125,3 +125,13 @@ func RemoveDuplication(arr []string) []string {
125 } 125 }
126 return arr[:j] 126 return arr[:j]
127 } 127 }
  128 +
  129 +// IsContain 判断int32数组是否包含
  130 +func IsContain(items []int32, item int32) bool {
  131 + for _, eachItem := range items {
  132 + if eachItem == item {
  133 + return true
  134 + }
  135 + }
  136 + return false
  137 +}