1.优化进销存报表查询时间改成created_at字段;

2.零售订单审核和更新增加updated_at字段;
3.修复会员过期提醒sql报错问题;
4.修复短信使用量统计错误的缺陷;
This commit is contained in:
chenlin 2024-07-25 20:02:35 +08:00
parent 16c6f1671c
commit e9ac976f48
6 changed files with 89 additions and 35 deletions

View File

@ -234,6 +234,7 @@ func ErpOrderAudit(c *gin.Context) {
"audit_time": time.Now(), "audit_time": time.Now(),
"auditor_name": sysUser.NickName, "auditor_name": sysUser.NickName,
"auditor_id": sysUser.UserId, "auditor_id": sysUser.UserId,
"updated_at": time.Now(),
}).Error }).Error
if err != nil { if err != nil {
begin.Rollback() begin.Rollback()

View File

@ -332,6 +332,9 @@ func (m *ErpDecisionReportReq) DecisionReportList(c *gin.Context) (*ErpDecisionR
} }
// 查询期初库存、期初金额 // 查询期初库存、期初金额
// 没有时间:默认为系统入库数量
// 某一天:默认系统入库数量 - 某一天前的所有出库数量 + 某一天前的所有入库数量
// 某个时间段:默认系统入库数量 - 开始时间前的所有出库数量 + 开始时间前的所有入库数量
func getSystemStartCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionReportData, error) { func getSystemStartCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionReportData, error) {
var reportData DecisionReportData var reportData DecisionReportData
@ -344,7 +347,7 @@ func getSystemStartCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionRep
logger.Errorf("getSystemStartCount err:", err) logger.Errorf("getSystemStartCount err:", err)
return DecisionReportData{}, err return DecisionReportData{}, err
} }
qs = qs.Where("first_stock_time > ?", parse) qs = qs.Where("created_at > ?", parse)
} }
if req.EndTime != "" { // 出入库结束时间 if req.EndTime != "" { // 出入库结束时间
@ -353,7 +356,7 @@ func getSystemStartCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionRep
logger.Errorf("getSystemStartCount err:", err) logger.Errorf("getSystemStartCount err:", err)
return DecisionReportData{}, err return DecisionReportData{}, err
} }
qs = qs.Where("first_stock_time <= ?", parse) qs = qs.Where("created_at <= ?", parse)
} }
var err error var err error
@ -446,7 +449,7 @@ func getPurchaseReturnCount(req *ErpDecisionReportReq, stock ErpStock) (Decision
logger.Errorf("getSystemStartCount err:", err) logger.Errorf("getSystemStartCount err:", err)
return DecisionReportData{}, err return DecisionReportData{}, err
} }
qs = qs.Where("first_stock_time > ?", parse) qs = qs.Where("created_at > ?", parse)
} }
if req.EndTime != "" { // 出入库结束时间 if req.EndTime != "" { // 出入库结束时间
@ -455,7 +458,7 @@ func getPurchaseReturnCount(req *ErpDecisionReportReq, stock ErpStock) (Decision
logger.Errorf("getSystemStartCount err:", err) logger.Errorf("getSystemStartCount err:", err)
return DecisionReportData{}, err return DecisionReportData{}, err
} }
qs = qs.Where("first_stock_time <= ?", parse) qs = qs.Where("created_at <= ?", parse)
} }
var err error var err error
@ -593,7 +596,7 @@ func getProductCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionReportD
logger.Errorf("getSystemStartCount err:", err) logger.Errorf("getSystemStartCount err:", err)
return DecisionReportData{}, err return DecisionReportData{}, err
} }
qs = qs.Where("first_stock_time > ?", parse) qs = qs.Where("created_at > ?", parse)
} }
if req.EndTime != "" { // 出入库结束时间 if req.EndTime != "" { // 出入库结束时间
@ -602,7 +605,7 @@ func getProductCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionReportD
logger.Errorf("getSystemStartCount err:", err) logger.Errorf("getSystemStartCount err:", err)
return DecisionReportData{}, err return DecisionReportData{}, err
} }
qs = qs.Where("first_stock_time <= ?", parse) qs = qs.Where("created_at <= ?", parse)
} }
var err error var err error
@ -758,7 +761,7 @@ func getSystemOutCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionRepor
logger.Errorf("getSystemStartCount err:", err) logger.Errorf("getSystemStartCount err:", err)
return DecisionReportData{}, err return DecisionReportData{}, err
} }
qs = qs.Where("first_stock_time > ?", parse) qs = qs.Where("created_at > ?", parse)
} }
if req.EndTime != "" { // 出入库结束时间 if req.EndTime != "" { // 出入库结束时间
@ -767,7 +770,7 @@ func getSystemOutCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionRepor
logger.Errorf("getSystemStartCount err:", err) logger.Errorf("getSystemStartCount err:", err)
return DecisionReportData{}, err return DecisionReportData{}, err
} }
qs = qs.Where("first_stock_time <= ?", parse) qs = qs.Where("created_at <= ?", parse)
} }
var err error var err error
@ -1028,7 +1031,7 @@ func getSystemEndCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionRepor
logger.Errorf("getSystemStartCount err:", err) logger.Errorf("getSystemStartCount err:", err)
return DecisionReportData{}, err return DecisionReportData{}, err
} }
qs = qs.Where("first_stock_time > ?", parse) qs = qs.Where("created_at > ?", parse)
} }
if req.EndTime != "" { // 出入库结束时间 if req.EndTime != "" { // 出入库结束时间
@ -1037,7 +1040,7 @@ func getSystemEndCount(req *ErpDecisionReportReq, stock ErpStock) (DecisionRepor
logger.Errorf("getSystemStartCount err:", err) logger.Errorf("getSystemStartCount err:", err)
return DecisionReportData{}, err return DecisionReportData{}, err
} }
qs = qs.Where("first_stock_time <= ?", parse) qs = qs.Where("created_at <= ?", parse)
} }
var err error var err error
@ -1074,7 +1077,7 @@ func getSumStockData(req *ErpDecisionReportReq) (DecisionReportData, error) {
logger.Errorf("getStockData err:", err) logger.Errorf("getStockData err:", err)
return DecisionReportData{}, err return DecisionReportData{}, err
} }
qs = qs.Where("first_stock_time > ?", parse) qs = qs.Where("created_at > ?", parse)
} }
if req.EndTime != "" { if req.EndTime != "" {
@ -1083,7 +1086,7 @@ func getSumStockData(req *ErpDecisionReportReq) (DecisionReportData, error) {
logger.Errorf("getStockData err:", err) logger.Errorf("getStockData err:", err)
return DecisionReportData{}, err return DecisionReportData{}, err
} }
qs = qs.Where("first_stock_time <= ?", parse) qs = qs.Where("created_at <= ?", parse)
} }
if len(req.StoreId) > 0 { if len(req.StoreId) > 0 {

View File

@ -898,7 +898,10 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error {
} }
err = gdb.Table("erp_stock_commodity").Where("imei = ?", commodities[i].IMEI). err = gdb.Table("erp_stock_commodity").Where("imei = ?", commodities[i].IMEI).
Updates(map[string]interface{}{"state": state}).Error // 状态更新为已销售;反审核则更新为在库 Updates(map[string]interface{}{
"state": state,
"updated_at": time.Now(),
}).Error // 状态更新为已销售;反审核则更新为在库
if err != nil { if err != nil {
logger.Error("commodities err:", logger.Field("err", err)) logger.Error("commodities err:", logger.Field("err", err))
return err return err
@ -907,7 +910,10 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error {
if state == SoldOut { // 已售的订单才更新库存数量 if state == SoldOut { // 已售的订单才更新库存数量
err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?", err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?",
erpOrder.StoreId, commodities[i].ErpCommodityId). erpOrder.StoreId, commodities[i].ErpCommodityId).
Updates(map[string]interface{}{"count": gorm.Expr("count - ?", 1)}).Error // 库存数量-1 Updates(map[string]interface{}{
"count": gorm.Expr("count - ?", 1),
"updated_at": time.Now(),
}).Error // 库存数量-1
if err != nil { if err != nil {
logger.Error("commodities err:", logger.Field("err", err)) logger.Error("commodities err:", logger.Field("err", err))
return err return err
@ -915,7 +921,10 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error {
} else { // 反审核时则库存数量+1 } else { // 反审核时则库存数量+1
err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?", err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?",
erpOrder.StoreId, commodities[i].ErpCommodityId). erpOrder.StoreId, commodities[i].ErpCommodityId).
Updates(map[string]interface{}{"count": gorm.Expr("count + ?", 1)}).Error // 库存数量+1 Updates(map[string]interface{}{
"count": gorm.Expr("count + ?", 1),
"updated_at": time.Now(),
}).Error // 库存数量+1
if err != nil { if err != nil {
logger.Error("commodities err:", logger.Field("err", err)) logger.Error("commodities err:", logger.Field("err", err))
return err return err
@ -924,7 +933,10 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error {
} else { // 非串码商品 } else { // 非串码商品
if state == InStock { // 零售订单反审核 if state == InStock { // 零售订单反审核
err = gdb.Table("erp_stock_commodity").Where("id = ?", commodities[i].ErpStockCommodityID). err = gdb.Table("erp_stock_commodity").Where("id = ?", commodities[i].ErpStockCommodityID).
Updates(map[string]interface{}{"state": state}).Error // 状态更新为在库 Updates(map[string]interface{}{
"state": state,
"updated_at": time.Now(),
}).Error // 状态更新为在库
if err != nil { if err != nil {
logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err)) logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err))
return err return err
@ -932,7 +944,10 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error {
err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?", err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?",
erpOrder.StoreId, commodities[i].ErpCommodityId). erpOrder.StoreId, commodities[i].ErpCommodityId).
Updates(map[string]interface{}{"count": gorm.Expr("count + ?", 1)}).Error // 库存数量+1 Updates(map[string]interface{}{
"count": gorm.Expr("count + ?", 1),
"updated_at": time.Now(),
}).Error // 库存数量+1
if err != nil { if err != nil {
logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err)) logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err))
return err return err
@ -949,7 +964,10 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error {
} else { // 正常销售 } else { // 正常销售
if commodities[i].ErpStockCommodityID != "" { // 零售退货单反审核,默认当作销售单 if commodities[i].ErpStockCommodityID != "" { // 零售退货单反审核,默认当作销售单
err = gdb.Table("erp_stock_commodity").Where("id = ?", commodities[i].ErpStockCommodityID). err = gdb.Table("erp_stock_commodity").Where("id = ?", commodities[i].ErpStockCommodityID).
Updates(map[string]interface{}{"state": SoldOut}).Error // 状态更新为在库 Updates(map[string]interface{}{
"state": SoldOut,
"updated_at": time.Now(),
}).Error // 状态更新为在库
if err != nil { if err != nil {
logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err)) logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err))
return err return err
@ -957,7 +975,10 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error {
err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?", err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?",
erpOrder.StoreId, commodities[i].ErpCommodityId). erpOrder.StoreId, commodities[i].ErpCommodityId).
Updates(map[string]interface{}{"count": gorm.Expr("count - ?", 1)}).Error // 库存数量-1 Updates(map[string]interface{}{
"count": gorm.Expr("count - ?", 1),
"updated_at": time.Now(),
}).Error // 库存数量-1
if err != nil { if err != nil {
logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err)) logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err))
return err return err
@ -993,7 +1014,10 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error {
// 优先出库库存时间最长的数据 // 优先出库库存时间最长的数据
err = gdb.Table("erp_stock_commodity").Where("id = ?", rightId). err = gdb.Table("erp_stock_commodity").Where("id = ?", rightId).
Updates(map[string]interface{}{"state": state}).Error // 状态更新为销售锁定中;反审核则更新为在库 Updates(map[string]interface{}{
"state": state,
"updated_at": time.Now(),
}).Error // 状态更新为销售锁定中;反审核则更新为在库
if err != nil { if err != nil {
logger.Error("commodities err:", logger.Field("err", err)) logger.Error("commodities err:", logger.Field("err", err))
return err return err
@ -1002,7 +1026,10 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error {
if state == SoldOut { // 已售的订单才更新库存数量 if state == SoldOut { // 已售的订单才更新库存数量
err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?", err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?",
erpOrder.StoreId, commodities[i].ErpCommodityId). erpOrder.StoreId, commodities[i].ErpCommodityId).
Updates(map[string]interface{}{"count": gorm.Expr("count - ?", 1)}).Error // 库存数量-1 Updates(map[string]interface{}{
"count": gorm.Expr("count - ?", 1),
"updated_at": time.Now(),
}).Error // 库存数量-1
if err != nil { if err != nil {
logger.Error("commodities err:", logger.Field("err", err)) logger.Error("commodities err:", logger.Field("err", err))
return err return err
@ -1027,7 +1054,10 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error {
} }
err = gdb.Table("erp_stock_commodity").Where("imei = ?", commodities[i].IMEI). err = gdb.Table("erp_stock_commodity").Where("imei = ?", commodities[i].IMEI).
Updates(map[string]interface{}{"state": InStock}).Error // 状态更新为在库 Updates(map[string]interface{}{
"state": InStock,
"updated_at": Now(),
}).Error // 状态更新为在库
if err != nil { if err != nil {
logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err)) logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err))
return err return err
@ -1035,7 +1065,10 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error {
err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?", err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?",
erpOrder.StoreId, commodities[i].ErpCommodityId). erpOrder.StoreId, commodities[i].ErpCommodityId).
Updates(map[string]interface{}{"count": gorm.Expr("count + ?", 1)}).Error // 库存数量+1 Updates(map[string]interface{}{
"count": gorm.Expr("count + ?", 1),
"updated_at": time.Now(),
}).Error // 库存数量+1
if err != nil { if err != nil {
logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err)) logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err))
return err return err
@ -1047,7 +1080,10 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error {
stockCommodityID, _ := tools.StringToInt(commodities[i].ErpStockCommodityID) stockCommodityID, _ := tools.StringToInt(commodities[i].ErpStockCommodityID)
if stockCommodityID > 0 { if stockCommodityID > 0 {
err = gdb.Table("erp_stock_commodity").Where("id = ?", commodities[i].ErpStockCommodityID). err = gdb.Table("erp_stock_commodity").Where("id = ?", commodities[i].ErpStockCommodityID).
Updates(map[string]interface{}{"state": InStock}).Error // 状态更新为在库 Updates(map[string]interface{}{
"state": InStock,
"updated_at": Now(),
}).Error // 状态更新为在库
if err != nil { if err != nil {
logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err)) logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err))
return err return err
@ -1055,7 +1091,10 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error {
err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?", err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?",
erpOrder.StoreId, commodities[i].ErpCommodityId). erpOrder.StoreId, commodities[i].ErpCommodityId).
Updates(map[string]interface{}{"count": gorm.Expr("count + ?", 1)}).Error // 库存数量+1 Updates(map[string]interface{}{
"count": gorm.Expr("count + ?", 1),
"updated_at": time.Now(),
}).Error // 库存数量+1
if err != nil { if err != nil {
logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err)) logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err))
return err return err
@ -1083,7 +1122,10 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error {
} }
err = gdb.Table("erp_stock_commodity").Where("id = ?", rightId). err = gdb.Table("erp_stock_commodity").Where("id = ?", rightId).
Updates(map[string]interface{}{"state": InStock}).Error // 状态更新为在库 Updates(map[string]interface{}{
"state": InStock,
"updated_at": Now(),
}).Error // 状态更新为在库
if err != nil { if err != nil {
logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err)) logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err))
return err return err
@ -1091,7 +1133,10 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error {
err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?", err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?",
erpOrder.StoreId, commodities[i].ErpCommodityId). erpOrder.StoreId, commodities[i].ErpCommodityId).
Updates(map[string]interface{}{"count": gorm.Expr("count + ?", 1)}).Error // 库存数量+1 Updates(map[string]interface{}{
"count": gorm.Expr("count + ?", 1),
"updated_at": time.Now(),
}).Error // 库存数量+1
if err != nil { if err != nil {
logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err)) logger.Error("RetailTypeRejected commodities err:", logger.Field("err", err))
return err return err

