1
This commit is contained in:
@@ -3,6 +3,7 @@ package dao
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"git.rosy.net.cn/jx-print/dao"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -1749,3 +1750,179 @@ func StatisticsFineFee(db *DaoDB, startTime, endTime time.Time, storeId []int) (
|
||||
|
||||
return fine, nil
|
||||
}
|
||||
|
||||
// StatisticsSettlement 统计京西门店结算信息
|
||||
func StatisticsSettlement(db *DaoDB, storeId []int, start, end time.Time, vendorId []int, size, offset int) (pagedInfo *model.PagedInfo, err error) {
|
||||
sql := `
|
||||
SELECT
|
||||
SQL_CALC_FOUND_ROWS
|
||||
gs.jx_store_id,
|
||||
s.name,
|
||||
b.id AS brand_id,
|
||||
b.name AS brand_name,
|
||||
sm1.vendor_store_id AS mt_store_id,
|
||||
sm2.vendor_store_id AS jd_store_id,
|
||||
sm3.vendor_store_id AS sg_store_id,
|
||||
city.name AS city_name,
|
||||
district.name AS district_name,
|
||||
s.market_man_phone,
|
||||
u_market.name AS market_man_name, -- 修正别名
|
||||
u_operator1.name AS operator1_name,
|
||||
u_operator2.name AS operator2_name,
|
||||
u_operator3.name AS operator3_name,
|
||||
s.jx_brand_fee_factor,
|
||||
s.market_add_fee_factor,
|
||||
s.pay_percentage,
|
||||
COALESCE(COUNT(gs.vendor_order_id), 0) AS order_count, -- 处理 NULL
|
||||
COALESCE(SUM(w.desired_fee), 0) AS total_desired_fee,
|
||||
s.package_setting,
|
||||
SUM(ROUND(IF(gs.earning_type = 1, (gs.total_shop_money-gs.earning_price-IFNULL(w.desired_fee,0)), gs.total_shop_money *(gs.order_pay_percentage/2)/100) * (s.jx_brand_fee_factor/10),3)) jx_income,
|
||||
SUM(ROUND(IF(gs.earning_type = 1, (gs.total_shop_money-gs.earning_price-IFNULL(w.desired_fee,0)) , gs.total_shop_money *(gs.order_pay_percentage/2)/100) * (s.market_add_fee_factor/10),3)) market_income,
|
||||
SUM(ROUND(IF(gs.earning_type = 1, gs.earning_price, gs.total_shop_money- (gs.total_shop_money *(gs.order_pay_percentage/2)/100)) -IFNULL(w.desired_fee,0),3)) store_income,
|
||||
SUM(ROUND(IF(gs.earning_type = 1, gs.total_shop_money-gs.earning_price-IFNULL(w.desired_fee,0), gs.total_shop_money- (gs.total_shop_money *(1-(gs.order_pay_percentage/2)/100))) -IFNULL(w.desired_fee,0),3)) platform_income,
|
||||
COALESCE(SUM(gs.total_shop_money), 0) AS total_shop_money,-- 平台结算
|
||||
COALESCE(SUM(ao.refund_money), 0) AS refund_money -- 售后退款
|
||||
FROM goods_order gs
|
||||
LEFT JOIN store_map sm1 ON gs.jx_store_id = sm1.store_id AND sm1.vendor_id = 1 AND sm1.deleted_at = '1970-01-01 00:00:00'
|
||||
LEFT JOIN store_map sm2 ON gs.jx_store_id = sm2.store_id AND sm2.vendor_id = 0 AND sm2.deleted_at = '1970-01-01 00:00:00'
|
||||
LEFT JOIN store_map sm3 ON gs.jx_store_id = sm3.store_id AND sm3.vendor_id = 3 AND sm3.deleted_at = '1970-01-01 00:00:00'
|
||||
LEFT JOIN store s ON s.id = gs.jx_store_id
|
||||
LEFT JOIN brand b ON b.id = s.brand_id
|
||||
LEFT JOIN place city ON city.code = s.city_code
|
||||
LEFT JOIN place district ON district.code = s.district_code -- 别名避免歧义
|
||||
LEFT JOIN user u_market ON u_market.mobile = s.market_man_phone
|
||||
LEFT JOIN user u_operator1 ON u_operator1.mobile = s.operator_phone
|
||||
LEFT JOIN user u_operator2 ON u_operator2.mobile = s.operator_phone2
|
||||
LEFT JOIN user u_operator3 ON u_operator3.mobile = s.operator_phone3
|
||||
LEFT JOIN waybill w ON w.vendor_order_id = gs.vendor_order_id AND w.status IN (100,105)
|
||||
LEFT JOIN afs_order ao ON ao.vendor_order_id = gs.vendor_order_id AND ao.status IN (160,180)
|
||||
WHERE 1=1
|
||||
`
|
||||
param := []interface{}{}
|
||||
if !utils.IsTimeZero(start) && !utils.IsTimeZero(end) {
|
||||
sql += ` AND gs.order_created_at BETWEEN ? AND ? AND gs.status = 110 `
|
||||
param = append(param, start, end)
|
||||
}
|
||||
if len(storeId) != 0 {
|
||||
sql += ` AND IF(gs.jx_store_id != 0, gs.jx_store_id, gs.store_id) IN (` + dao.GenQuestionMarks(len(storeId)) + `)`
|
||||
param = append(param, vendorId)
|
||||
}
|
||||
if len(vendorId) != 0 {
|
||||
sql += ` AND gs.vendor_id IN (` + GenQuestionMarks(len(vendorId)) + `)`
|
||||
param = append(param, vendorId)
|
||||
}
|
||||
sql += ` AND s.deleted_at = ? `
|
||||
param = append(param, utils.DefaultTimeValue)
|
||||
|
||||
sql += `
|
||||
GROUP BY
|
||||
s.id, s.name, sm1.vendor_store_id, sm2.vendor_store_id, sm3.vendor_store_id,
|
||||
city.name, district.name, s.market_man_phone, u_market.name,
|
||||
u_operator1.name, u_operator2.name, u_operator3.name,
|
||||
s.jx_brand_fee_factor, s.market_add_fee_factor, s.pay_percentage, s.package_setting ORDER BY order_count desc LIMIT ? OFFSET ?
|
||||
`
|
||||
param = append(param, size, offset)
|
||||
|
||||
txDB, _ := Begin(db)
|
||||
defer Commit(db, txDB)
|
||||
var msgList []*model.JxSettlementInfo
|
||||
if err = GetRowsTx(txDB, &msgList, sql, param...); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(msgList) > 0 {
|
||||
for _, v := range msgList {
|
||||
if v.BrandId == 1 || v.BrandId == 38 { // 京西/好菜
|
||||
// 袋子费
|
||||
v.PackagingFee = 40 * v.OrderCount
|
||||
} else {
|
||||
if v.PayPercentage != 0 && v.JxIncome == 0 {
|
||||
v.JxIncome = float64(v.TotalShopMoney) - v.StoreInCome
|
||||
}
|
||||
}
|
||||
// 服务费
|
||||
v.PackageSetting = v.PackageSetting * v.OrderCount
|
||||
v.Profit = v.JxIncome + v.MarketIncome - float64(v.PackagingFee) + float64(v.PackageSetting)
|
||||
}
|
||||
}
|
||||
pagedInfo = &model.PagedInfo{
|
||||
TotalCount: GetLastTotalRowCount2(db, txDB),
|
||||
Data: msgList,
|
||||
}
|
||||
return pagedInfo, nil
|
||||
}
|
||||
|
||||
// StatisticsSettlementByCity 根据城市统计结算
|
||||
func StatisticsSettlementByCity(db *DaoDB, cityCode []string, start, end time.Time, vendorId []int, size, offset int) (pagedInfo *model.PagedInfo, err error) {
|
||||
sql := `
|
||||
SELECT
|
||||
SQL_CALC_FOUND_ROWS
|
||||
p.name AS city_name,
|
||||
s.id AS store_id,
|
||||
u.name AS user_name,
|
||||
u.mobile,
|
||||
s.brand_id,
|
||||
s.package_setting,
|
||||
COUNT(gs.vendor_order_id) AS order_count,
|
||||
COALESCE(SUM(w.desired_fee), 0) AS total_desired_fee,
|
||||
SUM(ROUND(IF(gs.earning_type = 1, (gs.total_shop_money-gs.earning_price-IFNULL(w.desired_fee,0)), gs.total_shop_money *(gs.order_pay_percentage/2)/100) * (s.jx_brand_fee_factor/10),3)) jx_income,
|
||||
SUM(ROUND(IF(gs.earning_type = 1, (gs.total_shop_money-gs.earning_price-IFNULL(w.desired_fee,0)) , gs.total_shop_money *(gs.order_pay_percentage/2)/100) * (s.market_add_fee_factor/10),3)) market_income,
|
||||
SUM(ROUND(IF(gs.earning_type = 1, gs.earning_price, gs.total_shop_money- (gs.total_shop_money *(gs.order_pay_percentage/2)/100)) -IFNULL(w.desired_fee,0),3)) store_income,
|
||||
COALESCE(SUM(gs.total_shop_money), 0) AS total_shop_money,-- 平台结算
|
||||
SUM(ROUND(IF(gs.earning_type = 1, gs.total_shop_money-gs.earning_price-IFNULL(w.desired_fee,0), gs.total_shop_money- (gs.total_shop_money *(1-(gs.order_pay_percentage/2)/100))) -IFNULL(w.desired_fee,0),3)) platform_income,
|
||||
COALESCE(SUM(ao.refund_money), 0) AS refund_money -- 售后退款
|
||||
FROM goods_order gs
|
||||
LEFT JOIN waybill w ON w.vendor_order_id = gs.vendor_order_id AND w.status IN (100,105)
|
||||
LEFT JOIN store s ON s.id = IF(gs.jx_store_id != 0, gs.jx_store_id, gs.store_id)
|
||||
LEFT JOIN user u ON u.mobile = s.market_man_phone
|
||||
LEFT JOIN place p ON p.code = s.city_code
|
||||
LEFT JOIN afs_order ao ON ao.vendor_order_id = gs.vendor_order_id AND ao.status IN (160, 180)
|
||||
WHERE 1=1
|
||||
`
|
||||
param := []interface{}{}
|
||||
if !utils.IsTimeZero(start) && !utils.IsTimeZero(end) {
|
||||
sql += ` AND gs.order_created_at BETWEEN ? AND ? AND gs.status = 110 `
|
||||
param = append(param, start, end)
|
||||
}
|
||||
if len(vendorId) != 0 {
|
||||
sql += ` AND gs.vendor_id IN (` + GenQuestionMarks(len(vendorId)) + `)`
|
||||
param = append(param, vendorId)
|
||||
}
|
||||
if len(cityCode) != 0 {
|
||||
sql += ` AND s.city_code IN (` + dao.GenQuestionMarks(len(cityCode)) + `)`
|
||||
param = append(param, vendorId)
|
||||
}
|
||||
|
||||
sql += ` AND s.deleted_at = ? `
|
||||
param = append(param, utils.DefaultTimeValue)
|
||||
|
||||
sql += `
|
||||
GROUP BY
|
||||
u.name, u.mobile ,p.name,s.id ORDER BY mobile desc LIMIT ? OFFSET ?
|
||||
`
|
||||
param = append(param, size, offset)
|
||||
|
||||
txDB, _ := Begin(db)
|
||||
defer Commit(db, txDB)
|
||||
var msgList []*model.SettlementByCityCode
|
||||
if err = GetRowsTx(txDB, &msgList, sql, param...); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(msgList) > 0 {
|
||||
for _, v := range msgList {
|
||||
if v.BrandId == 1 || v.BrandId == 38 { // 京西/好菜
|
||||
// 袋子费
|
||||
v.PackagingFee = 40 * v.OrderCount
|
||||
}
|
||||
// 服务费
|
||||
v.PackageSetting = v.PackageSetting * v.OrderCount
|
||||
v.Profit = v.JxIncome + v.MarketIncome - float64(v.PackagingFee) + float64(v.PackageSetting)
|
||||
}
|
||||
}
|
||||
pagedInfo = &model.PagedInfo{
|
||||
TotalCount: GetLastTotalRowCount2(db, txDB),
|
||||
Data: msgList,
|
||||
}
|
||||
return pagedInfo, nil
|
||||
}
|
||||
|
||||
52
business/model/settlement_info.go
Normal file
52
business/model/settlement_info.go
Normal file
@@ -0,0 +1,52 @@
|
||||
package model
|
||||
|
||||
type JxSettlementInfo struct {
|
||||
StoreID int `json:"jx_store_id"` // jx门店ID
|
||||
Name string `json:"name"` // 门店名称
|
||||
BrandId int `json:"brand_id"` // 品牌ID
|
||||
BrandName string `json:"brand_name"` // 品牌名称
|
||||
MtStoreID string `json:"mt_store_id"` // 美团平台ID
|
||||
JdStoreId string `json:"jd_store_id"` // 京东平台ID
|
||||
SgStoreId string `json:"sg_store_id"` // 闪购平台ID
|
||||
CityName string `json:"city_name"` // 市
|
||||
DistrictName string `json:"district_name"` // 市
|
||||
MarketManPhone string `json:"market_man_phone"` // 平台负责人电话
|
||||
MarketManName string `json:"market_man_name"` // 平台负责人名称
|
||||
Operator1Name string `json:"operator1_name"` // 美团负责人
|
||||
Operator2Name string `json:"operator2_name"` // 京东负责人
|
||||
Operator3Name string `json:"operator3_name"` // 闪购负责人
|
||||
JxBrandFeeFactor string `json:"jx_brand_fee_factor"` // 京西品牌费因子
|
||||
MarketAddFeeFactor string `json:"market_add_fee_factor"` // 市场费因子
|
||||
PayPercentage int `json:"pay_percentage"` // 扣点模式,小于50为扣点,其他为报价
|
||||
OrderCount int `json:"order_count"` // 有效订单数
|
||||
TotalShopMoney int `json:"total_shop_money"` // 平台结算金额
|
||||
TotalDesiredFee int `json:"total_desired_fee"` // 总运费
|
||||
RefundMoney int `json:"refund_money"` // 订单售后金额
|
||||
PackageSetting int `json:"package_setting"` // 服务费
|
||||
PackagingFee int `json:"packaging_fee"` // 包装费-每单0.4元
|
||||
StoreInCome float64 `json:"store_income"` // 门店收入
|
||||
PlatformIncome float64 `json:"platform_income"` // 平台收益
|
||||
JxIncome float64 `json:"jx_income"` // 京西收益
|
||||
MarketIncome float64 `json:"market_income"` // 市场收益
|
||||
Profit float64 `json:"-"` // 纯收益
|
||||
}
|
||||
|
||||
// SettlementByCityCode 根据城市统计
|
||||
type SettlementByCityCode struct {
|
||||
CityName string `json:"city_name"` // 市
|
||||
StoreID int `json:"jx_store_id"` // jx门店ID
|
||||
BrandId int `json:"brand_id"` // 品牌ID
|
||||
UserName string `json:"user_name"` // 名称
|
||||
Mobile string `json:"mobile"` // 电话
|
||||
OrderCount int `json:"order_count"` // 有效订单数
|
||||
PackageSetting int `json:"package_setting"` // 服务费
|
||||
PackagingFee int `json:"packaging_fee"` // 包装费-每单0.4元
|
||||
TotalDesiredFee int `json:"total_desired_fee"` // 总运费
|
||||
JxIncome float64 `json:"jx_income"` // 京西收益
|
||||
MarketIncome float64 `json:"market_income"` // 市场收益
|
||||
StoreInCome float64 `json:"store_income"` // 门店收入
|
||||
TotalShopMoney int `json:"total_shop_money"` // 平台结算金额
|
||||
PlatformIncome float64 `json:"platform_income"` // 平台收益
|
||||
RefundMoney int `json:"refund_money"` // 订单售后金额
|
||||
Profit float64 `json:"-"` // 纯收益
|
||||
}
|
||||
Reference in New Issue
Block a user