作者 yangfu

Merge branch 'test'

正在显示 48 个修改的文件 包含 2088 行增加675 行删除
... ... @@ -9,5 +9,5 @@ require (
github.com/linmadan/egglib-go v0.0.0-20191217144343-ca4539f95bf9
github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect
github.com/shopspring/decimal v1.2.0
github.com/tiptok/gocomm v0.0.0-20190919092013-c230743f8095
github.com/tiptok/gocomm v1.0.0
)
... ...
... ... @@ -5,6 +5,7 @@ import (
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/constant"
_ "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/constant"
_ "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg"
_ "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/redis"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/log"
_ "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/port/appsvr"
)
... ...
... ... @@ -3,10 +3,7 @@ package auth
import (
"fmt"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/factory"
//"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/partnerInfo/query"
//"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/partnerInfo/service"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/svr"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/utils"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/log"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/protocol"
... ... @@ -70,13 +67,18 @@ func Login(header *protocol.RequestHeader, request *protocol.LoginRequest) (rsp
break
}
rsp.AuthCode, _ = utils.GenerateToken(partnerInfo.Id, protocol.AuthCodeExpire*time.Second)
if err = InitOrUpdateUserIMInfo(partnerInfo, transactionContext); err != nil {
log.Error(err)
return
}
err = transactionContext.CommitTransaction()
return
}
func SmsCode(request *protocol.SmsCodeRequest) (rsp *protocol.SmsCodeResponse, err error) {
var data map[string]interface{}
sms := svr.NewHttplibMmmSmsApiServiceGateway()
sms, _ := factory.CreateSmsCodeService()
data, err = sms.SendSms(request.Phone)
rsp = &protocol.SmsCodeResponse{}
if err != nil {
... ... @@ -106,6 +108,14 @@ func AccessToken(request *protocol.AccessTokenRequest) (rsp *protocol.AccessToke
rsp.AccessToken, _ = utils.GenerateToken(claim.UserId, protocol.TokenExpire*time.Second)
rsp.RefreshToken, _ = utils.GenerateToken(claim.UserId, protocol.RefreshTokenExipre*time.Second)
rsp.ExpiresIn = protocol.TokenExpire
//auth := userAuth.NewRedisUserAuth(userAuth.WithUserId(claim.UserId),
// userAuth.WithAccessToken(rsp.AccessToken),
// userAuth.WithRefreshToken(rsp.RefreshToken))
//if err = auth.AddAuth(); err != nil {
// log.Error(err)
// return
//}
return
}
... ... @@ -122,16 +132,29 @@ func RefreshToken(request *protocol.RefreshTokenRequest) (rsp *protocol.RefreshT
err = protocol.NewErrWithMessage(1, fmt.Errorf("jwt refrshToken (%v) valid", request.RefreshToken))
return
}
//oldAuth := userAuth.NewRedisUserAuth(userAuth.WithUserId(claim.UserId))
//if err = oldAuth.Check(userAuth.NewOptions(userAuth.WithRefreshToken(request.RefreshToken))); err != nil {
// log.Error(err)
// err = protocol.NewErrWithMessage(4140, err)
// return
//}
rsp.AccessToken, _ = utils.GenerateToken(claim.UserId, protocol.TokenExpire*time.Second)
rsp.RefreshToken, _ = utils.GenerateToken(claim.UserId, protocol.RefreshTokenExipre*time.Second)
rsp.ExpiresIn = protocol.TokenExpire
return
//newAuth := userAuth.NewRedisUserAuth(userAuth.WithUserId(claim.UserId),
// userAuth.WithAccessToken(rsp.AccessToken),
// userAuth.WithRefreshToken(rsp.RefreshToken))
//if err = newAuth.AddAuth(); err != nil {
// log.Error(err)
// return
//}
return
}
//验证短信验证码 T
func CheckSmsCode(phone, code string) (result bool, err error) {
sms := svr.NewHttplibMmmSmsApiServiceGateway()
sms, _ := factory.CreateSmsCodeService()
var data map[string]interface{}
data, err = sms.CheckSmsCode(phone, code)
if err != nil {
... ... @@ -154,3 +177,18 @@ func AuthCheckSmsCode(header *protocol.RequestHeader, request *protocol.AuthChec
}
return
}
//注销登录
func Revoke(header *protocol.RequestHeader, request *protocol.RevokeRequest) (rsp *protocol.RevokeResponse, err error) {
//auth := userAuth.NewRedisUserAuth(userAuth.WithUserId(header.UserId))
//rsp = &protocol.RevokeResponse{}
//if !auth.Exist() {
// return
//}
//if err = auth.RemoveAuth(); err != nil {
// log.Error(err)
// err = protocol.NewErrWithMessage(4140, err)
// return
//}
return
}
... ...
package auth
import (
"fmt"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/log"
"strconv"
"time"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/factory"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/im"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg/transaction"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/utils"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/protocol"
)
// 更新用户 IM INFO
func InitOrUpdateUserIMInfo(partnerInfo *domain.PartnerInfo, ctx *transaction.TransactionContext) (err error) {
var (
ImInfoRepository, _ = factory.CreateImInfoRepository(ctx)
checkImRequest *protocol.CheckImRequest = &protocol.CheckImRequest{}
IsCreated = false
checkImResponse *protocol.CheckImResponse
)
imInfo, e := ImInfoRepository.FindOne(map[string]interface{}{"user_id": partnerInfo.Id})
// 异常
if e != nil && e != domain.QueryNoRow {
err = e
return
}
// 不存在
if e == domain.QueryNoRow {
imInfo = &domain.ImInfo{
UserId: partnerInfo.Id,
CreateTime: time.Now(),
}
}
// 已存在
if e == nil && imInfo != nil {
IsCreated = true
}
if len(imInfo.ImId) == 0 {
id, _ := utils.NewSnowflakeId()
imInfo.ImId = fmt.Sprintf("%v", id)
}
checkImRequest = &protocol.CheckImRequest{
UserId: imInfo.UserId,
ImId: imInfo.ImId,
Uname: partnerInfo.PartnerName,
CustomerImId: fmt.Sprintf("%v", imInfo.CustomerImId),
IsCreated: IsCreated,
}
if checkImResponse, err = CheckIm(checkImRequest); err != nil {
return
}
if imInfo.CustomerImId == 0 {
imInfo.CustomerImId = getRandomCustomerAccount(partnerInfo.Id, ctx)
}
imInfo.ImToken = checkImResponse.ImToken
imInfo.UpdateTime = time.Now()
if _, err = ImInfoRepository.Save(imInfo); err != nil {
return
}
return
}
// 检查ImToken
func CheckIm(request *protocol.CheckImRequest) (rsp *protocol.CheckImResponse, err error) {
var ()
rsp = &protocol.CheckImResponse{}
if !request.IsCreated {
if err = imCreate(request, rsp); err != nil {
return
}
} else {
if err = imUpdate(request, rsp); err != nil {
return
}
}
if err = imRefreshToken(request, rsp); err != nil {
return
}
return
}
//create
func imCreate(request *protocol.CheckImRequest, rsp *protocol.CheckImResponse) (err error) {
var (
param im.UserCreate = im.UserCreate{
Accid: request.ImId,
Name: request.Uname,
Icon: request.Icon,
}
out *im.UserTokenResult
)
if out, err = im.CallCreate(param); err != nil {
return
}
if out.Code != 200 || (out.Info.Accid != request.ImId) {
return im.ErrorFailCall
}
rsp.ImToken = out.Info.Token
return
}
//update user info
func imUpdate(request *protocol.CheckImRequest, rsp *protocol.CheckImResponse) (err error) {
var (
param im.UserUpdate = im.UserUpdate{
Accid: request.ImId,
Name: request.Uname,
Icon: request.Icon,
}
out *im.BaseResp
)
if out, err = im.CallUpdate(param); err != nil {
return
}
if out.Code != 200 {
return im.ErrorFailCall
}
return
}
//refresh token
func imRefreshToken(request *protocol.CheckImRequest, rsp *protocol.CheckImResponse) (err error) {
var (
param im.UserRefreshToken = im.UserRefreshToken{
Accid: request.ImId,
}
out *im.UserTokenResult
)
if out, err = im.CallRefreshToken(param); err != nil {
return
}
if out.Code != 200 || (out.Info.Accid != request.ImId) {
return im.ErrorFailCall
}
rsp.ImToken = out.Info.Token
return
}
// 获取客服id
func getRandomCustomerAccount(userId int64, ctx *transaction.TransactionContext) (acid int64) {
ImCustomerServiceRepository, _ := factory.CreateImCustomerServiceRepository(ctx)
total, customers, err := ImCustomerServiceRepository.Find(map[string]interface{}{"sortById": domain.ASC})
if err != nil {
log.Error(err)
return 0
}
if total == 0 {
return 0
}
index := userId % total
if int(index) < len(customers) {
acid, _ = strconv.ParseInt(customers[index].ImId, 10, 64)
return
}
acid, _ = strconv.ParseInt(customers[0].ImId, 10, 64)
return
}
... ...
... ... @@ -3,18 +3,17 @@ package dividend
import (
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/factory"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg/models"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/utils"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/log"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/protocol"
"time"
)
//分红统计
func DividendStatistics(header *protocol.RequestHeader, request *protocol.DividendStatisticsRequest) (rsp *protocol.DividendStatisticsResponse, err error) {
// 分红统计
func Statistics(header *protocol.RequestHeader, request *protocol.DividendStatisticsRequest) (rsp *protocol.DividendStatisticsResponse, err error) {
var (
transactionContext, _ = factory.CreateTransactionContext(nil)
OrderResponsitory, _ = factory.CreateOrderRepository(transactionContext)
transactionContext, _ = factory.CreateTransactionContext(nil)
OrderBaseResponsitory, _ = factory.CreateOrderBaseRepository(transactionContext)
//beginTime = time.Unix(request.StartTime/1000, 0)
//endTime = time.Unix(request.EndTime/1000, 0)
)
... ... @@ -24,13 +23,13 @@ func DividendStatistics(header *protocol.RequestHeader, request *protocol.Divide
defer func() {
transactionContext.RollbackTransaction()
}()
_, orderAll, e := OrderResponsitory.Find(utils.ObjectJsonToMap(domain.OrderQueryOption{PartnerId: header.UserId, EndTime: time.Now(), SortByCreateTime: domain.DESC, OrderType: domain.OrderReal}))
_, orderAll, e := OrderBaseResponsitory.Find(utils.ObjectJsonToMap(domain.OrderQueryOption{PartnerId: header.UserId, EndTime: time.Now(), SortByCreateTime: domain.DESC, OrderType: domain.OrderReal}))
if e != nil {
log.Error(e)
}
var orderBetween []*domain.Order
var orderBetween []*domain.OrderBase
for i := range orderAll {
if orderAll[i].CreateAt.Unix() >= (request.StartTime/1000) && orderAll[i].CreateAt.Unix() < (request.EndTime/1000) {
if orderAll[i].CreateTime.Unix() >= (request.StartTime/1000) && orderAll[i].CreateTime.Unix() < (request.EndTime/1000) {
orderBetween = append(orderBetween, orderAll[i])
}
}
... ... @@ -40,42 +39,62 @@ func DividendStatistics(header *protocol.RequestHeader, request *protocol.Divide
rsp.Statistics = protocol.DividendStatistics{
Received: bonusAll.Received,
Outstanding: bonusAll.Outstanding,
Receivable: bonusAll.Receivable,
Quarters: bonusQuarters,
}
err = transactionContext.CommitTransaction()
return
}
//累计分红
func AllBonusStatics(orders []*domain.Order, action int) (bonus protocol.Bonus) {
// 累计分红
func AllBonusStatics(orders []*domain.OrderBase, action int) (bonus protocol.Bonus) {
bonus = protocol.Bonus{}
for i := range orders {
o := orders[i]
bonus.Received = utils.Decimal(bonus.Received + o.OrderBonusReceive())
bonus.Outstanding = utils.Decimal(bonus.Outstanding + o.OrderBonusWait())
static := o.OrderBonusStatic()
bonus.Received = utils.Decimal(bonus.Received + static.OrderBonusReceive())
bonus.Outstanding = utils.Decimal(bonus.Outstanding + static.OrderBonusWait())
bonus.Receivable = utils.Decimal(bonus.Receivable + static.OrderTotalReceivable())
}
return
}
//订单-季度分红统计
func QuartersBonusStatics(orders []*domain.Order, action int) (bonus []protocol.Bonus) {
// 订单-季度分红统计
func QuartersBonusStatics(orders []*domain.OrderBase, action int) (bonus []protocol.Bonus) {
bonus = make([]protocol.Bonus, 4)
for i := range orders {
o := orders[i]
quarter := (o.CreateAt.Month() - 1) / 3
bonus[quarter].Received = utils.Decimal(bonus[quarter].Received + o.OrderBonusReceive())
bonus[quarter].Outstanding = utils.Decimal(bonus[quarter].Outstanding + o.OrderBonusWait())
bonus[quarter].Expend = utils.Decimal(bonus[quarter].Expend + o.OrderBonusOutstanding())
quarter := quarter(o.CreateTime)
static := o.OrderBonusStatic()
bonus[quarter].Receivable = utils.Decimal(bonus[quarter].Receivable + static.OrderTotalReceivable())
bonus[quarter].Received = utils.Decimal(bonus[quarter].Received + static.OrderBonusReceive())
bonus[quarter].Outstanding = utils.Decimal(bonus[quarter].Outstanding + static.OrderBonusWait())
}
return
}
//分红订单
func DividendOrders(header *protocol.RequestHeader, request *protocol.DividendOrdersRequest) (rsp *protocol.DividendOrdersResponse, err error) {
// 季度
func quarter(t time.Time) int {
q := t.Month()
switch q {
case 4, 5, 6:
return 0
case 7, 8, 9:
return 1
case 10, 11, 12:
return 2
case 1, 2, 3:
return 3
}
return 0
}
// 分红订单
func OrderList(header *protocol.RequestHeader, request *protocol.DividendOrdersRequest) (rsp *protocol.DividendOrdersResponse, err error) {
var (
transactionContext, _ = factory.CreateTransactionContext(nil)
OrderDao, _ = factory.CreateOrderDao(transactionContext)
orders []*models.Order
OrderDao, _ = factory.CreateOrderBaseDao(transactionContext)
orders []*domain.OrderBase
count int
)
if err = transactionContext.StartTransaction(); err != nil {
... ... @@ -87,10 +106,11 @@ func DividendOrders(header *protocol.RequestHeader, request *protocol.DividendOr
rsp = &protocol.DividendOrdersResponse{List: make([]*protocol.DividendOrderListItem, 0)}
count, orders, err = OrderDao.DividendOrders(&domain.DividendOrdersQueryOption{
OrderType: domain.OrderReal,
PartnerId: header.UserId,
DetailAction: request.DetailAction,
DividendAction: request.DividendAction,
OrderType: domain.OrderReal,
PartnerId: header.UserId,
DetailAction: request.DetailAction,
DividendAction: request.DividendAction,
//IsDisable: "0",
StartTime: request.StartTime,
EndTime: request.EndTime,
Offset: request.PageIndex * request.PageSize,
... ... @@ -103,11 +123,12 @@ func DividendOrders(header *protocol.RequestHeader, request *protocol.DividendOr
for i := range orders {
o := orders[i]
s := o.OrderBonusStatic()
item := &protocol.DividendOrderListItem{
Id: o.Id,
OrderNo: o.OrderCode,
OrderAmount: o.OrderActualAmount,
MyDividend: utils.Decimal(o.OrderActualAmount * (o.PartnerBonusPercent / 100.0)),
Id: o.Id,
DeliveryNo: o.DeliveryCode,
OrderAmount: s.PlanOrderAmount, //s.OrderAmount(),
DividendReceivable: utils.Decimal(s.OrderTotalReceivable()),
}
rsp.List = append(rsp.List, item)
}
... ...
... ... @@ -5,18 +5,10 @@ import (
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg/transaction"
)
//func CreateTaskDao(options map[string]interface{}) (*dao.TaskDao, error) {
// var transactionContext *pg.TransactionContext
// if value, ok := options["transactionContext"]; ok {
// transactionContext = value.(*pg.TransactionContext)
// }
// return dao.NewTaskDao(transactionContext)
//}
func CreateOrderDao(ctx *transaction.TransactionContext) (*dao.OrderDao, error) {
return dao.NewOrderDao(ctx)
}
func CreatePartnerInfoDao(ctx *transaction.TransactionContext) (*dao.PartnerInfoDao, error) {
return dao.NewPartnerInfoDao(ctx)
}
func CreateOrderBaseDao(ctx *transaction.TransactionContext) (*dao.OrderBaseDao, error) {
return dao.NewOrderBaseDao(ctx)
}
... ...
package factory
import (
//pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
//"gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/domain/service"
//domainService "gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/infrastructure/domain_service"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain/service"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/svr"
)
//func CreateReadSentNotificationService(options map[string]interface{}) (service.ReadSentNotificationService, error) {
// var transactionContext *pgTransaction.TransactionContext
// if value, ok := options["transactionContext"]; ok {
// transactionContext = value.(*pgTransaction.TransactionContext)
// }
// return domainService.NewReadSentNotificationService(transactionContext)
//}
func CreateSmsCodeService() (service.SmsCodeService, error) {
return svr.NewHttplibMmmSmsApiServiceGateway(), nil
}
... ...
... ... @@ -24,16 +24,6 @@ func CreateAdminUserRepository(options map[string]interface{}) (domain.AdminUser
return repository.NewAdminUserRepository(transactionContext)
}
//CreateOrderRepository 订单
func CreateOrderRepository(transactionContext *transaction.TransactionContext) (domain.OrderRepository, error) {
return repository.NewOrderRepository(transactionContext)
}
//CreateOrderRepository 订单
func CreateOrderPaymentRepository(transactionContext *transaction.TransactionContext) (domain.OrderPaymentRepository, error) {
return repository.NewOrderPaymentRepository(transactionContext)
}
func CreatePartnerInfoRepositoryIn(transactionContext *transaction.TransactionContext) (domain.PartnerInfoRepository, error) {
return repository.NewPartnerInfoRepository(transactionContext)
}
... ... @@ -46,3 +36,23 @@ func CreatePartnerSubAccountRepository(transactionContext *transaction.Transacti
func CreateCompanyRepository(transactionContext *transaction.TransactionContext) (domain.CompanyRepository, error) {
return repository.NewCompanyRepository(transactionContext)
}
//CreateOrderBaseRepository 订单基础
func CreateOrderBaseRepository(transactionContext *transaction.TransactionContext) (domain.OrderBaseRepository, error) {
return repository.NewOrderBaseRepository(transactionContext)
}
//CreateOrderGoodRepository 订单基础
func CreateOrderGoodRepository(transactionContext *transaction.TransactionContext) (domain.OrderGoodRepository, error) {
return repository.NewOrderGoodRepository(transactionContext)
}
//CreateImInfoRepository Im信息
func CreateImInfoRepository(transactionContext *transaction.TransactionContext) (domain.ImInfoRepository, error) {
return repository.NewImInfoRepository(transactionContext)
}
//CreateImInfoRepository Im信息
func CreateImCustomerServiceRepository(transactionContext *transaction.TransactionContext) (domain.ImCustomerServiceRepository, error) {
return repository.NewImCustomerServiceRepository(transactionContext)
}
... ...
... ... @@ -2,10 +2,7 @@ package order
import (
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/factory"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/utils"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/protocol"
"time"
)
func Template(header *protocol.RequestHeader, request *protocol.OrderDetailRequest) (rsp *protocol.OrderDetailResponse, err error) {
... ... @@ -23,195 +20,3 @@ func Template(header *protocol.RequestHeader, request *protocol.OrderDetailReque
err = transactionContext.CommitTransaction()
return
}
//订单详情
func OrderDetail(header *protocol.RequestHeader, request *protocol.OrderDetailRequest) (rsp *protocol.OrderDetailResponse, err error) {
var (
transactionContext, _ = factory.CreateTransactionContext(nil)
OrderResponsitory, _ = factory.CreateOrderRepository(transactionContext)
OrderDao, _ = factory.CreateOrderDao(transactionContext)
order *domain.Order
)
if err = transactionContext.StartTransaction(); err != nil {
return nil, err
}
defer func() {
transactionContext.RollbackTransaction()
}()
rsp = &protocol.OrderDetailResponse{}
if order, err = OrderResponsitory.FindOne(utils.ObjectJsonToMap(request)); err != nil {
return
}
rsp.Order = protocol.OrderDetail{
Id: order.Id,
OrderNo: order.OrderCode,
OrderName: order.OrderName,
OrderStatus: order.OrderStatus,
CreateTime: order.CreateAt.Unix() * 1000,
UpdateTime: order.UpdateAt.Unix() * 1000,
OrderQuantity: order.OrderActualCount,
OrderAmount: order.OrderActualAmount,
OrderAmountCancel: order.OrderAmountCancel(),
OrderUpdateReason: order.Reason,
OrderDistrict: map[string]interface{}{"id": order.OrderRegionInfo.RegionId, "name": order.OrderRegionInfo.RegionName},
Customer: protocol.Customer{Uname: order.Buyer.BuyerName, Phone: order.Buyer.ContactInfo},
MyDividend: order.OrderTotalBonus(),
MyDividendPercent: order.PartnerBonusPercent,
}
if header.UserId == order.PartnerId && order.UpdateAt.After(order.LastViewTime) {
if err = OrderDao.UpdateLastViewTime(order.Id, time.Now()); err != nil {
return
}
}
err = transactionContext.CommitTransaction()
return
}
//订单统计
func OrderStatistics(header *protocol.RequestHeader, request *protocol.OrderStatisticsRequest) (rsp *protocol.OrderStatisticsResponse, err error) {
var (
transactionContext, _ = factory.CreateTransactionContext(nil)
OrderDao, _ = factory.CreateOrderDao(transactionContext)
)
if err = transactionContext.StartTransaction(); err != nil {
return nil, err
}
defer func() {
transactionContext.RollbackTransaction()
}()
rsp = &protocol.OrderStatisticsResponse{Statistics: protocol.OrderStatics{}}
if rsp.Statistics.TodayIntentionQuantity, rsp.Statistics.TodayIntentionMoney, err = OrderDao.OrderStatics(&domain.OrderStaticQuery{
BeginTime: utils.GetDayBegin().Unix() * 1000,
EndTime: utils.GetDayEnd().Unix() * 1000,
OrderType: domain.OrderIntention,
PartnerId: header.UserId,
}); err != nil {
return
}
if rsp.Statistics.TodayRealQuantity, rsp.Statistics.TodayRealMoney, err = OrderDao.OrderStatics(&domain.OrderStaticQuery{
BeginTime: utils.GetDayBegin().Unix() * 1000,
EndTime: utils.GetDayEnd().Unix() * 1000,
OrderType: domain.OrderReal,
PartnerId: header.UserId,
}); err != nil {
return
}
if rsp.Statistics.CumulativeQuantity, rsp.Statistics.CumulativeMoney, err = OrderDao.OrderStatics(&domain.OrderStaticQuery{
EndTime: time.Now().Unix() * 1000,
OrderType: domain.OrderReal,
PartnerId: header.UserId,
}); err != nil {
return
}
err = transactionContext.CommitTransaction()
return
}
//订单列表
func OrderList(header *protocol.RequestHeader, request *protocol.OrderListRequest) (rsp *protocol.OrderListResponse, err error) {
var (
transactionContext, _ = factory.CreateTransactionContext(nil)
OrderResponsitory, _ = factory.CreateOrderRepository(transactionContext)
OrderDao, _ = factory.CreateOrderDao(transactionContext)
orders []*domain.Order
)
rsp = &protocol.OrderListResponse{
List: make([]*protocol.OrderListItem, 0),
Statistics: make(map[string]interface{}),
}
if err = transactionContext.StartTransaction(); err != nil {
return nil, err
}
defer func() {
transactionContext.RollbackTransaction()
}()
queryOption := &domain.OrderQueryOption{
PartnerId: header.UserId,
Limit: request.PageSize,
Offset: request.PageSize * request.PageIndex,
SortByUpdateTime: domain.DESC,
}
if request.OrderAction == 1 {
queryOption.OrderStatus = domain.OrderStatusDeliverSome
} else if request.OrderAction == 2 {
queryOption.OrderStatus = domain.OrderStatusDeliverAll
}
if request.StartTime > 0 {
queryOption.BeginTime = time.Unix(request.StartTime/1000, 0)
}
if request.EndTime > 0 {
queryOption.EndTime = time.Unix(request.EndTime/1000, 0)
}
queryOption.OrderType = request.OrderType
_, orders, _ = OrderResponsitory.Find(utils.ObjectJsonToMap(queryOption))
//统计数据
if request.PageIndex == 0 {
var (
partShipmentQuantity, allShipmentQuantity int
cumulativeQuantity, intentionQuantity int
)
//部分发货的订单数量
partShipmentQuantity, _, err = OrderDao.OrderStatics(&domain.OrderStaticQuery{
EndTime: request.EndTime,
BeginTime: request.StartTime,
OrderType: domain.OrderReal,
PartnerId: header.UserId,
OrderStatus: domain.OrderStatusDeliverSome,
})
//全部发货的订单数量
allShipmentQuantity, _, err = OrderDao.OrderStatics(&domain.OrderStaticQuery{
EndTime: request.EndTime,
BeginTime: request.StartTime,
OrderType: domain.OrderReal,
PartnerId: header.UserId,
OrderStatus: domain.OrderStatusDeliverAll,
})
//累计实发订单
cumulativeQuantity, _, err = OrderDao.OrderStatics(&domain.OrderStaticQuery{
EndTime: time.Now().Unix() * 1000,
//BeginTime: request.StartTime,
OrderType: domain.OrderReal,
PartnerId: header.UserId,
})
//累计意向订单
intentionQuantity, _, err = OrderDao.OrderStatics(&domain.OrderStaticQuery{
EndTime: time.Now().Unix() * 1000,
//BeginTime: request.StartTime,
OrderType: domain.OrderIntention,
PartnerId: header.UserId,
})
//订单数量
rsp.Statistics["partShipmentQuantity"] = partShipmentQuantity
rsp.Statistics["allShipmentQuantity"] = allShipmentQuantity
rsp.Statistics["orderQuantity"] = partShipmentQuantity + allShipmentQuantity //所有订单 = 部分发货 + 已经发货
rsp.Statistics["cumulativeQuantity"] = cumulativeQuantity //实发订单 = 部分发货 + 全部发货
rsp.Statistics["intentionQuantity"] = intentionQuantity
}
if len(orders) == 0 {
return
}
for i := range orders {
rsp.List = append(rsp.List, DomainOrderToOrderListItem(orders[i]))
}
err = transactionContext.CommitTransaction()
return
}
func DomainOrderToOrderListItem(order *domain.Order) *protocol.OrderListItem {
return &protocol.OrderListItem{
Id: order.Id,
OrderType: order.OrderType,
OrderNo: order.OrderCode,
OrderName: order.OrderName,
OrderAmount: order.OrderActualAmount,
OrderActualCount: order.OrderActualCount,
OrderStatus: order.OrderStatus,
UpdateTime: order.UpdateAt.Unix() * 1000,
MyDividend: order.OrderTotalBonus(),
IsRead: order.IsRead(),
}
}
... ...
package order
import (
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/factory"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/utils"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/log"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/protocol"
"time"
)
// 订单详情
func Detail(header *protocol.RequestHeader, request *protocol.OrderDetailRequest) (rsp *protocol.OrderDetailResponse, err error) {
var (
transactionContext, _ = factory.CreateTransactionContext(nil)
OrderResponsitory, _ = factory.CreateOrderBaseRepository(transactionContext)
OrderDao, _ = factory.CreateOrderBaseDao(transactionContext)
order *domain.OrderBase
)
if err = transactionContext.StartTransaction(); err != nil {
return nil, err
}
defer func() {
transactionContext.RollbackTransaction()
}()
rsp = &protocol.OrderDetailResponse{}
if order, err = OrderResponsitory.FindOne(utils.ObjectJsonToMap(request)); err != nil {
log.Error(err)
return
}
rsp.Order = protocol.OrderDetail{
Id: order.Id,
OrderNo: order.OrderCode,
DeliveryNo: order.DeliveryCode,
OrderStatus: orderStatus(order),
CreateTime: order.CreateTime.Unix() * 1000,
UpdateTime: order.UpdateTime.Unix() * 1000,
OrderDistrict: map[string]interface{}{"id": order.RegionInfo.RegionId, "name": order.RegionInfo.RegionName},
Customer: protocol.Customer{Uname: order.Buyer.BuyerName, Phone: order.Buyer.ContactInfo},
Products: orderProducts(order),
Total: orderTotalStatic(order),
}
if header.UserId == order.PartnerId && order.UpdateTime.After(order.LastViewTime) {
if err = OrderDao.UpdateLastViewTime(order.Id, time.Now()); err != nil {
return
}
}
err = transactionContext.CommitTransaction()
return
}
func orderStatus(order *domain.OrderBase) int {
var hasBonus = false
for i := range order.OrderGood {
good := order.OrderGood[i]
if good.BonusStatus == domain.BonusPaid {
hasBonus = true
break
}
}
if hasBonus {
if order.UseOrderCount >= 0 && order.UseOrderCount < order.PlanOrderCount {
return 3 // 已支付退货
}
return 2 // 已支付分红
}
if !hasBonus {
if order.UseOrderCount >= 0 && order.UseOrderCount < order.PlanOrderCount {
return 4 // 待支付退货
}
return 1
}
return 1
}
func orderProducts(order *domain.OrderBase) interface{} {
var products []map[string]interface{}
for i := range order.OrderGood {
good := order.OrderGood[i]
static := good.OrderBonusStatic()
item := make(map[string]interface{})
item["productName"] = good.GoodName
item["orderCount"] = good.PlanGoodNumber
item["orderAmount"] = good.PlanAmount
item["dividendPercent"] = good.PartnerBonusPercent
item["dividendReceivable"] = static.OrderTotalReceivable() //应收分红
item["dividendReceived"] = static.OrderBonusReceive() //已收分红
item["dividendUnReceive"] = static.OrderBonusWait() // 未收分红
item["dividendExpend"] = static.OrderBonusOutstanding() //分红支出
if len(good.Remark) > 0 {
item["orderUpdateReason"] = good.Remark
}
item["dividendStatus"] = good.Status()
if good.Status() > 2 {
item["countAdjust"] = good.UseGoodNumber
item["amountAdjust"] = good.UseAmount
}
products = append(products, item)
}
return products
}
func orderTotalStatic(order *domain.OrderBase) interface{} {
item := make(map[string]interface{})
static := order.OrderBonusStatic()
item["totalCount"] = order.PlanOrderCount
item["totalAmount"] = order.PlanOrderAmount
item["totalDividendReceivable"] = static.OrderTotalReceivable()
item["totalReceived"] = static.OrderBonusReceive()
item["totalUnReceive"] = static.OrderBonusWait()
item["totalExpend"] = static.OrderBonusOutstanding()
if order.UseOrderCount > 0 {
item["totalCountAdjust"] = order.UseOrderCount
item["totalAmountAdjust"] = order.UseOrderAmount
}
return item
}
// 订单统计
func Statistics(header *protocol.RequestHeader, request *protocol.OrderStatisticsRequest) (rsp *protocol.OrderStatisticsResponse, err error) {
var (
transactionContext, _ = factory.CreateTransactionContext(nil)
OrderDao, _ = factory.CreateOrderBaseDao(transactionContext)
)
if err = transactionContext.StartTransaction(); err != nil {
return nil, err
}
defer func() {
transactionContext.RollbackTransaction()
}()
rsp = &protocol.OrderStatisticsResponse{Statistics: protocol.OrderStatics{}}
//if rsp.Statistics.TodayIntentionQuantity, rsp.Statistics.TodayIntentionMoney, err = OrderDao.OrderStatics(&domain.OrderStaticQuery{
// BeginTime: utils.GetDayBegin().Unix() * 1000,
// EndTime: utils.GetDayEnd().Unix() * 1000,
// OrderType: domain.OrderIntention,
// PartnerId: header.UserId,
//}); err != nil {
// return
//}
if rsp.Statistics.TodayRealQuantity, rsp.Statistics.TodayRealMoney, err = OrderDao.OrderStatics(&domain.OrderStaticQuery{
BeginTime: utils.GetDayBegin().Unix() * 1000,
EndTime: utils.GetDayEnd().Unix() * 1000,
OrderType: domain.OrderReal,
PartnerId: header.UserId,
}); err != nil {
return
}
if rsp.Statistics.CumulativeQuantity, rsp.Statistics.CumulativeMoney, err = OrderDao.OrderStatics(&domain.OrderStaticQuery{
EndTime: time.Now().Unix() * 1000,
OrderType: domain.OrderReal,
PartnerId: header.UserId,
}); err != nil {
return
}
rsp.Statistics.TodayRealMoney = utils.Decimal(rsp.Statistics.TodayRealMoney)
rsp.Statistics.CumulativeMoney = utils.Decimal(rsp.Statistics.CumulativeMoney)
err = transactionContext.CommitTransaction()
return
}
// 订单列表
func List(header *protocol.RequestHeader, request *protocol.OrderListRequest) (rsp *protocol.OrderListResponse, err error) {
var (
transactionContext, _ = factory.CreateTransactionContext(nil)
OrderResponsitory, _ = factory.CreateOrderBaseRepository(transactionContext)
OrderDao, _ = factory.CreateOrderBaseDao(transactionContext)
orders []*domain.OrderBase
)
rsp = &protocol.OrderListResponse{
List: make([]*protocol.OrderListItem, 0),
Statistics: make(map[string]interface{}),
}
if err = transactionContext.StartTransaction(); err != nil {
return nil, err
}
defer func() {
transactionContext.RollbackTransaction()
}()
queryOption := &domain.OrderQueryOption{
PartnerId: header.UserId,
Limit: request.PageSize,
Offset: request.PageSize * request.PageIndex,
SortByUpdateTime: domain.DESC,
}
if request.StartTime > 0 {
queryOption.BeginTime = time.Unix(request.StartTime/1000, 0)
}
if request.EndTime > 0 {
queryOption.EndTime = time.Unix(request.EndTime/1000, 0)
}
queryOption.OrderType = request.OrderType
_, orders, _ = OrderResponsitory.Find(utils.ObjectJsonToMap(queryOption))
//统计数据
if request.PageIndex == 0 {
var (
cumulativeQuantity int
)
//累计实发订单
cumulativeQuantity, _, err = OrderDao.OrderStatics(&domain.OrderStaticQuery{
EndTime: time.Now().Unix() * 1000,
OrderType: domain.OrderReal,
PartnerId: header.UserId,
})
rsp.Total = cumulativeQuantity
}
if len(orders) == 0 {
return
}
for i := range orders {
rsp.List = append(rsp.List, DomainOrderToOrderListItem(orders[i]))
}
err = transactionContext.CommitTransaction()
return
}
func DomainOrderToOrderListItem(order *domain.OrderBase) *protocol.OrderListItem {
bonusStatic := order.OrderBonusStatic()
return &protocol.OrderListItem{
Id: order.Id,
OrderType: order.OrderType,
OrderNo: order.OrderCode,
DeliveryNo: order.DeliveryCode,
OrderAmount: order.PlanOrderAmount,
UpdateTime: order.UpdateTime.Unix() * 1000,
MyDividend: bonusStatic.OrderTotalReceivable(),
IsRead: order.IsRead(),
}
}
... ...
package user
import (
"fmt"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/auth"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/factory"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/partnerInfo/query"
... ... @@ -8,6 +9,7 @@ import (
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/log"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/protocol"
"strconv"
"strings"
)
... ... @@ -18,6 +20,7 @@ func UserInfo(header *protocol.RequestHeader, request *protocol.UserInfoRequest)
transactionContext, _ = factory.CreateTransactionContext(nil)
CompanyResponsitory, _ = factory.CreateCompanyRepository(transactionContext)
PartnerInfoService, _ = factory.CreatePartnerInfoRepositoryIn(transactionContext)
ImInfoRepository, _ = factory.CreateImInfoRepository(transactionContext)
company *domain.Company
)
if err = transactionContext.StartTransaction(); err != nil {
... ... @@ -53,6 +56,11 @@ func UserInfo(header *protocol.RequestHeader, request *protocol.UserInfoRequest)
} else {
rsp.User.Salesman = map[string]interface{}{}
}
if imInfo, e := ImInfoRepository.FindOne(map[string]interface{}{"user_id": partnerInfo.Id}); e == nil && imInfo != nil {
rsp.User.ImToken = imInfo.ImToken
rsp.User.AccountID, _ = strconv.ParseInt(imInfo.ImId, 10, 64)
rsp.User.CsAccountID = fmt.Sprintf("%v", imInfo.CustomerImId)
}
err = transactionContext.CommitTransaction()
return
}
... ... @@ -144,6 +152,16 @@ func ResetPassword(header *protocol.RequestHeader, request *protocol.ResetPasswo
}); err != nil {
return
}
//清除auth token
//auth := userAuth.NewRedisUserAuth(userAuth.WithUserId(header.UserId))
//if !auth.Exist() {
// return
//}
//if err = auth.RemoveAuth(); err != nil {
// log.Error(err)
// err = protocol.NewErrWithMessage(4140, err)
// return
//}
err = transactionContext.CommitTransaction()
return
}
... ... @@ -190,6 +208,16 @@ func ChangePassword(header *protocol.RequestHeader, request *protocol.ChangePass
}); err != nil {
return
}
//清除auth token
//auth := userAuth.NewRedisUserAuth(userAuth.WithUserId(header.UserId))
//if !auth.Exist() {
// return
//}
//if err = auth.RemoveAuth(); err != nil {
// log.Error(err)
// err = protocol.NewErrWithMessage(4140, err)
// return
//}
err = transactionContext.CommitTransaction()
return
}
... ...
package userAuth
import (
"encoding/json"
"fmt"
"github.com/tiptok/gocomm/pkg/redis"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/utils"
"strconv"
)
var (
errDataType = fmt.Errorf("auth:data type assert error")
errNoMatch = fmt.Errorf("auth:user auth no match")
errNotFound = func(field string) error { return fmt.Errorf("auth:hset field (%v) not found", field) }
errTokenNotEqual = func(target, compare string) error {
return fmt.Errorf("auth:token not equal (%v != %v)", target, compare)
}
)
type UserAuthManager interface {
//添加用户权限
AddAuth() error
//获取用户权限
GetAuth() (interface{}, error)
//移除用户权限
RemoveAuth() error
//检验权限
//检查 refreshToken assessToken 是否一致
Check(*Options) error
//用户权限是否存在
//true:存在 false:不存在
Exist() bool
}
var _ UserAuthManager = (*RedisUserAuth)(nil)
type Options struct {
UserId int64
RefreshToken string
AccessToken string
}
func NewOptions(options ...Option) *Options {
Options := &Options{}
for i := range options {
options[i](Options)
}
return Options
}
type Option func(options *Options)
//option 参数
func WithRefreshToken(token string) Option {
return func(options *Options) {
options.RefreshToken = token
}
}
func WithAccessToken(token string) Option {
return func(options *Options) {
options.AccessToken = token
}
}
func WithUserId(uid int64) Option {
return func(options *Options) {
options.UserId = uid
}
}
//Redis用户权限
type RedisUserAuth struct {
Options *Options
}
func NewRedisUserAuth(options ...Option) *RedisUserAuth {
rua := &RedisUserAuth{
Options: NewOptions(options...),
}
return rua
}
func (auth RedisUserAuth) AddAuth() error {
err := redis.Hset(
auth.redisKey(),
auth.field(),
utils.JsonAssertString(NewRedisUserAuthData(auth.Options)), 0,
)
return err
}
func (auth RedisUserAuth) RemoveAuth() error {
if !auth.Exist() {
return nil
}
return redis.Hdel(auth.redisKey(), auth.field())
}
func (auth RedisUserAuth) GetAuth() (interface{}, error) {
if !auth.Exist() {
return nil, errNotFound(auth.field())
}
data, err := redis.Hget(auth.redisKey(), auth.field())
if err != nil {
return nil, err
}
var authData *RedisUserAuthData
if err = json.Unmarshal([]byte(data), &authData); err != nil {
return nil, err
}
return authData, nil
}
func (auth RedisUserAuth) Check(options *Options) error {
data, err := auth.GetAuth()
if err != nil {
return err
}
authData, ok := data.(*RedisUserAuthData)
if !ok {
return errDataType
}
if options.AccessToken != "" {
if authData.AccessToken != options.AccessToken {
return errTokenNotEqual(authData.AccessToken, options.AccessToken)
}
return nil
}
if options.RefreshToken != "" {
if authData.RefreshToken != options.RefreshToken {
return errTokenNotEqual(authData.RefreshToken, options.RefreshToken)
}
return nil
}
return errNoMatch
}
func (auth RedisUserAuth) Exist() bool {
return redis.Hexists(auth.redisKey(), auth.field())
}
func (auth RedisUserAuth) redisKey() string {
if auth.Options.UserId == 0 {
return ""
}
return utils.RedisKey("user_auth")
}
func (auth RedisUserAuth) field() string {
return strconv.Itoa(int(auth.Options.UserId))
}
//存储到redis的数据结构
type RedisUserAuthData struct {
UserId int64 `json:"userId"`
RefreshToken string `json:"refreshToken"`
AccessToken string `json:"accessToken"`
}
func NewRedisUserAuthData(options *Options) RedisUserAuthData {
return RedisUserAuthData{
UserId: options.UserId,
RefreshToken: options.RefreshToken,
AccessToken: options.AccessToken,
}
}
... ...
package userAuth
import (
"fmt"
"github.com/tiptok/gocomm/pkg/redis"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/constant"
"testing"
)
func initRedis() {
redisSource := fmt.Sprintf("%v:%v", constant.REDIS_HOST, constant.REDIS_PORT)
err := redis.InitWithDb(100, redisSource, constant.REDIS_AUTH, "0")
if err != nil {
panic(err)
}
}
func TestRedisUserAuth(t *testing.T) {
initRedis()
userAuth := NewRedisUserAuth(WithUserId(1),
WithAccessToken("abc"),
WithRefreshToken("cdf"),
)
err := userAuth.AddAuth()
if err != nil {
t.Fatal(err)
}
_, err = userAuth.GetAuth()
if err != nil {
t.Fatal("get auth", err)
}
if !userAuth.Exist() {
t.Fatal("except:true")
}
if err = userAuth.Check(NewOptions(WithAccessToken("abc"))); err != nil {
t.Fatal("check accessToken:", err)
}
if err = userAuth.Check(NewOptions(WithRefreshToken("cdf"))); err != nil {
t.Fatal("check refreshToken:", err)
}
if err = userAuth.RemoveAuth(); err != nil {
t.Fatal("remove:", err)
}
if userAuth.field() != "1" {
t.Fatal("except:1")
}
if userAuth.Exist() {
t.Fatal("except:false")
}
}
... ...
package constant
import "os"
var (
IM_SERVICE_ADDRESS = "https://api.netease.im/nimserver"
IM_APP_KEY = "be7c0639c10e6a69f86ce3b4fa8dc8ec" //"ebf3ae278ee1b346773b99be5080f6a9"
IM_APP_SECRET = "9c5b60346613" //"67ea92e1ea45"
)
func init() {
if os.Getenv("IM_APP_KEY") != "" {
IM_APP_KEY = os.Getenv("IM_APP_KEY")
}
if os.Getenv("IM_APP_SECRET") != "" {
IM_APP_SECRET = os.Getenv("IM_APP_SECRET")
}
}
... ...
package domain
import "time"
type ImCustomerService struct {
// id
Id int64
// 用户id(合伙人Id)
UserId int64
// IM唯一id
ImId string
// IM颁发的token
ImToken string
// 创建时间
CreateTime time.Time
// 更新时间
UpdateTime time.Time
}
type ImCustomerServiceRepository interface {
Save(dm *ImCustomerService) (*ImCustomerService, error)
Remove(dm *ImCustomerService) (*ImCustomerService, error)
FindOne(queryOptions map[string]interface{}) (*ImCustomerService, error)
Find(queryOptions map[string]interface{}) (int64, []*ImCustomerService, error)
}
func (m *ImCustomerService) Identify() interface{} {
if m.Id == 0 {
return nil
}
return m.Id
}
... ...
package domain
import "fmt"
//查询参数
const (
ASC = "ASC"
DESC = "DESC"
)
const (
OrderReal = iota + 1 //实发订单
OrderIntention //意向订单
)
const (
BonusWaitPay = iota + 1 //等待支付分红
BonusPaid //已经支付分红
)
var (
QueryNoRow = fmt.Errorf("not row found")
)
... ...
package domain
import "time"
type ImInfo struct {
tableName struct{} `pg:"im_info"`
// id
Id int64
// 合伙人Id
UserId int64
// IM唯一id
ImId string
// IM颁发的token
ImToken string
// 客服IM编号
CustomerImId int64
// 是否是客服 true:是 false:否
//IsCustomer bool
// 创建时间
CreateTime time.Time
// 更新时间
UpdateTime time.Time
}
type ImInfoRepository interface {
Save(dm *ImInfo) (*ImInfo, error)
Remove(dm *ImInfo) (*ImInfo, error)
FindOne(queryOptions map[string]interface{}) (*ImInfo, error)
Find(queryOptions map[string]interface{}) (int64, []*ImInfo, error)
}
func (m *ImInfo) Identify() interface{} {
if m.Id == 0 {
return nil
}
return m.Id
}
... ...
package domain
import (
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/utils"
"time"
)
const (
OrderStatusReserve = iota + 1 //预定中
OrderStatusDeliverSome //部分发货
OrderStatusDeliverAll //全部发货
)
const (
OrderReal = iota + 1 //实发订单
OrderIntention //意向订单
)
type OrderRepository interface {
Save(dm *Order) (*Order, error)
Remove(dm *Order) (*Order, error)
FindOne(queryOptions map[string]interface{}) (*Order, error)
Find(queryOptions map[string]interface{}) (int64, []*Order, error)
}
//Order 订单信息
type Order struct {
//id
Id int64 `json:"Id,omitempty"`
//订单类型
OrderType int `json:"orderType,omitempty"`
//订单编号
OrderCode string `json:"orderCode,omitempty"`
//订单名称
OrderName string `json:"orderName,omitempty"`
//订单状态
OrderStatus int `json:"orderStatus,omitempty"`
//订单数量
OrderCount int `json:"orderCount,omitempty"`
//实际订单数量
OrderActualCount int `json:"orderActualCount,omitempty"`
//订单金额
OrderAmount float64 `json:"admin_name,omitempty"`
//订单实际金额
OrderActualAmount float64 `json:"orderActualAmount,omitempty"`
//订单已支付金额(货款)
OrderPaymentAmount float64 `json:"orderPaymentAmount,omitempty"`
//订单区域信息
OrderRegionInfo *RegionInfo `json:"orderRegionInfo,omitempty"`
Buyer *Buyer `json:"buyer,omitempty"`
//合伙人编号
PartnerId int64 `json:"partnerId,omitempty"`
//合伙人分红百分比
PartnerBonusPercent float64 `json:"partnerBonusPercent,omitempty"`
//业务员分红百分比
SalesmanBonusPercent float64 `json:"salesmanBonusPercent,omitempty"`
//创建时间
CreateAt time.Time `json:"createAt,omitempty"`
//更新时间
UpdateAt time.Time `json:"updateAt,omitempty"`
//上一次查看时间 已读情况
LastViewTime time.Time `json:"lastViewTime,omitempty"`
//订单更新理由
Reason string `json:"reason,omitempty"`
}
func (m *Order) Identify() interface{} {
if m.Id == 0 {
return nil
}
return m.Id
}
func (m *Order) Update(data map[string]interface{}) error {
if orderType, ok := data["orderType"]; ok && orderType != 0 {
m.OrderType = orderType.(int)
}
if orderCode, ok := data["orderCode"]; ok && orderCode != "" {
m.OrderCode = orderCode.(string)
}
if orderName, ok := data["orderName"]; ok && orderName != "" {
m.OrderName = orderName.(string)
}
if orderStatus, ok := data["orderStatus"]; ok && orderStatus != 0 {
m.OrderStatus = orderStatus.(int)
}
if lastViewTime, ok := data["lastViewTime"]; ok && lastViewTime != 0 {
m.LastViewTime = lastViewTime.(time.Time)
}
m.UpdateAt = time.Now()
return nil
}
//合伙人
//订单累计分红
func (m *Order) OrderTotalBonus() float64 {
return utils.Decimal(m.OrderActualAmount * (m.PartnerBonusPercent / 100.0))
}
//订单已收分红
func (m *Order) OrderBonusReceive() float64 {
return utils.Decimal(m.OrderPaymentAmount * (m.PartnerBonusPercent / 100.0))
}
//订单未收分红
func (m *Order) OrderBonusWait() float64 {
bonusWait := m.OrderTotalBonus() - m.OrderBonusReceive()
if bonusWait < 0 {
return 0
}
return bonusWait
}
//分红支出
func (m *Order) OrderBonusOutstanding() float64 {
if m.OrderAmount <= m.OrderActualAmount {
return 0
}
return utils.Decimal((m.OrderAmount - m.OrderActualAmount) * (m.PartnerBonusPercent / 100.0))
}
//订单被取消金额
func (m *Order) OrderAmountCancel() float64 {
if m.OrderAmount <= m.OrderActualAmount {
return 0
}
return utils.Decimal(m.OrderAmount - m.OrderActualAmount)
}
//订单是否已读
func (m *Order) IsRead() int {
if m.UpdateAt.After(m.LastViewTime) {
return 0
}
return 1
}
type OrderQueryOption struct {
PartnerId int64 `json:"partnerId,omitempty"`
OrderType int `json:"orderType,omitempty"`
OrderStatus int `json:"orderStatus,omitempty"`
BeginTime time.Time `json:"beginTime,omitempty"`
EndTime time.Time `json:"endTime,omitempty"`
SortByCreateTime string `json:"sortByCreateTime,omitempty"`
SortByUpdateTime string `json:"sortByUpdateTime,omitempty"`
Offset int `json:"offset,omitempty"`
Limit int `json:"limit,omitempty"`
}
type DividendOrdersQueryOption struct {
PartnerId int64 `json:"partnerId"`
OrderType int `json:"orderType"` //订单类型
DetailAction int `json:"detailAction"` //明细类型(0已收明细、1未收明细)
DividendAction int `json:"dividendAction"` //分红类型(0累计分红、1分红支出)
StartTime int64 `json:"startTime" `
EndTime int64 `json:"endTime"`
Offset int `json:"offset,omitempty"`
Limit int `json:"limit,omitempty"`
SortByUpdateTime string `json:"sortByUpdateTime,omitempty"`
}
//买家
type Buyer struct {
//买家姓名
BuyerName string `json:"buyerName"`
//联系方式
ContactInfo string `json:"contactInfo"`
//收获地址
ShippingAddress string `json:"shippingAddress"`
}
package domain
import (
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/utils"
"time"
)
//OrderBase 订单基础
type OrderBase struct {
//表id
Id int64
//订单类型 1:实际订单 2:意向订单
OrderType int `pg:",notnull,default:1"`
//订单编号
OrderCode string
//交货编号
DeliveryCode string
//买家
Buyer *Buyer
//订单区域信息
RegionInfo *RegionInfo
//订单对应的合伙人
PartnerId int64
//业务员抽成比例
SalesmanBonusPercent float64
//业务员抽成
SalesmanBonus float64
//预计的订单内货品总数
PlanOrderCount int
//预计的订单的总金额
PlanOrderAmount float64
//按需使用的订单内货品总数 (初始值=-1)
UseOrderCount int
//按需使用的订单内货品总数 (初始值=-1)
UseOrderAmount float64
//订单的创建时间
CreateTime time.Time
//发货时间
DeliveryTime time.Time
//更新时间
UpdateTime time.Time
//上一次查看时间 已读情况
LastViewTime time.Time
//合伙人应收分红
PlanPartnerBonus float64
//调整后的合伙人应收分红 (初始值=-1)
UsePartnerBonus float64
//合伙人已收分红
PartnerBonusHas float64
//合伙人未收分红
PartnerBonusNot float64
//合伙人分红支出
PartnerBonusExpense float64
//是否关闭【0;否】【1:是】
IsDisable int8
//1:待支付分红 2:已支付分红
BonusStatus int8
//货物列表
OrderGood []*OrderGood
}
func (m *OrderBase) Identify() interface{} {
if m.Id == 0 {
return nil
}
return m.Id
}
//合伙人
//订单累计分红
func (m *OrderBase) OrderTotalBonus() float64 {
if m.UseOrderCount >= 0 {
return utils.Decimal(m.UsePartnerBonus + m.PartnerBonusExpense)
}
return utils.Decimal(m.PlanPartnerBonus)
}
//订单已收分红
func (m *OrderBase) OrderBonusReceive() float64 {
return utils.Decimal(m.PartnerBonusHas)
}
//订单未收分红
func (m *OrderBase) OrderBonusWait() float64 {
bonusWait := m.OrderTotalBonus() - m.OrderBonusReceive()
if bonusWait < 0 {
return 0
}
return bonusWait
}
//分红支出
func (m *OrderBase) OrderBonusOutstanding() float64 {
return utils.Decimal(m.PartnerBonusExpense)
}
//订单被取消金额
func (m *OrderBase) OrderAmountCancel() float64 {
if m.UseOrderAmount < 0 {
return 0
}
if m.PlanOrderAmount > m.UseOrderAmount {
return 0
}
return utils.Decimal(m.UseOrderAmount - m.PlanOrderAmount)
}
//订单金额
func (m *OrderBase) OrderAmount() float64 {
if m.UseOrderAmount < 0 {
return m.PlanOrderAmount
}
return m.UseOrderAmount
}
//订单是否已读
func (m *OrderBase) IsRead() int {
if m.UpdateTime.After(m.LastViewTime) {
return 0
}
return 1
}
func (m *OrderBase) OrderBonusStatic() *OrderStatics {
return &OrderStatics{
BonusStatus: m.BonusStatus,
PlanOrderCount: m.PlanOrderCount,
PlanOrderAmount: m.PlanOrderAmount,
UseOrderCount: m.UseOrderCount,
UseOrderAmount: m.UseOrderAmount,
PlanPartnerBonus: m.PlanPartnerBonus,
UsePartnerBonus: m.UsePartnerBonus,
PartnerBonusHas: m.PartnerBonusHas,
PartnerBonusNot: m.PartnerBonusNot,
PartnerBonusExpense: m.PartnerBonusExpense,
}
}
type OrderQueryOption struct {
PartnerId int64 `json:"partnerId,omitempty"`
OrderType int `json:"orderType,omitempty"`
OrderStatus int `json:"orderStatus,omitempty"`
BeginTime time.Time `json:"beginTime,omitempty"`
EndTime time.Time `json:"endTime,omitempty"`
//IsDisable string `json:"isDisable,omitempty"`
SortByCreateTime string `json:"sortByCreateTime,omitempty"`
SortByUpdateTime string `json:"sortByUpdateTime,omitempty"`
Offset int `json:"offset,omitempty"`
Limit int `json:"limit,omitempty"`
}
type DividendOrdersQueryOption struct {
PartnerId int64 `json:"partnerId"`
OrderType int `json:"orderType"` //订单类型
DetailAction int `json:"detailAction"` //明细类型(0已收明细、1未收明细)
DividendAction int `json:"dividendAction"` //分红类型(0累计分红、1分红支出)
IsDisable string `json:"isDisable,omitempty"`
StartTime int64 `json:"startTime" `
EndTime int64 `json:"endTime"`
Offset int `json:"offset,omitempty"`
Limit int `json:"limit,omitempty"`
SortByUpdateTime string `json:"sortByUpdateTime,omitempty"`
}
//买家
type Buyer struct {
//买家姓名
BuyerName string `json:"buyerName"`
//联系方式
ContactInfo string `json:"contactInfo"`
//收获地址
ShippingAddress string `json:"shippingAddress"`
}
type OrderBaseRepository interface {
Save(dm *OrderBase) (*OrderBase, error)
Remove(dm *OrderBase) (*OrderBase, error)
FindOne(queryOptions map[string]interface{}) (*OrderBase, error)
Find(queryOptions map[string]interface{}) (int64, []*OrderBase, error)
}
... ...
package domain
//OrderGood 订单中的货品
type OrderGood struct {
//货品id
Id int64
//所属订单id
OrderId int64
//货品名称 长度可能较长
GoodName string
//预计的货品数量
PlanGoodNumber int
//货品单价
Price float64
//预计的货品总额
PlanAmount float64
//调整后的货品数量
UseGoodNumber int
//调整后的货品总额
UseAmount float64
//合伙人分红比例
PartnerBonusPercent float64
//预计的合伙人分红
PlanPartnerBonus float64
//合伙人应收分红调整 (初始值=-1)
UsePartnerBonus float64
//合伙人已收分红
PartnerBonusHas float64
//合伙人未收分红
PartnerBonusNot float64
//合伙人分红支出
PartnerBonusExpense float64
//分红状态
BonusStatus int
//备注信息
Remark string
}
func (g *OrderGood) Status() GoodStatus {
if g.BonusStatus == BonusWaitPay && g.UseGoodNumber >= 0 && g.UseGoodNumber < g.PlanGoodNumber {
return goodStatusWithGoodsReturn
}
if g.BonusStatus == BonusWaitPay {
return goodStatusWait
}
if g.BonusStatus == BonusPaid && g.UseGoodNumber >= 0 && g.UseGoodNumber < g.PlanGoodNumber {
return goodStatusPayWithGoodsReturn
}
if g.BonusStatus == BonusPaid {
return goodStatusPay
}
return goodStatusWait
}
type GoodStatus int
const (
// 待支付
goodStatusWait GoodStatus = GoodStatus(iota + 1)
// 已支付
goodStatusPay
// 已支付退货
goodStatusPayWithGoodsReturn
// 待支付退货
goodStatusWithGoodsReturn
)
func (m *OrderGood) Identify() interface{} {
if m.Id == 0 {
return nil
}
return m.Id
}
func (m *OrderGood) OrderBonusStatic() *OrderStatics {
return &OrderStatics{
BonusStatus: int8(m.BonusStatus),
PlanOrderCount: m.PlanGoodNumber,
PlanOrderAmount: m.PlanAmount,
UseOrderCount: m.UseGoodNumber,
UseOrderAmount: m.UseAmount,
PlanPartnerBonus: m.PlanPartnerBonus,
UsePartnerBonus: m.UsePartnerBonus,
PartnerBonusHas: m.PartnerBonusHas,
PartnerBonusNot: m.PartnerBonusNot,
PartnerBonusExpense: m.PartnerBonusExpense,
}
}
type OrderGoodRepository interface {
Save(dm *OrderGood) (*OrderGood, error)
Remove(dm *OrderGood) (*OrderGood, error)
FindOne(queryOptions map[string]interface{}) (*OrderGood, error)
Find(queryOptions map[string]interface{}) (int64, []*OrderGood, error)
}
... ...
package domain
import "time"
const (
BonusWaitPay = iota + 1 //等待支付分红
BonusPaid //已经支付分红
)
type OrderPaymentRepository interface {
Save(dm *OrderPayment) (*OrderPayment, error)
Remove(dm *OrderPayment) (*OrderPayment, error)
FindOne(queryOptions map[string]interface{}) (*OrderPayment, error)
Find(queryOptions map[string]interface{}) (int64, []*OrderPayment, error)
}
type OrderPayment struct {
//编号
Id int64 `json:"id"`
//订单编号
OrderId int64 `json:"orderId"`
//合伙人编号
PartnerId int64 `json:"partnerId"`
//支付货款
PaymentAmount float64 `json:"paymentAmount"`
//分红金额
BonusAmount float64 `json:"bonusAmount"`
//分红状态 1.等待支付分红 2.已支付分红
BonusStatus int `json:"bonusStatus"`
//创建时间
CreateAt time.Time `json:"createAt"`
//更新时间
UpdateAt time.Time `json:"updateAt"`
}
func (m *OrderPayment) Identify() interface{} {
if m.Id == 0 {
return nil
}
return m.Id
}
func (m *OrderPayment) Update(data map[string]interface{}) error {
if m.BonusStatus != BonusWaitPay {
return nil
}
if paymentAmount, ok := data["paymentAmount"]; ok && paymentAmount != 0 {
m.PaymentAmount = paymentAmount.(float64)
}
if bonusAmount, ok := data["bonusAmount"]; ok && bonusAmount != 0 {
m.BonusAmount = bonusAmount.(float64)
}
if bonusStatus, ok := data["bonusStatus"]; ok && bonusStatus != 0 {
m.BonusStatus = bonusStatus.(int)
}
m.UpdateAt = time.Now()
return nil
}
package domain
//type OrderTodayStatic struct {
// TodayIntentionQuantity int `json:"todayIntentionQuantity"` //今日新增意向订单
// TodayIntentionMoney int `json:"todayIntentionMoney"` //今日新增意向订单金额
// TodayRealQuantity int `json:"todayRealQuantity"` //今日新增实发订单
// TodayRealMoney int `json:"todayRealMoney"` //今日新增实发订单金额
// //CumulativeQuantity int `json:"cumulativeQuantity"` //累计实发订单
// //CumulativeMoney int `json:"cumulativeMoney"` //累计实发订单金额
//}
////实发订单统计
//type OrderRealStatic struct {
// CumulativeQuantity int `json:"cumulativeQuantity"` //累计实发订单
// CumulativeMoney int `json:"cumulativeMoney"` //累计实发订单金额
//}
////意向订单统计
//type OrderIntentionStatic struct {
// CumulativeQuantity int `json:"cumulativeQuantity"` //累计意向订单
// CumulativeMoney int `json:"cumulativeMoney"` //累计意向订单金额
//}
type OrderStatic struct {
CumulativeQuantity int `json:"cumulativeQuantity"` //累计数量
CumulativeMoney int `json:"cumulativeMoney"` //累计金额
... ... @@ -30,6 +11,7 @@ type OrderStaticQuery struct {
EndTime int64 `json:"endTime,omitempty"`
OrderStatus int `json:"orderStatus,omitempty"`
OrderType int `json:"orderType,omitempty"`
//IsDisable int `json:"isDisable,omitempty"`
}
type DividendOrdersQuery struct {
... ...
package domain
import "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/utils"
//分洪统计
type OrderStatics struct {
//1:待支付分红 2:已支付分红
BonusStatus int8
//预计的订单内货品总数
PlanOrderCount int
//预计的订单的总金额
PlanOrderAmount float64
//按需使用的订单内货品总数 (初始值=-1)
UseOrderCount int
//按需使用的订单内货品总数 (初始值=-1)
UseOrderAmount float64
//合伙人应收分红
PlanPartnerBonus float64
//调整后的合伙人应收分红 (初始值=-1)
UsePartnerBonus float64
//合伙人已收分红
PartnerBonusHas float64
//合伙人未收分红
PartnerBonusNot float64
//合伙人分红支出
PartnerBonusExpense float64
}
//订单应收分红 = 初始分红 / 有调整 取调整后分红
func (m *OrderStatics) OrderTotalReceivable() float64 {
if m.UseOrderCount >= 0 {
return utils.Decimal(m.UsePartnerBonus)
}
return utils.Decimal(m.PlanPartnerBonus)
//return utils.Decimal(m.PartnerBonusHas + m.PartnerBonusNot)
}
//订单已收分红 = 已收分红
func (m *OrderStatics) OrderBonusReceive() float64 {
return utils.Decimal(m.PartnerBonusHas)
}
//订单未收分红 = 未收分红
func (m *OrderStatics) OrderBonusWait() float64 {
//bonusWait := m.OrderTotalBonus() - m.OrderBonusReceive()
//if bonusWait < 0 {
// return 0
//}
//return bonusWait
return m.PartnerBonusNot
}
//分红支出 = 分红支出
func (m *OrderStatics) OrderBonusOutstanding() float64 {
return utils.Decimal(m.PartnerBonusExpense)
}
//订单被取消金额
func (m *OrderStatics) OrderAmountCancel() float64 {
if m.UseOrderAmount < 0 {
return 0
}
if m.PlanOrderAmount < m.UseOrderAmount {
return 0
}
return utils.Decimal(m.PlanOrderAmount - m.UseOrderAmount)
}
//订单金额
func (m *OrderStatics) OrderAmount() float64 {
if m.UseOrderAmount < 0 {
return m.PlanOrderAmount
}
return m.UseOrderAmount
}
... ...
package service
type SmsCodeService interface {
SendSms(phone string) (map[string]interface{}, error)
CheckSmsCode(phone string, code string) (map[string]interface{}, error)
}
... ...
... ... @@ -5,37 +5,37 @@ import (
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg/models"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg/transaction"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/utils"
"time"
)
type OrderDao struct {
type OrderBaseDao struct {
transactionContext *transaction.TransactionContext
}
//订单统计
func (dao *OrderDao) OrderStatics(option *domain.OrderStaticQuery) (count int, amount float64, err error) {
func (dao *OrderBaseDao) OrderStatics(option *domain.OrderStaticQuery) (count int, amount float64, err error) {
tx := dao.transactionContext.PgTx
order := new(models.Order)
order := new(models.OrderBase)
var orderAmount float64
q := tx.Model(order)
q.ColumnExpr("count(*) count")
q.ColumnExpr("sum(order_actual_amount) total_order_actual_amount")
q.ColumnExpr("sum(order_amount) total_order_amount")
//q.ColumnExpr("sum(case when use_order_amount >0 THEN use_order_amount else plan_order_amount END) total_order_actual_amount")
q.ColumnExpr("sum(plan_order_amount) total_order_actual_amount")
q.ColumnExpr("sum(use_order_amount) total_order_amount")
if option.PartnerId > 0 {
q.Where(`"order".partner_id =?`, option.PartnerId)
q.Where(`"order_base".partner_id =?`, option.PartnerId)
}
if option.OrderType > 0 {
q.Where(`"order".order_type =?`, option.OrderType)
}
if option.OrderStatus > 0 {
q.Where(`"order".order_status =?`, option.OrderStatus)
q.Where(`"order_base".order_type =?`, option.OrderType)
}
if option.BeginTime > 0 {
q.Where(`"order".create_at >=?`, time.Unix(option.BeginTime/1000, 0))
q.Where(`"order_base".create_time >=?`, time.Unix(option.BeginTime/1000, 0))
}
if option.EndTime > 0 {
q.Where(`"order".create_at <?`, time.Unix(option.EndTime/1000, 0))
q.Where(`"order_base".create_time <?`, time.Unix(option.EndTime/1000, 0))
}
//q.Where(`"order_base".is_disable =?`, 0)
err = q.Select(&count, &amount, &orderAmount)
if option.OrderType == domain.OrderIntention { //意向订单值只有 order_amount order_actual_amount还未赋值
amount = orderAmount
... ... @@ -44,32 +44,35 @@ func (dao *OrderDao) OrderStatics(option *domain.OrderStaticQuery) (count int, a
}
//分红订单
func (dao *OrderDao) DividendOrders(option *domain.DividendOrdersQueryOption) (count int, orders []*models.Order, err error) {
func (dao *OrderBaseDao) DividendOrders(option *domain.DividendOrdersQueryOption) (count int, domainOrders []*domain.OrderBase, err error) {
tx := dao.transactionContext.PgTx
var orders []*models.OrderBase
q := tx.Model(&orders)
q.Column(`order.id`, `order.order_code`, `order.order_actual_amount`, `order.partner_bonus_percent`)
//q.Where(`"order".order_status >=?`, domain.OrderStatusDeliverSome) //已经发货
//q.Column(`order_base.id`, `order_base.order_code`, `order_base.order_actual_amount`, `order_base.partner_bonus_percent`)
if option.OrderType > 0 {
q.Where(`"order".order_type=?`, option.OrderType)
q.Where(`"order_base".order_type=?`, option.OrderType)
}
if option.PartnerId > 0 {
q.Where(`"order".partner_id=?`, option.PartnerId)
q.Where(`"order_base".partner_id=?`, option.PartnerId)
}
if option.StartTime > 0 {
q.Where(`"order".create_at >=?`, time.Unix(option.StartTime/1000, 0))
q.Where(`"order_base".create_time >=?`, time.Unix(option.StartTime/1000, 0))
}
if option.EndTime > 0 {
q.Where(`"order".create_at <?`, time.Unix(option.EndTime/1000, 0))
q.Where(`"order_base".create_time <?`, time.Unix(option.EndTime/1000, 0))
}
//if len(option.IsDisable) > 0 {
// value, _ := strconv.Atoi(option.IsDisable)
// q.Where(`"order_base".is_disable =?`, value)
//}
if option.DividendAction == 0 { //累计分红
if option.DetailAction == 0 { //已收明细
q.Join(`JOIN order_payment as a ON a.order_id="order".id`)
q.Where(`"a".bonus_status=?`, domain.BonusPaid)
q.Where(`"order_base".partner_bonus_has>0`)
} else if option.DetailAction == 1 { //未收明细 //实际金额>已支付金额
q.Where(`"order".order_actual_amount>"order".order_payment_amount`)
q.Where(`"order_base".partner_bonus_not>0`)
}
} else if option.DividendAction == 1 { //分红支出
q.Where(`"order".order_amount>"order".order_actual_amount`)
q.Where(`"order_base".partner_bonus_expense>0`)
}
if option.Limit > 0 {
q.Limit(option.Limit)
... ... @@ -78,26 +81,34 @@ func (dao *OrderDao) DividendOrders(option *domain.DividendOrdersQueryOption) (c
q.Offset(option.Offset)
}
if len(option.SortByUpdateTime) > 0 {
q.Order(fmt.Sprintf("order.id %v", option.SortByUpdateTime))
q.Order(fmt.Sprintf("order_base.id %v", option.SortByUpdateTime))
}
count, err = q.Distinct().SelectAndCount()
for i := range orders {
var domainOrder *domain.OrderBase
err = utils.GobModelTransform(&domainOrder, &orders[i])
if err != nil {
return
}
domainOrders = append(domainOrders, domainOrder)
}
return
}
func (dao *OrderDao) UpdateLastViewTime(id int64, lastViewTime time.Time) (err error) {
func (dao *OrderBaseDao) UpdateLastViewTime(id int64, lastViewTime time.Time) (err error) {
tx := dao.transactionContext.PgTx
order := new(models.Order)
order := new(models.OrderBase)
q := tx.Model(order).Set("last_view_time = ?", lastViewTime)
q.Where("id=?", id)
_, err = q.Update()
return
}
func NewOrderDao(transactionContext *transaction.TransactionContext) (*OrderDao, error) {
func NewOrderBaseDao(transactionContext *transaction.TransactionContext) (*OrderBaseDao, error) {
if transactionContext == nil {
return nil, fmt.Errorf("transactionContext参数不能为nil")
} else {
return &OrderDao{
return &OrderBaseDao{
transactionContext: transactionContext,
}, nil
}
... ...
package im
import (
"encoding/json"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/constant"
)
func init() {
InitImClient(constant.IM_SERVICE_ADDRESS, constant.IM_APP_KEY, constant.IM_APP_SECRET)
}
type RequestParam interface {
Format() map[string]string
GetPath() string
Valid() error
}
//接口
func CallCreate(v UserCreate) (*UserTokenResult, error) {
var result UserTokenResult
btData, err := DefaultImClient.Call(v)
if err != nil {
return nil, err
}
err = json.Unmarshal(btData, &result)
if err != nil {
return nil, err
}
return &result, nil
}
func CallRefreshToken(v UserRefreshToken) (*UserTokenResult, error) {
var result UserTokenResult
btData, err := DefaultImClient.Call(v)
if err != nil {
return nil, err
}
err = json.Unmarshal(btData, &result)
if err != nil {
return nil, err
}
return &result, nil
}
func CallUpdate(v UserUpdate) (*BaseResp, error) {
var result BaseResp
btData, err := DefaultImClient.Call(v)
if err != nil {
return nil, err
}
err = json.Unmarshal(btData, &result)
if err != nil {
return nil, err
}
return &result, nil
}
... ...
package im
import (
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/constant"
"testing"
)
func TestCallCreate(t *testing.T) {
InitImClient(constant.IM_SERVICE_ADDRESS, constant.IM_APP_KEY, constant.IM_APP_SECRET)
token, err := CallCreate(UserCreate{Accid: "1"})
if err != nil {
t.Fatal(err)
}
if token == nil {
t.Fatal("token is nil")
}
t.Log(token.Code, token.Info)
}
func TestCallRefreshToken(t *testing.T) {
InitImClient(constant.IM_SERVICE_ADDRESS, constant.IM_APP_KEY, constant.IM_APP_SECRET)
token, err := CallRefreshToken(UserRefreshToken{Accid: "1"})
if err != nil {
t.Fatal(err)
}
if token == nil {
t.Fatal("token is nil")
}
t.Log(token.Code, token.Info)
}
func TestCallUpdate(t *testing.T) {
InitImClient(constant.IM_SERVICE_ADDRESS, constant.IM_APP_KEY, constant.IM_APP_SECRET)
token, err := CallUpdate(UserUpdate{Accid: "1", Name: "tip tok"})
if err != nil {
t.Fatal(err)
}
if token == nil {
t.Fatal("token is nil")
}
t.Log(token.Code)
}
... ...
package im
import (
"crypto/sha1"
"encoding/hex"
"fmt"
"io/ioutil"
"math/rand"
"net/http"
"net/url"
"strconv"
"strings"
"time"
)
var DefaultImClient Client
var ErrorFailCall = fmt.Errorf(" imclient call failed")
func InitImClient(baseUrl, appKey, appSecret string) {
DefaultImClient = Client{
baseUrl: baseUrl,
appKey: appKey,
appSecret: appSecret,
}
}
type Client struct {
baseUrl string
appKey string
appSecret string
}
func (i Client) Call(param RequestParam) ([]byte, error) {
return i.httpDo(param.GetPath(), param.Format())
}
func (i Client) buildHeader() http.Header {
var h = http.Header{}
curTime := strconv.FormatInt(time.Now().Unix(), 10)
nonce := strconv.FormatInt(time.Now().Unix()+rand.Int63n(5000), 10)
checkSum := buildCheckSum(i.appSecret, nonce, curTime)
h.Set("Content-Type", "application/x-www-form-urlencoded")
h.Set("AppKey", i.appKey)
h.Set("Nonce", nonce)
h.Set("CurTime", curTime)
h.Set("CheckSum", checkSum)
return h
}
func (i Client) httpDo(path string, posts map[string]string) ([]byte, error) {
client := http.Client{
Timeout: 5 * time.Second, //请求超时时间5秒
}
reqURL := i.baseUrl + path
params := url.Values{}
for k, v := range posts {
params.Add(k, v)
}
req, err := http.NewRequest("POST", reqURL, strings.NewReader(params.Encode()))
if err != nil {
return nil, err
}
req.Header = i.buildHeader()
resp, err := client.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
return body, nil
}
func buildCheckSum(appSecret string, nonce string, curTime string) string {
str := []byte(appSecret + nonce + curTime)
sh := sha1.New()
sh.Write(str)
result := hex.EncodeToString(sh.Sum(nil))
return strings.ToLower(result)
}
... ...
package im
import (
"fmt"
)
var (
_ RequestParam = UserCreate{}
_ RequestParam = UserUpdate{}
_ RequestParam = UserRefreshToken{}
)
type BaseResp struct {
Code int `json:"code"`
}
// TokenInfo 云通信Token
type TokenInfo struct {
Token string `json:"token"`
Accid string `json:"accid"`
Name string `json:"name"`
}
type UserTokenResult struct {
BaseResp
Info TokenInfo `json:"info"`
}
// 创建网易云通信ID
type UserCreate struct {
Accid string //网易云通信ID,最大长度32字符
Name string //ID昵称,最大长度64字符。
Props string //json属性,开发者可选填,最大长度1024字符
Icon string //ID头像URL,开发者可选填,最大长度1024字符
/**
云通信ID可以指定登录token值,最大长度128字符,
并更新,如果未指定,会自动生成token,并在
创建成功后返回
**/
Token string
Sign string //签名
Email string
Birth string
Mobile string
Gender int //0未知,1男,2女
Ex string //扩展字段
}
func (p UserCreate) Format() map[string]string {
return map[string]string{
"accid": p.Accid,
"name": p.Name,
"props": p.Props,
"icon": p.Icon,
"token": p.Token,
"sign": p.Sign,
"email": p.Email,
"birth": p.Birth,
"mobile": p.Mobile,
"gender": fmt.Sprintf("%d", p.Gender),
"ex": p.Ex,
}
}
func (p UserCreate) GetPath() string {
return "/user/create.action"
}
func (p UserCreate) Valid() error {
return nil
}
// 重置网易云通信token
type UserRefreshToken struct {
Accid string //网易云通信ID,最大长度32字符,必须保证一个 APP内唯一
}
func (p UserRefreshToken) Format() map[string]string {
return map[string]string{
"accid": p.Accid,
}
}
func (p UserRefreshToken) GetPath() string {
return "/user/refreshToken.action"
}
func (p UserRefreshToken) Valid() error {
return nil
}
// 更新网易云通信token
type UserUpdate struct {
Accid string
Name string //这边网易云要有昵称以手机号码为昵称
Icon string //icon默认头像
Sign string //签名
Email string
Birth string
Mobile string
Gender int //0未知,1男,2女
Ex string //扩展字段
}
func (u UserUpdate) Format() map[string]string {
return map[string]string{
"accid": u.Accid,
"name": u.Name,
"icon": u.Icon,
"sign": u.Sign,
"email": u.Email,
"birth": u.Birth,
"mobile": u.Mobile,
"gender": fmt.Sprintf("%d", u.Gender),
"ex": u.Ex,
}
}
func (u UserUpdate) GetPath() string {
return "/user/refreshToken.action"
}
func (u UserUpdate) Valid() error {
return nil
}
... ...
... ... @@ -22,6 +22,7 @@ func init() {
if !constant.DISABLE_SQL_GENERATE_PRINT {
DB.AddQueryHook(SqlGeneratePrintHook{})
}
//orm.RegisterTable((*models.OrderGood)(nil))
if !constant.DISABLE_CREATE_TABLE {
for _, model := range []interface{}{
//(*models.Employee)(nil),
... ... @@ -30,6 +31,10 @@ func init() {
(*models.OrderPayment)(nil),
(*models.PartnerSubAccount)(nil),
(*models.Company)(nil),
(*models.OrderBase)(nil),
(*models.OrderGood)(nil),
(*models.ImInfo)(nil),
(*models.ImCustomerService)(nil),
} {
err := DB.CreateTable(model, &orm.CreateTableOptions{
Temp: false,
... ...
package models
import "time"
type ImCustomerService struct {
tableName struct{} `pg:"im_customer_service"`
// id
Id int64
// 用户id(合伙人Id)
UserId int64
// IM唯一id
ImId string
// IM颁发的token
ImToken string
// 创建时间
CreateTime time.Time
// 更新时间
UpdateTime time.Time
}
... ...
package models
import "time"
type ImInfo struct {
tableName struct{} `pg:"im_info"`
// id
Id int64
// 合伙人Id
UserId int64
// IM唯一id
ImId string
// IM颁发的token
ImToken string
// 客服IM编号
CustomerImId int64
// 是否是客服 true:是 false:否
//IsCustomer bool
// 创建时间
CreateTime time.Time
// 更新时间
UpdateTime time.Time
}
... ...
package models
import (
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain"
"time"
)
//OrderBase 订单基础
type OrderBase struct {
tableName struct{} `pg:"order_base"`
//表id
Id int64 `pg:",pk"`
//订单类型 1:实际订单 2:意向订单
OrderType int `pg:",notnull,default:1"`
//订单编号
OrderCode string
//交货编号
DeliveryCode string
//买家
Buyer *domain.Buyer
//订单区域信息
RegionInfo *domain.RegionInfo
//订单对应的合伙人
PartnerId int64
//业务员抽成比例
SalesmanBonusPercent float64
//业务员抽成
SalesmanBonus float64
//预计的订单内货品总数
PlanOrderCount int
//预计的订单的总金额
PlanOrderAmount float64
//按需使用的订单内货品总数 (初始值=-1)
UseOrderCount int
//按需使用的订单内货总金额 (初始值=-1)
UseOrderAmount float64
//订单的创建时间
CreateTime time.Time
//发货时间
DeliveryTime time.Time
//更新时间
UpdateTime time.Time
//上一次查看时间 已读情况
LastViewTime time.Time
//合伙人应收分红
PlanPartnerBonus float64
//调整后的合伙人应收分红 (初始值=-1)
UsePartnerBonus float64
//合伙人已收分红
PartnerBonusHas float64
//合伙人未收分红
PartnerBonusNot float64
//合伙人分红支出
PartnerBonusExpense float64
//是否关闭【0;否】【1:是】
IsDisable int8
//1:待支付分红 2:已支付分红
BonusStatus int8
//货物列表
OrderGood []*OrderGood `pg:"fk:order_id"`
}
... ...
package models
//OrderGood 订单中的货品
type OrderGood struct {
tableName struct{} `pg:"order_good"`
//货品id
Id int64 `pg:",pk"`
//所属订单id
OrderId int64
//货品名称 长度可能较长
GoodName string
//预计的货品数量
PlanGoodNumber int
//货品单价
Price float64
//预计的货品总额
PlanAmount float64
//调整后的货品数量
UseGoodNumber int
//调整后的货品总额
UseAmount float64
//合伙人分红比例
PartnerBonusPercent float64
//预计的合伙人分红
PlanPartnerBonus float64
//合伙人应收分红调整 (初始值=-1)
UsePartnerBonus float64
//合伙人已收分红
PartnerBonusHas float64
//合伙人未收分红
PartnerBonusNot float64
//合伙人分红支出
PartnerBonusExpense float64
//分红状态
BonusStatus int
//备注信息
Remark string
}
... ...
... ... @@ -4,12 +4,13 @@ import (
"fmt"
"github.com/tiptok/gocomm/pkg/redis"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/constant"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/log"
)
func init() {
redisSource := fmt.Sprintf("%v:%v", constant.REDIS_HOST, constant.REDIS_PORT)
err := redis.InitWithDb(100, redisSource, constant.REDIS_AUTH, "0")
if err != nil {
panic(err)
log.Error(err)
}
}
... ...
package repository
import (
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg/models"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg/transaction"
. "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/utils"
)
type ImCustomerServiceRepository struct {
transactionContext *transaction.TransactionContext
}
func (repository *ImCustomerServiceRepository) Save(dm *domain.ImCustomerService) (*domain.ImCustomerService, error) {
var (
err error
m = &models.ImCustomerService{}
tx = repository.transactionContext.PgTx
)
if err = GobModelTransform(m, dm); err != nil {
return nil, err
}
if dm.Identify() == nil {
if err = tx.Insert(m); err != nil {
return nil, err
}
return dm, nil
}
if err = tx.Update(m); err != nil {
return nil, err
}
return dm, nil
}
func (repository *ImCustomerServiceRepository) Remove(ImCustomerService *domain.ImCustomerService) (*domain.ImCustomerService, error) {
var (
tx = repository.transactionContext.PgTx
ImCustomerServiceModel = &models.ImCustomerService{Id: ImCustomerService.Identify().(int64)}
)
if _, err := tx.Model(ImCustomerServiceModel).Where("id = ?", ImCustomerService.Id).Delete(); err != nil {
return ImCustomerService, err
}
return ImCustomerService, nil
}
func (repository *ImCustomerServiceRepository) FindOne(queryOptions map[string]interface{}) (*domain.ImCustomerService, error) {
tx := repository.transactionContext.PgTx
ImCustomerServiceModel := new(models.ImCustomerService)
query := NewQuery(tx.Model(ImCustomerServiceModel), queryOptions)
query.SetWhere("id = ?", "id")
query.SetWhere("user_id = ?", "user_id")
if err := query.First(); err != nil {
return nil, domain.QueryNoRow
}
if ImCustomerServiceModel.Id == 0 {
return nil, domain.QueryNoRow
}
return repository.transformPgModelToDomainModel(ImCustomerServiceModel)
}
func (repository *ImCustomerServiceRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.ImCustomerService, error) {
tx := repository.transactionContext.PgTx
var ImCustomerServiceModels []*models.ImCustomerService
ImCustomerServices := make([]*domain.ImCustomerService, 0)
query := NewQuery(tx.Model(&ImCustomerServiceModels), queryOptions).
SetOrder("create_time", "sortByCreateTime").
SetOrder("update_time", "sortByUpdateTime").
SetOrder("id", "sortById")
var err error
if query.AffectRow, err = query.SelectAndCount(); err != nil {
return 0, ImCustomerServices, err
}
for _, ImCustomerServiceModel := range ImCustomerServiceModels {
if ImCustomerService, err := repository.transformPgModelToDomainModel(ImCustomerServiceModel); err != nil {
return 0, ImCustomerServices, err
} else {
ImCustomerServices = append(ImCustomerServices, ImCustomerService)
}
}
return int64(query.AffectRow), ImCustomerServices, nil
}
func (repository *ImCustomerServiceRepository) transformPgModelToDomainModel(ImCustomerServiceModel *models.ImCustomerService) (*domain.ImCustomerService, error) {
m := &domain.ImCustomerService{}
err := GobModelTransform(m, ImCustomerServiceModel)
return m, err
}
func NewImCustomerServiceRepository(transactionContext *transaction.TransactionContext) (*ImCustomerServiceRepository, error) {
if transactionContext == nil {
return nil, ERR_EMPTY_TC
}
return &ImCustomerServiceRepository{transactionContext: transactionContext}, nil
}
... ...
... ... @@ -7,24 +7,20 @@ import (
. "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/utils"
)
type OrderPaymentRepository struct {
type ImInfoRepository struct {
transactionContext *transaction.TransactionContext
}
func (repository *OrderPaymentRepository) Save(dm *domain.OrderPayment) (*domain.OrderPayment, error) {
func (repository *ImInfoRepository) Save(dm *domain.ImInfo) (*domain.ImInfo, error) {
var (
err error
m = &models.OrderPayment{}
m = &models.ImInfo{}
tx = repository.transactionContext.PgTx
)
if err = GobModelTransform(m, dm); err != nil {
return nil, err
}
if dm.Identify() == nil {
if dm.Id, err = NewSnowflakeId(); err != nil {
return dm, err
}
m.Id = dm.Id
if err = tx.Insert(m); err != nil {
return nil, err
}
... ... @@ -36,68 +32,62 @@ func (repository *OrderPaymentRepository) Save(dm *domain.OrderPayment) (*domain
return dm, nil
}
func (repository *OrderPaymentRepository) Remove(OrderPayment *domain.OrderPayment) (*domain.OrderPayment, error) {
func (repository *ImInfoRepository) Remove(ImInfo *domain.ImInfo) (*domain.ImInfo, error) {
var (
tx = repository.transactionContext.PgTx
OrderPaymentModel = &models.OrderPayment{Id: OrderPayment.Identify().(int64)}
tx = repository.transactionContext.PgTx
ImInfoModel = &models.ImInfo{Id: ImInfo.Identify().(int64)}
)
if _, err := tx.Model(OrderPaymentModel).Where("id = ?", OrderPayment.Id).Delete(); err != nil {
return OrderPayment, err
if _, err := tx.Model(ImInfoModel).Where("id = ?", ImInfo.Id).Delete(); err != nil {
return ImInfo, err
}
return OrderPayment, nil
return ImInfo, nil
}
func (repository *OrderPaymentRepository) FindOne(queryOptions map[string]interface{}) (*domain.OrderPayment, error) {
func (repository *ImInfoRepository) FindOne(queryOptions map[string]interface{}) (*domain.ImInfo, error) {
tx := repository.transactionContext.PgTx
OrderPaymentModel := new(models.OrderPayment)
query := NewQuery(tx.Model(OrderPaymentModel), queryOptions)
query.SetWhere("order_payment.id = ?", "id")
query.SetWhere("order_payment.order_id = ?", "orderId")
ImInfoModel := new(models.ImInfo)
query := NewQuery(tx.Model(ImInfoModel), queryOptions)
query.SetWhere("id = ?", "id")
query.SetWhere("user_id = ?", "user_id")
if err := query.First(); err != nil {
return nil, query.HandleError(err, "没有此订单")
return nil, domain.QueryNoRow
}
if OrderPaymentModel.Id == 0 {
return nil, nil
if ImInfoModel.Id == 0 {
return nil, domain.QueryNoRow
}
return repository.transformPgModelToDomainModel(OrderPaymentModel)
return repository.transformPgModelToDomainModel(ImInfoModel)
}
func (repository *OrderPaymentRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.OrderPayment, error) {
func (repository *ImInfoRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.ImInfo, error) {
tx := repository.transactionContext.PgTx
var OrderPaymentModels []*models.OrderPayment
OrderPayments := make([]*domain.OrderPayment, 0)
query := NewQuery(tx.Model(&OrderPaymentModels), queryOptions)
query.
SetWhere("order_payment.partner_id = ?", "partnerId").
SetWhere("order_payment.order_id = ?", "orderId").
SetWhere(`order_payment.create_at >= ?`, "beginTime").
SetWhere(`order_payment.create_at < ?`, "endTime").
SetLimit().
SetOrder("order_payment.create_at", "sortByCreateTime").
SetOrder("order_payment.update_at", "sortByUpdateTime")
var ImInfoModels []*models.ImInfo
ImInfos := make([]*domain.ImInfo, 0)
query := NewQuery(tx.Model(&ImInfoModels), queryOptions).
SetOrder("im_info.create_time", "sortByCreateTime").
SetOrder("im_info.update_time", "sortByUpdateTime")
var err error
if query.AffectRow, err = query.SelectAndCount(); err != nil {
return 0, OrderPayments, err
return 0, ImInfos, err
}
for _, OrderPaymentModel := range OrderPaymentModels {
if OrderPayment, err := repository.transformPgModelToDomainModel(OrderPaymentModel); err != nil {
return 0, OrderPayments, err
for _, ImInfoModel := range ImInfoModels {
if ImInfo, err := repository.transformPgModelToDomainModel(ImInfoModel); err != nil {
return 0, ImInfos, err
} else {
OrderPayments = append(OrderPayments, OrderPayment)
ImInfos = append(ImInfos, ImInfo)
}
}
return int64(query.AffectRow), OrderPayments, nil
return int64(query.AffectRow), ImInfos, nil
}
func (repository *OrderPaymentRepository) transformPgModelToDomainModel(OrderPaymentModel *models.OrderPayment) (*domain.OrderPayment, error) {
m := &domain.OrderPayment{}
err := GobModelTransform(m, OrderPaymentModel)
func (repository *ImInfoRepository) transformPgModelToDomainModel(ImInfoModel *models.ImInfo) (*domain.ImInfo, error) {
m := &domain.ImInfo{}
err := GobModelTransform(m, ImInfoModel)
return m, err
}
func NewOrderPaymentRepository(transactionContext *transaction.TransactionContext) (*OrderPaymentRepository, error) {
func NewImInfoRepository(transactionContext *transaction.TransactionContext) (*ImInfoRepository, error) {
if transactionContext == nil {
return nil, ERR_EMPTY_TC
}
return &OrderPaymentRepository{transactionContext: transactionContext}, nil
return &ImInfoRepository{transactionContext: transactionContext}, nil
}
... ...
package repository
import (
"github.com/go-pg/pg/v10/orm"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg/models"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg/transaction"
. "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/utils"
)
type OrderBaseRepository struct {
transactionContext *transaction.TransactionContext
}
func (repository *OrderBaseRepository) Save(dm *domain.OrderBase) (*domain.OrderBase, error) {
var (
err error
m = &models.OrderBase{}
tx = repository.transactionContext.PgTx
)
if err = GobModelTransform(m, dm); err != nil {
return nil, err
}
if dm.Identify() == nil {
//if dm.Id, err = NewSnowflakeId(); err != nil {
// return dm, err
//}
//m.Id = dm.Id
if err = tx.Insert(m); err != nil {
return nil, err
}
return dm, nil
}
if err = tx.Update(m); err != nil {
return nil, err
}
return dm, nil
}
func (repository *OrderBaseRepository) Remove(OrderBase *domain.OrderBase) (*domain.OrderBase, error) {
var (
tx = repository.transactionContext.PgTx
OrderBaseModel = &models.OrderBase{Id: OrderBase.Identify().(int64)}
)
if _, err := tx.Model(OrderBaseModel).Where("id = ?", OrderBase.Id).Delete(); err != nil {
return OrderBase, err
}
return OrderBase, nil
}
func (repository *OrderBaseRepository) FindOne(queryOptions map[string]interface{}) (*domain.OrderBase, error) {
tx := repository.transactionContext.PgTx
OrderBaseModel := new(models.OrderBase)
query := NewQuery(tx.Model(OrderBaseModel), queryOptions)
query.ColumnExpr("order_base.*")
query.Relation("OrderGood", func(q *orm.Query) (*orm.Query, error) {
q.ColumnExpr("order_good.*")
q.Order("id")
return q, nil
})
query.SetWhere(`"order_base".id = ?`, "id")
query.SetWhere(`"order_base".order_code = ?`, "order_code")
if err := query.First(); err != nil {
return nil, query.HandleError(err, "没有此订单")
}
if OrderBaseModel.Id == 0 {
return nil, nil
}
return repository.transformPgModelToDomainModel(OrderBaseModel)
}
func (repository *OrderBaseRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.OrderBase, error) {
tx := repository.transactionContext.PgTx
var OrderBaseModels []*models.OrderBase
OrderBases := make([]*domain.OrderBase, 0)
query := NewQuery(tx.Model(&OrderBaseModels), queryOptions)
query.
SetWhere(`"order_base".partner_id= ?`, "partnerId").
SetWhere(`"order_base".order_type= ?`, "orderType").
SetWhere(`"order_base".create_time >= ?`, "beginTime").
SetWhere(`"order_base".create_time < ?`, "endTime").
//SetWhere(`"order_base".is_disable = ?`, "isDisable").
SetLimit().
SetOrder(`order_base.create_time`, "sortByCreateTime").
SetOrder(`order_base.update_time`, "sortByUpdateTime")
var err error
if query.AffectRow, err = query.SelectAndCount(); err != nil {
return 0, OrderBases, err
}
for _, OrderBaseModel := range OrderBaseModels {
if OrderBase, err := repository.transformPgModelToDomainModel(OrderBaseModel); err != nil {
return 0, OrderBases, err
} else {
OrderBases = append(OrderBases, OrderBase)
}
}
return int64(query.AffectRow), OrderBases, nil
}
func (repository *OrderBaseRepository) transformPgModelToDomainModel(OrderBaseModel *models.OrderBase) (*domain.OrderBase, error) {
m := &domain.OrderBase{}
err := GobModelTransform(m, OrderBaseModel)
return m, err
}
func NewOrderBaseRepository(transactionContext *transaction.TransactionContext) (*OrderBaseRepository, error) {
if transactionContext == nil {
return nil, ERR_EMPTY_TC
}
return &OrderBaseRepository{transactionContext: transactionContext}, nil
}
... ...
... ... @@ -7,14 +7,14 @@ import (
. "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/utils"
)
type OrderRepository struct {
type OrderGoodRepository struct {
transactionContext *transaction.TransactionContext
}
func (repository *OrderRepository) Save(dm *domain.Order) (*domain.Order, error) {
func (repository *OrderGoodRepository) Save(dm *domain.OrderGood) (*domain.OrderGood, error) {
var (
err error
m = &models.Order{}
m = &models.OrderGood{}
tx = repository.transactionContext.PgTx
)
if err = GobModelTransform(m, dm); err != nil {
... ... @@ -36,69 +36,66 @@ func (repository *OrderRepository) Save(dm *domain.Order) (*domain.Order, error)
return dm, nil
}
func (repository *OrderRepository) Remove(Order *domain.Order) (*domain.Order, error) {
func (repository *OrderGoodRepository) Remove(OrderGood *domain.OrderGood) (*domain.OrderGood, error) {
var (
tx = repository.transactionContext.PgTx
OrderModel = &models.Order{Id: Order.Identify().(int64)}
tx = repository.transactionContext.PgTx
OrderGoodModel = &models.OrderGood{Id: OrderGood.Identify().(int64)}
)
if _, err := tx.Model(OrderModel).Where("id = ?", Order.Id).Delete(); err != nil {
return Order, err
if _, err := tx.Model(OrderGoodModel).Where("id = ?", OrderGood.Id).Delete(); err != nil {
return OrderGood, err
}
return Order, nil
return OrderGood, nil
}
func (repository *OrderRepository) FindOne(queryOptions map[string]interface{}) (*domain.Order, error) {
func (repository *OrderGoodRepository) FindOne(queryOptions map[string]interface{}) (*domain.OrderGood, error) {
tx := repository.transactionContext.PgTx
OrderModel := new(models.Order)
query := NewQuery(tx.Model(OrderModel), queryOptions)
query.SetWhere(`"order".id = ?`, "id")
query.SetWhere(`"order".order_code = ?`, "orderCode")
OrderGoodModel := new(models.OrderGood)
query := NewQuery(tx.Model(OrderGoodModel), queryOptions)
query.SetWhere(`id = ?`, "id")
if err := query.First(); err != nil {
return nil, query.HandleError(err, "没有此订单")
}
if OrderModel.Id == 0 {
if OrderGoodModel.Id == 0 {
return nil, nil
}
return repository.transformPgModelToDomainModel(OrderModel)
return repository.transformPgModelToDomainModel(OrderGoodModel)
}
func (repository *OrderRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.Order, error) {
func (repository *OrderGoodRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.OrderGood, error) {
tx := repository.transactionContext.PgTx
var OrderModels []*models.Order
Orders := make([]*domain.Order, 0)
query := NewQuery(tx.Model(&OrderModels), queryOptions)
var OrderGoodModels []*models.OrderGood
OrderGoods := make([]*domain.OrderGood, 0)
query := NewQuery(tx.Model(&OrderGoodModels), queryOptions)
query.
SetWhere(`"order".partner_id= ?`, "partnerId").
SetWhere(`"order".order_type= ?`, "orderType").
SetWhere(`"order".order_status= ?`, "orderStatus").
SetWhere(`"order".create_at >= ?`, "beginTime").
SetWhere(`"order".create_at < ?`, "endTime").
SetWhere(`partner_id= ?`, "partnerId").
SetWhere(`create_at >= ?`, "beginTime").
SetWhere(`create_at < ?`, "endTime").
SetLimit().
SetOrder(`order.create_at`, "sortByCreateTime").
SetOrder(`order.update_at`, "sortByUpdateTime")
SetOrder(`create_at`, "sortByCreateTime").
SetOrder(`update_at`, "sortByUpdateTime")
var err error
if query.AffectRow, err = query.SelectAndCount(); err != nil {
return 0, Orders, err
return 0, OrderGoods, err
}
for _, OrderModel := range OrderModels {
if Order, err := repository.transformPgModelToDomainModel(OrderModel); err != nil {
return 0, Orders, err
for _, OrderGoodModel := range OrderGoodModels {
if OrderGood, err := repository.transformPgModelToDomainModel(OrderGoodModel); err != nil {
return 0, OrderGoods, err
} else {
Orders = append(Orders, Order)
OrderGoods = append(OrderGoods, OrderGood)
}
}
return int64(query.AffectRow), Orders, nil
return int64(query.AffectRow), OrderGoods, nil
}
func (repository *OrderRepository) transformPgModelToDomainModel(OrderModel *models.Order) (*domain.Order, error) {
m := &domain.Order{}
err := GobModelTransform(m, OrderModel)
func (repository *OrderGoodRepository) transformPgModelToDomainModel(OrderGoodModel *models.OrderGood) (*domain.OrderGood, error) {
m := &domain.OrderGood{}
err := GobModelTransform(m, OrderGoodModel)
return m, err
}
func NewOrderRepository(transactionContext *transaction.TransactionContext) (*OrderRepository, error) {
func NewOrderGoodRepository(transactionContext *transaction.TransactionContext) (*OrderGoodRepository, error) {
if transactionContext == nil {
return nil, ERR_EMPTY_TC
}
return &OrderRepository{transactionContext: transactionContext}, nil
return &OrderGoodRepository{transactionContext: transactionContext}, nil
}
... ...
package utils
import (
"fmt"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/constant"
)
//redis键值
func RedisKey(businessKey string) string {
//项目:环境:业务码
return fmt.Sprintf("%v:%v", constant.SERVICE_NAME, businessKey)
}
//redis键值 项标识
func RedisKeyWithId(businessKey string, id int64) string {
//项目:环境:业务码
return fmt.Sprintf("%v:%v:%v", constant.SERVICE_NAME, businessKey, id)
}
... ...
... ... @@ -103,18 +103,18 @@ func (this *AuthController) Revoke() {
defer func() {
this.Resp(msg)
}()
//var request *protocol.RevokeRequest
//if err := json.Unmarshal(this.ByteBody, &request); err != nil {
// log.Error(err)
// msg = protocol.BadRequestParam(1)
// return
//}
//if b, m := this.Valid(request); !b {
// msg = m
// return
//}
//header := controllers.GetRequestHeader(this.Ctx)
//msg = protocol.NewReturnResponse(auth.Revoke(header, request))
var request *protocol.RevokeRequest
if err := this.JsonUnmarshal(&request); err != nil {
log.Error(err)
msg = protocol.BadRequestParam(1)
return
}
if b, m := this.Valid(request); !b {
msg = m
return
}
header := this.GetRequestHeader(this.Ctx)
msg = protocol.NewReturnResponse(auth.Revoke(header, request))
}
//UpdateDevice
... ...
... ... @@ -25,7 +25,7 @@ func (this *DividendController) DividendStatistics() {
return
}
header := this.GetRequestHeader(this.Ctx)
msg = protocol.NewReturnResponse(dividend.DividendStatistics(header, request))
msg = protocol.NewReturnResponse(dividend.Statistics(header, request))
}
//DividendOrders 分红订单
... ... @@ -44,5 +44,5 @@ func (this *DividendController) DividendOrders() {
return
}
header := this.GetRequestHeader(this.Ctx)
msg = protocol.NewReturnResponse(dividend.DividendOrders(header, request))
msg = protocol.NewReturnResponse(dividend.OrderList(header, request))
}
... ...
... ... @@ -28,7 +28,7 @@ func (this *OrderController) Statistics() {
return
}
header := this.GetRequestHeader(this.Ctx)
msg = protocol.NewReturnResponse(order.OrderStatistics(header, request))
msg = protocol.NewReturnResponse(order.Statistics(header, request))
}
//OrderDetail 订单详情
... ... @@ -48,7 +48,7 @@ func (this *OrderController) OrderDetail() {
return
}
header := this.GetRequestHeader(this.Ctx)
msg = protocol.NewReturnResponse(order.OrderDetail(header, request))
msg = protocol.NewReturnResponse(order.Detail(header, request))
}
//OrderList
... ... @@ -68,7 +68,7 @@ func (this *OrderController) OrderList() {
}
request.OrderType = domain.OrderReal
header := this.GetRequestHeader(this.Ctx)
msg = protocol.NewReturnResponse(order.OrderList(header, request))
msg = protocol.NewReturnResponse(order.List(header, request))
}
//OrderList
... ... @@ -89,5 +89,5 @@ func (this *OrderController) Intentions() {
request.EndTime = time.Now().Unix() * 1000
request.OrderType = domain.OrderIntention
header := this.GetRequestHeader(this.Ctx)
msg = protocol.NewReturnResponse(order.OrderList(header, request))
msg = protocol.NewReturnResponse(order.List(header, request))
}
... ...
... ... @@ -29,6 +29,16 @@ func CheckJWTToken(ctx *context.Context) {
return
} else {
ctx.Input.SetData("UserId", u.UserId)
//valid token
//tokenAuth := userAuth.NewRedisUserAuth(userAuth.WithUserId(u.UserId))
//err := tokenAuth.Check(
// userAuth.NewOptions(userAuth.WithAccessToken(token)),
//)
//if err != nil {
// msg = protocol.NewMesage(4141)
// return
//}
}
return
}
... ...
... ... @@ -91,3 +91,17 @@ type AuthCheckSmsCodeRequest struct {
type AuthCheckSmsCodeResponse struct {
CaptchaCertificate string `json:"captchaCertificate"` //短信验证码通过凭证
}
/*CheckIm */
type CheckImRequest struct {
UserId int64
ImId string
Uname string
Icon string
CustomerImId string
IsCreated bool
}
type CheckImResponse struct {
ImToken string //net im token
CsAccount int64 //客服id
}
... ...
... ... @@ -19,13 +19,15 @@ type DividendStatisticsResponse struct {
type DividendStatistics struct {
Received float64 `json:"received"` //总已收分红
Outstanding float64 `json:"outstanding"` //总未收分红/分红支出
Receivable float64 `json:"receivable"` //总应收分红
Quarters []Bonus `json:"quarters"`
}
type Bonus struct {
Receivable float64 `json:"receivable"` //应收分红
Received float64 `json:"received"` //已收分红
Outstanding float64 `json:"outstanding"` //未收分红
Expend float64 `json:"expend"` //季度分红支出
Expend float64 `json:"-"` //季度分红支出
}
/*DividendOrders 分红订单*/
... ... @@ -44,8 +46,9 @@ type DividendOrdersResponse struct {
}
type DividendOrderListItem struct {
Id int64 `json:"id"`
OrderNo string `json:"orderNo"`
OrderAmount float64 `json:"orderAmount"`
MyDividend float64 `json:"myDividend"`
Id int64 `json:"id"`
OrderNo string `json:"-"`
DeliveryNo string `json:"deliveryNo"`
OrderAmount float64 `json:"orderAmount"`
DividendReceivable float64 `json:"dividendReceivable"`
}
... ...
... ... @@ -7,21 +7,34 @@ type OrderDetailRequest struct {
type OrderDetailResponse struct {
Order interface{} `json:"order"`
}
//type OrderDetail struct {
// Id int64 `json:"id"`
// OrderNo string `json:"orderNo"`
// OrderName string `json:"orderName"`
// OrderStatus int `json:"orderStatus"`
// CreateTime int64 `json:"createTime"`
// UpdateTime int64 `json:"updateTime"`
// OrderQuantity int `json:"orderQuantity"`
// OrderAmount float64 `json:"orderAmount"`
// OrderAmountCancel float64 `json:"orderAmountCancel"`
// OrderUpdateReason string `json:"orderUpdateReason"`
// OrderDistrict interface{} `json:"orderDistrict"`
// Customer Customer `json:"customer"`
// MyDividend float64 `json:"myDividend"`
// MyDividendPercent float64 `json:"myDividendPercent"`
//}
type OrderDetail struct {
Id int64 `json:"id"`
OrderNo string `json:"orderNo"`
OrderName string `json:"orderName"`
OrderStatus int `json:"orderStatus"`
CreateTime int64 `json:"createTime"`
UpdateTime int64 `json:"updateTime"`
OrderQuantity int `json:"orderQuantity"`
OrderAmount float64 `json:"orderAmount"`
OrderAmountCancel float64 `json:"orderAmountCancel"`
OrderUpdateReason string `json:"orderUpdateReason"`
OrderDistrict interface{} `json:"orderDistrict"`
Customer Customer `json:"customer"`
MyDividend float64 `json:"myDividend"`
MyDividendPercent float64 `json:"myDividendPercent"`
Id int64 `json:"id"`
OrderNo string `json:"orderNo"` //订单号
DeliveryNo string `json:"deliveryNo"` //发货单号
OrderStatus int `json:"orderStatus"` //订单状态 1.待支付 2.已支付 3.已支付退货 4待支付退货
CreateTime int64 `json:"createTime"`
UpdateTime int64 `json:"updateTime"`
OrderDistrict interface{} `json:"orderDistrict"`
Customer Customer `json:"customer"`
Products interface{} `json:"products"`
Total interface{} `json:"total"`
}
type Customer struct {
Uname string `json:"uname"`
... ... @@ -35,12 +48,12 @@ type OrderStatisticsResponse struct {
Statistics OrderStatics `json:"statistics"`
}
type OrderStatics struct {
TodayIntentionQuantity int `json:"todayIntentionQuantity"` //今日新增意向订单
TodayIntentionMoney float64 `json:"todayIntentionMoney"` //今日新增意向订单金额
TodayRealQuantity int `json:"todayRealQuantity"` //今日新增实发订单
TodayRealMoney float64 `json:"todayRealMoney"` //今日新增实发订单金额
CumulativeQuantity int `json:"cumulativeQuantity"` //累计实发订单
CumulativeMoney float64 `json:"cumulativeMoney"` //累计实发订单金额
TodayIntentionQuantity int `json:"-"` //今日新增意向订单
TodayIntentionMoney float64 `json:"-"` //今日新增意向订单金额
TodayRealQuantity int `json:"todayRealQuantity"` //今日新增实发订单
TodayRealMoney float64 `json:"todayRealMoney"` //今日新增实发订单金额
CumulativeQuantity int `json:"cumulativeQuantity"` //累计实发订单
CumulativeMoney float64 `json:"cumulativeMoney"` //累计实发订单金额
}
/*OrderList */
... ... @@ -54,7 +67,8 @@ type OrderListRequest struct {
}
type OrderListResponse struct {
List []*OrderListItem `json:"list"`
Statistics map[string]interface{} `json:"statistics"`
Statistics map[string]interface{} `json:"-"`
Total int `json:"total"`
}
type OrderListItem struct {
... ... @@ -63,18 +77,20 @@ type OrderListItem struct {
//订单类型
OrderType int `json:"orderType"`
//订单编号
OrderNo string `json:"orderNo"`
OrderNo string `json:"-"`
//发货编号
DeliveryNo string `json:"deliveryNo"`
//订单名称
OrderName string `json:"orderName"`
OrderName string `json:"-"`
//订单状态
OrderStatus int `json:"orderStatus"`
OrderStatus int `json:"-"`
//实际订单数量
OrderActualCount int `json:"orderActualCount"`
OrderActualCount int `json:"-"`
//订单金额
OrderAmount float64 `json:"orderAmount"`
UpdateTime int64 `json:"updateTime"`
//我的分红
MyDividend float64 `json:"myDividend"`
MyDividend float64 `json:"dividendReceivable"`
//是否已读(0未读,1已读)
IsRead int `json:"isRead"`
}
... ...
... ... @@ -28,6 +28,11 @@ type User struct {
//合作时间
CooperateTime int64 `json:"cooperationTime"`
Salesman interface{} `json:"salesman"`
// 网易云信
AccountID int64 `json:"accid"` // 网易云信ID
ImToken string `json:"imToken"` // 网易云信Token
CsAccountID string `json:"csAccountID"` // 分配的客服ID
}
type Company struct {
... ...