This commit is contained in:
邹宗楠
2026-01-07 15:21:22 +08:00
parent f63d8d0bc8
commit 5ee8f4c32a
10 changed files with 62078 additions and 61291 deletions

View File

@@ -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
}

View 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:"-"` // 纯收益
}