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
}