作者 tangxvhui

新增更新

@@ -50,3 +50,21 @@ func CreateOrderRepository(options map[string]interface{}) (domain.OrderReposito @@ -50,3 +50,21 @@ func CreateOrderRepository(options map[string]interface{}) (domain.OrderReposito
50 } 50 }
51 return repository.NewOrderRepository(transactionContext) 51 return repository.NewOrderRepository(transactionContext)
52 } 52 }
  53 +
  54 +//CreateOrderBaseRepository 订单信息
  55 +func CreateOrderBaseRepository(options map[string]interface{}) (domain.OrderBaseRepository, error) {
  56 + var transactionContext *transaction.TransactionContext
  57 + if value, ok := options["transactionContext"]; ok {
  58 + transactionContext = value.(*transaction.TransactionContext)
  59 + }
  60 + return repository.NewOrderBaseRepository(transactionContext)
  61 +}
  62 +
  63 +//CreateOrderGoodRepository 订单信息
  64 +func CreateOrderGoodRepository(options map[string]interface{}) (domain.OrderGoodRepository, error) {
  65 + var transactionContext *transaction.TransactionContext
  66 + if value, ok := options["transactionContext"]; ok {
  67 + transactionContext = value.(*transaction.TransactionContext)
  68 + }
  69 + return repository.NewOrderGoodRepository(transactionContext)
  70 +}
