作者 yangfu

合伙人项目初始化

正在显示 53 个修改的文件 包含 2294 行增加0 行删除
  1 +# Binaries for programs and plugins
  2 +*.exe
  3 +*.dll
  4 +*.so
  5 +*.dylib
  6 +*.vscode
  7 +
  8 +# Test binary, build with `go test -c`
  9 +*.test
  10 +
  11 +# Output of the go coverage tool, specifically when used with LiteIDE
  12 +*.out
  13 +
  14 +*.log
  15 +*debug
  16 +*wasm
  17 +
  18 +*.idea
  19 +
  20 +*.tmp
  21 +
  22 +*.sum
  23 +
  24 +opp
  25 +/vendor
  26 +/*.exe~
  1 +FROM golang:latest
  2 +ENV APP_DIR $GOPATH/src/partner
  3 +RUN mkdir -p $APP_DIR
  4 +WORKDIR $APP_DIR/
  5 +COPY ./pkg pkg
  6 +COPY ./conf conf
  7 +COPY ./go.mod go.mod
  8 +COPY ./main.go main.go
  9 +RUN ["ln","-sf","/usr/share/zoneinfo/Asia/Shanghai","/etc/localtime"]
  10 +ENV GO111MODULE on
  11 +ENV GOPROXY https://goproxy.cn
  12 +RUN ["go","mod","tidy"]
  13 +RUN ["go","build"]
  14 +ENTRYPOINT ["./partner"]
  1 +#价值系统
  1 +appname = partner
  2 +runmode = "${RUN_MODE||dev}"
  3 +httpport = "${HTTP_PORT||8080}"
  4 +
  5 +#开启监控
  6 +EnableAdmin = false
  7 +#开启JSON请求
  8 +copyrequestbody = true
  9 +#防止跨站请求伪造 未启用
  10 +enablexsrf = false
  11 +xsrfkey = asdfioerjlasdfmFADFOEJF2323SDFF
  12 +xsrfexpire = 3600
  13 +[lang]
  14 +types = en-US|zh-CN
  15 +names = English|简体中文
  1 +#!/bin/bash
  2 +export PATH=/root/local/bin:$PATH
  3 +kubectl -n mmm-suplus-dev get pods | grep -q partner
  4 +if [ "$?" == "1" ];then
  5 + kubectl create -f /tmp/dev/partner/partner.yaml --record
  6 + kubectl -n mmm-suplus-dev get svc | grep -q partner
  7 + if [ "$?" == "0" ];then
  8 + echo "partner service install success!"
  9 + else
  10 + echo "partner service install fail!"
  11 + fi
  12 + kubectl -n mmm-suplus-dev get pods | grep -q partner
  13 + if [ "$?" == "0" ];then
  14 + echo "partner deployment install success!"
  15 + else
  16 + echo "partner deployment install fail!"
  17 + fi
  18 +else
  19 + kubectl delete -f /tmp/dev/partner/partner.yaml
  20 + kubectl -n mmm-suplus-dev get svc | grep -q partner
  21 + while [ "$?" == "0" ]
  22 + do
  23 + kubectl -n mmm-suplus-dev get svc | grep -q partner
  24 + done
  25 + kubectl -n mmm-suplus-dev get pods | grep -q partner
  26 + while [ "$?" == "0" ]
  27 + do
  28 + kubectl -n mmm-suplus-dev get pods | grep -q partner
  29 + done
  30 + kubectl create -f /tmp/dev/partner/partner.yaml --record
  31 + kubectl -n mmm-suplus-dev get svc | grep -q partner
  32 + if [ "$?" == "0" ];then
  33 + echo "partner service update success!"
  34 + else
  35 + echo "partner service update fail!"
  36 + fi
  37 + kubectl -n mmm-suplus-dev get pods | grep -q partner
  38 + if [ "$?" == "0" ];then
  39 + echo "partner deployment update success!"
  40 + else
  41 + echo "partner deployment update fail!"
  42 + fi
  43 +fi
  1 +apiVersion: v1
  2 +kind: Service
  3 +metadata:
  4 + name: partner
  5 + namespace: mmm-suplus-dev
  6 + labels:
  7 + k8s-app: partner
  8 +spec:
  9 + ports:
  10 + - name: "http"
  11 + port: 80
  12 + targetPort: 8082
  13 + selector:
  14 + k8s-app: partner
  15 +---
  16 +apiVersion: extensions/v1beta1
  17 +kind: Deployment
  18 +metadata:
  19 + name: partner
  20 + namespace: mmm-suplus-dev
  21 + labels:
  22 + k8s-app: partner
  23 +spec:
  24 + replicas: 1
  25 + template:
  26 + metadata:
  27 + labels:
  28 + k8s-app: partner
  29 + spec:
  30 + affinity:
  31 + nodeAffinity:
  32 + preferredDuringSchedulingIgnoredDuringExecution:
  33 + - preference: {}
  34 + weight: 100
  35 + requiredDuringSchedulingIgnoredDuringExecution:
  36 + nodeSelectorTerms:
  37 + - matchExpressions:
  38 + - key: kubernetes.io/hostname
  39 + operator: In
  40 + values:
  41 + - cn-hangzhou.i-bp1djh1xn7taumbue1ze
  42 + - cn-hangzhou.i-bp1djh1xn7taumbue1zd
  43 + - cn-hangzhou.i-bp1euf5u1ph9kbhtndhb
  44 + - cn-hangzhou.i-bp1hyp5oips9cdwxxgxy
  45 + containers:
  46 + - name: partner
  47 + image: 192.168.0.243:5000/mmm/partner:dev
  48 + imagePullPolicy: Always
  49 + ports:
  50 + - containerPort: 8082
  51 + volumeMounts:
  52 + - mountPath: /opt/logs
  53 + name: accesslogs
  54 + env:
  55 + - name: POSTGRESQL_DB_NAME
  56 + value: "partner_dev"
  57 + - name: POSTGRESQL_USER
  58 + value: "postgres"
  59 + - name: POSTGRESQL_PASSWORD
  60 + value: "postgres_15432"
  61 + - name: POSTGRESQL_HOST
  62 + value: "101.37.68.23"
  63 + - name: POSTGRESQL_PORT
  64 + value: "15432"
  65 + - name: LOG_LEVEL
  66 + value: "debug"
  67 + - name: ERROR_BASE_CODE
  68 + value: "1"
  69 + - name: ERROR_BASE_CODE_MULTIPLE
  70 + value: "1000"
  71 + - name: ABILITY_SERVICE_HOST
  72 + value: "https://suplus-worth-app-gateway-dev.fjmaimaimai.com"
  73 + - name: MMM_OPEN_API_SERVICE_HOST
  74 + value: "http://mmm-open-api-dev.fjmaimaimai.com"
  75 + volumes:
  76 + - name: accesslogs
  77 + emptyDir: {}
  1 +#!/bin/bash
  2 +export PATH=/root/local/bin:$PATH
  3 +kubectl -n mmm-suplus-prd get pods | grep -q partner
  4 +if [ "$?" == "1" ];then
  5 + kubectl create -f /tmp/prd/partner/partner.yaml --record
  6 + kubectl -n mmm-suplus-prd get svc | grep -q partner
  7 + if [ "$?" == "0" ];then
  8 + echo "partner service install success!"
  9 + else
  10 + echo "partner service install fail!"
  11 + fi
  12 + kubectl -n mmm-suplus-prd get pods | grep -q partner
  13 + if [ "$?" == "0" ];then
  14 + echo "partner deployment install success!"
  15 + else
  16 + echo "partner deployment install fail!"
  17 + fi
  18 +else
  19 + kubectl delete -f /tmp/prd/partner/partner.yaml
  20 + kubectl -n mmm-suplus-prd get svc | grep -q partner
  21 + while [ "$?" == "0" ]
  22 + do
  23 + kubectl -n mmm-suplus-prd get svc | grep -q partner
  24 + done
  25 + kubectl -n mmm-suplus-prd get pods | grep -q partner
  26 + while [ "$?" == "0" ]
  27 + do
  28 + kubectl -n mmm-suplus-prd get pods | grep -q partner
  29 + done
  30 + kubectl create -f /tmp/prd/partner/partner.yaml --record
  31 + kubectl -n mmm-suplus-prd get svc | grep -q partner
  32 + if [ "$?" == "0" ];then
  33 + echo "partner service update success!"
  34 + else
  35 + echo "partner service update fail!"
  36 + fi
  37 + kubectl -n mmm-suplus-prd get pods | grep -q partner
  38 + if [ "$?" == "0" ];then
  39 + echo "partner deployment update success!"
  40 + else
  41 + echo "partner deployment update fail!"
  42 + fi
  43 +fi
  1 +apiVersion: v1
  2 +kind: Service
  3 +metadata:
  4 + name: partner
  5 + namespace: mmm-suplus-prd
  6 + labels:
  7 + k8s-app: partner
  8 +spec:
  9 + ports:
  10 + - name: "http"
  11 + port: 80
  12 + targetPort: 8082
  13 + selector:
  14 + k8s-app: partner
  15 +---
  16 +apiVersion: extensions/v1beta1
  17 +kind: Deployment
  18 +metadata:
  19 + name: partner
  20 + namespace: mmm-suplus-prd
  21 + labels:
  22 + k8s-app: partner
  23 +spec:
  24 + replicas: 1
  25 + template:
  26 + metadata:
  27 + labels:
  28 + k8s-app: partner
  29 + spec:
  30 + affinity:
  31 + nodeAffinity:
  32 + preferredDuringSchedulingIgnoredDuringExecution:
  33 + - preference: {}
  34 + weight: 100
  35 + requiredDuringSchedulingIgnoredDuringExecution:
  36 + nodeSelectorTerms:
  37 + - matchExpressions:
  38 + - key: kubernetes.io/hostname
  39 + operator: In
  40 + values:
  41 + - cn-hangzhou.i-bp1djh1xn7taumbue1ze
  42 + - cn-hangzhou.i-bp1djh1xn7taumbue1zd
  43 + - cn-hangzhou.i-bp1euf5u1ph9kbhtndhb
  44 + - cn-hangzhou.i-bp1hyp5oips9cdwxxgxy
  45 + containers:
  46 + - name: partner
  47 + image: 192.168.0.243:5000/mmm/partner:master
  48 + imagePullPolicy: Always
  49 + ports:
  50 + - containerPort: 8082
  51 + volumeMounts:
  52 + - mountPath: /opt/logs
  53 + name: accesslogs
  54 + env:
  55 + - name: POSTGRESQL_DB_NAME
  56 + value: "partner"
  57 + - name: POSTGRESQL_USER
  58 + value: "postgres"
  59 + - name: POSTGRESQL_PASSWORD
  60 + value: "postgres_55_online"
  61 + - name: POSTGRESQL_HOST
  62 + value: "112.124.115.55"
  63 + - name: POSTGRESQL_PORT
  64 + value: "15432"
  65 + - name: LOG_LEVEL
  66 + value: "debug"
  67 + - name: ERROR_BASE_CODE
  68 + value: "1"
  69 + - name: ERROR_BASE_CODE_MULTIPLE
  70 + value: "1000"
  71 + - name: ABILITY_SERVICE_HOST
  72 + value: "https://ability.fjmaimaimai.com"
  73 + - name: MMM_OPEN_API_SERVICE_HOST
  74 + value: "https://public-interface.fjmaimaimai.com/openapi"
  75 + volumes:
  76 + - name: accesslogs
  77 + emptyDir: {}
  1 +#!/bin/bash
  2 +export PATH=/root/local/bin:$PATH
  3 +kubectl -n mmm-suplus-test get pods | grep -q partner
  4 +if [ "$?" == "1" ];then
  5 + kubectl create -f /tmp/test/partner/partner.yaml --record
  6 + kubectl -n mmm-suplus-test get svc | grep -q partner
  7 + if [ "$?" == "0" ];then
  8 + echo "partner service install success!"
  9 + else
  10 + echo "partner service install fail!"
  11 + fi
  12 + kubectl -n mmm-suplus-test get pods | grep -q partner
  13 + if [ "$?" == "0" ];then
  14 + echo "partner deployment install success!"
  15 + else
  16 + echo "partner deployment install fail!"
  17 + fi
  18 +else
  19 + kubectl delete -f /tmp/test/partner/partner.yaml
  20 + kubectl -n mmm-suplus-test get svc | grep -q partner
  21 + while [ "$?" == "0" ]
  22 + do
  23 + kubectl -n mmm-suplus-test get svc | grep -q partner
  24 + done
  25 + kubectl -n mmm-suplus-test get pods | grep -q partner
  26 + while [ "$?" == "0" ]
  27 + do
  28 + kubectl -n mmm-suplus-test get pods | grep -q partner
  29 + done
  30 + kubectl create -f /tmp/test/partner/partner.yaml --record
  31 + kubectl -n mmm-suplus-test get svc | grep -q partner
  32 + if [ "$?" == "0" ];then
  33 + echo "partner service update success!"
  34 + else
  35 + echo "partner service update fail!"
  36 + fi
  37 + kubectl -n mmm-suplus-test get pods | grep -q partner
  38 + if [ "$?" == "0" ];then
  39 + echo "partner deployment update success!"
  40 + else
  41 + echo "partner deployment update fail!"
  42 + fi
  43 +fi
  1 +apiVersion: v1
  2 +kind: Service
  3 +metadata:
  4 + name: partner
  5 + namespace: mmm-suplus-test
  6 + labels:
  7 + k8s-app: partner
  8 +spec:
  9 + ports:
  10 + - name: "http"
  11 + port: 80
  12 + targetPort: 8082
  13 + selector:
  14 + k8s-app: partner
  15 +---
  16 +apiVersion: extensions/v1beta1
  17 +kind: Deployment
  18 +metadata:
  19 + name: partner
  20 + namespace: mmm-suplus-test
  21 + labels:
  22 + k8s-app: partner
  23 +spec:
  24 + replicas: 1
  25 + template:
  26 + metadata:
  27 + labels:
  28 + k8s-app: partner
  29 + spec:
  30 + affinity:
  31 + nodeAffinity:
  32 + preferredDuringSchedulingIgnoredDuringExecution:
  33 + - preference: {}
  34 + weight: 100
  35 + requiredDuringSchedulingIgnoredDuringExecution:
  36 + nodeSelectorTerms:
  37 + - matchExpressions:
  38 + - key: kubernetes.io/hostname
  39 + operator: In
  40 + values:
  41 + - cn-hangzhou.i-bp1djh1xn7taumbue1ze
  42 + - cn-hangzhou.i-bp1djh1xn7taumbue1zd
  43 + - cn-hangzhou.i-bp1euf5u1ph9kbhtndhb
  44 + - cn-hangzhou.i-bp1hyp5oips9cdwxxgxy
  45 + containers:
  46 + - name: partner
  47 + image: 192.168.0.243:5000/mmm/partner:test
  48 + imagePullPolicy: Always
  49 + ports:
  50 + - containerPort: 8082
  51 + volumeMounts:
  52 + - mountPath: /opt/logs
  53 + name: accesslogs
  54 + env:
  55 + - name: POSTGRESQL_DB_NAME
  56 + value: "partner_test"
  57 + - name: POSTGRESQL_USER
  58 + value: "postgres"
  59 + - name: POSTGRESQL_PASSWORD
  60 + value: "postgres_15432"
  61 + - name: POSTGRESQL_HOST
  62 + value: "101.37.68.23"
  63 + - name: POSTGRESQL_PORT
  64 + value: "15432"
  65 + - name: LOG_LEVEL
  66 + value: "debug"
  67 + - name: ERROR_BASE_CODE
  68 + value: "1"
  69 + - name: ERROR_BASE_CODE_MULTIPLE
  70 + value: "1000"
  71 + - name: ABILITY_SERVICE_HOST
  72 + value: "https://suplus-worth-app-gateway-test.fjmaimaimai.com"
  73 + - name: MMM_OPEN_API_SERVICE_HOST
  74 + value: "http://mmm-open-api-test.fjmaimaimai.com"
  75 + volumes:
  76 + - name: accesslogs
  77 + emptyDir: {}
  1 +module gitlab.fjmaimaimai.com/mmm-go/partner
  2 +
  3 +go 1.13
  4 +
  5 +require (
  6 + github.com/ajg/form v1.5.1 // indirect
  7 + github.com/astaxie/beego v1.12.1
  8 + github.com/fatih/structs v1.1.0 // indirect
  9 + github.com/gavv/httpexpect v2.0.0+incompatible
  10 + github.com/go-pg/pg/v10 v10.0.0-beta.2
  11 + github.com/google/go-querystring v1.0.0 // indirect
  12 + github.com/gorilla/websocket v1.4.2 // indirect
  13 + github.com/imkira/go-interpol v1.1.0 // indirect
  14 + github.com/linmadan/egglib-go v0.0.0-20191217144343-ca4539f95bf9
  15 + github.com/moul/http2curl v1.0.0 // indirect
  16 + github.com/onsi/ginkgo v1.10.3
  17 + github.com/onsi/gomega v1.7.1
  18 + github.com/sergi/go-diff v1.1.0 // indirect
  19 + github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect
  20 + github.com/valyala/fasthttp v1.14.0 // indirect
  21 + github.com/xeipuuv/gojsonschema v1.2.0 // indirect
  22 + github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect
  23 + github.com/yudai/gojsondiff v1.0.0 // indirect
  24 + github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect
  25 +)
  1 +package main
  2 +
  3 +import (
  4 + "github.com/astaxie/beego"
  5 + _ "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg"
  6 + _ "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/port/beego"
  7 +)
  8 +
  9 +func main() {
  10 + beego.Run()
  11 +}
  1 +package factory
  2 +
  3 +//func CreateTaskDao(options map[string]interface{}) (*dao.TaskDao, error) {
  4 +// var transactionContext *pg.TransactionContext
  5 +// if value, ok := options["transactionContext"]; ok {
  6 +// transactionContext = value.(*pg.TransactionContext)
  7 +// }
  8 +// return dao.NewTaskDao(transactionContext)
  9 +//}
  1 +package factory
  2 +
  3 +import (
  4 +//pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  5 +//"gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/domain/service"
  6 +//domainService "gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/infrastructure/domain_service"
  7 +)
  8 +
  9 +//func CreateReadSentNotificationService(options map[string]interface{}) (service.ReadSentNotificationService, error) {
  10 +// var transactionContext *pgTransaction.TransactionContext
  11 +// if value, ok := options["transactionContext"]; ok {
  12 +// transactionContext = value.(*pgTransaction.TransactionContext)
  13 +// }
  14 +// return domainService.NewReadSentNotificationService(transactionContext)
  15 +//}
  1 +package factory
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain"
  5 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg/transaction"
  6 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/repository"
  7 +)
  8 +
  9 +//CreatePartnerInfoRepository 合伙人信息
  10 +func CreatePartnerInfoRepository(options map[string]interface{}) (domain.PartnerInfoRepository, error) {
  11 + var transactionContext *transaction.TransactionContext
  12 + if value, ok := options["transactionContext"]; ok {
  13 + transactionContext = value.(*transaction.TransactionContext)
  14 + }
  15 + return repository.NewPartnerInfoRepository(transactionContext)
  16 +}
  1 +package factory
  2 +
  3 +//import serviceGateway "gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/infrastructure/service_gateway"
  4 +//
  5 +//func CreateAbilityServiceGateway(options map[string]interface{}) (serviceGateway.AbilityServiceGateway, error) {
  6 +// return serviceGateway.NewHttplibAbilityServiceGateway(), nil
  7 +//}
  1 +package factory
  2 +
  3 +import (
  4 + "github.com/linmadan/egglib-go/core/application"
  5 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg"
  6 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg/transaction"
  7 +)
  8 +
  9 +func CreateTransactionContext(options map[string]interface{}) (application.TransactionContext, error) {
  10 + return &transaction.TransactionContext{
  11 + PgDd: pg.DB,
  12 + }, nil
  13 +}
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain"
  6 +
  7 + "github.com/astaxie/beego/validation"
  8 +)
  9 +
  10 +type CreatePartnerInfoCommand struct {
  11 + domain.PartnerInfo
  12 +}
  13 +
  14 +func (c *CreatePartnerInfoCommand) ValidateCommand() error {
  15 + valid := validation.Validation{}
  16 + b, err := valid.Valid(c)
  17 + if err != nil {
  18 + return err
  19 + }
  20 + if !b {
  21 + for _, validErr := range valid.Errors {
  22 + return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
  23 + }
  24 + }
  25 + return nil
  26 +}
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 +
  6 + "github.com/astaxie/beego/validation"
  7 +)
  8 +
  9 +type RemovePartnerInfoCommand struct {
  10 + // 合伙人ID
  11 + Id int `json:"id" valid:"Required"`
  12 +}
  13 +
  14 +func (c *RemovePartnerInfoCommand) ValidateCommand() error {
  15 + valid := validation.Validation{}
  16 + b, err := valid.Valid(c)
  17 + if err != nil {
  18 + return err
  19 + }
  20 + if !b {
  21 + for _, validErr := range valid.Errors {
  22 + return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
  23 + }
  24 + }
  25 + return nil
  26 +}
  1 +package command
  2 +
  3 +import (
  4 + "fmt"
  5 + "github.com/astaxie/beego/validation"
  6 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain"
  7 +)
  8 +
  9 +type UpdatePartnerInfoCommand struct {
  10 + // 合伙人Id
  11 + Id int `json:"id,omitempty"`
  12 +
  13 + // 合伙人姓名
  14 + PartnerName string `json:"partnerName,omitempty"`
  15 + // 登录账号
  16 + Account string `json:"account,omitempty"`
  17 + // 登录密码
  18 + Password string `json:"password,omitempty"`
  19 + // 状态(1:启用或者0:禁用)
  20 + Status int `json:"status"`
  21 + // 合伙类别 (1.研发合伙人 2.业务合伙人 3.事业)
  22 + PartnerCategory int `json:"partnerCategory,omitempty"`
  23 +
  24 + //关联业务员
  25 + Salesman []*domain.Salesman `json:"salesman,omitempty"`
  26 +}
  27 +
  28 +func (c *UpdatePartnerInfoCommand) ValidateCommand() error {
  29 + valid := validation.Validation{}
  30 + b, err := valid.Valid(c)
  31 + if err != nil {
  32 + return err
  33 + }
  34 + if !b {
  35 + for _, validErr := range valid.Errors {
  36 + return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
  37 + }
  38 + }
  39 + return nil
  40 +}
  1 +package query
  2 +
  3 +import (
  4 + "fmt"
  5 +
  6 + "github.com/astaxie/beego/validation"
  7 +)
  8 +
  9 +type GetPartnerInfoQuery struct {
  10 + // 合伙人ID
  11 + Id int `json:"id" valid:"Required"`
  12 +}
  13 +
  14 +func (q *GetPartnerInfoQuery) ValidateQuery() error {
  15 + valid := validation.Validation{}
  16 + b, err := valid.Valid(q)
  17 + if err != nil {
  18 + return err
  19 + }
  20 + if !b {
  21 + for _, validErr := range valid.Errors {
  22 + return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
  23 + }
  24 + }
  25 + return nil
  26 +}
  1 +package query
  2 +
  3 +import (
  4 + "fmt"
  5 +
  6 + "github.com/astaxie/beego/validation"
  7 +)
  8 +
  9 +type ListPartnerInfoQuery struct {
  10 + //状态
  11 + Status int `json:"status,omitempty"`
  12 + // 合伙人类别
  13 + PartnerCategory int `json:"partnerCategory,omitempty"`
  14 + //按创建任务时间排序(ASC,DESC)
  15 + SortByCreateTime string `json:"sortByCreateTime,omitempty"`
  16 + //按创建任务时间排序(ASC,DESC)
  17 + SortByUpdateTime string `json:"sortByUpdateTime,omitempty"`
  18 + // 查询偏离量
  19 + Offset int `json:"offset,omitempty"`
  20 + // 查询限制
  21 + Limit int `json:"limit,omitempty"`
  22 +}
  23 +
  24 +func (q *ListPartnerInfoQuery) ValidateQuery() error {
  25 + valid := validation.Validation{}
  26 + b, err := valid.Valid(q)
  27 + if err != nil {
  28 + return err
  29 + }
  30 + if !b {
  31 + for _, validErr := range valid.Errors {
  32 + return fmt.Errorf("%s %s", validErr.Key, validErr.Message)
  33 + }
  34 + }
  35 + return nil
  36 +}
  1 +package service
  2 +
  3 +import (
  4 + "fmt"
  5 + "github.com/linmadan/egglib-go/core/application"
  6 + "github.com/linmadan/egglib-go/utils/tool_funs"
  7 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/factory"
  8 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/partnerInfo/command"
  9 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/partnerInfo/query"
  10 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain"
  11 + "time"
  12 +)
  13 +
  14 +// 客户价值服务
  15 +type PartnerInfoService struct {
  16 +}
  17 +
  18 +// 创建客户价值
  19 +func (PartnerInfoService *PartnerInfoService) CreatePartnerInfo(command *command.CreatePartnerInfoCommand) (data interface{}, err error) {
  20 + var (
  21 + count int64
  22 + transactionContext, _ = factory.CreateTransactionContext(nil)
  23 + )
  24 + if err = command.ValidateCommand(); err != nil {
  25 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  26 + }
  27 + if err = transactionContext.StartTransaction(); err != nil {
  28 + return nil, err
  29 + }
  30 + defer func() {
  31 + if err != nil {
  32 + transactionContext.RollbackTransaction()
  33 + }
  34 + }()
  35 +
  36 + newPartnerInfo := &command.PartnerInfo
  37 + newPartnerInfo.CreateAt = time.Now()
  38 + newPartnerInfo.UpdateAt = time.Now()
  39 +
  40 + var PartnerInfoRepository domain.PartnerInfoRepository
  41 + if PartnerInfoRepository, err = factory.CreatePartnerInfoRepository(map[string]interface{}{"transactionContext": transactionContext}); err != nil {
  42 + return nil, err
  43 + }
  44 + if count, _, err = PartnerInfoRepository.Find(map[string]interface{}{"account": command.Account}); err != nil {
  45 + return nil, err
  46 + }
  47 + if count > 0 {
  48 + return nil, fmt.Errorf("标签不可重复名称")
  49 + }
  50 +
  51 + if data, err = PartnerInfoRepository.Save(newPartnerInfo); err != nil {
  52 + return
  53 + }
  54 + err = transactionContext.CommitTransaction()
  55 + return
  56 +}
  57 +
  58 +// 返回客户价值
  59 +func (PartnerInfoService *PartnerInfoService) GetPartnerInfo(command *query.GetPartnerInfoQuery) (data interface{}, err error) {
  60 + var (
  61 + transactionContext, _ = factory.CreateTransactionContext(nil)
  62 + )
  63 + if err = command.ValidateQuery(); err != nil {
  64 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  65 + }
  66 + if err := transactionContext.StartTransaction(); err != nil {
  67 + return nil, err
  68 + }
  69 + defer func() {
  70 + if err != nil {
  71 + transactionContext.RollbackTransaction()
  72 + }
  73 + }()
  74 + var PartnerInfoRepository domain.PartnerInfoRepository
  75 + if PartnerInfoRepository, err = factory.CreatePartnerInfoRepository(map[string]interface{}{"transactionContext": transactionContext}); err != nil {
  76 + return nil, err
  77 + }
  78 + data, err = PartnerInfoRepository.FindOne(map[string]interface{}{"Id": command.Id})
  79 + if err != nil {
  80 + return nil, err
  81 + }
  82 + if data == nil {
  83 + return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(command.Id)))
  84 + }
  85 + err = transactionContext.CommitTransaction()
  86 + return
  87 +}
  88 +
  89 +// 更新客户价值
  90 +func (PartnerInfoService *PartnerInfoService) UpdatePartnerInfo(updatePartnerInfoCommand *command.UpdatePartnerInfoCommand) (data interface{}, err error) {
  91 + var (
  92 + transactionContext, _ = factory.CreateTransactionContext(nil)
  93 + PartnerInfo *domain.PartnerInfo
  94 + )
  95 + if err = updatePartnerInfoCommand.ValidateCommand(); err != nil {
  96 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  97 + }
  98 + if err := transactionContext.StartTransaction(); err != nil {
  99 + return nil, err
  100 + }
  101 + defer func() {
  102 + if err != nil {
  103 + transactionContext.RollbackTransaction()
  104 + }
  105 + }()
  106 + var PartnerInfoRepository domain.PartnerInfoRepository
  107 + if PartnerInfoRepository, err = factory.CreatePartnerInfoRepository(map[string]interface{}{"transactionContext": transactionContext}); err != nil {
  108 + return nil, err
  109 + }
  110 + PartnerInfo, err = PartnerInfoRepository.FindOne(map[string]interface{}{"Id": updatePartnerInfoCommand.Id})
  111 + if err != nil {
  112 + return nil, err
  113 + }
  114 + if PartnerInfo == nil {
  115 + return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(updatePartnerInfoCommand.Id)))
  116 + }
  117 + //if count, PartnerInfos, err := PartnerInfoRepository.Find(map[string]interface{}{
  118 + // "PartnerInfoName": updatePartnerInfoCommand.PartnerInfoName,
  119 + // "companyId": PartnerInfo.CompanyId,
  120 + //}); err != nil {
  121 + // return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  122 + //} else {
  123 + // if count > 0 && PartnerInfos[0].PartnerInfoId != PartnerInfo.PartnerInfoId {
  124 + // return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "标签不可重复名称")
  125 + // }
  126 + //}
  127 + if err := PartnerInfo.Update(tool_funs.SimpleStructToMap(updatePartnerInfoCommand)); err != nil {
  128 + return nil, err
  129 + }
  130 +
  131 + if data, err = PartnerInfoRepository.Save(PartnerInfo); err != nil {
  132 + return nil, err
  133 + }
  134 + err = transactionContext.CommitTransaction()
  135 + return
  136 +}
  137 +
  138 +// 移除客户价值
  139 +func (PartnerInfoService *PartnerInfoService) RemovePartnerInfo(removePartnerInfoCommand *command.RemovePartnerInfoCommand) (data interface{}, err error) {
  140 + var (
  141 + transactionContext, _ = factory.CreateTransactionContext(nil)
  142 + PartnerInfo *domain.PartnerInfo
  143 + )
  144 + if err = removePartnerInfoCommand.ValidateCommand(); err != nil {
  145 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  146 + }
  147 + if err = transactionContext.StartTransaction(); err != nil {
  148 + return nil, err
  149 + }
  150 + defer func() {
  151 + if err != nil {
  152 + transactionContext.RollbackTransaction()
  153 + }
  154 + }()
  155 + var PartnerInfoRepository domain.PartnerInfoRepository
  156 + if PartnerInfoRepository, err = factory.CreatePartnerInfoRepository(map[string]interface{}{"transactionContext": transactionContext}); err != nil {
  157 + return nil, err
  158 + }
  159 + PartnerInfo, err = PartnerInfoRepository.FindOne(map[string]interface{}{"Id": removePartnerInfoCommand.Id})
  160 + if err != nil {
  161 + return nil, err
  162 + }
  163 + if PartnerInfo == nil {
  164 + return nil, application.ThrowError(application.RES_NO_FIND_ERROR, fmt.Sprintf("%s", string(removePartnerInfoCommand.Id)))
  165 + }
  166 + if data, err = PartnerInfoRepository.Remove(PartnerInfo); err != nil {
  167 + return nil, err
  168 + }
  169 + err = transactionContext.CommitTransaction()
  170 + return
  171 +}
  172 +
  173 +// 返回客户价值列表
  174 +func (PartnerInfoService *PartnerInfoService) ListPartnerInfo(listPartnerInfoQuery *query.ListPartnerInfoQuery) (data interface{}, err error) {
  175 + var (
  176 + transactionContext, _ = factory.CreateTransactionContext(nil)
  177 + PartnerInfos []*domain.PartnerInfo
  178 + count int64
  179 + )
  180 + if err = listPartnerInfoQuery.ValidateQuery(); err != nil {
  181 + return nil, application.ThrowError(application.ARG_ERROR, err.Error())
  182 + }
  183 + if err := transactionContext.StartTransaction(); err != nil {
  184 + return nil, err
  185 + }
  186 + defer func() {
  187 + if err != nil {
  188 + transactionContext.RollbackTransaction()
  189 + }
  190 + }()
  191 + var PartnerInfoRepository domain.PartnerInfoRepository
  192 + if PartnerInfoRepository, err = factory.CreatePartnerInfoRepository(map[string]interface{}{"transactionContext": transactionContext}); err != nil {
  193 + return nil, err
  194 + }
  195 + if count, PartnerInfos, err = PartnerInfoRepository.Find(tool_funs.SimpleStructToMap(listPartnerInfoQuery)); err != nil {
  196 + return nil, err
  197 + }
  198 + if err = transactionContext.CommitTransaction(); err != nil {
  199 + return nil, err
  200 + }
  201 + return map[string]interface{}{
  202 + "count": count,
  203 + "partnerInfos": PartnerInfos,
  204 + }, nil
  205 +}
  206 +
  207 +func NewPartnerInfoService(options map[string]interface{}) *PartnerInfoService {
  208 + newPartnerInfoService := &PartnerInfoService{}
  209 + return newPartnerInfoService
  210 +}
  1 +package constant
  2 +
  3 +import "os"
  4 +
  5 +const SERVICE_NAME = "partner"
  6 +
  7 +var LOG_LEVEL = "debug"
  8 +var LOG_File = "app.log"
  9 +var ABILITY_SERVICE_HOST = "https://suplus-worth-app-gateway-dev.fjmaimaimai.com"
  10 +var MMM_OPEN_API_SERVICE_HOST = "http://mmm-open-api-dev.fjmaimaimai.com"
  11 +
  12 +func init() {
  13 + if os.Getenv("LOG_LEVEL") != "" {
  14 + LOG_LEVEL = os.Getenv("LOG_LEVEL")
  15 + }
  16 + if os.Getenv("ABILITY_SERVICE_HOST") != "" {
  17 + ABILITY_SERVICE_HOST = os.Getenv("ABILITY_SERVICE_HOST")
  18 + }
  19 + if os.Getenv("MMM_OPEN_API_SERVICE_HOST") != "" {
  20 + MMM_OPEN_API_SERVICE_HOST = os.Getenv("MMM_OPEN_API_SERVICE_HOST")
  21 + }
  22 +}
  1 +package constant
  2 +
  3 +import "os"
  4 +
  5 +var POSTGRESQL_DB_NAME = "partner"
  6 +var POSTGRESQL_USER = "postgres"
  7 +var POSTGRESQL_PASSWORD = "pgsql@123"
  8 +var POSTGRESQL_HOST = "127.0.0.1"
  9 +var POSTGRESQL_PORT = "5432"
  10 +var DISABLE_CREATE_TABLE = false
  11 +var DISABLE_SQL_GENERATE_PRINT = false
  12 +
  13 +func init() {
  14 + if os.Getenv("POSTGRESQL_DB_NAME") != "" {
  15 + POSTGRESQL_DB_NAME = os.Getenv("POSTGRESQL_DB_NAME")
  16 + }
  17 + if os.Getenv("POSTGRESQL_USER") != "" {
  18 + POSTGRESQL_USER = os.Getenv("POSTGRESQL_USER")
  19 + }
  20 + if os.Getenv("POSTGRESQL_PASSWORD") != "" {
  21 + POSTGRESQL_PASSWORD = os.Getenv("POSTGRESQL_PASSWORD")
  22 + }
  23 + if os.Getenv("POSTGRESQL_HOST") != "" {
  24 + POSTGRESQL_HOST = os.Getenv("POSTGRESQL_HOST")
  25 + }
  26 + if os.Getenv("POSTGRESQL_PORT") != "" {
  27 + POSTGRESQL_PORT = os.Getenv("POSTGRESQL_PORT")
  28 + }
  29 + if os.Getenv("DISABLE_CREATE_TABLE") != "" {
  30 + DISABLE_CREATE_TABLE = true
  31 + }
  32 + if os.Getenv("DISABLE_SQL_GENERATE_PRINT") != "" {
  33 + DISABLE_SQL_GENERATE_PRINT = true
  34 + }
  35 +}
  1 +package event
  2 +
  3 +//import (
  4 +// coreDomain "github.com/linmadan/egglib-go/core/domain"
  5 +// "gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/domain"
  6 +//)
  7 +//
  8 +//const TASK_ROBED_EVENT = "task-robed-event"
  9 +//
  10 +//type TaskRobed struct {
  11 +// coreDomain.BaseEvent
  12 +// // 任务ID
  13 +// TaskId int64 `json:"taskId"`
  14 +// // 公司ID
  15 +// CompanyId int64 `json:"companyId"`
  16 +// // 任务名称
  17 +// TaskName string `json:"taskName"`
  18 +// // 任务类型Type
  19 +// TaskType int `json:"taskType"`
  20 +// // 任务发起者
  21 +// Sponsor *domain.EmployeeInfo `json:"sponsor"`
  22 +// // 任务状态
  23 +// TaskStatus int `json:"taskStatus"`
  24 +// // 引用资源
  25 +// ReferenceResource *domain.ReferenceResource `json:"referenceResource"`
  26 +// // 抢单任务信息
  27 +// RobInfo *domain.RobInfo `json:"robInfo"`
  28 +//}
  29 +//
  30 +//func (event *TaskRobed) EventType() string {
  31 +// return TASK_ROBED_EVENT
  32 +//}
  1 +package domain
  2 +
  3 +import "time"
  4 +
  5 +type PartnerInfoRepository interface {
  6 + Save(dm *PartnerInfo) (*PartnerInfo, error)
  7 + Remove(dm *PartnerInfo) (*PartnerInfo, error)
  8 + FindOne(queryOptions map[string]interface{}) (*PartnerInfo, error)
  9 + Find(queryOptions map[string]interface{}) (int64, []*PartnerInfo, error)
  10 +}
  11 +
  12 +type PartnerInfo struct {
  13 + // 合伙人ID
  14 + Id int64 `json:"id"`
  15 + // 合伙人姓名
  16 + PartnerName string `json:"partnerName"`
  17 + // 登录账号
  18 + Account string `json:"account"`
  19 + // 登录密码
  20 + Password string `json:"password"`
  21 + // 状态(1:启用或者0:禁用)
  22 + Status int `json:"status"`
  23 + // 合伙类别 (1.研发合伙人 2.业务合伙人 3.事业)
  24 + PartnerCategory int `json:"partnerCategory"`
  25 +
  26 + //创建时间
  27 + CreateAt time.Time `json:"createAt"`
  28 + //更新时间
  29 + UpdateAt time.Time `json:"updateAt"`
  30 +
  31 + //关联业务员
  32 + Salesman []*Salesman `json:"salesman"`
  33 +}
  34 +
  35 +func (m *PartnerInfo) Identify() interface{} {
  36 + if m.Id == 0 {
  37 + return nil
  38 + }
  39 + return m.Id
  40 +}
  41 +
  42 +func (m *PartnerInfo) Update(data map[string]interface{}) error {
  43 + if partnerName, ok := data["partnerName"]; ok && partnerName != "" {
  44 + m.PartnerName = partnerName.(string)
  45 + }
  46 + if account, ok := data["account"]; ok && account != "" {
  47 + m.Account = account.(string)
  48 + }
  49 + if password, ok := data["account"]; ok && password != "" {
  50 + m.Password = password.(string)
  51 + }
  52 + if status, ok := data["status"]; ok && status != 0 {
  53 + m.Status = status.(int)
  54 + }
  55 + if partnerCategory, ok := data["partnerCategory"]; ok && partnerCategory != 0 {
  56 + m.PartnerCategory = partnerCategory.(int)
  57 + }
  58 + if salesman, ok := data["salesman"]; ok {
  59 + m.Salesman = salesman.([]*Salesman)
  60 + }
  61 + m.UpdateAt = time.Now()
  62 + return nil
  63 +}
  1 +package domain
  2 +
  3 +type Salesman struct {
  4 + //Id int64 `json:"id"`
  5 + Name string `json:"name"`
  6 + Telephone string `json:"telephone"`
  7 +}
  1 +package service
  2 +
  3 +//import (
  4 +// coreDomain "github.com/linmadan/egglib-go/core/domain"
  5 +// "gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/domain"
  6 +//)
  7 +//
  8 +//type RobTaskService interface {
  9 +// coreDomain.DomainEventPublisher
  10 +// Rob(taskId int64, receiverUid int64) (*domain.Task, error)
  11 +//}
  1 +package dao
  2 +
  3 +//import (
  4 +// "fmt"
  5 +// "github.com/go-pg/pg/v10"
  6 +// pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  7 +// "gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/domain"
  8 +// "gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/infrastructure/pg/models"
  9 +// "time"
  10 +//)
  11 +//
  12 +//type EmployeeDao struct {
  13 +// transactionContext *pgTransaction.TransactionContext
  14 +//}
  15 +//
  16 +//func (dao *EmployeeDao) BatchRemove(uids []int64) error {
  17 +// tx := dao.transactionContext.PgTx
  18 +// _, err := tx.QueryOne(
  19 +// pg.Scan(),
  20 +// "DELETE FROM employees WHERE uid IN (?)",
  21 +// pg.In(uids))
  22 +// return err
  23 +//}
  24 +//
  25 +//func (dao *EmployeeDao) BatchSetStatus(uids []int64, status int) error {
  26 +// tx := dao.transactionContext.PgTx
  27 +// _, err := tx.QueryOne(
  28 +// pg.Scan(),
  29 +// "UPDATE employees SET status=? WHERE uid IN (?)",
  30 +// status, pg.In(uids))
  31 +// return err
  32 +//}
  33 +//
  34 +//func (dao *EmployeeDao) ChangePrincipal(companyId int64, employeeAccount string) error {
  35 +// tx := dao.transactionContext.PgTx
  36 +// if _, err := tx.Query(
  37 +// pg.Scan(),
  38 +// "UPDATE employees SET is_principal=? WHERE company_id=?",
  39 +// false, companyId); err != nil {
  40 +// return err
  41 +// }
  42 +// if _, err := tx.QueryOne(
  43 +// pg.Scan(),
  44 +// "UPDATE employees SET is_principal=? WHERE company_id=? AND employee_account=?",
  45 +// true, companyId, employeeAccount); err != nil {
  46 +// return err
  47 +// }
  48 +// return nil
  49 +//}
  50 +//
  51 +//func (dao *EmployeeDao) TransferSuMoney(uid int64, suMoney float64) error {
  52 +// tx := dao.transactionContext.PgTx
  53 +// _, err := tx.QueryOne(
  54 +// pg.Scan(),
  55 +// "UPDATE employees SET su_money=su_money+? WHERE uid=?",
  56 +// suMoney, uid)
  57 +// return err
  58 +//}
  59 +//
  60 +//func (dao *EmployeeDao) CalculatePersonUnReadNotification(uid int64) (map[string]int, error) {
  61 +// var unReadSystemNotification int
  62 +// var unReadInteractionNotification int
  63 +// tx := dao.transactionContext.PgTx
  64 +// sentNotificationModel := new(models.SentNotification)
  65 +// if count, err := tx.Model(sentNotificationModel).Relation("Notification").
  66 +// Where(`sent_notification.receiver @> '{"uid":?}'`, uid).
  67 +// Where("notification.notification_type = ?", domain.NOTIFICATION_TYPE_SYSTEM).
  68 +// Where("sent_notification.is_read = ?", false).
  69 +// Count(); err != nil {
  70 +// return nil, err
  71 +// } else {
  72 +// unReadSystemNotification = count
  73 +// }
  74 +// if count, err := tx.Model(sentNotificationModel).Relation("Notification").
  75 +// Where(`sent_notification.receiver @> '{"uid":?}'`, uid).
  76 +// Where("notification.notification_type = ?", domain.NOTIFICATION_TYPE_INTERACTION).
  77 +// Where("sent_notification.is_read = ?", false).
  78 +// Count(); err != nil {
  79 +// return nil, err
  80 +// } else {
  81 +// unReadInteractionNotification = count
  82 +// }
  83 +// return map[string]int{
  84 +// "unReadSystemNotification": unReadSystemNotification,
  85 +// "unReadInteractionNotification": unReadInteractionNotification,
  86 +// }, nil
  87 +//}
  88 +//
  89 +//func (dao *EmployeeDao) CalculatePersonSuMoney(uid int64) (map[string]interface{}, error) {
  90 +// var incomeSuMoney float64
  91 +// var incomeSuMoneyOfYesterday float64
  92 +// tx := dao.transactionContext.PgTx
  93 +// suMoneyTransactionRecordModel := new(models.SuMoneyTransactionRecord)
  94 +// yesterday := time.Now().AddDate(0, 0, -1)
  95 +// if err := tx.Model(suMoneyTransactionRecordModel).
  96 +// ColumnExpr("sum(su_money_transaction_record.su_money) AS income_su_money").
  97 +// Where(`su_money_transaction_record.employee @> '{"uid":?}'`, uid).
  98 +// Where(`su_money_transaction_record.record_type = ?`, 2).
  99 +// Where(`su_money_transaction_record.create_time > ?`, time.Date(yesterday.Year(), yesterday.Month(), yesterday.Day(), 0, 0, 0, 0, yesterday.Location())).
  100 +// Where(`su_money_transaction_record.create_time < ?`, time.Date(yesterday.Year(), yesterday.Month(), yesterday.Day(), 23, 59, 59, 0, yesterday.Location())).
  101 +// Select(&incomeSuMoneyOfYesterday); err != nil {
  102 +// return nil, err
  103 +// }
  104 +// if err := tx.Model(suMoneyTransactionRecordModel).
  105 +// ColumnExpr("sum(su_money_transaction_record.su_money) AS income_su_money").
  106 +// Where(`su_money_transaction_record.employee @> '{"uid":?}'`, uid).
  107 +// Where(`su_money_transaction_record.record_type = ?`, 2).
  108 +// Select(&incomeSuMoney); err != nil {
  109 +// return nil, err
  110 +// }
  111 +// return map[string]interface{}{
  112 +// "incomeSuMoney": incomeSuMoney,
  113 +// "incomeSuMoneyOfYesterday": incomeSuMoneyOfYesterday,
  114 +// }, nil
  115 +//}
  116 +//
  117 +//func (dao *EmployeeDao) CalculateSuMoneyTransactionRecord(uid int64, transactionStartTime time.Time, transactionEndTime time.Time) (map[string]interface{}, error) {
  118 +// var incomeSuMoney float64
  119 +// var expendSuMoney float64
  120 +// tx := dao.transactionContext.PgTx
  121 +// suMoneyTransactionRecordModel := new(models.SuMoneyTransactionRecord)
  122 +// if err := tx.Model(suMoneyTransactionRecordModel).
  123 +// ColumnExpr("sum(su_money_transaction_record.su_money) AS income_su_money").
  124 +// Where(`su_money_transaction_record.employee @> '{"uid":?}'`, uid).
  125 +// Where(`su_money_transaction_record.record_type IN (?)`, pg.In([]int{2, 3})).
  126 +// Where(`su_money_transaction_record.create_time > ?`, transactionStartTime).
  127 +// Where(`su_money_transaction_record.create_time < ?`, transactionEndTime).
  128 +// Select(&incomeSuMoney); err != nil {
  129 +// return nil, err
  130 +// }
  131 +// if err := tx.Model(suMoneyTransactionRecordModel).
  132 +// ColumnExpr("sum(su_money_transaction_record.su_money) AS expend_su_money").
  133 +// Where(`su_money_transaction_record.employee @> '{"uid":?}'`, uid).
  134 +// Where(`su_money_transaction_record.record_type IN (?)`, pg.In([]int{1, 4})).
  135 +// Where(`su_money_transaction_record.create_time > ?`, transactionStartTime).
  136 +// Where(`su_money_transaction_record.create_time < ?`, transactionEndTime).
  137 +// Select(&expendSuMoney); err != nil {
  138 +// return nil, err
  139 +// }
  140 +// return map[string]interface{}{
  141 +// "incomeSuMoney": incomeSuMoney,
  142 +// "expendSuMoney": expendSuMoney,
  143 +// }, nil
  144 +//}
  145 +//
  146 +//func NewEmployeeDao(transactionContext *pgTransaction.TransactionContext) (*EmployeeDao, error) {
  147 +// if transactionContext == nil {
  148 +// return nil, fmt.Errorf("transactionContext参数不能为nil")
  149 +// } else {
  150 +// return &EmployeeDao{
  151 +// transactionContext: transactionContext,
  152 +// }, nil
  153 +// }
  154 +//}
  1 +package domain_service
  2 +
  3 +//import (
  4 +// "fmt"
  5 +// coreDomain "github.com/linmadan/egglib-go/core/domain"
  6 +// pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
  7 +// "gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/domain"
  8 +// "gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/domain/event"
  9 +// "gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/infrastructure/dao"
  10 +// "gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/infrastructure/repository"
  11 +// "time"
  12 +//)
  13 +//
  14 +//type RobTaskService struct {
  15 +// coreDomain.BaseEventPublisher
  16 +// transactionContext *pgTransaction.TransactionContext
  17 +//}
  18 +//
  19 +//func (service *RobTaskService) Rob(taskId int64, receiverUid int64) (*domain.Task, error) {
  20 +// var employeeRepository domain.EmployeeRepository
  21 +// var taskRepository domain.TaskRepository
  22 +// var taskDao *dao.TaskDao
  23 +// if repository, err := repository.NewEmployeeRepository(service.transactionContext); err != nil {
  24 +// return nil, err
  25 +// } else {
  26 +// employeeRepository = repository
  27 +// }
  28 +// if repository, err := repository.NewTaskRepository(service.transactionContext); err != nil {
  29 +// return nil, err
  30 +// } else {
  31 +// taskRepository = repository
  32 +// }
  33 +// if dao, err := dao.NewTaskDao(service.transactionContext); err != nil {
  34 +// return nil, err
  35 +// } else {
  36 +// taskDao = dao
  37 +// }
  38 +// receiver, err := employeeRepository.FindOne(map[string]interface{}{
  39 +// "uid": receiverUid,
  40 +// })
  41 +// if err != nil {
  42 +// return nil, err
  43 +// }
  44 +// if receiver == nil {
  45 +// return nil, fmt.Errorf("无效的领取人")
  46 +// }
  47 +// task, err := taskRepository.FindOne(map[string]interface{}{
  48 +// "taskId": taskId,
  49 +// })
  50 +// if err != nil {
  51 +// return nil, err
  52 +// }
  53 +// if task == nil {
  54 +// return nil, fmt.Errorf("无效的任务")
  55 +// }
  56 +// if receiver.EmployeeInfo.Uid == task.Sponsor.Uid {
  57 +// return nil, fmt.Errorf("无法领取自己发布的任务")
  58 +// }
  59 +// if task.RobInfo != nil && task.RobInfo.Receiver != nil {
  60 +// return nil, fmt.Errorf("任务已经被人领取")
  61 +// }
  62 +// if err := task.Rob(receiver.EmployeeInfo); err != nil {
  63 +// return nil, err
  64 +// }
  65 +// if err := taskDao.AddRobInfo(taskId, receiver.EmployeeInfo); err != nil {
  66 +// return nil, fmt.Errorf("抢单失败,任务可能已经被人领取")
  67 +// }
  68 +// if task, err := taskRepository.Save(task); err != nil {
  69 +// return nil, err
  70 +// } else {
  71 +// taskRobedEvent := new(event.TaskRobed)
  72 +// taskRobedEvent.OccurredOn = time.Now()
  73 +// taskRobedEvent.TaskId = task.TaskId
  74 +// taskRobedEvent.CompanyId = task.CompanyId
  75 +// taskRobedEvent.TaskName = task.TaskName
  76 +// taskRobedEvent.TaskType = task.TaskType
  77 +// taskRobedEvent.Sponsor = task.Sponsor
  78 +// taskRobedEvent.TaskStatus = task.TaskStatus
  79 +// taskRobedEvent.ReferenceResource = task.ReferenceResource
  80 +// taskRobedEvent.RobInfo = task.RobInfo
  81 +// if err := service.Publish(taskRobedEvent); err != nil {
  82 +// return nil, err
  83 +// }
  84 +// return task, nil
  85 +// }
  86 +//}
  87 +//
  88 +//func NewRobTaskService(transactionContext *pgTransaction.TransactionContext) (*RobTaskService, error) {
  89 +// if transactionContext == nil {
  90 +// return nil, fmt.Errorf("transactionContext参数不能为nil")
  91 +// } else {
  92 +// return &RobTaskService{
  93 +// transactionContext: transactionContext,
  94 +// }, nil
  95 +// }
  96 +//}
  1 +package pg
  2 +
  3 +import (
  4 + "context"
  5 + "fmt"
  6 + "github.com/go-pg/pg/v10"
  7 + "github.com/go-pg/pg/v10/orm"
  8 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/constant"
  9 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg/models"
  10 +)
  11 +
  12 +var DB *pg.DB
  13 +
  14 +func init() {
  15 + DB = pg.Connect(&pg.Options{
  16 + User: constant.POSTGRESQL_USER,
  17 + Password: constant.POSTGRESQL_PASSWORD,
  18 + Database: constant.POSTGRESQL_DB_NAME,
  19 + Addr: fmt.Sprintf("%s:%s", constant.POSTGRESQL_HOST, constant.POSTGRESQL_PORT),
  20 + })
  21 + if !constant.DISABLE_SQL_GENERATE_PRINT {
  22 + DB.AddQueryHook(SqlGeneratePrintHook{})
  23 + }
  24 + if !constant.DISABLE_CREATE_TABLE {
  25 + for _, model := range []interface{}{
  26 + //(*models.Employee)(nil),
  27 + (*models.PartnerInfo)(nil),
  28 + } {
  29 + err := DB.CreateTable(model, &orm.CreateTableOptions{
  30 + Temp: false,
  31 + IfNotExists: true,
  32 + FKConstraints: true,
  33 + })
  34 + if err != nil {
  35 + panic(err)
  36 + }
  37 + }
  38 + }
  39 +}
  40 +
  41 +type SqlGeneratePrintHook struct{}
  42 +
  43 +func (hook SqlGeneratePrintHook) BeforeQuery(c context.Context, q *pg.QueryEvent) (context.Context, error) {
  44 + return c, nil
  45 +}
  46 +
  47 +func (hook SqlGeneratePrintHook) AfterQuery(c context.Context, q *pg.QueryEvent) error {
  48 + data, err := q.FormattedQuery()
  49 + fmt.Println(string(data))
  50 + return err
  51 +}
  1 +package models
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain"
  5 + "time"
  6 +)
  7 +
  8 +type PartnerInfo struct {
  9 + tableName struct{} `pg:"partner_infos,alias:partner_info"`
  10 + // 合伙人ID
  11 + Id int64 `pg:",pk"`
  12 + // 合伙人姓名
  13 + PartnerName string
  14 + // 登录账号
  15 + Account string
  16 + // 登录密码
  17 + Password string
  18 + // 状态(1:启用或者0:禁用)
  19 + Status int `pg:",notnull,default:1"`
  20 + // 合伙类别 (1.研发合伙人 2.业务合伙人 3.事业)
  21 + PartnerCategory int `pg:",notnull,default:1"`
  22 +
  23 + //创建时间
  24 + CreateAt time.Time
  25 + //更新时间
  26 + UpdateAt time.Time
  27 +
  28 + //关联业务员
  29 + Salesman []*domain.Salesman
  30 +}
  1 +package transaction
  2 +
  3 +import "github.com/go-pg/pg/v10"
  4 +
  5 +type TransactionContext struct {
  6 + PgDd *pg.DB
  7 + PgTx *pg.Tx
  8 +}
  9 +
  10 +func (transactionContext *TransactionContext) StartTransaction() error {
  11 + tx, err := transactionContext.PgDd.Begin()
  12 + if err != nil {
  13 + return err
  14 + }
  15 + transactionContext.PgTx = tx
  16 + return nil
  17 +}
  18 +
  19 +func (transactionContext *TransactionContext) CommitTransaction() error {
  20 + err := transactionContext.PgTx.Commit()
  21 + return err
  22 +}
  23 +
  24 +func (transactionContext *TransactionContext) RollbackTransaction() error {
  25 + err := transactionContext.PgTx.Rollback()
  26 + return err
  27 +}
  28 +
  29 +func NewPGTransactionContext(pgDd *pg.DB) *TransactionContext {
  30 + return &TransactionContext{
  31 + PgDd: pgDd,
  32 + }
  33 +}
  1 +package repository
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain"
  5 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg/models"
  6 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg/transaction"
  7 +)
  8 +
  9 +type PartnerInfoRepository struct {
  10 + transactionContext *transaction.TransactionContext
  11 +}
  12 +
  13 +func (repository *PartnerInfoRepository) Save(dm *domain.PartnerInfo) (*domain.PartnerInfo, error) {
  14 + var (
  15 + err error
  16 + m = &models.PartnerInfo{}
  17 + tx = repository.transactionContext.PgTx
  18 + )
  19 + if err = GobModelTransform(m, dm); err != nil {
  20 + return nil, err
  21 + }
  22 + if dm.Identify() == nil {
  23 + if dm.Id, err = NewSnowflakeId(); err != nil {
  24 + return dm, err
  25 + }
  26 + m.Id = dm.Id
  27 + if err = tx.Insert(m); err != nil {
  28 + return nil, err
  29 + }
  30 + return dm, nil
  31 + }
  32 + if err = tx.Update(m); err != nil {
  33 + return nil, err
  34 + }
  35 + return dm, nil
  36 +}
  37 +
  38 +func (repository *PartnerInfoRepository) Remove(PartnerInfo *domain.PartnerInfo) (*domain.PartnerInfo, error) {
  39 + var (
  40 + tx = repository.transactionContext.PgTx
  41 + PartnerInfoModel = &models.PartnerInfo{Id: PartnerInfo.Identify().(int64)}
  42 + )
  43 + if _, err := tx.Model(PartnerInfoModel).Where("id = ?", PartnerInfo.Id).Delete(); err != nil {
  44 + return PartnerInfo, err
  45 + }
  46 + return PartnerInfo, nil
  47 +}
  48 +
  49 +func (repository *PartnerInfoRepository) FindOne(queryOptions map[string]interface{}) (*domain.PartnerInfo, error) {
  50 + tx := repository.transactionContext.PgTx
  51 + PartnerInfoModel := new(models.PartnerInfo)
  52 + query := NewQuery(tx.Model(PartnerInfoModel), queryOptions)
  53 + query.SetWhere("partner_info.id = ?", "id")
  54 + if err := query.First(); err != nil {
  55 + return nil, query.HandleError(err, "没有此合伙人")
  56 + }
  57 + if PartnerInfoModel.Id == 0 {
  58 + return nil, nil
  59 + }
  60 + return repository.transformPgModelToDomainModel(PartnerInfoModel)
  61 +}
  62 +
  63 +func (repository *PartnerInfoRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.PartnerInfo, error) {
  64 + tx := repository.transactionContext.PgTx
  65 + var PartnerInfoModels []*models.PartnerInfo
  66 + PartnerInfos := make([]*domain.PartnerInfo, 0)
  67 + query := NewQuery(tx.Model(&PartnerInfoModels), queryOptions)
  68 + query.
  69 + SetWhere("partner_info.account = ?", "account").
  70 + SetWhere(`partner_info.status = ?`, "status").
  71 + SetWhere(`partner_info.partner_category = ?`, "partnerCategory").
  72 + SetLimit().
  73 + SetOrder("partner_info.create_at", "sortByCreateTime").
  74 + SetOrder("partner_info.update_at", "sortByUpdateTime")
  75 + var err error
  76 + if query.AffectRow, err = query.SelectAndCount(); err != nil {
  77 + return 0, PartnerInfos, err
  78 + }
  79 + for _, PartnerInfoModel := range PartnerInfoModels {
  80 + if PartnerInfo, err := repository.transformPgModelToDomainModel(PartnerInfoModel); err != nil {
  81 + return 0, PartnerInfos, err
  82 + } else {
  83 + PartnerInfos = append(PartnerInfos, PartnerInfo)
  84 + }
  85 + }
  86 + return int64(query.AffectRow), PartnerInfos, nil
  87 +}
  88 +
  89 +func (repository *PartnerInfoRepository) transformPgModelToDomainModel(PartnerInfoModel *models.PartnerInfo) (*domain.PartnerInfo, error) {
  90 + m := &domain.PartnerInfo{}
  91 + err := GobModelTransform(m, PartnerInfoModel)
  92 + return m, err
  93 +}
  94 +
  95 +func NewPartnerInfoRepository(transactionContext *transaction.TransactionContext) (*PartnerInfoRepository, error) {
  96 + if transactionContext == nil {
  97 + return nil, ERR_EMPTY_TC
  98 + }
  99 + return &PartnerInfoRepository{transactionContext: transactionContext}, nil
  100 +}
  1 +package repository
  2 +
  3 +import (
  4 + "bytes"
  5 + "encoding/gob"
  6 + "fmt"
  7 + "github.com/go-pg/pg/v10/orm"
  8 + "github.com/linmadan/egglib-go/utils/snowflake"
  9 +)
  10 +
  11 +var (
  12 + ERR_EMPTY_TC = fmt.Errorf("transactionContext参数不能为nil")
  13 +)
  14 +
  15 +type Query struct {
  16 + *orm.Query
  17 + queryOptions map[string]interface{}
  18 + AffectRow int
  19 +}
  20 +
  21 +func NewQuery(query *orm.Query, queryOptions map[string]interface{}) *Query {
  22 + return &Query{
  23 + query,
  24 + queryOptions,
  25 + 0,
  26 + }
  27 +}
  28 +
  29 +func (query *Query) SetWhere(condition, key string) *Query {
  30 + if v, ok := query.queryOptions[key]; ok {
  31 + query.Where(condition, v)
  32 + }
  33 + return query
  34 +}
  35 +
  36 +func (query *Query) SetLimit() *Query {
  37 + if offset, ok := query.queryOptions["offset"]; ok {
  38 + offset := offset.(int)
  39 + if offset > -1 {
  40 + query.Offset(offset)
  41 + }
  42 + } else {
  43 + query.Offset(0)
  44 + }
  45 + if limit, ok := query.queryOptions["limit"]; ok {
  46 + limit := limit.(int)
  47 + if limit > -1 {
  48 + query.Limit(limit)
  49 + } else {
  50 + query.Limit(20)
  51 + }
  52 + }
  53 + return query
  54 +}
  55 +
  56 +func (query *Query) SetOrder(orderColumn string, key string) *Query {
  57 + //query.Order(condition...)
  58 + //return query
  59 + if v, ok := query.queryOptions[key]; ok {
  60 + query.Order(fmt.Sprintf("%v %v", orderColumn, v))
  61 + }
  62 + return query
  63 +}
  64 +
  65 +func (query *Query) HandleError(err error, errMsg string) error {
  66 + if err.Error() == "pg: no rows in result set" {
  67 + return fmt.Errorf(errMsg)
  68 + } else {
  69 + return err
  70 + }
  71 +}
  72 +
  73 +func NewSnowflakeId() (int64, error) {
  74 + IdWorker, err := snowflake.NewIdWorker(2)
  75 + if err != nil {
  76 + return 0, err
  77 + }
  78 + id, err := IdWorker.NextId()
  79 + return id, err
  80 +}
  81 +
  82 +//GobModelTransform 模型转换
  83 +func GobModelTransform(dst interface{}, src interface{}) error {
  84 + var data bytes.Buffer
  85 + enc := gob.NewEncoder(&data)
  86 + if err := enc.Encode(src); err != nil {
  87 + return err
  88 + }
  89 + dec := gob.NewDecoder(&data)
  90 + if err := dec.Decode(dst); err != nil {
  91 + return err
  92 + }
  93 + return nil
  94 +}
  1 +package service_gateway
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/constant"
  5 + "strings"
  6 + "time"
  7 +)
  8 +
  9 +type HttplibAbilityServiceGateway struct {
  10 + httplibBaseServiceGateway
  11 +}
  12 +
  13 +func (serviceGateway *HttplibAbilityServiceGateway) CommitQuestionQuotes(uid int64, taskId int64, serials []int64) (map[string]interface{}, error) {
  14 + url := strings.Join([]string{serviceGateway.baseURL, "task/commitQuestionQuotes"}, "/")
  15 + request := serviceGateway.createRequest(url, "post")
  16 + options := make(map[string]interface{})
  17 + options["uid"] = uid
  18 + options["taskId"] = taskId
  19 + options["serials"] = serials
  20 + request.JSONBody(options)
  21 + response := make(map[string]interface{})
  22 + request.ToJSON(&response)
  23 + data, err := serviceGateway.responseHandle(response)
  24 + return data, err
  25 +}
  26 +
  27 +func (serviceGateway *HttplibAbilityServiceGateway) CommitQuestionSolution(qid int64, uid int64, solveUid int64, content string, scoreSolve float64, imgs []string, partners []map[string]interface{}) (map[string]interface{}, error) {
  28 + url := strings.Join([]string{serviceGateway.baseURL, "task/commitQuestionSolution"}, "/")
  29 + request := serviceGateway.createRequest(url, "post")
  30 + options := make(map[string]interface{})
  31 + options["qid"] = qid
  32 + options["uid"] = uid
  33 + options["solveUid"] = solveUid
  34 + options["content"] = content
  35 + options["scoreSolve"] = scoreSolve
  36 + options["imgs"] = imgs
  37 + options["partners"] = partners
  38 + request.JSONBody(options)
  39 + response := make(map[string]interface{})
  40 + request.ToJSON(&response)
  41 + data, err := serviceGateway.responseHandle(response)
  42 + return data, err
  43 +}
  44 +
  45 +func (serviceGateway *HttplibAbilityServiceGateway) CloseTaskCallback(taskId int64, referenceResourceIds []int64) (map[string]interface{}, error) {
  46 + url := strings.Join([]string{serviceGateway.baseURL, "task/closeTaskCallback"}, "/")
  47 + request := serviceGateway.createRequest(url, "post")
  48 + options := make(map[string]interface{})
  49 + options["taskId"] = taskId
  50 + options["referenceResourceIds"] = referenceResourceIds
  51 + request.JSONBody(options)
  52 + response := make(map[string]interface{})
  53 + request.ToJSON(&response)
  54 + data, err := serviceGateway.responseHandle(response)
  55 + return data, err
  56 +}
  57 +
  58 +func (serviceGateway *HttplibAbilityServiceGateway) ReceiverTaskCallback(uid int64, taskId int64, referenceResourceIds []int64, operatorId int64, operatorTime time.Time) (map[string]interface{}, error) {
  59 + url := strings.Join([]string{serviceGateway.baseURL, "task/receiverTaskCallback"}, "/")
  60 + request := serviceGateway.createRequest(url, "post")
  61 + options := make(map[string]interface{})
  62 + options["uid"] = uid
  63 + options["taskId"] = taskId
  64 + options["referenceResourceIds"] = referenceResourceIds
  65 + options["operator_id"] = operatorId
  66 + options["operator_time"] = operatorTime
  67 + request.JSONBody(options)
  68 + response := make(map[string]interface{})
  69 + request.ToJSON(&response)
  70 + data, err := serviceGateway.responseHandle(response)
  71 + return data, err
  72 +}
  73 +
  74 +func (serviceGateway *HttplibAbilityServiceGateway) SaveTaskCallback(uid int64, taskId int64, serials []int64) (map[string]interface{}, error) {
  75 + url := strings.Join([]string{serviceGateway.baseURL, "task/saveTaskCallback"}, "/")
  76 + request := serviceGateway.createRequest(url, "post")
  77 + options := make(map[string]interface{})
  78 + options["uid"] = uid
  79 + options["taskId"] = taskId
  80 + options["serials"] = serials
  81 + request.JSONBody(options)
  82 + response := make(map[string]interface{})
  83 + request.ToJSON(&response)
  84 + data, err := serviceGateway.responseHandle(response)
  85 + return data, err
  86 +}
  87 +
  88 +func (serviceGateway *HttplibAbilityServiceGateway) DeleteTaskCallback(uid int64, taskId int64, serials []int64) (map[string]interface{}, error) {
  89 + url := strings.Join([]string{serviceGateway.baseURL, "task/deleteTaskCallback"}, "/")
  90 + request := serviceGateway.createRequest(url, "post")
  91 + options := make(map[string]interface{})
  92 + options["uid"] = uid
  93 + options["taskId"] = taskId
  94 + options["serials"] = serials
  95 + request.JSONBody(options)
  96 + response := make(map[string]interface{})
  97 + request.ToJSON(&response)
  98 + data, err := serviceGateway.responseHandle(response)
  99 + return data, err
  100 +}
  101 +
  102 +func NewHttplibAbilityServiceGateway() *HttplibAbilityServiceGateway {
  103 + return &HttplibAbilityServiceGateway{
  104 + httplibBaseServiceGateway: httplibBaseServiceGateway{
  105 + baseURL: constant.ABILITY_SERVICE_HOST,
  106 + connectTimeout: 100 * time.Second,
  107 + readWriteTimeout: 30 * time.Second,
  108 + },
  109 + }
  110 +}
  1 +package service_gateway
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/constant"
  5 + "strings"
  6 + "time"
  7 +)
  8 +
  9 +type HttplibMmmOpenApiServiceGateway struct {
  10 + httplibBaseServiceGateway
  11 +}
  12 +
  13 +func (serviceGateway *HttplibMmmOpenApiServiceGateway) PushInfo(msgType int, uids []int64, title string, content string, ext map[string]interface{}) (map[string]interface{}, error) {
  14 + url := strings.Join([]string{serviceGateway.baseURL, "v1", "push", "pushInfo"}, "/")
  15 + request := serviceGateway.createRequest(url, "post")
  16 + options := make(map[string]interface{})
  17 + options["mmmType"] = msgType
  18 + options["project"] = "worth"
  19 + options["receivers"] = uids
  20 + options["title"] = title
  21 + options["content"] = content
  22 + options["ext"] = ext
  23 + request.JSONBody(options)
  24 + response := make(map[string]interface{})
  25 + request.ToJSON(&response)
  26 + data, err := serviceGateway.responseHandle(response)
  27 + return data, err
  28 +}
  29 +
  30 +func NewHttplibMmmOpenApiServiceGateway() *HttplibMmmOpenApiServiceGateway {
  31 + return &HttplibMmmOpenApiServiceGateway{
  32 + httplibBaseServiceGateway: httplibBaseServiceGateway{
  33 + baseURL: constant.MMM_OPEN_API_SERVICE_HOST,
  34 + connectTimeout: 100 * time.Second,
  35 + readWriteTimeout: 30 * time.Second,
  36 + },
  37 + }
  38 +}
  1 +package service_gateway
  2 +
  3 +import (
  4 + "encoding/json"
  5 + "fmt"
  6 + "github.com/astaxie/beego/httplib"
  7 + "strconv"
  8 + "strings"
  9 + "time"
  10 +)
  11 +
  12 +type httplibBaseServiceGateway struct {
  13 + baseURL string
  14 + connectTimeout time.Duration
  15 + readWriteTimeout time.Duration
  16 +}
  17 +
  18 +func (serviceGateway *httplibBaseServiceGateway) createRequest(url string, method string) *httplib.BeegoHTTPRequest {
  19 + var request *httplib.BeegoHTTPRequest
  20 + switch method {
  21 + case "get":
  22 + request = httplib.Get(url)
  23 + break
  24 + case "post":
  25 + request = httplib.Post(url)
  26 + break
  27 + case "put":
  28 + request = httplib.Put(url)
  29 + break
  30 + case "delete":
  31 + request = httplib.Delete(url)
  32 + break
  33 + case "head":
  34 + request = httplib.Head(url)
  35 + break
  36 + default:
  37 + request = httplib.Get(url)
  38 + }
  39 + return request.SetTimeout(serviceGateway.connectTimeout, serviceGateway.readWriteTimeout)
  40 +}
  41 +
  42 +func (serviceGateway *httplibBaseServiceGateway) responseHandle(response map[string]interface{}) (map[string]interface{}, error) {
  43 + data := make(map[string]interface{})
  44 + var err error
  45 + if code, ok := response["code"]; ok {
  46 + code := code.(float64)
  47 + if code == 0 {
  48 + data = response["data"].(map[string]interface{})
  49 + } else {
  50 + msg := response["msg"].(string)
  51 + err = fmt.Errorf(strings.Join([]string{strconv.FormatFloat(code, 'f', -1, 64), msg}, " "))
  52 + }
  53 + } else {
  54 + jsonBytes, marshalErr := json.Marshal(response)
  55 + if marshalErr != nil {
  56 + err = marshalErr
  57 + }
  58 + err = fmt.Errorf("无法解析的网关服务数据返回格式:%s", string(jsonBytes))
  59 + }
  60 + return data, err
  61 +}
  1 +package service_gateway
  2 +
  3 +import "time"
  4 +
  5 +type AbilityServiceGateway interface {
  6 + CommitQuestionQuotes(uid int64, taskId int64, serials []int64) (map[string]interface{}, error)
  7 + CommitQuestionSolution(qid int64, uid int64, solveUid int64, content string, scoreSolve float64, imgs []string, partners []map[string]interface{}) (map[string]interface{}, error)
  8 + CloseTaskCallback(taskId int64, referenceResourceIds []int64) (map[string]interface{}, error)
  9 + ReceiverTaskCallback(uid int64, taskId int64, referenceResourceIds []int64, operatorId int64, operatorTime time.Time) (map[string]interface{}, error)
  10 + SaveTaskCallback(uid int64, taskId int64, serials []int64) (map[string]interface{}, error)
  11 + DeleteTaskCallback(uid int64, taskId int64, serials []int64) (map[string]interface{}, error)
  12 +}
  13 +
  14 +type MmmOpenApiServiceGateway interface {
  15 + PushInfo(msgType int, uids []int64, title string, content string, ext map[string]interface{}) (map[string]interface{}, error)
  16 +}
  1 +package constant
  2 +
  3 +import (
  4 + "github.com/astaxie/beego/logs"
  5 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/constant"
  6 + "path/filepath"
  7 + "strconv"
  8 +)
  9 +
  10 +var Logger *logs.BeeLogger
  11 +
  12 +func init() {
  13 + Logger = NewBeegoLogger(LoggerConfig{
  14 + Filename: constant.LOG_File,
  15 + Level: constant.LOG_LEVEL,
  16 + })
  17 +}
  18 +
  19 +type LoggerConfig struct {
  20 + Level string `json:"level,omitempty"`
  21 + Filename string `json:"filename,omitempty"`
  22 + MaxSize int `json:"max_size,omitempty"`
  23 + MaxBackups int `json:"max_backups,omitempty"`
  24 + MaxAge int `json:"max_age,omitempty"`
  25 + Compress bool `json:"compress,omitempty"`
  26 +}
  27 +
  28 +func NewBeegoLogger(conf LoggerConfig) *logs.BeeLogger {
  29 + filename := `{"filename":"` + filepath.ToSlash(conf.Filename) + `"}`
  30 +
  31 + log := logs.GetBeeLogger()
  32 +
  33 + log.SetLogger(logs.AdapterFile, filename)
  34 + ilv, err := strconv.Atoi(conf.Level)
  35 + if err != nil {
  36 + ilv = logs.LevelDebug
  37 + }
  38 + log.SetLevel(ilv)
  39 + log.EnableFuncCallDepth(true)
  40 + log.SetLogFuncCallDepth(3)
  41 + return log
  42 +}
  1 +package constant
  2 +
  3 +import (
  4 + "encoding/json"
  5 + "fmt"
  6 + "github.com/astaxie/beego/context"
  7 + "github.com/astaxie/beego/logs"
  8 + "time"
  9 +)
  10 +
  11 +func CreateRequstLogFilter(logger *logs.BeeLogger) func(ctx *context.Context) {
  12 + return func(ctx *context.Context) {
  13 + requestId := fmt.Sprintf("%v.%v.%v", ctx.Input.Method(), ctx.Input.URI(), time.Now().UnixNano())
  14 + ctx.Request.Header.Add("requestId", requestId)
  15 + var body string = "{}"
  16 + if ctx.Input.GetData("requestBody") != nil {
  17 + body = string(ctx.Input.GetData("requestBody").([]byte))
  18 + }
  19 + logger.Debug(fmt.Sprintf("====>Recv RequestId:%s BodyData:%s", requestId, body))
  20 + }
  21 +}
  22 +
  23 +func CreateResponseLogFilter(logger *logs.BeeLogger) func(ctx *context.Context) {
  24 + return func(ctx *context.Context) {
  25 + requestId := ctx.Request.Header.Get("requestId")
  26 + body, _ := json.Marshal(ctx.Input.GetData("outputData"))
  27 + if len(body) > 1000 {
  28 + body = body[:1000]
  29 + }
  30 + logger.Debug(fmt.Sprintf("<====Send RequestId:%v BodyData:%s", requestId, body))
  31 + }
  32 +}
  1 +package beego
  2 +
  3 +import (
  4 + "github.com/astaxie/beego"
  5 + "github.com/linmadan/egglib-go/web/beego/filters"
  6 + . "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/log"
  7 + _ "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/port/beego/routers"
  8 +)
  9 +
  10 +func init() {
  11 + beego.InsertFilter("/*", beego.BeforeExec, filters.CreateRequestBodyFilter())
  12 + beego.InsertFilter("/*", beego.BeforeExec, CreateRequstLogFilter(Logger))
  13 + beego.InsertFilter("/*", beego.AfterExec, CreateResponseLogFilter(Logger), false)
  14 +}
  1 +package controllers
  2 +
  3 +import (
  4 + "encoding/json"
  5 + "github.com/astaxie/beego"
  6 + "github.com/linmadan/egglib-go/core/application"
  7 + "github.com/linmadan/egglib-go/web/beego/utils"
  8 +)
  9 +
  10 +type BaseController struct {
  11 + beego.Controller
  12 +}
  13 +
  14 +func (controller BaseController) JsonUnmarshal(v interface{}) error {
  15 + body := controller.Ctx.Input.GetData("requestBody").([]byte)
  16 + //fmt.Println("【RequestBody】 ",controller.Ctx.Input.Method(),controller.Ctx.Input.URL(),string(body))
  17 + return json.Unmarshal(body, v)
  18 +}
  19 +
  20 +func (controller BaseController) HandlerResponse(data interface{}, err error) {
  21 + var response utils.JsonResponse
  22 + defer func() {
  23 + controller.Data["json"] = response
  24 + controller.ServeJSON()
  25 + }()
  26 + if err == nil {
  27 + response = utils.ResponseData(controller.Ctx, data)
  28 + return
  29 + }
  30 + if _, ok := err.(*application.ServiceError); !ok {
  31 + err = application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
  32 + }
  33 + response = utils.ResponseError(controller.Ctx, err)
  34 +}
  35 +
  36 +func (controller BaseController) GetLimitInfo() (offset int, limit int) {
  37 + offset, _ = controller.GetInt("offset")
  38 + limit, _ = controller.GetInt("limit")
  39 + return
  40 +}
  1 +package controllers
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/partnerInfo/command"
  5 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/partnerInfo/query"
  6 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/partnerInfo/service"
  7 +)
  8 +
  9 +type PartnerInfoController struct {
  10 + BaseController
  11 +}
  12 +
  13 +//CreatePartnerInfo 创建合伙人
  14 +func (controller *PartnerInfoController) CreatePartnerInfo() {
  15 + var (
  16 + service = service.NewPartnerInfoService(nil)
  17 + command = &command.CreatePartnerInfoCommand{}
  18 + )
  19 + controller.JsonUnmarshal(command)
  20 + controller.HandlerResponse(service.CreatePartnerInfo(command))
  21 +}
  22 +
  23 +//UpdatePartnerInfo 更新合伙人
  24 +func (controller *PartnerInfoController) UpdatePartnerInfo() {
  25 + var (
  26 + service = service.NewPartnerInfoService(nil)
  27 + command = &command.UpdatePartnerInfoCommand{}
  28 + )
  29 + controller.JsonUnmarshal(command)
  30 + id, _ := controller.GetInt(":id")
  31 + command.Id = id
  32 + controller.HandlerResponse(service.UpdatePartnerInfo(command))
  33 +}
  34 +
  35 +//GetPartnerInfo 获取合伙人
  36 +func (controller *PartnerInfoController) GetPartnerInfo() {
  37 + var (
  38 + service = service.NewPartnerInfoService(nil)
  39 + command = &query.GetPartnerInfoQuery{}
  40 + )
  41 + uid, _ := controller.GetInt(":id")
  42 + command.Id = uid
  43 + controller.HandlerResponse(service.GetPartnerInfo(command))
  44 +}
  45 +
  46 +//GetPartnerInfo 移除合伙人
  47 +func (controller *PartnerInfoController) RemovePartnerInfo() {
  48 + var (
  49 + service = service.NewPartnerInfoService(nil)
  50 + command = &command.RemovePartnerInfoCommand{}
  51 + )
  52 + uid, _ := controller.GetInt(":id")
  53 + command.Id = uid
  54 + controller.HandlerResponse(service.RemovePartnerInfo(command))
  55 +}
  56 +
  57 +//ListPartnerInfo 合伙人列表
  58 +func (controller *PartnerInfoController) ListPartnerInfo() {
  59 + var (
  60 + service = service.NewPartnerInfoService(nil)
  61 + command = &query.ListPartnerInfoQuery{}
  62 + )
  63 + command.PartnerCategory, _ = controller.GetInt("partnerCategory")
  64 + command.Status, _ = controller.GetInt("status")
  65 + command.SortByCreateTime = controller.GetString("sortByCreateTime")
  66 + command.SortByUpdateTime = controller.GetString("sortByUpdateTime")
  67 + command.Offset, command.Limit = controller.GetLimitInfo()
  68 + controller.HandlerResponse(service.ListPartnerInfo(command))
  69 +}
  1 +package routers
  2 +
  3 +import (
  4 + "github.com/astaxie/beego"
  5 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/port/beego/controllers"
  6 +)
  7 +
  8 +func init() {
  9 + beego.Router("/partnerInfos/", &controllers.PartnerInfoController{}, "Post:CreatePartnerInfo")
  10 + beego.Router("/partnerInfos/:id", &controllers.PartnerInfoController{}, "Put:UpdatePartnerInfo")
  11 + beego.Router("/partnerInfos/:id", &controllers.PartnerInfoController{}, "Get:GetPartnerInfo")
  12 + beego.Router("/partnerInfos/:id", &controllers.PartnerInfoController{}, "Delete:RemovePartnerInfo")
  13 + beego.Router("/partnerInfos/", &controllers.PartnerInfoController{}, "Get:ListPartnerInfo")
  14 +}
  1 +package routers
  2 +
  3 +import (
  4 + "github.com/astaxie/beego"
  5 + "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/constant"
  6 +)
  7 +
  8 +func init() {
  9 + beego.SetStaticPath("/log", constant.LOG_File)
  10 +}
  1 +package partnerInfo
  2 +
  3 +import (
  4 + "github.com/gavv/httpexpect"
  5 + . "github.com/onsi/ginkgo"
  6 + . "github.com/onsi/gomega"
  7 + pG "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg"
  8 + "net/http"
  9 +)
  10 +
  11 +var _ = Describe("创建新合伙人", func() {
  12 + Describe("创建新合伙人", func() {
  13 + Context("创建新合伙人", func() {
  14 + It("返回合伙人数据", func() {
  15 + httpExpect := httpexpect.New(GinkgoT(), server.URL)
  16 + body := map[string]interface{}{
  17 + "partnerName": "employeeName",
  18 + "account": "account123",
  19 + "password": "password",
  20 + "status": 1,
  21 + "partnerCategory": 1,
  22 + //"createAt":time.Now(),
  23 + //"updateAt":time.Now(),
  24 + "salesman": []map[string]interface{}{
  25 + {"name": "name", "telephone": "18860183051"},
  26 + {"name2": "name", "telephone": "18860183052j"},
  27 + },
  28 + }
  29 + httpExpect.POST("/partnerInfos").
  30 + WithJSON(body).
  31 + Expect().
  32 + Status(http.StatusOK).
  33 + JSON().
  34 + Object().
  35 + ContainsKey("code").ValueEqual("code", 0).
  36 + ContainsKey("msg").ValueEqual("msg", "ok").
  37 + ContainsKey("data").Value("data").Object().
  38 + ContainsKey("id").ValueNotEqual("id", BeZero())
  39 + })
  40 + })
  41 + })
  42 + AfterEach(func() {
  43 + _, err := pG.DB.Exec("DELETE FROM partner_infos WHERE true")
  44 + Expect(err).NotTo(HaveOccurred())
  45 + })
  46 +})
  1 +package partnerInfo
  2 +
  3 +import (
  4 + "github.com/gavv/httpexpect"
  5 + . "github.com/onsi/ginkgo"
  6 + . "github.com/onsi/gomega"
  7 + pG "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg"
  8 + "net/http"
  9 +)
  10 +
  11 +var _ = Describe("删除合伙人", func() {
  12 + BeforeEach(func() {
  13 + _, err := pG.DB.Exec(`INSERT INTO "public"."partner_infos"("id", "partner_name", "account", "password", "status", "partner_category", "create_at", "update_at", "salesman") VALUES (2929531956394199040, 'employeeName', 'account', 'password', 1, 1, '2020-06-19 15:23:31.616934+08', '2020-06-19 15:23:31.616934+08', '[{"name": "name", "telephone": "18860183051"}, {"name": "", "telephone": "18860183052j"}]');`)
  14 + Expect(err).NotTo(HaveOccurred())
  15 + })
  16 + Describe("删除合伙人", func() {
  17 + Context("删除合伙人", func() {
  18 + It("删除合伙人数据", func() {
  19 + httpExpect := httpexpect.New(GinkgoT(), server.URL)
  20 + body := map[string]interface{}{}
  21 + httpExpect.DELETE("/partnerInfos/2929531956394199040").
  22 + WithJSON(body).
  23 + Expect().
  24 + Status(http.StatusOK).
  25 + JSON().
  26 + Object().
  27 + ContainsKey("code").ValueEqual("code", 0).
  28 + ContainsKey("msg").ValueEqual("msg", "ok").
  29 + ContainsKey("data").Value("data").Object().
  30 + ContainsKey("id").ValueNotEqual("id", BeZero())
  31 + })
  32 + })
  33 + })
  34 + AfterEach(func() {
  35 + _, err := pG.DB.Exec("DELETE FROM partner_infos WHERE true")
  36 + Expect(err).NotTo(HaveOccurred())
  37 + })
  38 +})
  1 +package partnerInfo
  2 +
  3 +import (
  4 + "github.com/gavv/httpexpect"
  5 + . "github.com/onsi/ginkgo"
  6 + . "github.com/onsi/gomega"
  7 + pG "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg"
  8 + "net/http"
  9 +)
  10 +
  11 +var _ = Describe("获取合伙人", func() {
  12 + BeforeEach(func() {
  13 + _, err := pG.DB.Exec(`INSERT INTO "public"."partner_infos"("id", "partner_name", "account", "password", "status", "partner_category", "create_at", "update_at", "salesman") VALUES (2929531956394199040, 'employeeName', 'account', 'password', 1, 1, '2020-06-19 15:23:31.616934+08', '2020-06-19 15:23:31.616934+08', '[{"name": "name", "telephone": "18860183051"}, {"name": "", "telephone": "18860183052j"}]');`)
  14 + Expect(err).NotTo(HaveOccurred())
  15 + })
  16 + Describe("获取合伙人", func() {
  17 + Context("获取合伙人", func() {
  18 + It("返回合伙人数据", func() {
  19 + httpExpect := httpexpect.New(GinkgoT(), server.URL)
  20 + body := map[string]interface{}{}
  21 + httpExpect.GET("/partnerInfos/2929531956394199040").
  22 + WithJSON(body).
  23 + Expect().
  24 + Status(http.StatusOK).
  25 + JSON().
  26 + Object().
  27 + ContainsKey("code").ValueEqual("code", 0).
  28 + ContainsKey("msg").ValueEqual("msg", "ok").
  29 + ContainsKey("data").Value("data").Object().
  30 + ContainsKey("id").ValueNotEqual("id", BeZero())
  31 + })
  32 + })
  33 + })
  34 + AfterEach(func() {
  35 + _, err := pG.DB.Exec("DELETE FROM partner_infos WHERE true")
  36 + Expect(err).NotTo(HaveOccurred())
  37 + })
  38 +})
  1 +package partnerInfo
  2 +
  3 +import (
  4 + "github.com/gavv/httpexpect"
  5 + . "github.com/onsi/ginkgo"
  6 + . "github.com/onsi/gomega"
  7 + pG "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg"
  8 + "net/http"
  9 +)
  10 +
  11 +var _ = Describe("获取合伙人列表", func() {
  12 + BeforeEach(func() {
  13 + _, err := pG.DB.Exec(`INSERT INTO "public"."partner_infos"("id", "partner_name", "account", "password", "status", "partner_category", "create_at", "update_at", "salesman") VALUES (2929531956394199040, 'employeeName', 'account', 'password', 1, 1, '2020-06-19 15:23:31.616934+08', '2020-06-19 15:23:31.616934+08', '[{"name": "name", "telephone": "18860183051"}, {"name": "", "telephone": "18860183052j"}]');`)
  14 + Expect(err).NotTo(HaveOccurred())
  15 + })
  16 + Describe("获取合伙人列表", func() {
  17 + Context("获取合伙人列表", func() {
  18 + It("获取合伙人列表", func() {
  19 + httpExpect := httpexpect.New(GinkgoT(), server.URL)
  20 + body := map[string]interface{}{}
  21 + httpExpect.GET("/partnerInfos").
  22 + WithQuery("partnerCategory", 1).
  23 + WithQuery("status", 1).
  24 + WithQuery("status", 1).
  25 + WithQuery("sortByCreateTime", "DESC").
  26 + WithQuery("sortByUpdateTime", "DESC").
  27 + WithQuery("offset", 0).
  28 + WithQuery("limit", 20).
  29 + WithJSON(body).
  30 + Expect().
  31 + Status(http.StatusOK).
  32 + JSON().
  33 + Object().
  34 + ContainsKey("code").ValueEqual("code", 0).
  35 + ContainsKey("msg").ValueEqual("msg", "ok").
  36 + ContainsKey("data").Value("data").Object().ContainsKey("partnerInfos")
  37 + })
  38 + })
  39 + })
  40 + AfterEach(func() {
  41 + _, err := pG.DB.Exec("DELETE FROM partner_infos WHERE true")
  42 + Expect(err).NotTo(HaveOccurred())
  43 + })
  44 +})
  1 +package partnerInfo
  2 +
  3 +import (
  4 + "github.com/astaxie/beego"
  5 + . "github.com/onsi/ginkgo"
  6 + . "github.com/onsi/gomega"
  7 + "net/http"
  8 + "net/http/httptest"
  9 + "testing"
  10 +
  11 + _ "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg"
  12 + _ "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/port/beego"
  13 +)
  14 +
  15 +func TestPartnerInfo(t *testing.T) {
  16 + RegisterFailHandler(Fail)
  17 + RunSpecs(t, "Beego Port Employee Correlations Test Case Suite")
  18 +}
  19 +
  20 +var handler http.Handler
  21 +var server *httptest.Server
  22 +
  23 +var _ = BeforeSuite(func() {
  24 + handler = beego.BeeApp.Handlers
  25 + server = httptest.NewServer(handler)
  26 +})
  27 +
  28 +var _ = AfterSuite(func() {
  29 + server.Close()
  30 +})
  1 +package partnerInfo
  2 +
  3 +import (
  4 + "github.com/gavv/httpexpect"
  5 + . "github.com/onsi/ginkgo"
  6 + . "github.com/onsi/gomega"
  7 + pG "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg"
  8 + "net/http"
  9 +)
  10 +
  11 +var _ = Describe("创建新合伙人", func() {
  12 + BeforeEach(func() {
  13 + _, err := pG.DB.Exec(`INSERT INTO "public"."partner_infos"("id", "partner_name", "account", "password", "status", "partner_category", "create_at", "update_at", "salesman") VALUES (2929531956394199040, 'employeeName', 'account', 'password', 1, 1, '2020-06-19 15:23:31.616934+08', '2020-06-19 15:23:31.616934+08', '[{"name": "name", "telephone": "18860183051"}, {"name": "", "telephone": "18860183052j"}]');`)
  14 + Expect(err).NotTo(HaveOccurred())
  15 + })
  16 + Describe("创建新合伙人", func() {
  17 + Context("创建新合伙人", func() {
  18 + It("返回合伙人数据", func() {
  19 + httpExpect := httpexpect.New(GinkgoT(), server.URL)
  20 + body := map[string]interface{}{
  21 + "partnerName": "employeeName",
  22 + "account": "account123",
  23 + "password": "password",
  24 + "status": 1,
  25 + "partnerCategory": 1,
  26 + "salesman": []map[string]interface{}{
  27 + {"name": "name", "telephone": "18860183051"},
  28 + {"name2": "name", "telephone": "18860183052j"},
  29 + },
  30 + }
  31 + httpExpect.PUT("/partnerInfos/2929531956394199040").
  32 + WithJSON(body).
  33 + Expect().
  34 + Status(http.StatusOK).
  35 + JSON().
  36 + Object().
  37 + ContainsKey("code").ValueEqual("code", 0).
  38 + ContainsKey("msg").ValueEqual("msg", "ok").
  39 + ContainsKey("data").Value("data").Object().
  40 + ContainsKey("id").ValueNotEqual("id", BeZero())
  41 + })
  42 + })
  43 + })
  44 + AfterEach(func() {
  45 + _, err := pG.DB.Exec("DELETE FROM partner_infos WHERE true")
  46 + Expect(err).NotTo(HaveOccurred())
  47 + })
  48 +})