作者 郑周

Merge remote-tracking branch 'origin/dev' into dev

@@ -5,4 +5,8 @@ @@ -5,4 +5,8 @@
5 5
6 ### 可设置环境变量 6 ### 可设置环境变量
7 - DataSource 7 - DataSource
8 - 数据库连接,样例 host=数据库IP地址 user=用户名 password=密码 dbname=数据库名 port=31543 sslmode=disable TimeZone=Asia/Shanghai  
  8 + 数据库连接,样例
  9 + ``` code
  10 + host=数据库IP地址 user=用户名 password=密码 dbname=数据库名 port=31543 sslmode=disable TimeZone=Asia/Shanghai
  11 + ```
  12 +
@@ -230,7 +230,7 @@ type ( @@ -230,7 +230,7 @@ type (
230 Size int `json:"size"` 230 Size int `json:"size"`
231 ArticleId int64 `json:"articleId"` // 文章ID 231 ArticleId int64 `json:"articleId"` // 文章ID
232 TopId int64 `json:"topId,optional"` // 文章顶层ID 232 TopId int64 `json:"topId,optional"` // 文章顶层ID
233 - AuthorId int64 `json:"authorId,optional"` // 用户 233 + Author string `json:"author,optional"` // 用户
234 Show int `json:"show,optional"` // 显示状态 234 Show int `json:"show,optional"` // 显示状态
235 BeginTime int64 `json:"beginTime,optional"` // 开始时间 235 BeginTime int64 `json:"beginTime,optional"` // 开始时间
236 EndTime int64 `json:"endTime,optional"` // 结束时间 236 EndTime int64 `json:"endTime,optional"` // 结束时间
@@ -42,6 +42,10 @@ service Core { @@ -42,6 +42,10 @@ service Core {
42 @doc "公司搜索" 42 @doc "公司搜索"
43 @handler systemCompanySearch 43 @handler systemCompanySearch
44 post /system/company/search(CompanySearchRequest) returns (CompanySearchResponse) 44 post /system/company/search(CompanySearchRequest) returns (CompanySearchResponse)
  45 +
  46 + @doc "公司职位搜索"
  47 + @handler systemCompanyPositionsSearch
  48 + post /system/company/positions/search(CompanyPositionsSearchRequest) returns (CompanyPositionsSearchResponse)
45 } 49 }
46 50
47 type ( 51 type (
@@ -63,3 +67,17 @@ type ( @@ -63,3 +67,17 @@ type (
63 Logo string `json:"logo,omitempty"` // 公司LOGO 67 Logo string `json:"logo,omitempty"` // 公司LOGO
64 } 68 }
65 ) 69 )
  70 +
  71 +// 公司职位搜索
  72 +type(
  73 + CompanyPositionsSearchRequest{
  74 +
  75 + }
  76 + CompanyPositionsSearchResponse {
  77 + List []Position `json:"list"`
  78 + Total int64 `json:"total"`
  79 + }
  80 + Position{
  81 + Name string `json:"name"`
  82 + }
  83 +)
@@ -105,6 +105,7 @@ type( @@ -105,6 +105,7 @@ type(
105 MiniUserApplyJoinCompanyRequest{ 105 MiniUserApplyJoinCompanyRequest{
106 Phone string `json:"phone"` 106 Phone string `json:"phone"`
107 Code string `json:"code"` 107 Code string `json:"code"`
  108 + IsFromQr bool `json:"isFromQr,optional"` // true:扫码添加 false:手动查找添加
108 } 109 }
109 MiniUserApplyJoinCompanyResponse{ 110 MiniUserApplyJoinCompanyResponse{
110 111
  1 +package company
  2 +
  3 +import (
  4 + "net/http"
  5 +
  6 + "github.com/zeromicro/go-zero/rest/httpx"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/company"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  10 +)
  11 +
  12 +func SystemCompanyPositionsSearchHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  13 + return func(w http.ResponseWriter, r *http.Request) {
  14 + var req types.CompanyPositionsSearchRequest
  15 + if err := httpx.Parse(r, &req); err != nil {
  16 + httpx.ErrorCtx(r.Context(), w, err)
  17 + return
  18 + }
  19 +
  20 + l := company.NewSystemCompanyPositionsSearchLogic(r.Context(), svcCtx)
  21 + resp, err := l.SystemCompanyPositionsSearch(&req)
  22 + if err != nil {
  23 + httpx.ErrorCtx(r.Context(), w, err)
  24 + } else {
  25 + httpx.OkJsonCtx(r.Context(), w, resp)
  26 + }
  27 + }
  28 +}
@@ -347,6 +347,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -347,6 +347,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
347 Path: "/system/company/search", 347 Path: "/system/company/search",
348 Handler: company.SystemCompanySearchHandler(serverCtx), 348 Handler: company.SystemCompanySearchHandler(serverCtx),
349 }, 349 },
  350 + {
  351 + Method: http.MethodPost,
  352 + Path: "/system/company/positions/search",
  353 + Handler: company.SystemCompanyPositionsSearchHandler(serverCtx),
  354 + },
350 }..., 355 }...,
351 ), 356 ),
352 rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret), 357 rest.WithJwt(serverCtx.Config.SystemAuth.AccessSecret),
@@ -32,7 +32,7 @@ func (l *SystemArticleCommentSearchLogic) SystemArticleCommentSearch(req *types. @@ -32,7 +32,7 @@ func (l *SystemArticleCommentSearchLogic) SystemArticleCommentSearch(req *types.
32 WithOffsetLimit(req.Page, req.Size). 32 WithOffsetLimit(req.Page, req.Size).
33 WithKV("articleId", req.ArticleId). 33 WithKV("articleId", req.ArticleId).
34 WithKV("topId", req.TopId). 34 WithKV("topId", req.TopId).
35 - WithKV("fromUserId", req.AuthorId). 35 + WithKV("fromUserName", req.Author).
36 WithKV("beginCreatedAt", req.BeginTime). 36 WithKV("beginCreatedAt", req.BeginTime).
37 WithKV("endCreatedAt", req.EndTime) 37 WithKV("endCreatedAt", req.EndTime)
38 total, comments, err := l.svcCtx.ArticleCommentRepository.Find(l.ctx, conn, queryOptions) 38 total, comments, err := l.svcCtx.ArticleCommentRepository.Find(l.ctx, conn, queryOptions)
  1 +package company
  2 +
  3 +import (
  4 + "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  8 +
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  11 +
  12 + "github.com/zeromicro/go-zero/core/logx"
  13 +)
  14 +
  15 +type SystemCompanyPositionsSearchLogic struct {
  16 + logx.Logger
  17 + ctx context.Context
  18 + svcCtx *svc.ServiceContext
  19 +}
  20 +
  21 +func NewSystemCompanyPositionsSearchLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SystemCompanyPositionsSearchLogic {
  22 + return &SystemCompanyPositionsSearchLogic{
  23 + Logger: logx.WithContext(ctx),
  24 + ctx: ctx,
  25 + svcCtx: svcCtx,
  26 + }
  27 +}
  28 +
  29 +func (l *SystemCompanyPositionsSearchLogic) SystemCompanyPositionsSearch(req *types.CompanyPositionsSearchRequest) (resp *types.CompanyPositionsSearchResponse, err error) {
  30 + var (
  31 + conn = l.svcCtx.DefaultDBConn()
  32 + userToken = contextdata.GetUserTokenFromCtx(l.ctx)
  33 + users []*domain.User
  34 + total int64
  35 + )
  36 + resp = &types.CompanyPositionsSearchResponse{
  37 + List: make([]types.Position, 0),
  38 + }
  39 + total, users, err = l.svcCtx.UserRepository.FindCompanyPositions(l.ctx, conn, userToken.CompanyId, domain.NewQueryOptions().WithFindOnly())
  40 + if err != nil {
  41 + return nil, xerr.NewErrMsgErr("查找公司部门失败", err)
  42 + }
  43 +
  44 + for _, user := range users {
  45 + resp.List = append(resp.List, types.Position{
  46 + Name: user.Position,
  47 + })
  48 + }
  49 + resp.Total = total
  50 + return
  51 +}
@@ -72,9 +72,13 @@ func (l *MiniUserApplyJoinCompanyLogic) MiniUserApplyJoinCompany(req *types.Mini @@ -72,9 +72,13 @@ func (l *MiniUserApplyJoinCompanyLogic) MiniUserApplyJoinCompany(req *types.Mini
72 Roles: make([]int64, 0), 72 Roles: make([]int64, 0),
73 Follower: make([]int64, 0), 73 Follower: make([]int64, 0),
74 Following: make([]int64, 0), 74 Following: make([]int64, 0),
75 - AccountFrom: domain.AccountFromQr, 75 + AccountFrom: domain.AccountFromSearchJoin,
76 Departments: make([]int64, 0), 76 Departments: make([]int64, 0),
77 } 77 }
  78 + if req.IsFromQr {
  79 + user.AuditStatus = domain.UserAuditStatusPassed
  80 + user.AccountFrom = domain.AccountFromQr
  81 + }
78 user.WithName(name) 82 user.WithName(name)
79 if user, err = l.svcCtx.UserRepository.Insert(ctx, conn, user); err != nil { 83 if user, err = l.svcCtx.UserRepository.Insert(ctx, conn, user); err != nil {
80 return err 84 return err
@@ -36,14 +36,15 @@ func (l *MiniUserAuditListLogic) MiniUserAuditList(req *types.UserSearchRequest) @@ -36,14 +36,15 @@ func (l *MiniUserAuditListLogic) MiniUserAuditList(req *types.UserSearchRequest)
36 ) 36 )
37 queryOptions := domain.NewQueryOptions(). 37 queryOptions := domain.NewQueryOptions().
38 WithOffsetLimit(req.Page, req.Size). 38 WithOffsetLimit(req.Page, req.Size).
39 - MustWithKV("companyId", userToken.CompanyId) 39 + MustWithKV("companyId", userToken.CompanyId).
  40 + MustWithKV("accountFrom", []string{domain.AccountFromSearchJoin})
40 if req.AuditFlag != nil && *req.AuditFlag >= 0 { 41 if req.AuditFlag != nil && *req.AuditFlag >= 0 {
41 queryOptions.MustWithKV("auditStatus", []int{*req.AuditFlag}) 42 queryOptions.MustWithKV("auditStatus", []int{*req.AuditFlag})
42 } 43 }
43 if total, users, err = l.svcCtx.UserRepository.Find(l.ctx, conn, queryOptions); err != nil { 44 if total, users, err = l.svcCtx.UserRepository.Find(l.ctx, conn, queryOptions); err != nil {
44 return nil, xerr.NewErrMsgErr("查询审核列表失败", err) 45 return nil, xerr.NewErrMsgErr("查询审核列表失败", err)
45 } 46 }
46 - resp = &types.UserSearchResponse{Total: total} 47 + resp = &types.UserSearchResponse{Total: total, List: make([]*types.UserItem, 0)}
47 lo.ForEach(users, func(item *domain.User, index int) { 48 lo.ForEach(users, func(item *domain.User, index int) {
48 company, _ := domain.LazyLoad(companyMap, l.ctx, conn, item.CompanyId, l.svcCtx.CompanyRepository.FindOne) 49 company, _ := domain.LazyLoad(companyMap, l.ctx, conn, item.CompanyId, l.svcCtx.CompanyRepository.FindOne)
49 resp.List = append(resp.List, NewUserItemSimple(item, company)) 50 resp.List = append(resp.List, NewUserItemSimple(item, company))
@@ -33,7 +33,7 @@ func (l *MiniUserNewsLogic) MiniUserNews(req *types.MiniUserNewsRequest) (resp * @@ -33,7 +33,7 @@ func (l *MiniUserNewsLogic) MiniUserNews(req *types.MiniUserNewsRequest) (resp *
33 user *domain.User 33 user *domain.User
34 userToken = contextdata.GetUserTokenFromCtx(l.ctx) 34 userToken = contextdata.GetUserTokenFromCtx(l.ctx)
35 articles []*domain.Article 35 articles []*domain.Article
36 - readedArticles = make([]*domain.UserReadArticle, 0) 36 + readArticles = make([]*domain.UserReadArticle, 0)
37 ) 37 )
38 if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, userToken.UserId); err != nil { 38 if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, userToken.UserId); err != nil {
39 return nil, xerr.NewErrMsgErr("用户不存在", err) 39 return nil, xerr.NewErrMsgErr("用户不存在", err)
@@ -55,9 +55,9 @@ func (l *MiniUserNewsLogic) MiniUserNews(req *types.MiniUserNewsRequest) (resp * @@ -55,9 +55,9 @@ func (l *MiniUserNewsLogic) MiniUserNews(req *types.MiniUserNewsRequest) (resp *
55 }) 55 })
56 if len(articleIds) > 0 { 56 if len(articleIds) > 0 {
57 resp.LastArticleId = articleIds[len(articleIds)-1] 57 resp.LastArticleId = articleIds[len(articleIds)-1]
58 - _, readedArticles, _ = l.svcCtx.UserReadArticleRepository.Find(l.ctx, conn, domain.IndexCompanyId(userToken.CompanyId)().WithKV("articleIds", articleIds)) 58 + _, readArticles, _ = l.svcCtx.UserReadArticleRepository.Find(l.ctx, conn, domain.IndexCompanyId(userToken.CompanyId)().WithKV("articleIds", articleIds))
59 } 59 }
60 - readArticlesMap := lo.KeyBy(readedArticles, func(item *domain.UserReadArticle) int64 { 60 + readArticlesMap := lo.KeyBy(readArticles, func(item *domain.UserReadArticle) int64 {
61 return item.ArticleId 61 return item.ArticleId
62 }) 62 })
63 lo.ForEach(articles, func(item *domain.Article, index int) { 63 lo.ForEach(articles, func(item *domain.Article, index int) {
@@ -141,7 +141,7 @@ type SystemArticleCommentSearchRequest struct { @@ -141,7 +141,7 @@ type SystemArticleCommentSearchRequest struct {
141 Size int `json:"size"` 141 Size int `json:"size"`
142 ArticleId int64 `json:"articleId"` // 文章ID 142 ArticleId int64 `json:"articleId"` // 文章ID
143 TopId int64 `json:"topId,optional"` // 文章顶层ID 143 TopId int64 `json:"topId,optional"` // 文章顶层ID
144 - AuthorId int64 `json:"authorId,optional"` // 用户 144 + Author string `json:"author,optional"` // 用户
145 Show int `json:"show,optional"` // 显示状态 145 Show int `json:"show,optional"` // 显示状态
146 BeginTime int64 `json:"beginTime,optional"` // 开始时间 146 BeginTime int64 `json:"beginTime,optional"` // 开始时间
147 EndTime int64 `json:"endTime,optional"` // 结束时间 147 EndTime int64 `json:"endTime,optional"` // 结束时间
@@ -434,6 +434,7 @@ type MiniUserInfoResponse struct { @@ -434,6 +434,7 @@ type MiniUserInfoResponse struct {
434 type MiniUserApplyJoinCompanyRequest struct { 434 type MiniUserApplyJoinCompanyRequest struct {
435 Phone string `json:"phone"` 435 Phone string `json:"phone"`
436 Code string `json:"code"` 436 Code string `json:"code"`
  437 + IsFromQr bool `json:"isFromQr,optional"` // true:扫码添加 false:手动查找添加
437 } 438 }
438 439
439 type MiniUserApplyJoinCompanyResponse struct { 440 type MiniUserApplyJoinCompanyResponse struct {
@@ -726,6 +727,18 @@ type Company struct { @@ -726,6 +727,18 @@ type Company struct {
726 Logo string `json:"logo,omitempty"` // 公司LOGO 727 Logo string `json:"logo,omitempty"` // 公司LOGO
727 } 728 }
728 729
  730 +type CompanyPositionsSearchRequest struct {
  731 +}
  732 +
  733 +type CompanyPositionsSearchResponse struct {
  734 + List []Position `json:"list"`
  735 + Total int64 `json:"total"`
  736 +}
  737 +
  738 +type Position struct {
  739 + Name string `json:"name"`
  740 +}
  741 +
729 type Location struct { 742 type Location struct {
730 Longitude float64 `json:"longitude,optional"` //经度 743 Longitude float64 `json:"longitude,optional"` //经度
731 Latitude float64 `json:"latitude,optional"` //纬度 744 Latitude float64 `json:"latitude,optional"` //纬度
@@ -149,6 +149,9 @@ func (repository *ArticleCommentRepository) Find(ctx context.Context, conn trans @@ -149,6 +149,9 @@ func (repository *ArticleCommentRepository) Find(ctx context.Context, conn trans
149 if v, ok := queryOptions["endCreatedAt"]; ok { 149 if v, ok := queryOptions["endCreatedAt"]; ok {
150 tx = tx.Where("created_at < ?", v) 150 tx = tx.Where("created_at < ?", v)
151 } 151 }
  152 + if v, ok := queryOptions["fromUserName"]; ok && v.(string) != "" {
  153 + tx = tx.Where(`from_user #>> '{"name"}' like ?`, "%"+v.(string)+"%")
  154 + }
152 155
153 if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil { 156 if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
154 return dms, tx.Error 157 return dms, tx.Error
@@ -155,6 +155,9 @@ func (repository *UserRepository) Find(ctx context.Context, conn transaction.Con @@ -155,6 +155,9 @@ func (repository *UserRepository) Find(ctx context.Context, conn transaction.Con
155 if v, ok := queryOptions["auditStatus"]; ok { 155 if v, ok := queryOptions["auditStatus"]; ok {
156 tx.Where("audit_status in (?)", v) 156 tx.Where("audit_status in (?)", v)
157 } 157 }
  158 + if v, ok := queryOptions["accountFrom"]; ok {
  159 + tx.Where("account_from in (?)", v)
  160 + }
158 161
159 // 列表查询条件 162 // 列表查询条件
160 if v, ok := queryOptions["likeName"]; ok { 163 if v, ok := queryOptions["likeName"]; ok {
@@ -236,6 +239,41 @@ func (repository *UserRepository) FindDepartmentUsers(ctx context.Context, conn @@ -236,6 +239,41 @@ func (repository *UserRepository) FindDepartmentUsers(ctx context.Context, conn
236 return total, dms, nil 239 return total, dms, nil
237 } 240 }
238 241
  242 +func (repository *UserRepository) FindCompanyPositions(ctx context.Context, conn transaction.Conn, companyId int64, queryOptions map[string]interface{}) (int64, []*domain.User, error) {
  243 + var (
  244 + tx = conn.DB()
  245 + ms []*models.User
  246 + dms = make([]*domain.User, 0)
  247 + total int64
  248 + )
  249 + queryFunc := func() (interface{}, error) {
  250 + tx = tx.Model(&ms)
  251 + tx.Select("distinct position")
  252 + tx.Where("company_id = ?", companyId)
  253 + tx.Where("position <> ''")
  254 + tx.Where("audit_status in (?)", domain.UserAuditStatusPassed)
  255 + tx.Where("enable = ?", domain.UserEnable)
  256 + tx.Order("position asc")
  257 + if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
  258 + return dms, tx.Error
  259 + }
  260 + return dms, nil
  261 + }
  262 +
  263 + if _, err := repository.Query(queryFunc); err != nil {
  264 + return 0, nil, err
  265 + }
  266 +
  267 + for _, item := range ms {
  268 + if dm, err := repository.ModelToDomainModel(item); err != nil {
  269 + return 0, dms, err
  270 + } else {
  271 + dms = append(dms, dm)
  272 + }
  273 + }
  274 + return total, dms, nil
  275 +}
  276 +
239 func (repository *UserRepository) ModelToDomainModel(from *models.User) (*domain.User, error) { 277 func (repository *UserRepository) ModelToDomainModel(from *models.User) (*domain.User, error) {
240 to := &domain.User{} 278 to := &domain.User{}
241 err := copier.Copy(to, from) 279 err := copier.Copy(to, from)
@@ -40,6 +40,7 @@ type UserRepository interface { @@ -40,6 +40,7 @@ type UserRepository interface {
40 FindOneByCompanyIdAndPhone(ctx context.Context, conn transaction.Conn, companyId int64, phone string, status []int) (*User, error) 40 FindOneByCompanyIdAndPhone(ctx context.Context, conn transaction.Conn, companyId int64, phone string, status []int) (*User, error)
41 Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*User, error) 41 Find(ctx context.Context, conn transaction.Conn, queryOptions map[string]interface{}) (int64, []*User, error)
42 FindDepartmentUsers(ctx context.Context, conn transaction.Conn, companyId int64, queryOptions map[string]interface{}) (int64, []*User, error) 42 FindDepartmentUsers(ctx context.Context, conn transaction.Conn, companyId int64, queryOptions map[string]interface{}) (int64, []*User, error)
  43 + FindCompanyPositions(ctx context.Context, conn transaction.Conn, companyId int64, queryOptions map[string]interface{}) (int64, []*User, error)
43 } 44 }
44 45
45 func (m *User) Identify() interface{} { 46 func (m *User) Identify() interface{} {
@@ -68,6 +69,7 @@ const ( @@ -68,6 +69,7 @@ const (
68 ) 69 )
69 70
70 const ( 71 const (
  72 + AccountFromSearchJoin = "搜索添加"
71 AccountFromQr = "扫码注册" 73 AccountFromQr = "扫码注册"
72 AccountFromMr = "后台新增" 74 AccountFromMr = "后台新增"
73 ) 75 )