1 package query 1 package query
2 2
3 -//ListOrderQuery 获取用户列表 3 +//GetOrderQuery 获取订单详情
4 type GetOrderQuery struct { 4 type GetOrderQuery struct {
5 OrderId int64 `json:"orderId"` 5 OrderId int64 `json:"orderId"`
6 } 6 }
1 package query 1 package query
2 2
3 -//ListOrderQuery 获取用户列表 3 +//ListOrderQuery 获取订单列表
4 type ListOrderQuery struct { 4 type ListOrderQuery struct {
5 //合伙人id 5 //合伙人id
6 PartnerId int64 `json:"partnerId" ` 6 PartnerId int64 `json:"partnerId" `
  1 +package command
  2 +
  3 +type CreateOrderCommand struct {
  4 + //订单类型
  5 + OrderType int `json:"orderType"`
  6 + //订单编号
  7 + OrderCode string `json:"orderCode"`
  8 + //交货编号
  9 + DeliveryCode string `json:"deliveryCode"`
  10 + //买家
  11 + BuyerName string `json:"buyerName"`
  12 + //订单区域信息
  13 + OrderRegion string `json:"orderRegion"`
  14 + //订单对应的合伙人
  15 + PartnerId int64 `json:"partnerId"`
  16 + //业务员抽成比例
  17 + SalesmanBonusPercent float64 `json:"salesmanBonusPercent"`
  18 + //货品
  19 + Goods []OrderGoodData `json:"goods"`
  20 +}
  1 +package command
  2 +
  3 +type OrderGoodData struct {
  4 + //货品id
  5 + Id int64 `json:"id"`
  6 + //货品名称 长度可能较长
  7 + GoodName string `json:"goodName"`
  8 + //预计的货品数量
  9 + PlanGoodNumber int `json:"planGoodNumber"`
  10 + //调整后的货品数量
  11 + //业务判定时0是有效值,
  12 + //所以用空串表示无值,转换到数据库中为负值
  13 + UseGoodNumber int `json:"useGoodNumber"`
  14 + //货品单价
  15 + Price float64 `json:"price"`
  16 + //合伙人分红比例
  17 + PartnerBonusPercent float64 `json:"partnerBonusPercent"`
  18 + //分红支付状态
  19 + BonusStatus int `json:"bonusStatus"`
  20 + //备注信息
  21 + Remark string `json:"remark"`
  22 +}
  1 +package command
  2 +
  3 +type UpdateOrderCommand struct {
  4 + //订单类型
  5 + OrderType int `json:"orderType"`
  6 + //订单编号
  7 + OrderCode string `json:"orderCode"`
  8 + //交货编号
  9 + DeliveryCode string `json:"deliveryCode"`
  10 + //买家
  11 + BuyerName string `json:"buyerName"`
  12 + //订单区域信息
  13 + OrderRegion string `json:"orderRegion"`
  14 + //订单对应的合伙人
  15 + PartnerId int64 `json:"partnerId"`
  16 + //业务员抽成比例
  17 + SalesmanBonusPercent float64 `json:"salesmanBonusPercent"`
  18 + //货品
  19 + Goods []OrderGoodData `json:"goods"`
  20 +}
  1 +package query
  2 +
  3 +//GetOrderQuery 获取订单详情
  4 +type GetOrderQuery struct {
  5 + OrderId int64 `json:"orderId"`
  6 +}
  1 +package query
  2 +
  3 +//ListOrderQuery 获取用户列表
  4 +type ListOrderQuery struct {
  5 + //合伙人id
  6 + PartnerId int64 `json:"partnerId" `
  7 + //订单编号
  8 + OrderCode string `json:"order_code"`
  9 + // 查询偏离量
  10 + Offset int `json:"offset" `
  11 + // 查询限制
  12 + Limit int `json:"limit"`
  13 + //订单类型
  14 + OrderType int `json:"orderType"`
  15 +}
  1 +package service
  2 +
  3 +import (
  4 + "fmt"
  5 +
  6 + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/application/factory"
  7 + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/application/orderinfo/command"
  8 + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/application/orderinfo/query"
  9 + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/domain"
  10 + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/lib"
  11 +)
  12 +
  13 +//OrderService 管理员相关服务
  14 +type OrderInfoService struct {
  15 +}
  16 +
  17 +func NewOrderInfoService(option map[string]interface{}) *OrderInfoService {
  18 + newAdminUserService := new(OrderInfoService)
  19 + return newAdminUserService
  20 +}
  21 +
  22 +// PageListOrderBase 获取订单列表
  23 +func (service OrderInfoService) PageListOrderBase(listOrderQuery query.ListOrderQuery) ([]domain.OrderBase, int, error) {
  24 + transactionContext, err := factory.CreateTransactionContext(nil)
  25 + if err != nil {
  26 + return nil, 0, lib.ThrowError(lib.TRANSACTION_ERROR, err.Error())
  27 + }
  28 + var (
  29 + orderRepository domain.OrderBaseRepository
  30 + orders []domain.OrderBase
  31 + cnt int
  32 + )
  33 + if value, err := factory.CreateOrderBaseRepository(map[string]interface{}{
  34 + "transactionContext": transactionContext,
  35 + }); err != nil {
  36 + return nil, 0, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  37 + } else {
  38 + orderRepository = value
  39 + }
  40 + query := domain.OrderFindQuery{
  41 + PartnerId: listOrderQuery.PartnerId,
  42 + OrderCode: listOrderQuery.OrderCode,
  43 + Offset: listOrderQuery.Offset,
  44 + Limit: listOrderQuery.Limit,
  45 + OrderType: listOrderQuery.OrderType,
  46 + }
  47 + orders, cnt, err = orderRepository.Find(query)
  48 + if err != nil {
  49 + return nil, 0, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  50 + }
  51 + var PartnerInfoRepository domain.PartnerInfoRepository
  52 + if PartnerInfoRepository, err = factory.CreatePartnerInfoRepository(map[string]interface{}{
  53 + "transactionContext": transactionContext,
  54 + }); err != nil {
  55 + return nil, 0, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  56 + }
  57 + for i := range orders {
  58 + var partnerData *domain.PartnerInfo
  59 + partnerData, err = PartnerInfoRepository.FindOne(domain.PartnerFindOneQuery{
  60 + UserId: orders[i].PartnerId,
  61 + })
  62 + if err != nil {
  63 + return nil, 0, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  64 + }
  65 + orders[i].PartnerInfo = partnerData.Partner
  66 + }
  67 + return orders, cnt, nil
  68 +}
  69 +
  70 +//GetOrderDetail 获取订单详情
  71 +func (service OrderInfoService) GetOrderDetail(getOrderQuery query.GetOrderQuery) (*domain.OrderBase, error) {
  72 + //实际业务
  73 + transactionContext, err := factory.CreateTransactionContext(nil)
  74 + if err != nil {
  75 + return nil, lib.ThrowError(lib.TRANSACTION_ERROR, err.Error())
  76 + }
  77 + var (
  78 + orderBaseRepository domain.OrderBaseRepository
  79 + PartnerInfoRepository domain.PartnerInfoRepository
  80 + orderGoodRepository domain.OrderGoodRepository
  81 + order *domain.OrderBase
  82 + )
  83 + if err = transactionContext.StartTransaction(); err != nil {
  84 + return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  85 + }
  86 + defer func() {
  87 + transactionContext.RollbackTransaction()
  88 + }()
  89 + if value, err := factory.CreateOrderBaseRepository(map[string]interface{}{
  90 + "transactionContext": transactionContext,
  91 + }); err != nil {
  92 + return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  93 + } else {
  94 + orderBaseRepository = value
  95 + }
  96 + if PartnerInfoRepository, err = factory.CreatePartnerInfoRepository(map[string]interface{}{
  97 + "transactionContext": transactionContext,
  98 + }); err != nil {
  99 + return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  100 + }
  101 + if orderGoodRepository, err = factory.CreateOrderGoodRepository(map[string]interface{}{
  102 + "transactionContext": transactionContext,
  103 + }); err != nil {
  104 + return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  105 + }
  106 + order, err = orderBaseRepository.FindOne(domain.OrderFindOneQuery{
  107 + OrderId: getOrderQuery.OrderId,
  108 + })
  109 + if err != nil {
  110 + return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  111 + }
  112 + var (
  113 + partnerData *domain.PartnerInfo
  114 + goods []domain.OrderGood
  115 + )
  116 + partnerData, err = PartnerInfoRepository.FindOne(domain.PartnerFindOneQuery{UserId: order.PartnerInfo.Id})
  117 + if err != nil {
  118 + return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  119 + }
  120 + order.PartnerInfo = partnerData.Partner
  121 + goods, _, err = orderGoodRepository.Find(domain.OrderGoodFindQuery{
  122 + OrderId: order.Id,
  123 + })
  124 + if err != nil {
  125 + return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, fmt.Sprintf("获取订单中的商品列表失败:%s", err))
  126 + }
  127 + order.Goods = goods
  128 + err = transactionContext.CommitTransaction()
  129 + if err != nil {
  130 + return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  131 + }
  132 + return order, nil
  133 +}
  134 +
  135 +func (service OrderInfoService) CreateNewOrder(cmd command.CreateOrderCommand) (*domain.OrderBase, error) {
  136 + var (
  137 + transactionContext, _ = factory.CreateTransactionContext(nil)
  138 + err error
  139 + )
  140 +
  141 + if err = transactionContext.StartTransaction(); err != nil {
  142 + return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  143 + }
  144 + defer func() {
  145 + transactionContext.RollbackTransaction()
  146 + }()
  147 + // orderDao, _ := factory.CreateOrderDao(map[string]interface{}{"transactionContext": transactionContext})
  148 + // ok, err := orderDao.OrderCodeIsExist(command.OrderCode, 0)
  149 + // if err != nil {
  150 + // return lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  151 + // }
  152 + // if ok {
  153 + // return lib.ThrowError(lib.BUSINESS_ERROR, "订单编号已存在")
  154 + // }
  155 + var PartnerInfoRepository domain.PartnerInfoRepository
  156 + if PartnerInfoRepository, err = factory.CreatePartnerInfoRepository(map[string]interface{}{
  157 + "transactionContext": transactionContext,
  158 + }); err != nil {
  159 + return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  160 + }
  161 + var partnerData *domain.PartnerInfo
  162 + partnerData, err = PartnerInfoRepository.FindOne(domain.PartnerFindOneQuery{UserId: cmd.PartnerId})
  163 + if err != nil {
  164 + return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, fmt.Sprintf("检索合伙人数据失败"))
  165 + }
  166 + var (
  167 + orderBaseRepository domain.OrderBaseRepository
  168 + orderGoodRepository domain.OrderGoodRepository
  169 + )
  170 + if orderBaseRepository, err = factory.CreateOrderBaseRepository(map[string]interface{}{
  171 + "transactionContext": transactionContext,
  172 + }); err != nil {
  173 + return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  174 + }
  175 + if orderGoodRepository, err = factory.CreateOrderGoodRepository(map[string]interface{}{
  176 + "transactionContext": transactionContext,
  177 + }); err != nil {
  178 + return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  179 + }
  180 + newOrder := &domain.OrderBase{
  181 + OrderType: cmd.OrderType, OrderCode: cmd.OrderCode,
  182 + DeliveryCode: "",
  183 + Buyer: &domain.Buyer{
  184 + BuyerName: cmd.BuyerName,
  185 + },
  186 + RegionInfo: &domain.RegionInfo{
  187 + RegionName: cmd.OrderRegion,
  188 + },
  189 + PartnerId: cmd.PartnerId,
  190 + PartnerInfo: partnerData.Partner,
  191 + SalesmanBonusPercent: cmd.SalesmanBonusPercent,
  192 + }
  193 + var orderGoods []domain.OrderGood
  194 + for _, good := range cmd.Goods {
  195 + m := domain.NewOrderGood()
  196 + m.OrderId = newOrder.Id
  197 + m.GoodName = good.GoodName
  198 + m.PlanGoodNumber = good.PlanGoodNumber
  199 + m.Price = good.Price
  200 + m.PartnerBonusPercent = good.PartnerBonusPercent
  201 + m.Remark = good.Remark
  202 + err = m.Compute()
  203 + if err != nil {
  204 + return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, fmt.Sprintf("核算订单中商品的数值失败:%s", err))
  205 + }
  206 + orderGoods = append(orderGoods, m)
  207 + }
  208 + newOrder.Goods = orderGoods
  209 + err = newOrder.Compute()
  210 + if err != nil {
  211 + return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, fmt.Sprintf("核算订单中合计的数值失败:%s", err))
  212 + }
  213 + err = orderBaseRepository.Save(newOrder)
  214 + if err != nil {
  215 + return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, fmt.Sprintf("保存订单数据失败:%s", err))
  216 + }
  217 + err = orderGoodRepository.Save(orderGoods)
  218 + if err != nil {
  219 + return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, fmt.Sprintf("保存订单中的商品数据失败:%s", err))
  220 + }
  221 + newOrder.Goods = orderGoods
  222 + err = transactionContext.CommitTransaction()
  223 + if err != nil {
  224 + return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  225 + }
  226 + return newOrder, nil
  227 +}
  228 +
  229 +//DeleteOrder 删除订单
  230 +func (service OrderInfoService) DeleteOrder(orderId int64) error {
  231 + var (
  232 + transactionContext, _ = factory.CreateTransactionContext(nil)
  233 + err error
  234 + )
  235 + if err = transactionContext.StartTransaction(); err != nil {
  236 + return lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  237 + }
  238 + defer func() {
  239 + transactionContext.RollbackTransaction()
  240 + }()
  241 + var (
  242 + orderBaseRepository domain.OrderBaseRepository
  243 + orderGoodRepository domain.OrderGoodRepository
  244 + )
  245 + if orderBaseRepository, err = factory.CreateOrderBaseRepository(map[string]interface{}{
  246 + "transactionContext": transactionContext,
  247 + }); err != nil {
  248 + return lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  249 + }
  250 + if orderGoodRepository, err = factory.CreateOrderGoodRepository(map[string]interface{}{
  251 + "transactionContext": transactionContext,
  252 + }); err != nil {
  253 + return lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  254 + }
  255 + err = orderBaseRepository.Remove(orderId)
  256 + if err != nil {
  257 + return lib.ThrowError(lib.INTERNAL_SERVER_ERROR, fmt.Sprintf("删除订单数据失败:%s", err))
  258 + }
  259 + err = orderGoodRepository.Remove(orderId)
  260 + if err != nil {
  261 + return lib.ThrowError(lib.INTERNAL_SERVER_ERROR, fmt.Sprintf("删除订单中商品数据失败:%s", err))
  262 + }
  263 + err = transactionContext.CommitTransaction()
  264 + if err != nil {
  265 + return lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error())
  266 + }
  267 + return nil
  268 +}
