package dao import ( "fmt" "time" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/model" ) type StoresOrderSaleInfo struct { StoreID int `orm:"column(store_id)" json:"storeID"` VendorID int `orm:"column(vendor_id)" json:"vendorID"` Status int `json:"status"` Count int `json:"count"` ShopPrice int64 `json:"shopPrice"` VendorPrice int64 `json:"vendorPrice"` SalePrice int64 `json:"salePrice"` ActualPayPrice int64 `json:"actualPayPrice"` EarningPrice int64 `json:"earningPrice"` // 预估结算给门店老板的钱 } func QueryOrders(db *DaoDB, vendorIDs []int, storeID int, orderCreatedAtBegin, orderCreatedAtEnd time.Time) (orderList []*model.GoodsOrder, err error) { sql := ` SELECT t1.* FROM goods_order t1 WHERE t1.order_created_at >= ?` sqlParams := []interface{}{ orderCreatedAtBegin, } if len(vendorIDs) > 0 { sql += " AND t1.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")" sqlParams = append(sqlParams, vendorIDs) } if storeID > 0 { sql += " AND IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id) = ?" sqlParams = append(sqlParams, storeID) } if !utils.IsTimeZero(orderCreatedAtEnd) { sql += " AND t1.order_created_at <= ?" sqlParams = append(sqlParams, orderCreatedAtEnd) } // sql += " ORDER BY t1.order_created_at DESC, t1.id DESC;" return orderList, GetRows(db, &orderList, sql, sqlParams...) } func GetStoreOrderAfterTime(db *DaoDB, storeID int, orderTime time.Time, lastOrderSeqID int64) (orderList []*model.GoodsOrderExt, err error) { sql := ` SELECT t1.*, t2.status waybill_status, t2.courier_name, t2.courier_mobile, t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at FROM goods_order t1 LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id WHERE IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id) = ? AND t1.order_created_at >= ? AND t1.id > ? AND t1.status < ? ORDER BY t1.order_created_at DESC, t1.id DESC; ` sqlParams := []interface{}{ storeID, orderTime, lastOrderSeqID, model.OrderStatusEndBegin, } return orderList, GetRows(db, &orderList, sql, sqlParams...) } func SetOrderPrintFlag(db *DaoDB, userName string, vendorOrderID string, vendorID int, isPrinted bool) (err error) { if isPrinted { err = SetOrderFlag(db, userName, vendorOrderID, vendorID, model.OrderFlagMaskPrinted) } else { err = SetOrderFlag(db, userName, vendorOrderID, vendorID, ^model.OrderFlagMaskPrinted) } return err } func SetOrderFlag(db *DaoDB, userName string, vendorOrderID string, vendorID int, flag int) (err error) { _, err = ExecuteSQL(db, ` UPDATE goods_order SET flag = flag | ? WHERE vendor_order_id = ? AND vendor_id = ? `, flag, vendorOrderID, vendorID) return err } func ClearOrderFlag(db *DaoDB, userName string, vendorOrderID string, vendorID int, flag int) (err error) { _, err = ExecuteSQL(db, ` UPDATE goods_order SET flag = flag & ? WHERE vendor_order_id = ? AND vendor_id = ? `, flag, vendorOrderID, vendorID) return err } func SetAfsOrderFlag(db *DaoDB, userName string, afsOrderID string, vendorID int, flag int) (err error) { _, err = ExecuteSQL(db, ` UPDATE afs_order SET flag = flag | ? WHERE afs_order_id = ? AND vendor_id = ? `, flag, afsOrderID, vendorID) return err } func GetAfsOrders(db *DaoDB, vendorID int, vendorOrderID, afsOrderID string) (afsOrderList []*model.AfsOrder, err error) { sql := ` SELECT * FROM afs_order t1 WHERE t1.vendor_id = ? ` sqlParams := []interface{}{ vendorID, } if vendorOrderID != "" { sql += " AND t1.vendor_order_id = ?" sqlParams = append(sqlParams, vendorOrderID) } if afsOrderID != "" { sql += " AND t1.afs_order_id = ?" sqlParams = append(sqlParams, afsOrderID) } sql += " ORDER BY t1.afs_order_id DESC" err = GetRows(db, &afsOrderList, sql, sqlParams...) return afsOrderList, err } func GetStoresOrderSaleInfo(db *DaoDB, storeIDList []int, fromTime time.Time, toTime time.Time, statusList []int) (saleInfoList []*StoresOrderSaleInfo, err error) { if utils.IsTimeZero(fromTime) { return nil, fmt.Errorf("查询订单信息必须指定起始时间") } if utils.IsTimeZero(toTime) { toTime = time.Now() } if toTime.Sub(fromTime) > time.Hour*24*60 { return nil, fmt.Errorf("查询时间范围不能超过60天") } // 用int64类型去取float型的数据库返回值,会取不到 sql := fmt.Sprintf(` SELECT IF(t1.jx_store_id > 0, t1.jx_store_id, t1.store_id) store_id, t1.vendor_id, IF(t1.status < ?, 0, t1.status) status, COUNT(*) count, SUM(t1.shop_price) shop_price, SUM(t1.vendor_price) vendor_price, SUM(t1.sale_price) sale_price, SUM(t1.actual_pay_price) actual_pay_price, CAST(SUM(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, %d) / 100)) AS SIGNED) earning_price FROM goods_order t1 LEFT JOIN store t5 ON t5.id = IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id) WHERE t1.order_finished_at >= ? AND t1.order_finished_at <= ? `, model.DefaultEarningPricePercentage) sqlParams := []interface{}{ model.OrderStatusEndBegin, fromTime, toTime, } if len(storeIDList) > 0 { sql += " AND IF(t1.jx_store_id > 0, t1.jx_store_id, t1.store_id) IN (" + GenQuestionMarks(len(storeIDList)) + ")" sqlParams = append(sqlParams, storeIDList) } if len(statusList) > 0 { sql += " AND t1.status IN (" + GenQuestionMarks(len(statusList)) + ")" sqlParams = append(sqlParams, statusList) } sql += ` GROUP BY 1,2,3 ORDER BY 1,2,3` err = GetRows(db, &saleInfoList, sql, sqlParams...) return saleInfoList, err } func GetAfsOrderSkuInfo(db *DaoDB, vendorOrderID, afsOrderID string, vendorID int) (skus []*model.OrderFinancialSkuExt, err error) { if vendorOrderID == "" && afsOrderID == "" { return nil, fmt.Errorf("必须指定订单或售后单ID") } sql := ` SELECT t1.*, t3.img image FROM order_sku_financial t1 LEFT JOIN sku t2 ON t2.id = IF(t1.jx_sku_id <> 0, t1.jx_sku_id, t1.sku_id) LEFT JOIN sku_name t3 ON t3.id = t2.name_id WHERE t1.is_afs_order = 1 AND t1.vendor_id = ?` sqlParams := []interface{}{ vendorID, } if vendorOrderID != "" { sql += " AND t1.vendor_order_id = ?" sqlParams = append(sqlParams, vendorOrderID) } if afsOrderID != "" { sql += " AND t1.afs_order_id = ?" sqlParams = append(sqlParams, afsOrderID) } err = GetRows(db, &skus, sql, sqlParams...) return skus, err }