View File

@ -1557,7 +1557,7 @@ func ExpireMemberSMSSendDay(day uint32, nowTime time.Time) {
//err := orm.Eloquent.Table("user").Where("member_expire > ?", start).Where("member_expire < ?", end). //err := orm.Eloquent.Table("user").Where("member_expire > ?", start).Where("member_expire < ?", end).
// Where("member_level in (?)", []uint32{2, 3, 4, 5}).Find(&users).Error // Where("member_level in (?)", []uint32{2, 3, 4, 5}).Find(&users).Error
err := orm.Eloquent.Table("user").Where("member_expire > ?", start).Where("member_expire < ?", end). err := orm.Eloquent.Table("user").Where("member_expire > ?", start).Where("member_expire < ?", end).
Where("member_level = ", MemberLevelUser).Find(&users).Error Where("member_level = ?", MemberLevelUser).Find(&users).Error
if err != nil { if err != nil {
logger.Error(err.Error()) logger.Error(err.Error())
return return

View File

@ -1,7 +1,7 @@
package models package models
import ( import (
"database/sql" "fmt"
orm "go-admin/common/global" orm "go-admin/common/global"
"gorm.io/gorm" "gorm.io/gorm"
"time" "time"
@ -23,13 +23,16 @@ func GetSmsNumberRemaining() int {
now := time.Now() now := time.Now()
year, month, _ := now.Date() year, month, _ := now.Date()
var totalUsed sql.NullInt64 nTotalUsed := struct {
TotalUsed int `json:"total_used"`
}{}
// 查询当前年份和月份的短信发送总数 // 查询当前年份和月份的短信发送总数
if err := orm.Eloquent.Debug().Model(&SmsSummary{}). if err := orm.Eloquent.Debug().Model(&SmsSummary{}).
Where("year = ? AND month = ?", year, int(month)). Where("year = ? AND month = ?", year, int(month)).
Select("SUM(used)"). Select("SUM(used) as total_used").
Scan(&totalUsed).Error; err != nil { Scan(&nTotalUsed).Error; err != nil {
fmt.Println("SQL Error:", err) // 打印 SQL 错误信息
return 0 return 0
} }
@ -39,7 +42,7 @@ func GetSmsNumberRemaining() int {
nMonthlyLimit = monthlyLimit nMonthlyLimit = monthlyLimit
} }
remaining := nMonthlyLimit - int(totalUsed.Int64) remaining := nMonthlyLimit - nTotalUsed.TotalUsed
return remaining return remaining
} }

View File

@ -535,8 +535,10 @@ func TestMemberExpirationReminder(t *testing.T) {
func TestExpireMemberSMSSendDay(t *testing.T) { func TestExpireMemberSMSSendDay(t *testing.T) {
InitIODBTest() InitIODBTest()
orm.Eloquent = IODBTest orm.Eloquent = IODBTest
nowTime := time.Now() models.ExpireMemberSMSSend()
models.ExpireMemberSMSSendDay(1, nowTime)
//nowTime := time.Now()
//models.ExpireMemberSMSSendDay(1, nowTime)
} }
func TestCreateInviteMemberReport(t *testing.T) { func TestCreateInviteMemberReport(t *testing.T) {