@@ -12,21 +12,6 @@ const ( @@ -12,21 +12,6 @@ const (
12 OrderStatusDeliverAll //全部发货 12 OrderStatusDeliverAll //全部发货
13 ) 13 )
14 14
15 -const (  
16 - OrderReal = iota + 1 //实发订单  
17 - OrderIntention //意向订单  
18 -)  
19 -  
20 -//买家  
21 -type Buyer struct {  
22 - //买家姓名  
23 - BuyerName string `json:"buyerName"`  
24 - //联系方式  
25 - ContactInfo string `json:"contactInfo"`  
26 - //收获地址  
27 - ShippingAddress string `json:"shippingAddress"`  
28 -}  
29 -  
30 type Order struct { 15 type Order struct {
31 Id int64 `json:"id"` 16 Id int64 `json:"id"`
32 //订单类型 17 //订单类型
@@ -157,11 +142,12 @@ type OrderFindOneQuery struct { @@ -157,11 +142,12 @@ type OrderFindOneQuery struct {
157 } 142 }
158 143
159 type OrderFindQuery struct { 144 type OrderFindQuery struct {
160 - PartnerId int64  
161 - OrderCode string  
162 - Offset int  
163 - Limit int  
164 - OrderType int 145 + PartnerId int64
  146 + OrderCode string
  147 + DeliveryCode string
  148 + Offset int
  149 + Limit int
  150 + OrderType int
165 } 151 }
166 152
167 type OrderRepository interface { 153 type OrderRepository interface {
  1 +package domain
  2 +
  3 +import (
  4 + "time"
  5 +
  6 + "github.com/shopspring/decimal"
  7 +)
  8 +
  9 +const (
  10 + OrderReal = iota + 1 //实发订单
  11 + OrderIntention //意向订单
  12 +)
  13 +
  14 +//买家
  15 +type Buyer struct {
  16 + //买家姓名
  17 + BuyerName string `json:"buyerName"`
  18 + //联系方式
  19 + ContactInfo string `json:"contactInfo"`
  20 + //收获地址
  21 + ShippingAddress string `json:"shippingAddress"`
  22 +}
  23 +
  24 +//OrderBase 订单基础
  25 +type OrderBase struct {
  26 + //表id
  27 + Id int64 `json:"id"`
  28 + //订单类型
  29 + OrderType int `json:"orderType"`
  30 + //订单编号
  31 + OrderCode string `json:"orderCode"`
  32 + //交货编号
  33 + DeliveryCode string `json:"deliveryCode"`
  34 + //买家
  35 + Buyer *Buyer `json:"buyer"`
  36 + //订单区域信息
  37 + RegionInfo *RegionInfo `json:"regionInfo"`
  38 + //订单对应的合伙人
  39 + PartnerId int64 `json:"partnerId"`
  40 + PartnerInfo Partner `json:"partnerInfo"`
  41 + //业务员抽成比例
  42 + SalesmanBonusPercent float64 `json:"salesmanBonusPercent"`
  43 + //订单的创建时间
  44 + CreateTime time.Time `json:"createTime"`
  45 + //发货时间
  46 + DeliveryTime time.Time `json:"deliveryTime"`
  47 + //更新时间
  48 + UpdateTime time.Time `json:"updateTime"`
  49 + //货品
  50 + Goods []OrderGood `json:"goods"`
  51 + //核算订单相关数据
  52 + OrderCompute OrderCompute `json:"orderCompute"`
  53 +}
  54 +
  55 +type OrderCompute struct {
  56 + //合伙人应收分红
  57 + PlanPartnerBonus float64 `json:"planPartnerBonus"`
  58 + //调整后的合伙人应收分红 (初始值=-1);
  59 + //业务判定时0是有效值,
  60 + //所以用空串表示无值,转换到数据库中为负值
  61 + UsePartnerBonus float64 `json:"usePartnerBonus"`
  62 + //合伙人已收分红
  63 + PartnerBonusHas float64 `json:"partnerBonusHas"`
  64 + //合伙人未收分红
  65 + PartnerBonusNot float64 `json:"partnerBonusNot"`
  66 + //合伙人分红支出
  67 + PartnerBonusExpense float64 `json:"partnerBonusExpense"`
  68 + //业务员抽成
  69 + SalesmanBonus float64 `json:"salesmanBonus"`
  70 + //预计的订单内货品总数
  71 + PlanOrderCount int `json:"planOrderCount"`
  72 + //预计的订单的总金额
  73 + PlanOrderAmount float64 `json:"planOrderAmount"`
  74 + //按需使用的订单内货品总数 (初始值=-1)
  75 + //业务判定时0是有效值,
  76 + //所以用空串表示无值,转换到数据库中为负值
  77 + UseOrderCount int `json:"useOrderCount"`
  78 + //按需使用的订单内货总金额 (初始值=-1)
  79 + //业务判定时0是有效值,
  80 + //所以用空串表示无值,转换到数据库中为负值
  81 + UseOrderAmount float64 `json:"useOrderAmount"`
  82 +}
  83 +
  84 +//Compute 数据汇总核算
  85 +func (order *OrderBase) Compute() error {
  86 + planPartnerBonus := decimal.NewFromFloat(0)
  87 + planOrderAmount := decimal.NewFromFloat(0)
  88 + var (
  89 + planOrderCount int = 0
  90 + useOrderCount int = 0
  91 + HasUseOrderCount bool = false
  92 + )
  93 + usePartnerBonus := decimal.NewFromFloat(0)
  94 + var hasUsePartnerBonus bool = false
  95 + useOrderAmount := decimal.NewFromFloat(0)
  96 + var hasUseOrderAmount bool = false
  97 + partnerBonusHas := decimal.NewFromFloat(0)
  98 + partnerBonusNot := decimal.NewFromFloat(0)
  99 + partnerBonusExpense := decimal.NewFromFloat(0)
  100 + //统计所以货品的值
  101 + for i := range order.Goods {
  102 + planPartnerBonus.Add(decimal.NewFromFloat(order.Goods[i].GoodCompute.PlanPartnerBonus))
  103 + planOrderAmount.Add(decimal.NewFromFloat(order.Goods[i].GoodCompute.PlanAmount))
  104 + planOrderCount += order.Goods[i].PlanGoodNumber
  105 + //调整值 非负值得情况
  106 + goodUseAmount := decimal.NewFromFloat(order.Goods[i].GoodCompute.UseAmount)
  107 + if goodUseAmount.GreaterThanOrEqual(decimal.NewFromFloat(0)) {
  108 + hasUseOrderAmount = true
  109 + useOrderAmount.Add(goodUseAmount)
  110 + }
  111 + goodUsePartnerBonus := decimal.NewFromFloat(order.Goods[i].GoodCompute.UsePartnerBonus)
  112 + if goodUsePartnerBonus.GreaterThanOrEqual(decimal.NewFromFloat(0)) {
  113 + hasUsePartnerBonus = true
  114 + usePartnerBonus.Add(goodUsePartnerBonus)
  115 + }
  116 + if order.Goods[i].UseGoodNumber >= 0 {
  117 + HasUseOrderCount = true
  118 + useOrderCount += order.Goods[i].UseGoodNumber
  119 + }
  120 + partnerBonusHas.Add(decimal.NewFromFloat(order.Goods[i].GoodCompute.PartnerBonusHas))
  121 + partnerBonusNot.Add(decimal.NewFromFloat(order.Goods[i].GoodCompute.PartnerBonusNot))
  122 + partnerBonusExpense.Add(decimal.NewFromFloat(order.Goods[i].GoodCompute.PartnerBonusExpense))
  123 + }
  124 + //汇总赋值
  125 + order.OrderCompute.PartnerBonusExpense, _ = partnerBonusExpense.Round(2).Float64()
  126 + order.OrderCompute.PartnerBonusHas, _ = partnerBonusHas.Round(2).Float64()
  127 + order.OrderCompute.PartnerBonusNot, _ = partnerBonusNot.Round(2).Float64()
  128 + if hasUsePartnerBonus {
  129 +
  130 + } else {
  131 +
  132 + }
  133 + if hasUseOrderAmount {
  134 +
  135 + } else {
  136 +
  137 + }
  138 + if HasUseOrderCount {
  139 +
  140 + } else {
  141 +
  142 + }
  143 + return nil
  144 +}
  145 +
  146 +type OrderBaseFindOneQuery struct {
  147 + OrderId int64
  148 +}
  149 +
  150 +type OrderBaseFindQuery struct {
  151 + PartnerId int64
  152 + OrderCode string
  153 + Offset int
  154 + Limit int
  155 + OrderType int
  156 +}
  157 +
  158 +type OrderBaseRepository interface {
  159 + Save(order *OrderBase) error
  160 + FindOne(qureyOptions OrderFindOneQuery) (*OrderBase, error)
  161 + Find(queryOptions OrderFindQuery) ([]OrderBase, int, error)
  162 + Remove(id int64) error
  163 +}
  1 +package domain
  2 +
  3 +import (
  4 + "errors"
  5 +
  6 + "github.com/shopspring/decimal"
  7 +)
  8 +
  9 +//分红状态
  10 +type OrderGoodBonusStatus interface {
  11 + //状态变更为待支付
  12 + WartPayPartnerBonus(orderGood *OrderGood) error
  13 + //状态变更为已支付
  14 + PayPartnerBonus(orderGood *OrderGood) error
  15 +}
  16 +
  17 +//货单的支付状态
  18 +const (
  19 + //待支付
  20 + OrderGoodWaitPay int = 1
  21 + //已支付
  22 + OrderGoodHasPay int = 2
  23 +)
  24 +
  25 +//OrderGood 订单中的货品
  26 +type OrderGood struct {
  27 + //货品id
  28 + Id int64 `json:"id"`
  29 + //所属订单id
  30 + OrderId int64 `json:"orderId"`
  31 + //货品名称 长度可能较长
  32 + GoodName string `json:"goodName"`
  33 + //预计的货品数量
  34 + PlanGoodNumber int `json:"planGoodNumber"`
  35 + //调整后的货品数量
  36 + //业务判定时0是有效值,
  37 + //所以用空串表示无值,转换到数据库中为负值
  38 + UseGoodNumber int `json:"useGoodNumber"`
  39 + //货品单价
  40 + Price float64 `json:"price"`
  41 + //合伙人分红比例
  42 + PartnerBonusPercent float64 `json:"partnerBonusPercent"`
  43 + //分红支付状态
  44 + BonusStatus int `json:"bonusStatus"`
  45 + //备注信息
  46 + Remark string `json:"remark"`
  47 + //当前分红支付状态
  48 + CurrentBonusStatus OrderGoodBonusStatus `json:"-"`
  49 + ///核算订单相关数据
  50 + GoodCompute GoodCompute `json:"goodCompute"`
  51 +}
  52 +
  53 +type GoodCompute struct {
  54 + //预计的货品总额
  55 + PlanAmount float64 `json:"planAmount"`
  56 + //调整后的货品总额 (初始值=-1)
  57 + //业务判定时0是有效值,
  58 + //所以用空串表示无值,转换到数据库中为负值
  59 + UseAmount float64 `json:"useAmount"`
  60 + //预计的合伙人分红
  61 + PlanPartnerBonus float64 `json:"planPartnerBonus"`
  62 + //合伙人应收分红调整 (初始值=-1),
  63 + //业务判定时0是有效值,
  64 + //所以用空串表示无值,转换到数据库中为负值
  65 + UsePartnerBonus float64 `json:"usePartnerBonus"`
  66 + //合伙人已收分红
  67 + PartnerBonusHas float64 `json:"partnerBonusHas"`
  68 + //合伙人未收分红
  69 + PartnerBonusNot float64 `json:"partnerBonusNot"`
  70 + //合伙人分红支出
  71 + PartnerBonusExpense float64 `json:"partnerBonusExpense"`
  72 +}
  73 +
  74 +//OrderGoodBonusWaitPay 货品分红待支付
  75 +type OrderGoodBonusWaitPay struct{}
  76 +
  77 +var _ OrderGoodBonusStatus = (*OrderGoodBonusWaitPay)(nil)
  78 +
  79 +//OrderGoodBonusHasPay 货品分红已支付
  80 +type OrderGoodBonusHasPay struct{}
  81 +
  82 +var _ OrderGoodBonusStatus = (*OrderGoodBonusHasPay)(nil)
  83 +
  84 +func (waitPay OrderGoodBonusWaitPay) PayPartnerBonus(good *OrderGood) error {
  85 + good.GoodCompute.PartnerBonusExpense = 0
  86 + good.GoodCompute.PartnerBonusHas = 0
  87 + //初始状态为待支付时 ,合伙人未收分红等于合伙人应收分红(或者调整的)
  88 + if good.UseGoodNumber < 0 {
  89 + good.GoodCompute.PartnerBonusNot = good.GoodCompute.PlanPartnerBonus
  90 + } else {
  91 + good.GoodCompute.PartnerBonusNot = good.GoodCompute.UsePartnerBonus
  92 + }
  93 + return nil
  94 +}
  95 +
  96 +func (waitPay OrderGoodBonusWaitPay) WartPayPartnerBonus(good *OrderGood) error {
  97 + //待支付状态转支付时 ,合伙人已收收分红等于合伙人应收分红(或者调整的)
  98 + if good.GoodCompute.UsePartnerBonus < 0 {
  99 + good.GoodCompute.PartnerBonusHas = good.GoodCompute.PlanPartnerBonus
  100 + } else {
  101 + good.GoodCompute.PartnerBonusHas = good.GoodCompute.UsePartnerBonus
  102 + }
  103 + good.GoodCompute.PartnerBonusExpense = 0
  104 + return nil
  105 +}
  106 +
  107 +func (hasPay OrderGoodBonusHasPay) PayPartnerBonus(good *OrderGood) error {
  108 + //已支付的值保持不变
  109 + //未支付的值保持不变
  110 + //计算分红支出
  111 + //分红支出=应收分红(有出现调整,则取调整后的应收分红)和已收分红的差额
  112 + if good.UseGoodNumber >= 0 {
  113 + good.GoodCompute.PartnerBonusExpense = good.GoodCompute.PartnerBonusHas - good.GoodCompute.UsePartnerBonus
  114 + }
  115 + return nil
  116 +}
  117 +
  118 +func (hasPay OrderGoodBonusHasPay) WartPayPartnerBonus(good *OrderGood) error {
  119 + return errors.New("已支付的货单不能将状态回退为待支付")
  120 +}
  121 +
  122 +//NewOrderGood 初始值设定
  123 +func NewOrderGood() OrderGood {
  124 + return OrderGood{
  125 + UseGoodNumber: -1,
  126 + BonusStatus: OrderGoodWaitPay,
  127 + GoodCompute: GoodCompute{
  128 + UsePartnerBonus: -1,
  129 + UseAmount: -1,
  130 + },
  131 + CurrentBonusStatus: OrderGoodBonusWaitPay{},
  132 + }
  133 +}
  134 +
  135 +//Compute 数据汇总核算
  136 +func (good *OrderGood) Compute() error {
  137 + price := decimal.NewFromInt(int64(good.PlanGoodNumber))
  138 + planamount := price.Mul(decimal.NewFromInt(int64(good.PlanGoodNumber))) //price*planGoodNumber
  139 + //price*useGoodNumber
  140 + planPartnerBonus := planamount.Mul(decimal.NewFromFloat(good.PartnerBonusPercent)) //price*planGoodNumber*PartnerBonusPercent
  141 +
  142 + good.GoodCompute.PlanAmount, _ = planamount.Round(2).Float64()
  143 + good.GoodCompute.PlanPartnerBonus, _ = planPartnerBonus.Round(2).Float64()
  144 + if good.UseGoodNumber < 0 {
  145 + //没有出现数量调整
  146 + good.GoodCompute.UsePartnerBonus = -1
  147 + good.GoodCompute.UseAmount = -1
  148 + } else {
  149 + useamount := price.Mul(decimal.NewFromInt(int64(good.UseGoodNumber))) //price*useGoodNumber/price*useGoodNumber
  150 + usePartnerBonus := useamount.Mul(decimal.NewFromFloat(good.PartnerBonusPercent)) //price*useGoodNumber*PartnerBonusPercent
  151 + good.GoodCompute.UsePartnerBonus, _ = usePartnerBonus.Round(2).Float64()
  152 + good.GoodCompute.UseAmount, _ = useamount.Round(2).Float64()
  153 + }
  154 +
  155 + return nil
  156 +}
  157 +
  158 +type OrderGoodFindQuery struct {
  159 + OrderId int64
  160 + Offset int
  161 + Limit int
  162 +}
  163 +
  164 +type OrderGoodRepository interface {
  165 + Save(order []OrderGood) error
  166 + Find(queryOptions OrderGoodFindQuery) ([]OrderGood, int, error)
  167 + Remove(orderid int64, ids ...int64) error
  168 +}
  1 +package models
  2 +
  3 +import (
  4 + "context"
  5 + "time"
  6 +
  7 + "github.com/go-pg/pg/v10"
  8 + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/domain"
  9 +)
  10 +
  11 +//OrderBase 订单基础
  12 +type OrderBase struct {
  13 + tableName struct{} `pg:"order_base"`
  14 + //表id
  15 + Id int64 `pg:",pk"`
  16 + //订单类型
  17 + OrderType int
  18 + //订单编号
  19 + OrderCode string
  20 + //交货编号
  21 + DeliveryCode string
  22 + //买家
  23 + Buyer *domain.Buyer
  24 + //订单区域信息
  25 + RegionInfo *domain.RegionInfo
  26 + //订单对应的合伙人
  27 + PartnerId int64
  28 + //业务员抽成比例
  29 + SalesmanBonusPercent float64
  30 + //业务员抽成
  31 + SalesmanBonus float64
  32 + //预计的订单内货品总数
  33 + PlanOrderCount int
  34 + //预计的订单的总金额
  35 + PlanOrderAmount float64
  36 + //按需使用的订单内货品总数 (初始值=-1)
  37 + //业务判定时0是有效值,负值无效
  38 + UseOrderCount int
  39 + //按需使用的订单内货总金额 (初始值=-1)
  40 + //业务判定时0是有效值,负值无效
  41 + UseOrderAmount float64
  42 + //订单的创建时间
  43 + CreateTime time.Time
  44 + //发货时间
  45 + DeliveryTime time.Time
  46 + //更新时间
  47 + UpdateTime time.Time
  48 + //合伙人应收分红
  49 + PlanPartnerBonus float64
  50 + //调整后的合伙人应收分红 (初始值=-1);
  51 + //业务判定时0是有效值,负值无效
  52 + UsePartnerBonus float64
  53 + //合伙人已收分红
  54 + PartnerBonusHas float64
  55 + //合伙人未收分红
  56 + PartnerBonusNot float64
  57 + //合伙人分红支出
  58 + PartnerBonusExpense float64
  59 +}
  60 +
  61 +var _ pg.BeforeUpdateHook = (*OrderBase)(nil)
  62 +
  63 +func (or *OrderBase) BeforeUpdate(ctx context.Context) (context.Context, error) {
  64 + or.UpdateTime = time.Now()
  65 + return ctx, nil
  66 +}
  67 +
  68 +var _ pg.BeforeInsertHook = (*OrderBase)(nil)
  69 +
  70 +func (or *OrderBase) BeforeInsert(ctx context.Context) (context.Context, error) {
  71 + or.CreateTime = time.Now()
  72 + or.UpdateTime = time.Now()
  73 + return ctx, nil
  74 +}
  1 +package models
  2 +
  3 +//OrderGood 订单中的货品
  4 +type OrderGood struct {
  5 + tableName struct{} `pg:"order_good"`
  6 + //货品id
  7 + Id int64
  8 + //所属订单id
  9 + OrderId int64
  10 + //货品名称 长度可能较长
  11 + GoodName string
  12 + //预计的货品数量
  13 + PlanGoodNumber int
  14 + //货品单价
  15 + Price float64
  16 + //预计的货品总额
  17 + PlanAmount float64
  18 + //调整后的货品数量(初始值=-1)
  19 + //业务判定时0是有效值,负值无效
  20 + UseGoodNumber int
  21 + //调整后的货品总额
  22 + UseAmount float64
  23 + //合伙人分红比例
  24 + PartnerBonusPercent float64
  25 + //预计的合伙人分红
  26 + PlanPartnerBonus float64
  27 + //合伙人应收分红调整 (初始值=-1)
  28 + ////业务判定时0是有效值,负值无效
  29 + UsePartnerBonus float64
  30 + //合伙人已收分红
  31 + PartnerBonusHas float64
  32 + //合伙人未收分红
  33 + PartnerBonusNot float64
  34 + //合伙人分红支出
  35 + PartnerBonusExpense float64
  36 + //分红状态
  37 + BonusStatus int
  38 + //备注信息
  39 + Remark string
  40 +}
  1 +package repository
  2 +
  3 +import (
  4 + "fmt"
  5 +
  6 + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/pg/models"
  8 + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/pg/transaction"
  9 +)
  10 +
  11 +type OrderBaseRepository struct {
  12 + transactionContext *transaction.TransactionContext
  13 +}
  14 +
  15 +var (
  16 + _ domain.OrderBaseRepository = (*OrderBaseRepository)(nil)
  17 +)
  18 +
  19 +func NewOrderBaseRepository(transactionContext *transaction.TransactionContext) (*OrderBaseRepository, error) {
  20 + if transactionContext == nil {
  21 + return nil, fmt.Errorf("transactionContext参数不能为nil")
  22 + }
  23 + return &OrderBaseRepository{transactionContext: transactionContext}, nil
  24 +}
  25 +
  26 +func (reponsitory OrderBaseRepository) transformPgModelToDomainModel(orderModel *models.OrderBase) (order domain.OrderBase, err error) {
  27 + order = domain.OrderBase{
  28 + Id: orderModel.Id, OrderType: orderModel.OrderType, OrderCode: orderModel.OrderCode,
  29 + DeliveryCode: orderModel.DeliveryCode, Buyer: orderModel.Buyer, RegionInfo: orderModel.RegionInfo,
  30 + PartnerId: orderModel.PartnerId, SalesmanBonusPercent: orderModel.SalesmanBonusPercent,
  31 + CreateTime: orderModel.CreateTime, DeliveryTime: orderModel.DeliveryTime, UpdateTime: orderModel.UpdateTime,
  32 + OrderCompute: domain.OrderCompute{
  33 + PlanPartnerBonus: orderModel.PlanPartnerBonus, UsePartnerBonus: orderModel.UsePartnerBonus,
  34 + PartnerBonusHas: orderModel.PartnerBonusHas, PartnerBonusNot: orderModel.PartnerBonusNot,
  35 + PartnerBonusExpense: orderModel.PartnerBonusExpense, SalesmanBonus: orderModel.SalesmanBonus,
  36 + PlanOrderCount: orderModel.PlanOrderCount, PlanOrderAmount: orderModel.PlanOrderAmount,
  37 + UseOrderCount: orderModel.UseOrderCount, UseOrderAmount: orderModel.UseOrderAmount,
  38 + },
  39 + }
  40 + return order, nil
  41 +}
  42 +
  43 +func (repository OrderBaseRepository) Save(orderInfo *domain.OrderBase) error {
  44 + var (
  45 + err error
  46 + tx = repository.transactionContext.PgTx
  47 + )
  48 + m := &models.OrderBase{
  49 + Id: orderInfo.Id, OrderType: orderInfo.OrderType, OrderCode: orderInfo.OrderCode,
  50 + DeliveryCode: orderInfo.DeliveryCode, Buyer: orderInfo.Buyer, RegionInfo: orderInfo.RegionInfo,
  51 + PartnerId: orderInfo.PartnerId, SalesmanBonusPercent: orderInfo.SalesmanBonusPercent,
  52 + SalesmanBonus: orderInfo.OrderCompute.SalesmanBonus, PlanOrderCount: orderInfo.OrderCompute.PlanOrderCount,
  53 + PlanOrderAmount: orderInfo.OrderCompute.PlanOrderAmount, UseOrderCount: orderInfo.OrderCompute.UseOrderCount,
  54 + UseOrderAmount: orderInfo.OrderCompute.UseOrderAmount, DeliveryTime: orderInfo.DeliveryTime,
  55 + PlanPartnerBonus: orderInfo.OrderCompute.PlanPartnerBonus, UsePartnerBonus: orderInfo.OrderCompute.UsePartnerBonus,
  56 + PartnerBonusHas: orderInfo.OrderCompute.PartnerBonusHas, PartnerBonusNot: orderInfo.OrderCompute.PartnerBonusNot,
  57 + PartnerBonusExpense: orderInfo.OrderCompute.PartnerBonusExpense,
  58 + }
  59 + if m.Id == 0 {
  60 + _, err = tx.Model(m).
  61 + Returning("*").
  62 + Insert()
  63 + orderInfo.Id = m.Id
  64 + orderInfo.CreateTime = m.CreateTime
  65 + orderInfo.UpdateTime = m.UpdateTime
  66 + } else {
  67 + _, err = tx.Model(m).
  68 + WherePK().
  69 + Returning("*").
  70 + Update()
  71 + orderInfo.UpdateTime = m.UpdateTime
  72 + }
  73 + return err
  74 +}
  75 +
  76 +func (repository OrderBaseRepository) Find(queryOption domain.OrderFindQuery) ([]domain.OrderBase, int, error) {
  77 + db := repository.transactionContext.PgDd
  78 + orderModels := []models.OrderBase{}
  79 + query := db.Model(&orderModels)
  80 + if queryOption.PartnerId > 0 {
  81 + query = query.Where("partner_id=?", queryOption.PartnerId)
  82 + }
  83 + if len(queryOption.OrderCode) > 0 {
  84 + query = query.Where("order_code like ?", "%"+queryOption.OrderCode+"%")
  85 + }
  86 + if len(queryOption.DeliveryCode) > 0 {
  87 + query = query.Where("delivery_code like ?", "%"+queryOption.DeliveryCode+"%")
  88 + }
  89 + if queryOption.OrderType > 0 {
  90 + query = query.Where("order_type=?", queryOption.OrderType)
  91 + }
  92 + if queryOption.Offset > -1 {
  93 + query = query.Offset(queryOption.Offset)
  94 + }
  95 + if queryOption.Limit > 0 {
  96 + query = query.Limit(queryOption.Limit)
  97 + } else {
  98 + query = query.Limit(20)
  99 + }
  100 + var (
  101 + err error
  102 + ordersReturn = make([]domain.OrderBase, 0)
  103 + )
  104 + query = query.Order("order_base.id DESC")
  105 + count, err := query.SelectAndCount()
  106 + if err != nil {
  107 + return ordersReturn, 0, err
  108 + }
  109 + for i := range orderModels {
  110 + domainOrder, err := repository.transformPgModelToDomainModel(&orderModels[i])
  111 + if err != nil {
  112 + return ordersReturn, 0, err
  113 + }
  114 + ordersReturn = append(ordersReturn, domainOrder)
  115 + }
  116 + return ordersReturn, count, nil
  117 +}
  118 +
  119 +func (repository OrderBaseRepository) FindOne(qureyOptions domain.OrderFindOneQuery) (*domain.OrderBase, error) {
  120 + var (
  121 + err error
  122 + tx = repository.transactionContext.PgDd
  123 + )
  124 + m := new(models.OrderBase)
  125 + err = tx.Model(m).
  126 + Where("id=?", qureyOptions.OrderId).
  127 + First()
  128 + if err != nil {
  129 + return nil, err
  130 + }
  131 + result, err := repository.transformPgModelToDomainModel(m)
  132 + return &result, err
  133 +}
  134 +
  135 +func (repository OrderBaseRepository) Remove(id int64) error {
  136 + var (
  137 + err error
  138 + tx = repository.transactionContext.PgTx
  139 + )
  140 + m := &models.OrderBase{
  141 + Id: id,
  142 + }
  143 + _, err = tx.Model(m).WherePK().Delete()
  144 + return err
  145 +}
  1 +package repository
  2 +
  3 +import (
  4 + "fmt"
  5 +
  6 + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/pg/models"
  8 + "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/pg/transaction"
  9 +)
  10 +
  11 +type OrderGoodRepository struct {
  12 + transactionContext *transaction.TransactionContext
  13 +}
  14 +
  15 +var (
  16 + _ domain.OrderGoodRepository = (*OrderGoodRepository)(nil)
  17 +)
  18 +
  19 +func NewOrderGoodRepository(transactionContext *transaction.TransactionContext) (*OrderGoodRepository, error) {
  20 + if transactionContext == nil {
  21 + return nil, fmt.Errorf("transactionContext参数不能为nil")
  22 + }
  23 + return &OrderGoodRepository{transactionContext: transactionContext}, nil
  24 +}
  25 +
  26 +func (reponsitory OrderGoodRepository) transformPgModelToDomainModel(orderModel *models.OrderGood) (order domain.OrderGood, err error) {
  27 + order = domain.OrderGood{
  28 + Id: orderModel.Id, OrderId: orderModel.OrderId, GoodName: orderModel.GoodName,
  29 + PlanGoodNumber: orderModel.PlanGoodNumber, UseGoodNumber: orderModel.UseGoodNumber,
  30 + Price: orderModel.Price, PartnerBonusPercent: orderModel.PartnerBonusPercent,
  31 + BonusStatus: orderModel.BonusStatus, Remark: orderModel.Remark,
  32 + GoodCompute: domain.GoodCompute{
  33 + PlanAmount: orderModel.PlanAmount,
  34 + UseAmount: orderModel.UseAmount,
  35 + PlanPartnerBonus: orderModel.PlanPartnerBonus,
  36 + UsePartnerBonus: orderModel.UsePartnerBonus,
  37 + PartnerBonusHas: orderModel.PartnerBonusHas,
  38 + PartnerBonusNot: orderModel.PartnerBonusNot,
  39 + PartnerBonusExpense: orderModel.PartnerBonusExpense,
  40 + },
  41 + }
  42 + switch orderModel.BonusStatus {
  43 + case domain.OrderGoodWaitPay:
  44 + order.CurrentBonusStatus = domain.OrderGoodBonusWaitPay{}
  45 + case domain.OrderGoodHasPay:
  46 + order.CurrentBonusStatus = domain.OrderGoodBonusHasPay{}
  47 + }
  48 + return order, nil
  49 +}
  50 +
  51 +func (repository OrderGoodRepository) Save(data []domain.OrderGood) error {
  52 + var (
  53 + err error
  54 + tx = repository.transactionContext.PgTx
  55 + )
  56 + for k, v := range data {
  57 + m := &models.OrderGood{
  58 + Id: v.Id, OrderId: v.OrderId, GoodName: v.GoodName,
  59 + PlanGoodNumber: v.PlanGoodNumber, Price: v.Price,
  60 + PlanAmount: v.GoodCompute.PlanAmount, UseGoodNumber: v.UseGoodNumber,
  61 + UseAmount: v.GoodCompute.UseAmount, PartnerBonusPercent: v.PartnerBonusPercent,
  62 + PlanPartnerBonus: v.GoodCompute.PlanPartnerBonus, UsePartnerBonus: v.GoodCompute.UsePartnerBonus,
  63 + PartnerBonusHas: v.GoodCompute.PartnerBonusHas, PartnerBonusNot: v.GoodCompute.PartnerBonusNot,
  64 + PartnerBonusExpense: v.GoodCompute.PartnerBonusExpense, BonusStatus: v.BonusStatus,
  65 + Remark: v.Remark,
  66 + }
  67 + if v.Id == 0 {
  68 + _, err = tx.Model(m).
  69 + Returning("*").
  70 + Insert()
  71 + if err != nil {
  72 + return err
  73 + }
  74 + data[k].Id = m.Id
  75 + } else {
  76 + _, err = tx.Model(m).
  77 + WherePK().
  78 + Update()
  79 + if err != nil {
  80 + return err
  81 + }
  82 + }
  83 + }
  84 + return nil
  85 +}
  86 +
  87 +func (repository OrderGoodRepository) Find(queryOption domain.OrderGoodFindQuery) ([]domain.OrderGood, int, error) {
  88 + db := repository.transactionContext.PgDd
  89 + goodModes := []models.OrderGood{}
  90 + query := db.Model(&goodModes)
  91 + if queryOption.OrderId > 0 {
  92 + query = query.Where("order_id=?", queryOption.OrderId)
  93 + }
  94 + if queryOption.Offset > -1 {
  95 + query = query.Offset(queryOption.Offset)
  96 + }
  97 + if queryOption.Limit > 0 {
  98 + query = query.Limit(queryOption.Limit)
  99 + } else {
  100 + query = query.Limit(50)
  101 + }
  102 + var (
  103 + err error
  104 + orderGoods = make([]domain.OrderGood, 0)
  105 + )
  106 + query = query.Order("order_good.id DESC")
  107 + count, err := query.SelectAndCount()
  108 + if err != nil {
  109 + return orderGoods, 0, err
  110 + }
  111 + for i := range goodModes {
  112 + domainOrderGood, err := repository.transformPgModelToDomainModel(&goodModes[i])
  113 + if err != nil {
  114 + return orderGoods, 0, err
  115 + }
  116 + orderGoods = append(orderGoods, domainOrderGood)
  117 + }
  118 + return orderGoods, count, nil
  119 +}
  120 +
  121 +func (repository OrderGoodRepository) Remove(orderId int64, goodids ...int64) error {
  122 + var (
  123 + err error
  124 + tx = repository.transactionContext.PgTx
  125 + )
  126 + m := &models.OrderBase{}
  127 + query := tx.Model(m).Where("order_id=?", orderId)
  128 + if len(goodids) > 0 {
  129 + query = query.WhereIn("id in(?)", goodids)
  130 + }
  131 + _, err = query.Delete()
  132 + return err
  133 +}