mh_server/model/erp_retail_order.go
2023-02-09 16:59:06 +08:00

277 lines
7.4 KiB
Go

package model
import (
"encoding/json"
"fmt"
"github.com/codinl/go-logger"
"math/rand"
"time"
)
const (
ErpOrderStateUnAudit = "un_audit"
ErpOrderStateAudited = "audited"
)
const (
ErpOrderMemberTypeGeneral = "general"
ErpOrderMemberTypeMember = "member"
)
const (
RetailTypeSale = "sale"
RetailTypeRejected = "rejected"
)
type ErpOrder struct {
Model
BillSn string `json:"bill_sn" gorm:"index"`
RetailType string `json:"retail_type"` // 销售类型:
Tel string `json:"tel" gorm:"index"`
StoreId uint32 `json:"store_id" gorm:"index"`
StoreName string `json:"store_name"`
MakerId uint32 `json:"maker_id" gorm:"index"`
MakerName string `json:"maker_name"`
AuditTime time.Time `json:"audit_time"`
AuditorId uint32 `json:"auditor_id" gorm:"index"`
AuditorName string `json:"auditor_name"`
//ErpCashierId uint32 `json:"erp_cashier_id" gorm:"index"`
//ErpCashierName string `json:"erp_cashier_name"`
CashierList string `json:"cashier_list" gorm:"type:text"` // 付款方式
Salesman1 uint32 `json:"salesman_1"`
Salesman2 uint32 `json:"salesman_2"`
MemberType string `json:"member_type"` // 会员类型:
State string `json:"state" gorm:"index"`
TotalAmount uint32 `json:"total_amount"` // 包含退货
TotalCount uint32 `json:"total_count"` // 包含退货
SaleOrderId uint32 `json:"sale_order_id"` // 销售订单id
//RejectedTotalAmount uint32 `json:"rejected_total_amount"`
//RejectedTotalCount uint32 `json:"rejected_total_count"`
Commodities []ErpOrderCommodity `json:"commodities" gorm:"-"`
Cashiers []ErpCashier `json:"cashiers" gorm:"-"`
// erp_order
}
type ErpOrderCommodity struct {
Model
ErpOrderId uint32 `json:"erp_order_id"`
ErpCategoryId uint32 `json:"erp_category_id"`
ErpCategoryName string `json:"erp_category_name"`
ErpCommodityId uint32 `json:"erp_commodity_id"`
ErpCommodityName string `json:"erp_commodity_name"`
IMEIType uint32 `json:"imei_type"` // 1-无串码 2-串码
IMEI string `json:"imei"`
PresentType uint32 `json:"present_type"` // 赠送类型:1-非赠送 2-赠送
RetailPrice uint32 `json:"retail_price"`
MemberPrice uint32 `json:"member_price"`
Count uint32 `json:"count"`
Amount uint32 `json:"amount"`
Remark string `json:"remark"`
Tel string `json:"tel" gorm:"index"`
RejectedPrice uint32 `json:"rejected_price"`
RejectedCount uint32 `json:"rejected_count"`
RejectedAmount uint32 `json:"rejected_amount"`
RejectedOrderCommodityId uint32 `json:"rejected_order_commodity_id"`
// erp_order_commodity
}
type ErpOrderListReq struct {
BillSn string `json:"bill_sn"`
//Type string `json:"type"`
RetailType string `json:"retail_type"`
Tel string `json:"tel"`
StoreId uint32 `json:"store_id"`
State string `json:"state"`
StartTime string `json:"start_time"`
EndTime string `json:"end_time"`
PageNum int `json:"page_num"`
PageSize int `json:"page_size"`
IsExport uint32 `json:"is_export"` // 1-导出
//StartTime time.Time `json:"start_time"`
//EndTime time.Time `json:"end_time"`
}
type ErpOrderListResp struct {
List []ErpOrder `json:"list"`
Total int `json:"total"`
PageNum int `json:"page_num"`
PageSize int `json:"page_size"`
}
func (m *ErpOrderListReq) List() (*ErpOrderListResp, error) {
resp := &ErpOrderListResp{
PageNum: m.PageNum,
PageSize: m.PageSize,
}
page := m.PageNum - 1
if page < 0 {
page = 0
}
if m.PageSize == 0 {
m.PageSize = 10
}
qs := DB.Table("erp_order")
if m.BillSn != "" {
qs = qs.Where("bill_sn=?", m.BillSn)
}
//if m.Type != "" {
// qs = qs.Where("type=?", m.Type)
//}
if m.RetailType != "" {
qs = qs.Where("retail_type=?", m.RetailType)
}
if m.Tel != "" {
qs = qs.Where("tel=?", m.Tel)
}
if m.StoreId != 0 {
qs = qs.Where("store_id=?", m.StoreId)
}
if m.State != "" {
qs = qs.Where("state=?", m.State)
}
if m.StartTime != "" {
parse, err := time.Parse(DateTimeFormat, m.StartTime)
if err != nil {
logger.Error("err:", err)
//return users, 0, err
}
qs = qs.Where("created_at > ?", parse)
}
if m.EndTime != "" {
parse, err := time.Parse(DateTimeFormat, m.EndTime)
if err != nil {
logger.Error("err:", err)
//return users, 0, err
}
parse = parse.AddDate(0, 0, 1)
qs = qs.Where("created_at < ?", parse)
}
var count int64
err := qs.Count(&count).Error
if err != nil {
logger.Error("count err:", err)
return resp, err
}
resp.Total = int(count)/m.PageSize + 1
var orders []ErpOrder
err = qs.Order("id DESC").Offset(page * m.PageSize).Limit(m.PageSize).Find(&orders).Error
if err != nil && err != RecordNotFound {
logger.Error("erp commodity list err:", err)
return resp, err
}
ErpOrderListSetCashier(orders)
resp.List = orders
return resp, nil
}
func NewErpBillSn() string {
nowTime := time.Now()
rand.Seed(nowTime.UnixNano())
max := 1
for {
if max > 5 {
logger.Error("create sn err")
return ""
}
random := rand.Int31n(9999) + 1000
sn := fmt.Sprintf("%s%d", nowTime.Format("060102"), random)
exist, err := QueryRecordExist(fmt.Sprintf("SELECT * FROM erp_order WHERE bill_sn='%s'", sn))
if err != nil {
logger.Error("exist sn err")
}
if !exist {
return sn
}
max++
}
}
//func NewErpPurchaseSn() string {
// nowTime := time.Now()
// rand.Seed(nowTime.UnixNano())
// max := 1
// for {
// if max > 5 {
// logger.Error("create sn err")
// return ""
// }
// random := rand.Int31n(9999) + 1000
// sn := fmt.Sprintf("%s%d", nowTime.Format("060102"), random)
// exist, err := QueryRecordExist(fmt.Sprintf("SELECT * FROM erp_purchase_order WHERE serial_number='%s'", sn))
// if err != nil {
// logger.Error("exist sn err")
// }
// if !exist {
// return sn
// }
//
// max++
// }
//}
func ErpOrderListSetCashier(list []ErpOrder) {
for i, _ := range list {
//if list[i].CashierList != "" {
// var cashiers []ErpCashier
// err := json.Unmarshal([]byte(list[i].CashierList), &cashiers)
// if err != nil {
// logger.Error("unmarshal err:", err)
// }
// list[i].Cashiers = cashiers
// list[i].CashierList = ""
//}
list[i].SetErpCashier()
}
}
func (m *ErpOrder) SetErpCashier() {
if m.CashierList != "" {
var cashiers []ErpCashier
err := json.Unmarshal([]byte(m.CashierList), &cashiers)
if err != nil {
logger.Error("unmarshal err:", err)
}
m.Cashiers = cashiers
m.CashierList = ""
}
}
func GetErpOrderCommodityMap(ids []uint32) (map[uint32]ErpOrderCommodity, error) {
commodityMap := make(map[uint32]ErpOrderCommodity, 0)
if len(ids) == 0 {
return commodityMap, nil
}
var commodities []ErpOrderCommodity
err := DB.Table("erp_order_commodity").Where("id IN (?)", ids).Find(&commodities).Error
if err != nil {
logger.Error("commodities err:", err)
return commodityMap, err
}
for i, _ := range commodities {
commodityMap[commodities[i].ID] = commodities[i]
}
return commodityMap, nil
}
func SetUserInfo(tel string) {
var user User
err := DB.Table("user").Where("tel=?", tel).Find(&user).Error
if err != nil {
logger.Error("user err:", err)
return
}
if user.FirstRetailOrder.IsZero() {
err := DB.Table("user").Where("uid=?", user.Uid).Update("first_retail_order", time.Now()).Error
if err != nil {
logger.Error("update user err:", err)
}
}
}