1.修复缺陷,优化代码:

(1)库存调拨、库存变动中商品都拆分为单条数据;
(2)编辑商品资料时同步更新库存表和库存商品表的商品编号;
(3)租卡相关接口添加权限校验,只能查询对应门店权限的数据;
This commit is contained in:
chenlin 2024-05-31 17:51:41 +08:00
parent ee90ce6630
commit 9207440c53
53 changed files with 3600 additions and 414 deletions

View File

@ -335,8 +335,8 @@ func CommodityEdit(c *gin.Context) {
return
}
// 同步更新库存表和库存商品表的"指导零售价"和"最低零售价"、"分类id"、"分类名称";库存商品表的"商品条码"
err = models.UpdateErpStockAmountInfo(begin, req, barCode, commodity.ErpCategory)
// 同步更新库存表和库存商品表的"指导零售价"和"最低零售价"、"分类id"、"分类名称"、"商品编号";库存商品表的"商品条码"
err = models.UpdateErpStockAmountInfo(begin, req, barCode, commodity.SerialNumber, commodity.ErpCategory)
if err != nil {
begin.Rollback()
logger.Error("UpdateErpStockAmountInfo err:", logger.Field("err", err))

View File

@ -239,7 +239,7 @@ func CooperativeMemberPromotionStatisticList(c *gin.Context) {
return
}
ret, err := req.List()
ret, err := req.List(c)
if err != nil {
logger.Errorf("err:", err)
app.Error(c, http.StatusInternalServerError, err, "查询失败")
@ -654,7 +654,7 @@ func AssistantInviteMemberReportList(c *gin.Context) {
req.SysUser = sysUser
//req.CooperativeBusinessId = sysUser.CooperativeBusinessId
ret, err := req.List()
ret, err := req.List(c)
if err != nil {
logger.Errorf("err:", err)
app.Error(c, http.StatusInternalServerError, err, "查询失败")

View File

@ -46,6 +46,14 @@ func GameCardList(c *gin.Context) {
app.OK(c, ret, "")
}
// GameCardGoodsList 查询库存游戏卡串码
// @Summary 查询库存游戏卡串码
// @Tags 租卡系统-库存管理
// @Produce json
// @Accept json
// @Param request body models.GetGameCardGoodsListReq true "查询库存游戏卡串码"
// @Success 200 {object} models.GetGameCardGoodsListResp
// @Router /api/v1/goods/goods_list [post]
func GameCardGoodsList(c *gin.Context) {
req := models.GetGameCardGoodsListReq{}
if c.ShouldBindJSON(&req) != nil {
@ -54,7 +62,7 @@ func GameCardGoodsList(c *gin.Context) {
return
}
resp, err := req.GetGameCardGoodsList()
resp, err := req.GetGameCardGoodsList(c)
if err != nil {
logger.Errorf("err:", logger.Field("err", err))
app.Error(c, http.StatusInternalServerError, err, "查询失败")

View File

@ -275,7 +275,7 @@ func InventoryAllotDetail(c *gin.Context) {
return
}
allotOrder.Commodities = allotCommodities
allotOrder.Commodities = models.MergeCommodities(allotCommodities)
app.OK(c, allotOrder, "查询成功")
return
}

View File

@ -74,6 +74,12 @@ func InventoryChangeEdit(c *gin.Context) {
return
}
if len(req.Commodities) == 0 {
logger.Error("InventoryChangeEdit err:", logger.Field("err", err))
app.Error(c, http.StatusInternalServerError, errors.New("请添加商品"), "请添加商品")
return
}
changeProductOrder, err := models.EditChangeInventory(req)
if err != nil {
logger.Error("InventoryChangeEdit err:", logger.Field("err", err))
@ -276,7 +282,7 @@ func InventoryChangeDetail(c *gin.Context) {
return
}
changeOrder.Commodities = changeCommodities
changeOrder.Commodities = models.MergeChangeCommodities(changeCommodities)
app.OK(c, changeOrder, "查询成功")
return
}

View File

@ -10,6 +10,14 @@ import (
"net/http"
)
// GoodsOrderList 查询商城订单列表
// @Summary 查询商城订单列表
// @Tags 订单管理
// @Produce json
// @Accept json
// @Param request body models.GoodsOrderListReq true "查询商城订单列表"
// @Success 200 {object} app.Response "{"code": 200, "data": { "total": 4, "pageIndex":0, "total_page":10, "list":{} }}"
// @Router /api/v1/mall/goods/order/list [post]
func GoodsOrderList(c *gin.Context) {
req := &models.GoodsOrderListReq{}
if c.ShouldBindJSON(req) != nil {
@ -78,7 +86,11 @@ func GoodsOrderDeliver(c *gin.Context) {
app.Error(c, http.StatusInternalServerError, errors.New("order detail err"), "订单发货失败")
return
}
req.DeliverStoreId = sysUser.StoreId
// todo 暂时使用用户有效门店,待后续产品梳理流程后再修改
//req.DeliverStoreId = sysUser.StoreId
storeInfo, _ := models.GetUserEffectiveStore(uint32(sysUser.UserId))
req.DeliverStoreId = uint32(storeInfo[0].StoreID)
orderDetail, err := req.OrderDeliver()
if err != nil {

View File

@ -12,6 +12,14 @@ import (
"net/http"
)
// OrderList 查询租赁订单列表
// @Summary 查询租赁订单列表
// @Tags 租卡系统-订单管理
// @Produce json
// @Accept json
// @Param request body models.OrderListReq true "查询租赁订单列表"
// @Success 200 {object} app.Response "{"code": 200, "data": { "total": 4, "pageIndex":0, "total_page":10, "list":{} }}"
// @Router /api/v1/order/list [post]
func OrderList(c *gin.Context) {
req := &models.OrderListReq{}
if c.ShouldBindJSON(req) != nil {
@ -35,7 +43,7 @@ func OrderList(c *gin.Context) {
//
//}
list, count, _, err := req.List(0)
list, count, _, err := req.List(0, c)
if err != nil {
logger.Errorf("err:", logger.Field("err", err))
app.Error(c, http.StatusInternalServerError, err, "查询失败")
@ -43,10 +51,10 @@ func OrderList(c *gin.Context) {
}
ret := map[string]interface{}{
"count": count,
"list": list,
"pageIndex": req.Page,
"total_page": req.PageSize,
"total": count,
"list": list,
"pageIndex": req.Page,
"pageSize": req.PageSize,
}
app.OK(c, ret, "")
}
@ -283,7 +291,7 @@ func OrderListExport(c *gin.Context) {
reqJson, _ := json.Marshal(req)
fmt.Println("reqJson:", string(reqJson))
_, _, filePath, err := req.List(1)
_, _, filePath, err := req.List(1, c)
if err != nil {
logger.Errorf("OrderListExport err:", logger.Field("err", err))
app.Error(c, http.StatusInternalServerError, err, "导出失败")

View File

@ -14,6 +14,14 @@ import (
"time"
)
// RecycleCardOrderList 查询小程序回收订单
// @Summary 查询小程序回收订单
// @Tags 租卡系统-订单管理
// @Produce json
// @Accept json
// @Param request body models.RecycleCardOrderListReq true "查询小程序回收订单"
// @Success 200 {object} models.RecycleCardOrderListRsp
// @Router /api/v1/recycle_card/order/list [post]
func RecycleCardOrderList(c *gin.Context) {
req := models.RecycleCardOrderListReq{}
if c.ShouldBindJSON(&req) != nil {

View File

@ -342,7 +342,7 @@ func ShareCardRetrieveCardAudit(c *gin.Context) {
//ret := map[string]interface{}{
// "count": count,
// "list": list,
// "pageIndex": req.Page,
// "pageIndex": req.PageIndex,
// "pageSize": req.PageSize,
//}
app.OK(c, nil, "操作成功")
@ -377,7 +377,7 @@ func ShareCardRetrieveCardDeliver(c *gin.Context) {
//ret := map[string]interface{}{
// "count": count,
// "list": list,
// "pageIndex": req.Page,
// "pageIndex": req.PageIndex,
// "pageSize": req.PageSize,
//}
app.OK(c, nil, "")

View File

@ -12,6 +12,14 @@ import (
"time"
)
// GameCardGoodsStockInfoList 查询小程序租卡库存列表
// @Summary 查询小程序租卡库存列表
// @Tags 租卡系统-库存管理
// @Produce json
// @Accept json
// @Param request body models.GameCardGoodsStockListReq true "查询小程序租卡库存列表"
// @Success 200 {object} models.GameCardGoodsStockListResp
// @Router /api/v1/stock/list [post]
func GameCardGoodsStockInfoList(c *gin.Context) {
req := &models.GameCardGoodsStockListReq{}
if c.ShouldBindJSON(&req) != nil {
@ -19,7 +27,7 @@ func GameCardGoodsStockInfoList(c *gin.Context) {
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
return
}
resp, err := req.List()
resp, err := req.List(c)
if err != nil {
logger.Errorf("err:", logger.Field("err", err))
app.Error(c, http.StatusInternalServerError, err, "查询失败")
@ -29,7 +37,7 @@ func GameCardGoodsStockInfoList(c *gin.Context) {
//ret := map[string]interface{}{
// "count": count,
// "list": list,
// "pageIndex": req.Page,
// "pageIndex": req.PageIndex,
// "total_page": req.PageSize,
//}
app.OK(c, resp, "")
@ -222,7 +230,14 @@ func CannibalizeTaskPutInStorage(c *gin.Context) {
app.OK(c, nil, "发货成功")
}
// 5.调拨任务列表
// CannibalizeTaskList 查询游戏卡库存调拨
// @Summary 查询游戏卡库存调拨
// @Tags 租卡系统-库存管理
// @Produce json
// @Accept json
// @Param request body models.CannibalizeTaskListReq true "查询游戏卡库存调拨"
// @Success 200 {object} models.CannibalizeTaskListResp
// @Router /api/v1/stock/cannibalize_task/list [post]
func CannibalizeTaskList(c *gin.Context) {
req := models.CannibalizeTaskListReq{}
if c.ShouldBindJSON(&req) != nil {
@ -230,7 +245,7 @@ func CannibalizeTaskList(c *gin.Context) {
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
return
}
resp, err := req.GetCannibalizeTaskList()
resp, err := req.GetCannibalizeTaskList(c)
if err != nil {
logger.Error("err:", logger.Field("err", err))
app.Error(c, http.StatusInternalServerError, err, "任务列表错误")

View File

@ -118,7 +118,7 @@ func NewUserList(c *gin.Context) {
}
fmt.Printf("req: %+v \n", req)
ret, err := models.GetNewUserList(req)
ret, err := models.GetNewUserList(req, c)
if err != nil {
logger.Errorf("err:", logger.Field("err", err))
app.Error(c, http.StatusInternalServerError, err, "查询失败")
@ -938,10 +938,14 @@ func NewUserInviteRecordList(c *gin.Context) {
return
}
resp, err := req.NewList()
resp, err := req.NewList(c)
if err != nil {
logger.Errorf("err:", logger.Field("err", err))
app.Error(c, http.StatusInternalServerError, err, "查询失败")
if err.Error() == "您没有该门店权限" {
app.Error(c, http.StatusInternalServerError, err, err.Error())
} else {
app.Error(c, http.StatusInternalServerError, err, "查询失败")
}
return
}

View File

@ -291,6 +291,7 @@ type ErpCommodityListReq struct {
ErpCommodityName string `json:"erp_commodity_name"` // 商品名称
ErpCategoryId uint32 `json:"erp_category_id"` // 商品分类id
IMEI string `json:"imei"` // 串码
ErpBarcode string `json:"erp_barcode"` // 商品条码
ErpSupplierId uint32 `json:"erp_supplier_id"` // 供应商id
PageIndex int `json:"pageIndex"` // 页码
PageSize int `json:"pageSize"` // 每页展示数据条数
@ -337,6 +338,9 @@ func (m *ErpCommodityListReq) List() (*ErpCommodityListResp, error) {
if m.ErpSupplierId != 0 {
qs = qs.Where("erp_supplier_id=?", m.ErpSupplierId)
}
if m.ErpBarcode != "" {
qs = qs.Where("erp_barcode=?", m.ErpBarcode)
}
var count int64
err := qs.Count(&count).Error
@ -456,6 +460,66 @@ func SortCommodities(commodities []ErpCommodity) {
sort.SliceStable(commodities, less)
}
// SortReportByAllotDataCommodities 对商品数组进行排序
func SortReportByAllotDataCommodities(commodities []ReportByAllotData) {
// 定义排序函数
less := func(i, j int) bool {
// 解析商品编号,提取分类编号和商品编号的数字部分
catNumI, subCatNumI, threeSubCatNumI, itemNumI := parseSerialNumber(commodities[i].CommoditySerialNumber)
catNumJ, subCatNumJ, threeSubCatNumJ, itemNumJ := parseSerialNumber(commodities[j].CommoditySerialNumber)
// 按照分类编号从小到大排序
if catNumI != catNumJ {
return catNumI < catNumJ
}
// 如果分类编号相同,按照具体分类下的商品编号递增排序
if subCatNumI != subCatNumJ {
return subCatNumI < subCatNumJ
}
if threeSubCatNumI != threeSubCatNumJ {
return threeSubCatNumI < threeSubCatNumJ
}
// 如果具体分类编号也相同,按照商品编号递增排序
return itemNumI < itemNumJ
}
// 调用排序函数进行排序
sort.SliceStable(commodities, less)
}
// SortReportByOtherDataCommodities 对商品数组进行排序
func SortReportByOtherDataCommodities(commodities []ReportByOtherData) {
// 定义排序函数
less := func(i, j int) bool {
// 解析商品编号,提取分类编号和商品编号的数字部分
catNumI, subCatNumI, threeSubCatNumI, itemNumI := parseSerialNumber(commodities[i].CommoditySerialNumber)
catNumJ, subCatNumJ, threeSubCatNumJ, itemNumJ := parseSerialNumber(commodities[j].CommoditySerialNumber)
// 按照分类编号从小到大排序
if catNumI != catNumJ {
return catNumI < catNumJ
}
// 如果分类编号相同,按照具体分类下的商品编号递增排序
if subCatNumI != subCatNumJ {
return subCatNumI < subCatNumJ
}
if threeSubCatNumI != threeSubCatNumJ {
return threeSubCatNumI < threeSubCatNumJ
}
// 如果具体分类编号也相同,按照商品编号递增排序
return itemNumI < itemNumJ
}
// 调用排序函数进行排序
sort.SliceStable(commodities, less)
}
// parseSerialNumber 解析商品编号,提取分类编号、具体分类编号和商品编号的数字部分
func parseSerialNumber(serialNumber string) (catNum, subCatNum, threeSubCatNum, itemNum int) {
if len(serialNumber) < 3 {
@ -529,7 +593,7 @@ func (m *ErpCategoryListReq) List() (*ErpCategoryListResp, error) {
// qs = qs.Where("pid", m.Pid)
//}
//var count int64
//err := qs.Count(&count).Error
//err := qs.Total(&count).Error
//if err != nil {
// logger.Error("count err:", err)
// return resp, err
@ -1957,7 +2021,7 @@ func (m *ErpStockListReq) allCommodityList(c *gin.Context) (*ErpStockListResp, e
var count int64
err := orm.Eloquent.Debug().Table("(?) AS subquery", es).Count(&count).Error
//err := es.Count(&count).Error
//err := es.Total(&count).Error
if err != nil {
logger.Error("commodityList count err", logger.Field("err", err))
return resp, err

View File

@ -91,7 +91,7 @@ func (e *SysConfig) GetPage(pageSize int, pageIndex int) ([]SysConfig, int, erro
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
//table.Where("`deleted_at` IS NULL").Count(&count)
//table.Where("`deleted_at` IS NULL").Total(&count)
return doc, int(count), nil
}

View File

@ -1,10 +1,13 @@
package models
import (
"errors"
"fmt"
"github.com/codinl/go-logger"
"github.com/gin-gonic/gin"
"github.com/xuri/excelize/v2"
orm "go-admin/common/global"
"go-admin/tools"
"go-admin/tools/config"
"gorm.io/gorm"
"regexp"
@ -733,13 +736,34 @@ type CooperativeMemberPromotionStatisticListResp struct {
ExportUrl string `json:"export_url"` // 导出excel地址
}
func (m *CooperativeMemberPromotionStatisticReq) List() (*CooperativeMemberPromotionStatisticListResp, error) {
func (m *CooperativeMemberPromotionStatisticReq) List(c *gin.Context) (*CooperativeMemberPromotionStatisticListResp, error) {
resp := &CooperativeMemberPromotionStatisticListResp{
PageIndex: m.Page,
PageSize: m.PageSize,
}
list := make([]CooperativeMemberPromotionStatistic, 0)
// 非管理员才判断所属门店
var validStoreList []uint32
if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") {
sysUser, err := GetSysUserByCtx(c)
if err != nil {
return nil, err
}
// 返回sysUser未过期的门店id列表
validStoreList = GetValidStoreIDs(sysUser.StoreData)
if m.StoreId != 0 {
if !Contains(validStoreList, m.StoreId) {
return nil, errors.New("您没有该门店权限")
}
} else {
if len(validStoreList) == 0 {
return nil, errors.New("用户未绑定门店")
}
}
}
page := m.Page - 1
if page < 0 {
page = 0
@ -780,6 +804,13 @@ func (m *CooperativeMemberPromotionStatisticReq) List() (*CooperativeMemberPromo
var memberDayStorePromotions []CooperativeMemberPromotionStoreDay
qs = orm.Eloquent.Table("cooperative_member_promotion_store_day").Where("store_id=?", m.StoreId).
Where("cooperative_business_id=?", m.CooperativeBusinessId)
if len(validStoreList) > 0 {
if len(validStoreList) == 1 {
qs = qs.Where("store_id = ?", validStoreList[0])
} else {
qs = qs.Where("store_id IN (?)", validStoreList)
}
}
if !startTime.IsZero() {
qs = qs.Where("created_at>?", startTime)
}
@ -795,6 +826,13 @@ func (m *CooperativeMemberPromotionStatisticReq) List() (*CooperativeMemberPromo
} else {
var memberDayPromotions []CooperativeMemberPromotionDay
qs = orm.Eloquent.Table("cooperative_member_promotion_day").Where("cooperative_business_id=?", m.CooperativeBusinessId)
if len(validStoreList) > 0 {
if len(validStoreList) == 1 {
qs = qs.Where("store_id = ?", validStoreList[0])
} else {
qs = qs.Where("store_id IN (?)", validStoreList)
}
}
if !startTime.IsZero() {
qs = qs.Where("created_at>?", startTime)
}
@ -812,6 +850,13 @@ func (m *CooperativeMemberPromotionStatisticReq) List() (*CooperativeMemberPromo
if m.StoreId != 0 {
var memberStorePromotions []CooperativeMemberPromotionStore
qs = orm.Eloquent.Table("cooperative_member_promotion_store").Where("cooperative_business_id=?", m.CooperativeBusinessId)
if len(validStoreList) > 0 {
if len(validStoreList) == 1 {
qs = qs.Where("store_id = ?", validStoreList[0])
} else {
qs = qs.Where("store_id IN (?)", validStoreList)
}
}
if m.StoreId != 0 {
qs = qs.Where("store_id=?", m.StoreId)
}
@ -833,6 +878,13 @@ func (m *CooperativeMemberPromotionStatisticReq) List() (*CooperativeMemberPromo
} else {
var memberPromotions []CooperativeMemberPromotion
qs = orm.Eloquent.Table("cooperative_member_promotion").Where("cooperative_business_id=?", m.CooperativeBusinessId)
if len(validStoreList) > 0 {
if len(validStoreList) == 1 {
qs = qs.Where("store_id = ?", validStoreList[0])
} else {
qs = qs.Where("store_id IN (?)", validStoreList)
}
}
//if m.Date != "" {
// qs = qs.Where("date=?", m.Date)
//}

View File

@ -10,6 +10,7 @@ import (
"go-admin/tools"
"go-admin/tools/config"
"math"
"sort"
"strconv"
"sync"
"time"
@ -231,7 +232,35 @@ func (m *ErpDecisionReportReq) DecisionReportList(c *gin.Context) (*ErpDecisionR
// 从通道中接收结果
var sumData DecisionSumData
commodityMap := make(map[uint32]DecisionReportData)
for data := range ch {
if existing, found := commodityMap[data.CommodityId]; found {
// Merge data if the commodity already exists in the map
existing.BeginStock += data.BeginStock
existing.BeginAmount += data.BeginAmount
existing.PurchaseStock += data.PurchaseStock
existing.PurchaseReturn += data.PurchaseReturn
existing.OrderSale += data.OrderSale
existing.OrderReject += data.OrderReject
existing.AllotIn += data.AllotIn
existing.AllotWaitIn += data.AllotWaitIn
existing.AllotOut += data.AllotOut
existing.AllotWaitOut += data.AllotWaitOut
existing.ProductIn += data.ProductIn
existing.SystemOut += data.SystemOut
existing.CheckIn += data.CheckIn
existing.CheckOut += data.CheckOut
existing.EndStock += data.EndStock
existing.EndAmount += data.EndAmount
commodityMap[data.CommodityId] = existing
} else {
// If not found, add new entry to the map
commodityMap[data.CommodityId] = data
}
}
for _, data := range commodityMap {
sumData.TotalBeginStock += data.BeginStock
sumData.TotalBeginAmount += data.BeginAmount
sumData.TotalPurchaseStock += data.PurchaseStock
@ -255,8 +284,16 @@ func (m *ErpDecisionReportReq) DecisionReportList(c *gin.Context) (*ErpDecisionR
reportList = append(reportList, data)
}
// 排序规则:商品编号小
sort.Slice(reportList, func(i, j int) bool {
if reportList[i].CommodityId != reportList[j].CommodityId {
return reportList[i].CommodityId < reportList[j].CommodityId
}
return true
})
resp.SumData = sumData
resp.Total = int(count)
resp.Total = len(reportList)
if m.IsExport == 1 {
resp.List = reportList

View File

@ -123,7 +123,7 @@ func (e *DictData) GetPage(pageSize int, pageIndex int) ([]DictData, int, error)
if err := table.Order("dict_sort").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
//table.Where("`deleted_at` IS NULL").Count(&count)
//table.Where("`deleted_at` IS NULL").Total(&count)
return doc, int(count), nil
}

View File

@ -109,7 +109,7 @@ func (e *DictType) GetPage(pageSize int, pageIndex int) ([]DictType, int, error)
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
//table.Count(&count)
//table.Total(&count)
return doc, int(count), nil
}

View File

@ -1087,8 +1087,10 @@ func ErpOrderRetailDetailSetCommodity(list []ErpOrder) {
list[i].TotalRetailPrice = -math.Abs(list[i].TotalRetailPrice)
list[i].TotalAmount = -math.Abs(list[i].TotalAmount)
list[i].TotalCount = -int32(math.Abs(float64(list[i].TotalCount)))
list[i].TotalSalesProfit = -math.Abs(list[i].TotalSalesProfit)
list[i].TotalStaffProfit = -math.Abs(list[i].TotalStaffProfit)
//list[i].TotalSalesProfit = -math.Abs(list[i].TotalSalesProfit)
//list[i].TotalStaffProfit = -math.Abs(list[i].TotalStaffProfit)
list[i].TotalSalesProfit = -list[i].TotalSalesProfit
list[i].TotalStaffProfit = -list[i].TotalStaffProfit
list[i].TotalDiscount = -math.Abs(list[i].TotalDiscount)
list[i].VmCount = -uint32(math.Abs(float64(list[i].VmCount)))
list[i].StorePer = -math.Abs(list[i].StorePer)
@ -2303,9 +2305,9 @@ func QueryRetailMargin(req *ErpOrderRetailMarginReq, c *gin.Context) (*ErpOrderR
// data.ErpCommodityName = item.ErpCommodityName
// data.ErpCategoryId = item.ErpCategoryId
// data.ErpCategoryName = item.ErpCategoryName
// data.Count = item.Count
// data.Total = item.Total
// data.SalesAmount = item.ReceivedAmount
// data.SalesCost = float64(item.WholesalePrice * item.Count)
// data.SalesCost = float64(item.WholesalePrice * item.Total)
// data.SalesMargin = data.SalesAmount - data.SalesCost
// data.GrossMargins = float64ToPercentage(data.SalesMargin / data.SalesAmount)
// if data.RetailType == RetailTypeRejected {
@ -2315,7 +2317,7 @@ func QueryRetailMargin(req *ErpOrderRetailMarginReq, c *gin.Context) (*ErpOrderR
// }
// list = append(list, data)
//
// resp.TotalCount += data.Count
// resp.TotalCount += data.Total
// resp.TotalSalesAmount += data.SalesAmount
// resp.TotalSalesCost += data.SalesCost
// resp.TotalSalesMargin += data.SalesMargin
@ -2337,7 +2339,7 @@ func QueryRetailMargin(req *ErpOrderRetailMarginReq, c *gin.Context) (*ErpOrderR
var salesAmount, salesCost, salesMargin float64
if item.RetailType == RetailTypeRejected {
nCount = -int32(item.Count)
salesAmount = -item.ReceivedAmount
salesAmount = -item.RejectedAmount // 退货订单要以实际退货金额为准
salesCost = -float64(int32(item.WholesalePrice) * item.Count)
salesMargin = -(item.ReceivedAmount - float64(int32(item.WholesalePrice)*item.Count))
} else {
@ -2374,7 +2376,7 @@ func QueryRetailMargin(req *ErpOrderRetailMarginReq, c *gin.Context) (*ErpOrderR
SalesCost: float64(int32(item.WholesalePrice) * item.Count),
SalesMargin: item.ReceivedAmount - float64(int32(item.WholesalePrice)*item.Count),
GrossMargins: "--",
//GrossMargins: float64ToPercentage((item.ReceivedAmount - float64(int32(item.WholesalePrice)*item.Count)) / item.ReceivedAmount),
//GrossMargins: float64ToPercentage((item.ReceivedAmount - float64(int32(item.WholesalePrice)*item.Total)) / item.ReceivedAmount),
}
if item.ReceivedAmount != 0 {
data.GrossMargins = float64ToPercentage((item.ReceivedAmount - float64(int32(item.WholesalePrice)*item.Count)) / item.ReceivedAmount)
@ -2826,10 +2828,10 @@ func queryRetailDetailByJoin(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp
}
}
if req.Salesman != 0 { // 销售员
qs = qs.Where("JSON_CONTAINS(erp_order.salesman_list, ?)", fmt.Sprintf(`{"uid":%d}`, req.Salesman))
es = es.Where("JSON_CONTAINS(erp_order.salesman_list, ?)", fmt.Sprintf(`{"uid":%d}`, req.Salesman))
orderSumQs = orderSumQs.Where("JSON_CONTAINS(eo.salesman_list, ?)", fmt.Sprintf(`{"uid":%d}`, req.Salesman))
rejectedOrderSumQs = rejectedOrderSumQs.Where("JSON_CONTAINS(eo.salesman_list, ?)", fmt.Sprintf(`{"uid":%d}`, req.Salesman))
qs = qs.Where("JSON_CONTAINS(erp_order.salesman_list, ?)", fmt.Sprintf(`{"userId":%d}`, req.Salesman))
es = es.Where("JSON_CONTAINS(erp_order.salesman_list, ?)", fmt.Sprintf(`{"userId":%d}`, req.Salesman))
orderSumQs = orderSumQs.Where("JSON_CONTAINS(eo.salesman_list, ?)", fmt.Sprintf(`{"userId":%d}`, req.Salesman))
rejectedOrderSumQs = rejectedOrderSumQs.Where("JSON_CONTAINS(eo.salesman_list, ?)", fmt.Sprintf(`{"userId":%d}`, req.Salesman))
}
if req.StartTime != "" { // 审核开始时间
parse, err := time.Parse(QueryTimeFormat, req.StartTime)
@ -2869,14 +2871,14 @@ func queryRetailDetailByJoin(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp
// 销售订单的汇总数据
var sumData RetailDetailTotalData
sumData, err = getRetailDetailTotalDataJoinErpOrder(orderSumQs, RetailTypeSale)
sumData, err = getRetailDetailTotalDataJoinErpOrderSale(orderSumQs, RetailTypeSale)
if err != nil {
logger.Error("query sum data err:", logger.Field("err", err))
return resp, err
}
// 退货订单的汇总数据
var rejectedSumData RetailDetailTotalData
rejectedSumData, err = getRetailDetailTotalDataJoinErpOrder(rejectedOrderSumQs, RetailTypeRejected)
rejectedSumData, err = getRetailDetailTotalDataJoinErpOrderRejected(rejectedOrderSumQs, RetailTypeRejected)
if err != nil {
logger.Error("query sum data err:", logger.Field("err", err))
return resp, err
@ -3043,8 +3045,8 @@ func packData(result []RetailDetailByJoin) []ErpOrder {
order.TotalRetailPrice = item.TotalRetailPrice
order.TotalAmount = item.TotalAmount
order.TotalCount = item.TotalCount
//order.TotalSalesProfit = item.TotalSalesProfit
//order.TotalStaffProfit = item.TotalStaffProfit
order.TotalSalesProfit = item.TotalSalesProfit
order.TotalStaffProfit = item.TotalStaffProfit
order.VmCount = item.VmCount
order.SaleOrderId = item.SaleOrderId
order.PayStatus = item.PayStatus
@ -3059,8 +3061,8 @@ func packData(result []RetailDetailByJoin) []ErpOrder {
order.TotalRetailPrice = -math.Abs(order.TotalRetailPrice)
order.TotalAmount = -math.Abs(order.TotalAmount)
order.TotalCount = -int32(math.Abs(float64(order.TotalCount)))
order.TotalSalesProfit = -math.Abs(order.TotalSalesProfit)
order.TotalStaffProfit = -math.Abs(order.TotalStaffProfit)
order.TotalSalesProfit = -order.TotalSalesProfit
order.TotalStaffProfit = -order.TotalStaffProfit
order.TotalDiscount = -math.Abs(order.TotalDiscount)
order.VmCount = -uint32(math.Abs(float64(order.VmCount)))
order.StorePer = -math.Abs(order.StorePer)
@ -3183,7 +3185,7 @@ func queryRetailDetailCommon(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp
}
}
if req.Salesman != 0 { // 销售员
qs = qs.Where("JSON_CONTAINS(salesman_list, ?)", fmt.Sprintf(`{"uid":%d}`, req.Salesman))
qs = qs.Where("JSON_CONTAINS(salesman_list, ?)", fmt.Sprintf(`{"userId":%d}`, req.Salesman))
}
if req.StartTime != "" { // 审核开始时间
parse, err := time.Parse(QueryTimeFormat, req.StartTime)
@ -3208,7 +3210,7 @@ func queryRetailDetailCommon(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp
// 销售订单的汇总数据
orderSumQs := qs
var sumData RetailDetailTotalData
sumData, err = getRetailDetailTotalData(orderSumQs, RetailTypeSale)
sumData, err = getRetailDetailTotalDataSale(orderSumQs, RetailTypeSale)
if err != nil {
logger.Error("query sum data err:", logger.Field("err", err))
return resp, err
@ -3216,7 +3218,7 @@ func queryRetailDetailCommon(req *ErpOrderRetailDetailReq, c *gin.Context) (*Erp
// 退货订单的汇总数据
var rejectedSumData RetailDetailTotalData
rejectedOrderSumQs := qs
rejectedSumData, err = getRetailDetailTotalData(rejectedOrderSumQs, RetailTypeRejected)
rejectedSumData, err = getRetailDetailTotalDataRejected(rejectedOrderSumQs, RetailTypeRejected)
if err != nil {
logger.Error("query sum data err:", logger.Field("err", err))
return resp, err
@ -3341,7 +3343,7 @@ func roundValues(data *RetailDetailTotalData, totalPerData *TotalPerData, cashie
}
// 查询零售订单的汇总数据
func getRetailDetailTotalData(qs *gorm.DB, retailType string) (RetailDetailTotalData, error) {
func getRetailDetailTotalDataSale(qs *gorm.DB, retailType string) (RetailDetailTotalData, error) {
var sumData RetailDetailTotalData
err := qs.Debug().Select("SUM(erp_order_commodity.count) as count, "+
"SUM(erp_order_commodity.retail_price) as retail_price, "+
@ -3369,7 +3371,35 @@ func getRetailDetailTotalData(qs *gorm.DB, retailType string) (RetailDetailTotal
}
// 查询零售订单的汇总数据
func getRetailDetailTotalDataJoinErpOrder(qs *gorm.DB, retailType string) (RetailDetailTotalData, error) {
func getRetailDetailTotalDataRejected(qs *gorm.DB, retailType string) (RetailDetailTotalData, error) {
var sumData RetailDetailTotalData
err := qs.Debug().Select("SUM(erp_order_commodity.count) as count, "+
"SUM(erp_order_commodity.retail_price) as retail_price, "+
"SUM(erp_order_commodity.sale_price) as sale_price, "+
"SUM(erp_order_commodity.sale_discount) as sale_discount, "+
"SUM(erp_order_commodity.member_discount) as member_discount, "+
"SUM(erp_order_commodity.rejected_amount) as Amount, "+
"SUM(erp_order_commodity.wholesale_price) as wholesale_price, "+
"(SUM(erp_order_commodity.wholesale_price) + SUM(erp_order_commodity.staff_cost_price)) as staff_price, "+
"SUM(erp_order_commodity.sales_profit) as sales_profit, "+
"SUM(erp_order_commodity.staff_profit) as staff_profit, "+
"SUM(erp_order.total_retail_price) as total_retail_price, "+
"SUM(erp_order.total_discount) as total_discount, "+
"SUM(erp_order.total_amount) as total_amount, "+
"SUM(erp_order.total_sales_profit) as total_sales_profit, "+
"SUM(erp_order.total_staff_profit) as total_staff_profit, "+
"SUM(erp_order.store_per) as store_per").
Joins("JOIN erp_order_commodity ON erp_order_commodity.erp_order_id = erp_order.id and erp_order.retail_type = ?", retailType).
Scan(&sumData).Error
if err != nil {
logger.Error("query sum data err:", logger.Field("err", err))
return sumData, err
}
return sumData, nil
}
// 查询零售订单的汇总数据
func getRetailDetailTotalDataJoinErpOrderSale(qs *gorm.DB, retailType string) (RetailDetailTotalData, error) {
var sumData RetailDetailTotalData
qs = qs.Where("eo.retail_type = ?", retailType) // 添加额外的条件
err := qs.Debug().Select("SUM(oc.count) as count, " +
@ -3377,7 +3407,7 @@ func getRetailDetailTotalDataJoinErpOrder(qs *gorm.DB, retailType string) (Retai
"SUM(oc.sale_price) as sale_price, " +
"SUM(oc.sale_discount) as sale_discount, " +
"SUM(oc.member_discount) as member_discount, " +
"SUM(oc.Amount) as Amount, " +
"SUM(oc.amount) as Amount, " +
"SUM(oc.wholesale_price) as wholesale_price, " +
"(SUM(oc.wholesale_price) + SUM(oc.staff_cost_price)) as staff_price, " +
"(SUM(oc.Amount) - SUM(oc.wholesale_price)) as sales_profit, " +
@ -3390,6 +3420,28 @@ func getRetailDetailTotalDataJoinErpOrder(qs *gorm.DB, retailType string) (Retai
return sumData, nil
}
// 查询零售订单的汇总数据
func getRetailDetailTotalDataJoinErpOrderRejected(qs *gorm.DB, retailType string) (RetailDetailTotalData, error) {
var sumData RetailDetailTotalData
qs = qs.Where("eo.retail_type = ?", retailType) // 添加额外的条件
err := qs.Debug().Select("SUM(oc.count) as count, " +
"SUM(oc.retail_price) as retail_price, " +
"SUM(oc.sale_price) as sale_price, " +
"SUM(oc.sale_discount) as sale_discount, " +
"SUM(oc.member_discount) as member_discount, " +
"SUM(oc.rejected_amount) as Amount, " +
"SUM(oc.wholesale_price) as wholesale_price, " +
"(SUM(oc.wholesale_price) + SUM(oc.staff_cost_price)) as staff_price, " +
"SUM(oc.sales_profit) as sales_profit, " +
"SUM(oc.staff_profit) as staff_profit").
Scan(&sumData).Error
if err != nil {
logger.Error("query sum data err:", logger.Field("err", err))
return sumData, err
}
return sumData, nil
}
// 查询零售订单的提成汇总数据
func getTotalPerData(qs *gorm.DB, retailType string) (TotalPerData, error) {
var totalPerData TotalPerData
@ -3444,6 +3496,17 @@ func subtractRetailData(sumData, rejectedSumData RetailDetailTotalData) RetailDe
TotalStaffProfit: sumData.TotalStaffProfit - rejectedSumData.TotalStaffProfit,
StorePer: sumData.StorePer - rejectedSumData.StorePer,
}
//if sumData.TotalSalesProfit != 0 {
// result.TotalSalesProfit = sumData.TotalSalesProfit - rejectedSumData.TotalSalesProfit
//} else {
// result.TotalSalesProfit = rejectedSumData.TotalSalesProfit
//}
//if sumData.TotalStaffProfit != 0 {
// result.TotalStaffProfit = sumData.TotalStaffProfit - rejectedSumData.TotalStaffProfit
//} else {
// result.TotalStaffProfit = rejectedSumData.TotalStaffProfit
//}
return result
}
@ -3775,6 +3838,11 @@ func checkOrderData(req *ErpOrderCreateReq, c *gin.Context) (*ErpOrder, error) {
if err != nil {
return nil, err
}
} else { // 零售退货单,需校验退货商品是否是本门店售卖商品,同一个退货单中只能添加同一销售订单的商品
err = checkRejectedOrderRule(req)
if err != nil {
return nil, err
}
}
jCashier, err := json.Marshal(req.Cashiers)
@ -3925,13 +3993,15 @@ func checkOrderData(req *ErpOrderCreateReq, c *gin.Context) (*ErpOrder, error) {
// 订单总优惠
erpOrder.TotalDiscount += v.MemberDiscount + v.SaleDiscount
// 销售毛利 // todo 待测试核实 备注:产品说有亏本销售的情况,不用判断毛利是否<0
// 销售毛利:实际退货金额-采购金额(需要先取负值,然后再计算),结果等同于:采购金额-实际退货金额
//salesProfit := (-v.RejectedAmount) - (-float64(int32(v.WholesalePrice) * v.Count))
salesProfit := v.RejectedAmount - float64(int32(v.WholesalePrice)*v.Count)
//if salesProfit < 0 {
// logger.Error("rejected salesProfit less than 0")
// return nil, errors.New("商品销售毛利小于0请检查")
//}
// 员工毛利 // todo 待测试核实
//StaffProfit := salesProfit - (-float64(int32(v.StaffCostPrice) * v.Count))
StaffProfit := salesProfit - float64(int32(v.StaffCostPrice)*v.Count)
//if StaffProfit < 0 {
// logger.Error("rejected TotalStaffProfit less than 0")
@ -4137,6 +4207,26 @@ func checkOrderCommodityStock(req *ErpOrderCreateReq) error {
return nil
}
// 退货校验
// 1校验商品是否是当前用户购买
// 2校验退货商品是否是本门店售卖商品
// 3同一个退货单中只能添加同一销售订单的商品
func checkRejectedOrderRule(req *ErpOrderCreateReq) error {
if req.RetailType != RetailTypeRejected {
return nil
}
if len(req.ErpOrderCommodities) == 0 {
return errors.New("未添加退货商品")
}
//for _, item := range req.ErpOrderCommodities {
// // 查询退货商品之前的销售情况
//}
return nil
}
// updateCommodityData 更新订单商品信息
func updateCommodityData(gdb *gorm.DB, orderId uint32, req *ErpOrderCreateReq) error {
// 查询现有的零售订单信息
@ -4163,6 +4253,7 @@ func updateCommodityData(gdb *gorm.DB, orderId uint32, req *ErpOrderCreateReq) e
}
}
if !found {
reqCommodity.ID = 0
newCommodities = append(newCommodities, reqCommodity)
}
}

View File

@ -1208,7 +1208,7 @@ func getNumberOnCategory(categoryId uint32) int64 {
// var count int64
// orm.Eloquent.Debug().Model(&ErpCommodity{}).
// Where("erp_category_id = ?", category.ID).
// Count(&count)
// Total(&count)
//
// serialNumber := fmt.Sprintf("%s%04d", category.Number, count+1)
// fmt.Println("商品编号:", serialNumber)
@ -1253,16 +1253,17 @@ func GenerateSerialNumber(categoryId uint32) (string, error) {
}
// UpdateErpStockAmountInfo 更新库存和库存商品表的金额:指导零售价、最低零售价
func UpdateErpStockAmountInfo(begin *gorm.DB, req *CommodityEditRequest, barCode string, category *ErpCategory) error {
func UpdateErpStockAmountInfo(begin *gorm.DB, req *CommodityEditRequest, barCode, serial_number string, category *ErpCategory) error {
if category != nil && category.ID != 0 { // 分类信息有值
// 更新库存表
err := begin.Table("erp_stock").Where("erp_commodity_id=?", req.Id).
Updates(map[string]interface{}{
"retail_price": req.RetailPrice,
"min_retail_price": req.MinRetailPrice,
"erp_category_id": category.ID,
"erp_category_name": category.Name,
"erp_commodity_name": req.Name,
"retail_price": req.RetailPrice,
"min_retail_price": req.MinRetailPrice,
"erp_category_id": category.ID,
"erp_category_name": category.Name,
"erp_commodity_name": req.Name,
"commodity_serial_number": serial_number,
}).Error
if err != nil {
return err
@ -1274,10 +1275,11 @@ func UpdateErpStockAmountInfo(begin *gorm.DB, req *CommodityEditRequest, barCode
"retail_price": req.RetailPrice,
"min_retail_price": req.MinRetailPrice,
//"staff_cost_price": staffCostPrice,
"erp_barcode": barCode,
"erp_category_id": category.ID,
"erp_category_name": category.Name,
"erp_commodity_name": req.Name,
"erp_barcode": barCode,
"erp_category_id": category.ID,
"erp_category_name": category.Name,
"erp_commodity_name": req.Name,
"commodity_serial_number": serial_number,
}).Error
if err != nil {
return err

View File

@ -4,9 +4,11 @@ import (
"encoding/json"
"errors"
"fmt"
"github.com/gin-gonic/gin"
"github.com/xuri/excelize/v2"
orm "go-admin/common/global"
"go-admin/logger"
"go-admin/tools"
"gorm.io/gorm"
"strings"
"time"
@ -114,12 +116,12 @@ type GetGameCardGoodsListReq struct {
}
type GetGameCardGoodsListResp struct {
List []GameCardGoods `json:"list"`
Count int `json:"count"`
PageIndex int `json:"page_index"`
Total int `json:"total"`
PageIndex int `json:"pageIndex"`
TotalPage int `json:"total_page"`
}
func (m *GetGameCardGoodsListReq) GetGameCardGoodsList() (*GetGameCardGoodsListResp, error) {
func (m *GetGameCardGoodsListReq) GetGameCardGoodsList(c *gin.Context) (*GetGameCardGoodsListResp, error) {
var (
cardGoods = make([]GameCardGoods, 0)
totalPage uint32
@ -134,6 +136,33 @@ func (m *GetGameCardGoodsListReq) GetGameCardGoodsList() (*GetGameCardGoodsListR
resp := &GetGameCardGoodsListResp{List: cardGoods, PageIndex: m.Page}
fmt.Println("GetGameCardGoodsListReq:", m)
gdb := orm.Eloquent.Table("game_card_goods")
// 非管理员才判断所属门店
if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") {
sysUser, err := GetSysUserByCtx(c)
if err != nil {
return nil, err
}
// 返回sysUser未过期的门店id列表
storeList := GetValidStoreIDs(sysUser.StoreData)
if m.StoreId != 0 {
if !Contains(storeList, uint32(m.StoreId)) {
return nil, errors.New("您没有该门店权限")
}
} else {
if len(storeList) > 0 {
if len(storeList) == 1 {
gdb = gdb.Where("store_id = ?", storeList[0])
} else {
gdb = gdb.Where("store_id IN (?)", storeList)
}
} else {
return nil, errors.New("用户未绑定门店")
}
}
}
if m.Status != 0 {
gdb = gdb.Where("status=?", m.Status)
}
@ -152,7 +181,7 @@ func (m *GetGameCardGoodsListReq) GetGameCardGoodsList() (*GetGameCardGoodsListR
logger.Errorf(err.Error())
return resp, err
}
resp.Count = int(count)
resp.Total = int(count)
err = gdb.Order("created_at DESC").Offset(m.Page * m.PageSize).Limit(m.PageSize).Find(&cardGoods).Error
if err != nil && err != RecordNotFound {
logger.Errorf(err.Error())
@ -195,14 +224,14 @@ type CooperativeGameCardGoodsReq struct {
Status int `json:"status"`
GameCardId int `json:"game_card_id"`
SerialNumber string `json:"serial_number" ` // 编号
Page int `json:"pageIndex"`
PageIndex int `json:"pageIndex"`
PageSize int `json:"pageSize"`
}
type CooperativeGameCardGoodsResp struct {
List []GameCardGoods `json:"list"`
Count int `json:"count"`
PageIndex int `json:"page_index"`
TotalPage int `json:"total_page"`
Total int `json:"total"`
PageIndex int `json:"pageIndex"`
PageSize int `json:"pageSize"`
}
func (m *CooperativeGameCardGoodsReq) List() (*CooperativeGameCardGoodsResp, error) {
@ -210,19 +239,24 @@ func (m *CooperativeGameCardGoodsReq) List() (*CooperativeGameCardGoodsResp, err
cardGoods = make([]GameCardGoods, 0)
totalPage uint32
)
m.Page -= 1
if m.Page < 0 {
m.Page = 0
m.PageIndex -= 1
if m.PageIndex < 0 {
m.PageIndex = 0
}
if m.PageSize == 0 {
m.PageSize = 10
}
resp := &CooperativeGameCardGoodsResp{List: cardGoods, PageIndex: m.Page}
resp := &CooperativeGameCardGoodsResp{
List: cardGoods,
PageIndex: m.PageIndex,
PageSize: m.PageSize,
}
fmt.Println("GetGameCardGoodsListReq:", m)
gdb := orm.Eloquent.Table("game_card_goods")
if m.Status != 0 {
gdb = gdb.Where("status=?", m.Status)
}
if m.StoreId != 0 {
gdb = gdb.Where("store_id=?", m.StoreId)
} else {
@ -247,8 +281,8 @@ func (m *CooperativeGameCardGoodsReq) List() (*CooperativeGameCardGoodsResp, err
logger.Errorf(err.Error())
return resp, err
}
resp.Count = int(count)
err = gdb.Order("created_at DESC").Offset(m.Page * m.PageSize).Limit(m.PageSize).Find(&cardGoods).Error
resp.Total = int(count)
err = gdb.Order("created_at DESC").Offset(m.PageIndex * m.PageSize).Limit(m.PageSize).Find(&cardGoods).Error
if err != nil && err != RecordNotFound {
logger.Errorf(err.Error())
return resp, err
@ -279,7 +313,7 @@ func (m *CooperativeGameCardGoodsReq) List() (*CooperativeGameCardGoodsResp, err
}
totalPage = uint32(int(count)/m.PageSize + 1)
resp.TotalPage = int(totalPage)
resp.PageSize = int(totalPage)
resp.List = cardGoods
return resp, nil
}
@ -764,25 +798,24 @@ type GameCardGoodsStockListReq struct {
}
type GameCardGoodsStockListResp struct {
PageSize int `json:"pageSize"`
List []GameCardGoodsStockInfo `json:"list"`
Count int `json:"count"`
PageIndex int `json:"pageIndex"`
TotalPage int `json:"total_page"`
CardTotalCount int `json:"card_total_count"`
CardTotalStock int `json:"card_total_stock"`
CardHoldCount int `json:"card_hold_count"`
PageSize int `json:"pageSize"`
List []GameCardGoodsStockInfo `json:"list"`
Count int `json:"total"`
PageIndex int `json:"pageIndex"`
TotalPage int `json:"total_page"`
CardTotalCount int `json:"card_total_count"`
CardTotalStock int `json:"card_total_stock"`
CardHoldCount int `json:"card_hold_count"`
//"count": count,
//"list": list,
//"pageIndex": req.Page,
//"pageIndex": req.PageIndex,
//"total_page": req.PageSize,
//StoreId uint64 `json:"store_id" ` // 门店id
//GameCardId uint64 `json:"game_card_id"` // 游戏卡id
//GameCardName string `json:"game_card_name"` // 游戏卡
}
func (m *GameCardGoodsStockListReq) List() (*GameCardGoodsStockListResp, error) {
func (m *GameCardGoodsStockListReq) List(c *gin.Context) (*GameCardGoodsStockListResp, error) {
resp := &GameCardGoodsStockListResp{PageIndex: m.Page, PageSize: m.PageSize}
//resp.List
resp.List = make([]GameCardGoodsStockInfo, 0)
@ -791,6 +824,33 @@ func (m *GameCardGoodsStockListReq) List() (*GameCardGoodsStockListResp, error)
if m.GameCardId != 0 {
qs = qs.Where("game_card_id", m.GameCardId)
}
// 非管理员才判断所属门店
if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") {
sysUser, err := GetSysUserByCtx(c)
if err != nil {
return nil, err
}
// 返回sysUser未过期的门店id列表
storeList := GetValidStoreIDs(sysUser.StoreData)
if m.StoreId != 0 {
if !Contains(storeList, uint32(m.StoreId)) {
return nil, errors.New("您没有该门店权限")
}
} else {
if len(storeList) > 0 {
if len(storeList) == 1 {
qs = qs.Where("store_id = ?", storeList[0])
} else {
qs = qs.Where("store_id IN (?)", storeList)
}
} else {
return nil, errors.New("用户未绑定门店")
}
}
}
if m.GameCardName != "" {
var cards []GameCard
err := orm.Eloquent.Table("game_card").Where("name LIKE ?", "%"+m.GameCardName+"%").Find(&cards).Error
@ -808,20 +868,20 @@ func (m *GameCardGoodsStockListReq) List() (*GameCardGoodsStockListResp, error)
}
qs = qs.Where("game_card_id IN (?)", gameCardIds)
}
if m.CooperativeBusinessId != 0 {
var stores []Store
err := orm.Eloquent.Table("").Where("cooperative_business_id=?", m.CooperativeBusinessId).Find(&stores).Error
if err != nil {
logger.Error("stores err:", logger.Field("err", err))
return resp, err
}
ids := make([]uint32, 0, len(stores))
for i, _ := range stores {
ids = append(ids, stores[i].ID)
}
qs = qs.Where("store_id in (?)", ids)
}
//if m.CooperativeBusinessId != 0 {
// var stores []Store
// err := orm.Eloquent.Table("").Where("cooperative_business_id=?", m.CooperativeBusinessId).Find(&stores).Error
// if err != nil {
// logger.Error("stores err:", logger.Field("err", err))
// return resp, err
// }
// ids := make([]uint32, 0, len(stores))
// for i, _ := range stores {
// ids = append(ids, stores[i].ID)
// }
//
// qs = qs.Where("store_id in (?)", ids)
//}
var count int64
err := qs.Count(&count).Error
if err != nil {
@ -1403,7 +1463,7 @@ func MemberExpirationReminder() {
// }
//
// unreturned := &struct {
// Count int `json:"count"`
// Total int `json:"count"`
// }{}
// sql := fmt.Sprintf("SELECT COUNT(*) AS count FROM `order` WHERE uid = %d AND pay_status=2 AND card_status IN (1,2,3) ;", users[i].Uid)
// err := orm.Eloquent.Raw(sql).Scan(unreturned).Error
@ -1411,8 +1471,8 @@ func MemberExpirationReminder() {
// logger.Error(err.Error().Error()())
// continue
// }
// fmt.Println("订单数量count:", unreturned.Count)
// if unreturned.Count == 0 {
// fmt.Println("订单数量count:", unreturned.Total)
// if unreturned.Total == 0 {
// continue
// }
// err = SmsSend(users[i].Tel, content)
@ -2379,12 +2439,38 @@ type CannibalizeTaskListResp struct {
TotalPage int `json:"total_page"`
}
func (m *CannibalizeTaskListReq) GetCannibalizeTaskList() (*CannibalizeTaskListResp, error) {
func (m *CannibalizeTaskListReq) GetCannibalizeTaskList(c *gin.Context) (*CannibalizeTaskListResp, error) {
resp := &CannibalizeTaskListResp{
PageIndex: m.PageNum,
PageSize: m.PageSize,
}
qs := orm.Eloquent.Table("cannibalize_stock_task")
// 非管理员才判断所属门店
if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") {
sysUser, err := GetSysUserByCtx(c)
if err != nil {
return nil, err
}
// 返回sysUser未过期的门店id列表
storeList := GetValidStoreIDs(sysUser.StoreData)
if m.StoreId != 0 {
if !Contains(storeList, uint32(m.StoreId)) {
return nil, errors.New("您没有该门店权限")
}
} else {
if len(storeList) > 0 {
if len(storeList) == 1 {
qs = qs.Where("from_store_id = ?", storeList[0]).Or("to_store_id = ?", storeList[0])
} else {
qs = qs.Where("from_store_id IN (?)", storeList).Or("to_store_id IN (?)", storeList)
}
} else {
return nil, errors.New("用户未绑定门店")
}
}
}
if m.StoreId != 0 {
qs = qs.Where("from_store_id = ?", m.StoreId).Or("to_store_id = ?", m.StoreId)
}
@ -2846,7 +2932,7 @@ func CannibalizePutInStorage(taskId uint32) error {
// }
// //var outStockCount int64
// //err = orm.Eloquent.Table("share_card_retrieve_card").Where("share_card_retrieve_id=?", retrieveCard.ShareCardRetrieveId).
// // Where("id!=?", retrieveCard.ID).Where("state", RetrieveStateOutStock).Count(&outStockCount).Error
// // Where("id!=?", retrieveCard.ID).Where("state", RetrieveStateOutStock).Total(&outStockCount).Error
// //if err != nil {
// // logger.Error("out stock count err:", err)
// // return false

View File

@ -274,11 +274,26 @@ func AddInventoryAllot(req *InventoryAllotAddReq, sysUser *SysUser) (*ErpInvento
req.Commodities[i].CategoryId = commodityInfo.ErpCategoryId
req.Commodities[i].CategoryName = commodityInfo.ErpCategoryName
err = begin.Create(&req.Commodities[i]).Error
if err != nil {
begin.Rollback()
logger.Error("create allot commodity err:", logger.Field("err", err))
return nil, err
// 如果是非串码且数量大于1则进行拆分
if req.Commodities[i].IMEIType == 1 && req.Commodities[i].Count > 1 {
nCount := req.Commodities[i].Count
for j := 0; j < int(nCount); j++ {
req.Commodities[i].ID = 0
req.Commodities[i].Count = 1
err = begin.Create(&req.Commodities[i]).Error
if err != nil {
begin.Rollback()
logger.Error("create allot commodity err:", logger.Field("err", err))
return nil, err
}
}
} else { // 普通串码商品则只有1条数据
err = begin.Create(&req.Commodities[i]).Error
if err != nil {
begin.Rollback()
logger.Error("create allot commodity err:", logger.Field("err", err))
return nil, err
}
}
}
@ -369,68 +384,51 @@ func updateAllotCommodityData(gdb *gorm.DB, orderId uint32, req *InventoryAllotE
return err
}
var newCommodities []ErpInventoryAllotCommodity
var deletedCommodities []ErpInventoryAllotCommodity
var matchingCommodities []ErpInventoryAllotCommodity
// 找到新增的商品
for i, reqCommodity := range req.Commodities {
// 订单商品表信息添加零售订单id
req.Commodities[i].AllotOrderId = orderId
var found bool
for _, dbCommodity := range commodities {
if reqCommodity.CommodityId == dbCommodity.CommodityId && reqCommodity.ID == dbCommodity.ID {
found = true
break
}
}
if !found {
newCommodities = append(newCommodities, reqCommodity)
}
}
// 找到删除的商品
for _, dbCommodity := range commodities {
var found bool
for _, reqCommodity := range req.Commodities {
if reqCommodity.CommodityId == dbCommodity.CommodityId && reqCommodity.ID == dbCommodity.ID {
found = true
// 找到匹配的商品,加入匹配列表
matchingCommodities = append(matchingCommodities, reqCommodity)
break
}
}
if !found {
deletedCommodities = append(deletedCommodities, dbCommodity)
}
}
// 2-更新商品订单信息-更新
for _, commodity := range matchingCommodities {
if err := gdb.Model(&ErpInventoryAllotCommodity{}).Where("id = ?", commodity.ID).Updates(commodity).Error; err != nil {
logger.Error("更新商品订单信息-更新 error")
return errors.New("操作失败:" + err.Error())
}
}
// 2-更新商品订单信息-新增
if len(newCommodities) != 0 {
err = gdb.Create(&newCommodities).Error
if err != nil {
logger.Error("更新商品订单信息-新增 error")
return errors.New("操作失败:" + err.Error())
}
}
//2-更新商品订单信息-删除
if len(deletedCommodities) != 0 {
err = gdb.Delete(&deletedCommodities).Error
// 删除所有的商品信息
if len(commodities) != 0 {
err = gdb.Delete(&commodities).Error
if err != nil {
logger.Error("更新商品订单信息-删除 error")
return errors.New("操作失败:" + err.Error())
}
}
// 新建所有的商品信息
for i, _ := range req.Commodities {
req.Commodities[i].AllotOrderId = orderId
// 查询商品信息
commodityInfo, err := GetCommodity(req.Commodities[i].CommodityId)
if err != nil {
logger.Error("SetCategory err:", logger.Field("err", err))
return err
}
req.Commodities[i].CategoryId = commodityInfo.ErpCategoryId
req.Commodities[i].CategoryName = commodityInfo.ErpCategoryName
req.Commodities[i].CommodityName = commodityInfo.Name
// 如果是非串码且数量大于1则进行拆分
if req.Commodities[i].IMEIType == 1 && req.Commodities[i].Count > 1 {
nCount := req.Commodities[i].Count
for j := 0; j < int(nCount); j++ {
req.Commodities[i].ID = 0
req.Commodities[i].Count = 1
err = gdb.Create(&req.Commodities[i]).Error
if err != nil {
logger.Error("create allot commodity err:", logger.Field("err", err))
return err
}
}
} else { // 普通串码商品则只有1条数据
err = gdb.Create(&req.Commodities[i]).Error
if err != nil {
logger.Error("create allot commodity err:", logger.Field("err", err))
return err
}
}
}
return nil
}
@ -593,8 +591,15 @@ func allotAuditAndUpdateStock(gdb *gorm.DB, allotOrder ErpInventoryAllotOrder) e
return err
}
if len(commodities) == 0 {
return errors.New("未查询到商品信息")
}
// 遍历库存调拨商品信息将商品id相同的非串码商品进行合并数量累加即可
trimCommodities := MergeCommodities(commodities)
// 遍历库存调拨商品信息
for _, v := range commodities {
for _, v := range trimCommodities {
var stockCommodity []ErpStockCommodity
err = orm.Eloquent.Table("erp_stock_commodity").Where("erp_commodity_id = ? AND store_id = ? "+
"AND state = ? AND imei = ?", v.CommodityId, allotOrder.DeliverStoreId, InStock, v.IMEI).
@ -624,9 +629,13 @@ func allotAuditAndUpdateStock(gdb *gorm.DB, allotOrder ErpInventoryAllotOrder) e
}
nAmount += stockCommodity[i].WholesalePrice
}
if v.Count != 0 {
nAmount = nAmount / float64(v.Count) // todo 目前只能计算平均采购价
}
// 更新库存调拨商品信息表的调拨金额
err = gdb.Table("erp_inventory_allot_commodity").Where("id = ?", v.ID).
err = gdb.Table("erp_inventory_allot_commodity").Where("allot_order_id = ? and commodity_id = ?",
v.AllotOrderId, v.CommodityId).
Updates(map[string]interface{}{
"amount": nAmount,
}).Error
@ -685,6 +694,72 @@ func allotAuditAndUpdateStock(gdb *gorm.DB, allotOrder ErpInventoryAllotOrder) e
return nil
}
// MergeCommodities 遍历库存调拨商品信息将商品id相同的非串码商品进行合并数量累加即可
func MergeCommodities(commodities []ErpInventoryAllotCommodity) []ErpInventoryAllotCommodity {
// 用于存储合并后的商品信息
mergedCommodities := make([]ErpInventoryAllotCommodity, 0)
// 用于记录无串码商品的合并信息
commodityMap := make(map[uint32]*ErpInventoryAllotCommodity)
for _, commodity := range commodities {
// 只处理无串码商品
if commodity.IMEIType == 1 {
if existing, found := commodityMap[commodity.CommodityId]; found {
// 如果相同商品 ID 的无串码商品已存在,则数量累加
existing.Count += commodity.Count
commodityMap[commodity.CommodityId] = existing
} else {
// 否则,加入到 commodityMap 中
newCommodity := commodity
commodityMap[commodity.CommodityId] = &newCommodity
}
} else {
// 对于有串码的商品,直接加入到合并后的列表中
mergedCommodities = append(mergedCommodities, commodity)
}
}
// 将合并后的无串码商品加入到合并后的列表中
for _, commodity := range commodityMap {
mergedCommodities = append(mergedCommodities, *commodity)
}
return mergedCommodities
}
// MergeChangeCommodities 遍历库存变动商品信息将商品id相同的非串码商品进行合并数量累加即可
func MergeChangeCommodities(commodities []ErpInventoryChangeCommodity) []ErpInventoryChangeCommodity {
// 用于存储合并后的商品信息
mergedCommodities := make([]ErpInventoryChangeCommodity, 0)
// 用于记录无串码商品的合并信息
commodityMap := make(map[uint32]*ErpInventoryChangeCommodity)
for _, commodity := range commodities {
// 只处理无串码商品
if commodity.IMEIType == 1 {
if existing, found := commodityMap[commodity.CommodityId]; found {
// 如果相同商品 ID 的无串码商品已存在,则数量累加
existing.Count += commodity.Count
commodityMap[commodity.CommodityId] = existing
} else {
// 否则,加入到 commodityMap 中
newCommodity := commodity
commodityMap[commodity.CommodityId] = &newCommodity
}
} else {
// 对于有串码的商品,直接加入到合并后的列表中
mergedCommodities = append(mergedCommodities, commodity)
}
}
// 将合并后的无串码商品加入到合并后的列表中
for _, commodity := range commodityMap {
mergedCommodities = append(mergedCommodities, *commodity)
}
return mergedCommodities
}
// cancelAllotAuditAndUpdateStock 库存调拨反审核后更新库存信息
func cancelAllotAuditAndUpdateStock(gdb *gorm.DB, allotOrder ErpInventoryAllotOrder) error {
// 查询库存调拨商品信息
@ -698,12 +773,15 @@ func cancelAllotAuditAndUpdateStock(gdb *gorm.DB, allotOrder ErpInventoryAllotOr
return errors.New("取消审核失败,未查询到库存调拨商品信息")
}
// 遍历库存调拨商品信息将商品id相同的非串码商品进行合并数量累加即可
trimCommodities := MergeCommodities(commodities)
switch allotOrder.State {
// 2 待发货:状态改为待审核,调拨中库存恢复为在库
// 3 待收货:状态改为待审核,调拨中库存恢复为在库
case ErpInventoryAllotOrderWaitSend, ErpInventoryAllotOrderWaitReceive:
// 遍历库存调拨商品信息
for _, v := range commodities {
for _, v := range trimCommodities {
var stockCommodity []ErpStockCommodity
err := orm.Eloquent.Table("erp_stock_commodity").Where("erp_commodity_id = ? AND store_id = ? "+
"AND state = ? AND imei = ?", v.CommodityId, allotOrder.ReceiveStoreId, InAllot, v.IMEI).
@ -747,7 +825,7 @@ func cancelAllotAuditAndUpdateStock(gdb *gorm.DB, allotOrder ErpInventoryAllotOr
}
case ErpInventoryAllotOrderFinished: // 已完成:状态改为待审核,调入门店对应商品的库存更新到调出门店,如果库存不足则报错
// 遍历库存调拨商品信息
for _, v := range commodities {
for _, v := range trimCommodities {
var stockCommodity []ErpStockCommodity
err := orm.Eloquent.Table("erp_stock_commodity").Where("erp_commodity_id = ? AND store_id = ? "+
"AND state = ? AND imei = ?", v.CommodityId, allotOrder.ReceiveStoreId, InStock, v.IMEI).
@ -893,6 +971,7 @@ func ReceiveAllotInventory(req *InventoryAllotReceiveReq) error {
err = begin.Model(&ErpStockCommodity{}).Where("id = ?", stockCommodity[i].ID).
Updates(stockCommodity[i]).Error
if err != nil {
begin.Rollback()
return fmt.Errorf("更新商品库存失败:%s", err.Error())
}
}
@ -902,6 +981,7 @@ func ReceiveAllotInventory(req *InventoryAllotReceiveReq) error {
"UPDATE erp_stock SET count=count+%d, dispatch_count = dispatch_count-%d WHERE store_id=%d AND erp_commodity_id=%d",
v.Count, v.Count, inventoryAllotOrder.ReceiveStoreId, v.CommodityId)).Error
if err != nil {
begin.Rollback()
logger.Errorf("update stock err:", err)
return err
}
@ -914,6 +994,7 @@ func ReceiveAllotInventory(req *InventoryAllotReceiveReq) error {
err := begin.Model(&ErpInventoryAllotOrder{}).Where("id = ?", inventoryAllotOrder.ID).
Updates(inventoryAllotOrder).Error
if err != nil {
begin.Rollback()
return err
}

View File

@ -163,13 +163,13 @@ func checkChangeInventoryParam(req *InventoryChangeAddReq, editFlag bool) error
return fmt.Errorf("串码商品[%s]数量[%d]错误需为1", item.CommodityName, item.Count)
}
}
// 校验编辑订单时是否有传商品ID
if editFlag {
if item.ID == 0 {
return fmt.Errorf("商品[%s]ID为空", item.CommodityName)
}
}
//
//// 校验编辑订单时是否有传商品ID
//if editFlag {
// if item.ID == 0 {
// return fmt.Errorf("商品[%s]ID为空", item.CommodityName)
// }
//}
// 校验串码类型
switch item.IMEIType {
@ -266,11 +266,27 @@ func AddInventoryChange(req *InventoryChangeAddReq, sysUser *SysUser) (*ErpInven
// 创建库存变动商品信息添加库存变动订单id
for i, _ := range req.Commodities {
req.Commodities[i].ChangeOrderId = inventoryChangeOrder.ID
err = begin.Create(&req.Commodities[i]).Error
if err != nil {
begin.Rollback()
logger.Error("create change commodity err:", logger.Field("err", err))
return nil, err
// 如果是非串码且数量大于1则进行拆分
if req.Commodities[i].IMEIType == 1 && req.Commodities[i].Count > 1 {
nCount := req.Commodities[i].Count
for j := 0; j < int(nCount); j++ {
req.Commodities[i].ID = 0
req.Commodities[i].Count = 1
err = begin.Create(&req.Commodities[i]).Error
if err != nil {
begin.Rollback()
logger.Error("create change commodity err:", logger.Field("err", err))
return nil, err
}
}
} else { // 普通串码商品则只有1条数据
err = begin.Create(&req.Commodities[i]).Error
if err != nil {
begin.Rollback()
logger.Error("create change commodity err:", logger.Field("err", err))
return nil, err
}
}
}
@ -363,68 +379,40 @@ func updateChangeCommodityData(gdb *gorm.DB, orderId uint32, req *InventoryChang
return err
}
var newCommodities []ErpInventoryChangeCommodity
var deletedCommodities []ErpInventoryChangeCommodity
var matchingCommodities []ErpInventoryChangeCommodity
// 找到新增的商品
for i, reqCommodity := range req.Commodities {
// 订单商品表信息添加零售订单id
req.Commodities[i].ChangeOrderId = orderId
var found bool
for _, dbCommodity := range commodities {
if reqCommodity.CommodityId == dbCommodity.CommodityId && reqCommodity.ID == dbCommodity.ID {
found = true
break
}
}
if !found {
newCommodities = append(newCommodities, reqCommodity)
}
}
// 找到删除的商品
for _, dbCommodity := range commodities {
var found bool
for _, reqCommodity := range req.Commodities {
if reqCommodity.CommodityId == dbCommodity.CommodityId && reqCommodity.ID == dbCommodity.ID {
found = true
// 找到匹配的商品,加入匹配列表
matchingCommodities = append(matchingCommodities, reqCommodity)
break
}
}
if !found {
deletedCommodities = append(deletedCommodities, dbCommodity)
}
}
// 2-更新商品订单信息-更新
for _, commodity := range matchingCommodities {
if err := gdb.Model(&ErpInventoryChangeCommodity{}).Where("id = ?", commodity.ID).Updates(commodity).Error; err != nil {
logger.Error("更新商品订单信息-更新 error")
return errors.New("操作失败:" + err.Error())
}
}
// 2-更新商品订单信息-新增
if len(newCommodities) != 0 {
err = gdb.Create(&newCommodities).Error
if err != nil {
logger.Error("更新商品订单信息-新增 error")
return errors.New("操作失败:" + err.Error())
}
}
//2-更新商品订单信息-删除
if len(deletedCommodities) != 0 {
err = gdb.Delete(&deletedCommodities).Error
// 删除所有的商品信息
if len(commodities) != 0 {
err = gdb.Delete(&commodities).Error
if err != nil {
logger.Error("更新商品订单信息-删除 error")
return errors.New("操作失败:" + err.Error())
}
}
// 新建所有的商品信息
for i, _ := range req.Commodities {
req.Commodities[i].ChangeOrderId = orderId
// 如果是非串码且数量大于1则进行拆分
if req.Commodities[i].IMEIType == 1 && req.Commodities[i].Count > 1 {
nCount := req.Commodities[i].Count
for j := 0; j < int(nCount); j++ {
req.Commodities[i].ID = 0
req.Commodities[i].Count = 1
err = gdb.Create(&req.Commodities[i]).Error
if err != nil {
logger.Error("create allot commodity err:", logger.Field("err", err))
return err
}
}
} else { // 普通串码商品则只有1条数据
err = gdb.Create(&req.Commodities[i]).Error
if err != nil {
logger.Error("create allot commodity err:", logger.Field("err", err))
return err
}
}
}
return nil
}
@ -607,9 +595,16 @@ func handleInventoryAdd(gdb *gorm.DB, changeOrder ErpInventoryChangeOrder) error
return err
}
if len(commodities) == 0 {
return errors.New("未查询到商品信息")
}
// 遍历库存变动商品信息将商品id相同的非串码商品进行合并数量累加即可
trimCommodities := MergeChangeCommodities(commodities)
// 遍历采购入库商品信息
var stockList []ErpStockCommodity
for _, v := range commodities {
for _, v := range trimCommodities {
commodityInfo, err := GetCommodity(v.CommodityId)
if err != nil {
logger.Errorf("GetCommodity err:", err)
@ -708,31 +703,35 @@ func handleInventoryReduce(gdb *gorm.DB, changeOrder ErpInventoryChangeOrder) er
return errors.New("未查询到商品信息")
}
// 遍历库存变动商品信息将商品id相同的非串码商品进行合并数量累加即可
trimCommodities := MergeChangeCommodities(commodities)
usedStockCommodityIdList := make(map[uint32][]uint32) // 记录非串码商品已使用的商品库存表主键id
// 更新库存数量
for i, _ := range commodities {
if commodities[i].IMEIType == 2 { // 串码商品
if commodities[i].IMEI == "" {
for i, _ := range trimCommodities {
if trimCommodities[i].IMEIType == 2 { // 串码商品
if trimCommodities[i].IMEI == "" {
return errors.New("串码为空")
}
// 判断该串码商品是否已经销售
var stockCommodityInfo ErpStockCommodity
err = orm.Eloquent.Table("erp_stock_commodity").Where("imei = ?",
commodities[i].IMEI).Find(&stockCommodityInfo).Error
trimCommodities[i].IMEI).Find(&stockCommodityInfo).Error
if err != nil {
logger.Error("handleInventoryReduce query commodities err:", logger.Field("err", err))
return err
}
if stockCommodityInfo.State == SoldOut {
return fmt.Errorf("商品[%s]已经销售", stockCommodityInfo.ErpCommodityName)
//return fmt.Errorf("商品[%s]已经销售", stockCommodityInfo.ErpCommodityName)
return fmt.Errorf("此订单[%s]商品已出库,需先反审核相关订单返还库存", stockCommodityInfo.ErpCommodityName)
}
//else if stockCommodityInfo.State == OnSale {
// return fmt.Errorf("商品[%s]在销售锁定中", stockCommodityInfo.ErpCommodityName)
//}
// 更新库存商品状态为:盘点出库
err = gdb.Table("erp_stock_commodity").Where("imei = ?", commodities[i].IMEI).
err = gdb.Table("erp_stock_commodity").Where("imei = ?", trimCommodities[i].IMEI).
Update("state", CheckOut).Error
if err != nil {
logger.Error("handleInventoryReduce update erp_stock_commodity err:",
@ -742,7 +741,7 @@ func handleInventoryReduce(gdb *gorm.DB, changeOrder ErpInventoryChangeOrder) er
// 更新库存数量:库存数量-1
err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?",
changeOrder.StoreId, commodities[i].CommodityId).
changeOrder.StoreId, trimCommodities[i].CommodityId).
Updates(map[string]interface{}{"count": gorm.Expr("count - ?", 1)}).Error
if err != nil {
logger.Error("handleInventoryReduce update erp_stock err:", logger.Field("err", err))
@ -752,23 +751,23 @@ func handleInventoryReduce(gdb *gorm.DB, changeOrder ErpInventoryChangeOrder) er
// 查询商品实际库存详情处剩余有效数,不包含已出库的数量
var nCount int64
err = orm.Eloquent.Table("erp_stock_commodity").
Where("erp_commodity_id = ? AND store_id = ? AND state = 1", commodities[i].CommodityId,
Where("erp_commodity_id = ? AND store_id = ? AND state = 1", trimCommodities[i].CommodityId,
changeOrder.StoreId).Count(&nCount).Error
if err != nil {
return err
}
// 如果库存数量不够则报错
if uint32(nCount) < commodities[i].Count {
return fmt.Errorf("商品[%s]库存不足", commodities[i].CommodityName)
if uint32(nCount) < trimCommodities[i].Count {
return fmt.Errorf("商品[%s]库存不足", trimCommodities[i].CommodityName)
}
var stockCommodity []ErpStockCommodity
// 非串码商品可能不止1个更新库存商品状态
for j := 0; j < int(commodities[i].Count); j++ {
for j := 0; j < int(trimCommodities[i].Count); j++ {
// 通过门店id商品id查找状态为1-在库的非串码商品
err = orm.Eloquent.Table("erp_stock_commodity").Where("erp_commodity_id = ? and "+
"store_id = ? and state = ? and imei_type = ?", commodities[i].CommodityId, changeOrder.StoreId,
"store_id = ? and state = ? and imei_type = ?", trimCommodities[i].CommodityId, changeOrder.StoreId,
InStock, NoIMEICommodity).Order("first_stock_time DESC").Find(&stockCommodity).Error
if err != nil {
logger.Error("get commodities err:", logger.Field("err", err))
@ -780,7 +779,7 @@ func handleInventoryReduce(gdb *gorm.DB, changeOrder ErpInventoryChangeOrder) er
// 找一个可用的库存商品表主键ID
rightId, err := findRightErpStockCommodityId(usedStockCommodityIdList,
commodities[i].CommodityId, stockCommodity)
trimCommodities[i].CommodityId, stockCommodity)
if err != nil {
return err
}
@ -792,13 +791,13 @@ func handleInventoryReduce(gdb *gorm.DB, changeOrder ErpInventoryChangeOrder) er
logger.Field("err", err))
return err
}
usedStockCommodityIdList[commodities[i].ID] = append(usedStockCommodityIdList[commodities[i].ID], rightId)
usedStockCommodityIdList[trimCommodities[i].ID] = append(usedStockCommodityIdList[trimCommodities[i].ID], rightId)
}
// 更新库存数量:库存数量-count
err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?",
changeOrder.StoreId, commodities[i].CommodityId).
Updates(map[string]interface{}{"count": gorm.Expr("count - ?", commodities[i].Count)}).Error
changeOrder.StoreId, trimCommodities[i].CommodityId).
Updates(map[string]interface{}{"count": gorm.Expr("count - ?", trimCommodities[i].Count)}).Error
if err != nil {
logger.Error("handleInventoryReduce update erp_stock err:", logger.Field("err", err))
return err
@ -824,23 +823,27 @@ func handleCancelInventoryAdd(gdb *gorm.DB, changeOrder ErpInventoryChangeOrder)
return errors.New("未查询到商品信息")
}
// 遍历库存变动商品信息将商品id相同的非串码商品进行合并数量累加即可
trimCommodities := MergeChangeCommodities(commodities)
// 更新库存数量
for i, _ := range commodities {
if commodities[i].IMEIType == 2 { // 串码商品
if commodities[i].IMEI == "" {
for i, _ := range trimCommodities {
if trimCommodities[i].IMEIType == 2 { // 串码商品
if trimCommodities[i].IMEI == "" {
return errors.New("串码为空")
}
// 判断该串码商品是否已经销售
var stockCommodityInfo ErpStockCommodity
err = orm.Eloquent.Table("erp_stock_commodity").Where("imei = ?",
commodities[i].IMEI).Find(&stockCommodityInfo).Error
trimCommodities[i].IMEI).Find(&stockCommodityInfo).Error
if err != nil {
logger.Error("handleCancelInventoryAdd query commodities err:", logger.Field("err", err))
return err
}
if stockCommodityInfo.State == SoldOut {
return fmt.Errorf("商品[%s]已经销售", stockCommodityInfo.ErpCommodityName)
//return fmt.Errorf("商品[%s]已经销售", stockCommodityInfo.ErpCommodityName)
return fmt.Errorf("此订单[%s]商品已出库,需先反审核相关订单返还库存", stockCommodityInfo.ErpCommodityName)
}
//else if stockCommodityInfo.State == OnSale {
// return fmt.Errorf("商品[%s]在销售锁定中", stockCommodityInfo.ErpCommodityName)
@ -848,7 +851,7 @@ func handleCancelInventoryAdd(gdb *gorm.DB, changeOrder ErpInventoryChangeOrder)
// 更新库存数量:库存数量-1
err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?",
changeOrder.StoreId, commodities[i].CommodityId).
changeOrder.StoreId, trimCommodities[i].CommodityId).
Updates(map[string]interface{}{"count": gorm.Expr("count - ?", 1)}).Error
if err != nil {
logger.Error("handleCancelInventoryAdd commodities err:", logger.Field("err", err))
@ -857,21 +860,21 @@ func handleCancelInventoryAdd(gdb *gorm.DB, changeOrder ErpInventoryChangeOrder)
} else {
// 查询入库商品实际库存详情处剩余有效数,不包含已出库的数量
nCount, err := GetCommodityStockByPurchaseId(changeOrder.SerialNumber,
commodities[i].CommodityId)
trimCommodities[i].CommodityId)
if err != nil {
logger.Error("handleCancelInventoryAdd GetCommodityStockByPurchaseId err:",
logger.Field("err", err))
return err
}
// 如果库存数量不够则报错
if nCount < commodities[i].Count {
return fmt.Errorf("商品[%s]库存数量不足", commodities[i].CommodityName)
if nCount < trimCommodities[i].Count {
return fmt.Errorf("商品[%s]库存数量不足", trimCommodities[i].CommodityName)
}
// 更新库存数量:库存数量-count
err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?",
changeOrder.StoreId, commodities[i].CommodityId).
Updates(map[string]interface{}{"count": gorm.Expr("count - ?", commodities[i].Count)}).Error
changeOrder.StoreId, trimCommodities[i].CommodityId).
Updates(map[string]interface{}{"count": gorm.Expr("count - ?", trimCommodities[i].Count)}).Error
if err != nil {
logger.Error("handleCancelInventoryAdd commodities err:", logger.Field("err", err))
return err
@ -904,31 +907,35 @@ func handleCancelInventoryReduce(gdb *gorm.DB, changeOrder ErpInventoryChangeOrd
return errors.New("未查询到商品信息")
}
// 遍历库存变动商品信息将商品id相同的非串码商品进行合并数量累加即可
trimCommodities := MergeChangeCommodities(commodities)
usedStockCommodityIdList := make(map[uint32][]uint32) // 记录非串码商品已使用的商品库存表主键id
// 更新库存数量
for i, _ := range commodities {
if commodities[i].IMEIType == 2 { // 串码商品
if commodities[i].IMEI == "" {
for i, _ := range trimCommodities {
if trimCommodities[i].IMEIType == 2 { // 串码商品
if trimCommodities[i].IMEI == "" {
return errors.New("串码为空")
}
// 判断该串码商品是否已经销售
var stockCommodityInfo ErpStockCommodity
err = orm.Eloquent.Table("erp_stock_commodity").Where("imei = ?",
commodities[i].IMEI).Find(&stockCommodityInfo).Error
trimCommodities[i].IMEI).Find(&stockCommodityInfo).Error
if err != nil {
logger.Error("handleCancelInventoryReduce query commodities err:", logger.Field("err", err))
return err
}
if stockCommodityInfo.State == SoldOut {
return fmt.Errorf("商品[%s]已经销售", stockCommodityInfo.ErpCommodityName)
//return fmt.Errorf("商品[%s]已经销售", stockCommodityInfo.ErpCommodityName)
return fmt.Errorf("此订单[%s]商品已出库,需先反审核相关订单返还库存", stockCommodityInfo.ErpCommodityName)
}
//else if stockCommodityInfo.State == OnSale {
// return fmt.Errorf("商品[%s]在销售锁定中", stockCommodityInfo.ErpCommodityName)
//}
// 更新库存商品状态:在库
err = gdb.Table("erp_stock_commodity").Where("imei = ?", commodities[i].IMEI).
err = gdb.Table("erp_stock_commodity").Where("imei = ?", trimCommodities[i].IMEI).
Update("state", InStock).Error
if err != nil {
logger.Error("handleCancelInventoryReduce update erp_stock_commodity err:",
@ -938,7 +945,7 @@ func handleCancelInventoryReduce(gdb *gorm.DB, changeOrder ErpInventoryChangeOrd
// 更新库存数量:库存数量+1
err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?",
changeOrder.StoreId, commodities[i].CommodityId).
changeOrder.StoreId, trimCommodities[i].CommodityId).
Updates(map[string]interface{}{"count": gorm.Expr("count + ?", 1)}).Error
if err != nil {
logger.Error("handleCancelInventoryReduce update erp_stock err:", logger.Field("err", err))
@ -947,10 +954,10 @@ func handleCancelInventoryReduce(gdb *gorm.DB, changeOrder ErpInventoryChangeOrd
} else {
var stockCommodity []ErpStockCommodity
// 非串码商品可能不止1个更新库存商品状态
for j := 0; j < int(commodities[i].Count); j++ {
for j := 0; j < int(trimCommodities[i].Count); j++ {
// 通过门店id商品id查找状态为盘点出库的非串码商品
err = orm.Eloquent.Table("erp_stock_commodity").Where("erp_commodity_id = ? and "+
"store_id = ? and state = ? and imei_type = ?", commodities[i].CommodityId, changeOrder.StoreId,
"store_id = ? and state = ? and imei_type = ?", trimCommodities[i].CommodityId, changeOrder.StoreId,
CheckOut, NoIMEICommodity).Order("first_stock_time DESC").Find(&stockCommodity).Error
if err != nil {
logger.Error("get commodities err:", logger.Field("err", err))
@ -962,7 +969,7 @@ func handleCancelInventoryReduce(gdb *gorm.DB, changeOrder ErpInventoryChangeOrd
// 找一个可用的库存商品表主键ID
rightId, err := findRightErpStockCommodityId(usedStockCommodityIdList,
commodities[i].CommodityId, stockCommodity)
trimCommodities[i].CommodityId, stockCommodity)
if err != nil {
return err
}
@ -975,13 +982,13 @@ func handleCancelInventoryReduce(gdb *gorm.DB, changeOrder ErpInventoryChangeOrd
return err
}
usedStockCommodityIdList[commodities[i].ID] = append(usedStockCommodityIdList[commodities[i].ID], rightId)
usedStockCommodityIdList[trimCommodities[i].ID] = append(usedStockCommodityIdList[trimCommodities[i].ID], rightId)
}
// 更新库存数量:库存数量+count
err = gdb.Table("erp_stock").Where("store_id = ? and erp_commodity_id = ?",
changeOrder.StoreId, commodities[i].CommodityId).
Updates(map[string]interface{}{"count": gorm.Expr("count + ?", commodities[i].Count)}).Error
changeOrder.StoreId, trimCommodities[i].CommodityId).
Updates(map[string]interface{}{"count": gorm.Expr("count + ?", trimCommodities[i].Count)}).Error
if err != nil {
logger.Error("handleCancelInventoryReduce update erp_stock err:", logger.Field("err", err))
return err

View File

@ -379,6 +379,7 @@ func updateProductCommodityData(gdb *gorm.DB, orderId uint32, req *ProductInvent
}
}
if !found {
reqCommodity.ID = 0
newCommodities = append(newCommodities, reqCommodity)
}
}

View File

@ -9,6 +9,7 @@ import (
"go-admin/logger"
"go-admin/tools"
"go-admin/tools/config"
"gorm.io/gorm"
"math"
"sort"
"strconv"
@ -89,19 +90,20 @@ type InventoryReportByAllotResp struct {
// ReportByAllotData 库存调拨数据
type ReportByAllotData struct {
DeliverStoreId uint32 `json:"deliver_store_id"` // 调出门店id
DeliverStoreName string `json:"deliver_store_name"` // 调出门店名称
ReceiveStoreId uint32 `json:"receive_store_id"` // 调入门店id
ReceiveStoreName string `json:"receive_store_name"` // 调入门店名称
CommodityId uint32 `json:"commodity_id"` // 商品id
CommodityName string `json:"commodity_name"` // 商品名称
CategoryID uint32 `json:"category_id"` // 商品分类id
CategoryName string `json:"category_name"` // 商品分类名称
AuditTime *time.Time `json:"audit_time"` // 审核时间
ReceiveTime *time.Time `json:"receive_time"` // 收货时间/调入时间
State uint32 `json:"state"` // 调拨状态1-调拨中 2-已完成
AllotCount uint32 `json:"allot_count"` // 调拨数量
AllotAmount float64 `json:"allot_amount"` // 调拨金额
DeliverStoreId uint32 `json:"deliver_store_id"` // 调出门店id
DeliverStoreName string `json:"deliver_store_name"` // 调出门店名称
ReceiveStoreId uint32 `json:"receive_store_id"` // 调入门店id
ReceiveStoreName string `json:"receive_store_name"` // 调入门店名称
CommodityId uint32 `json:"commodity_id"` // 商品id
CommodityName string `json:"commodity_name"` // 商品名称
CommoditySerialNumber string `json:"commodity_serial_number"` // 商品编号
CategoryID uint32 `json:"category_id"` // 商品分类id
CategoryName string `json:"category_name"` // 商品分类名称
AuditTime *time.Time `json:"audit_time"` // 审核时间
ReceiveTime *time.Time `json:"receive_time"` // 收货时间/调入时间
State uint32 `json:"state"` // 调拨状态1-调拨中 2-已完成
AllotCount uint32 `json:"allot_count"` // 调拨数量
AllotAmount float64 `json:"allot_amount"` // 调拨金额
}
// InventoryReportAllotDetailReq 库存调拨明细入参
@ -169,7 +171,7 @@ type InventoryReportByOtherResp struct {
Total int `json:"total"` // 总条数/记录数
PageIndex int `json:"pageIndex"` // 页码
PageSize int `json:"pageSize"` // 页面条数
TotalCount uint32 `json:"total_count"` // 总数量
TotalCount int64 `json:"total_count"` // 总数量
TotalAmount float64 `json:"total_amount"` // 总金额
ExportUrl string `json:"export_url"` // 导出excel路径
List []ReportByOtherData `json:"list"` //
@ -177,16 +179,17 @@ type InventoryReportByOtherResp struct {
// ReportByOtherData 其他出入库汇总数据
type ReportByOtherData struct {
StoreId uint32 `json:"store_id"` // 门店id
StoreName string `json:"store_name"` // 门店名称
CommodityId uint32 `json:"commodity_id"` // 商品id
CommodityName string `json:"commodity_name"` // 商品名称
CategoryID uint32 `json:"category_id"` // 商品分类id
CategoryName string `json:"category_name"` // 商品分类名称
StockTime *time.Time `json:"stock_time"` // 出入库时间
Type uint32 `json:"type"` // 出入库方式1-产品入库 2-盘点入库 3-系统出库 4-盘点出库
Count int64 `json:"count"` // 数量
Amount float64 `json:"amount"` // 金额
StoreId uint32 `json:"store_id"` // 门店id
StoreName string `json:"store_name"` // 门店名称
CommodityId uint32 `json:"commodity_id"` // 商品id
CommodityName string `json:"commodity_name"` // 商品名称
CommoditySerialNumber string `json:"commodity_serial_number"` // 商品编号
CategoryID uint32 `json:"category_id"` // 商品分类id
CategoryName string `json:"category_name"` // 商品分类名称
StockTime *time.Time `json:"stock_time"` // 出入库时间
Type uint32 `json:"type"` // 出入库方式1-产品入库 2-盘点入库 3-系统出库 4-盘点出库
Count int64 `json:"count"` // 数量
Amount float64 `json:"amount"` // 金额
}
// InventoryReportOtherDetailReq 其他出入库明细入参
@ -268,6 +271,7 @@ func (m *InventoryReportByProductReq) ReportByProductList(c *gin.Context) (*Inve
}
qs := orm.Eloquent.Debug().Table("erp_stock")
sumQs := orm.Eloquent.Debug().Table("erp_stock_commodity")
if len(m.StoreId) > 0 { // 门店复选
var storeIDs []uint32
@ -275,6 +279,7 @@ func (m *InventoryReportByProductReq) ReportByProductList(c *gin.Context) (*Inve
storeIDs = append(storeIDs, store)
}
qs = qs.Where("store_id IN (?)", storeIDs)
sumQs = sumQs.Where("store_id IN (?)", storeIDs)
}
if len(m.CategoryID) > 0 { // 商品分类id
@ -283,6 +288,7 @@ func (m *InventoryReportByProductReq) ReportByProductList(c *gin.Context) (*Inve
categoryIDs = append(categoryIDs, category)
}
qs = qs.Where("erp_category_id IN (?)", categoryIDs)
sumQs = sumQs.Where("erp_category_id IN (?)", categoryIDs)
}
if len(m.CommoditySerialNumber) > 0 { // 商品编号
@ -291,6 +297,7 @@ func (m *InventoryReportByProductReq) ReportByProductList(c *gin.Context) (*Inve
serialNumbers = append(serialNumbers, serialNumber)
}
qs = qs.Where("commodity_serial_number IN (?)", serialNumbers)
sumQs = sumQs.Where("commodity_serial_number IN (?)", serialNumbers)
}
if len(m.CommodityName) > 0 { // 商品名称
@ -299,6 +306,7 @@ func (m *InventoryReportByProductReq) ReportByProductList(c *gin.Context) (*Inve
commodityNames = append(commodityNames, commodityName)
}
qs = qs.Where("erp_commodity_name IN (?)", commodityNames)
sumQs = sumQs.Where("erp_commodity_name IN (?)", commodityNames)
}
var count int64
@ -309,11 +317,12 @@ func (m *InventoryReportByProductReq) ReportByProductList(c *gin.Context) (*Inve
}
var commodities []ErpStock
if m.IsExport == 1 { // 导出excel
err = qs.Order("erp_commodity_id, store_id desc").Find(&commodities).Error
} else {
err = qs.Order("erp_commodity_id, store_id desc").Offset(page * m.PageSize).Limit(m.PageSize).Find(&commodities).Error
}
err = qs.Order("erp_commodity_id, store_id desc").Find(&commodities).Error
//if m.IsExport == 1 { // 导出excel
// err = qs.Order("erp_commodity_id, store_id desc").Find(&commodities).Error
//} else {
// err = qs.Order("erp_commodity_id, store_id desc").Offset(page * m.PageSize).Limit(m.PageSize).Find(&commodities).Error
//}
if err != nil && err != RecordNotFound {
logger.Error("查询无库存列表失败", logger.Field("err", err))
return nil, err
@ -357,10 +366,14 @@ func (m *InventoryReportByProductReq) ReportByProductList(c *gin.Context) (*Inve
nTotalEffectiveAmount += reportData.EffectiveAmount
nTotalTransferAmount += reportData.TransferAmount
if reportData.Count == 0 {
continue
}
reportList = append(reportList, reportData)
}
sumData, err := getReportByProductSumData()
sumData, err := getReportByProductSumData(sumQs)
if err != nil {
return nil, err
}
@ -370,7 +383,7 @@ func (m *InventoryReportByProductReq) ReportByProductList(c *gin.Context) (*Inve
resp.TotalCount = sumData.TotalCount
resp.TotalEffectiveAmount = sumData.TotalEffectiveAmount
resp.TotalTransferAmount = sumData.TotalTransferAmount
resp.Total = uint32(count)
resp.Total = uint32(len(reportList))
resp.List = reportList
if m.IsExport == 1 { // 导出excel
@ -379,6 +392,14 @@ func (m *InventoryReportByProductReq) ReportByProductList(c *gin.Context) (*Inve
return nil, err
}
resp.List = []ReportByProductData{}
} else {
// 计算分页所需的切片索引
startIndex := page * m.PageSize
endIndex := (page + 1) * m.PageSize
if endIndex > len(reportList) {
endIndex = len(reportList)
}
resp.List = reportList[startIndex:endIndex]
}
return resp, nil
@ -433,11 +454,12 @@ func getDispatchCommodityAmount(storeId, commodityId uint32) (float64, error) {
}
// 查询产品库存汇总(按门店)的汇总数据:总有效库存数、总调入中数量、总数量、总有效库存金额、总调入中金额
func getReportByProductSumData() (ReportByProductSumData, error) {
func getReportByProductSumData(qs *gorm.DB) (ReportByProductSumData, error) {
var data ReportByProductSumData
// 查询汇总数据
err := orm.Eloquent.Debug().Table("erp_stock_commodity").
//err := orm.Eloquent.Debug().Table("erp_stock_commodity").
err := qs.
Select(`
SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS total_effective_amount,
SUM(CASE WHEN state = ? THEN wholesale_price ELSE 0 END) AS total_transfer_amount,
@ -706,7 +728,7 @@ func (m *InventoryReportByAllotReq) ReportAllotList(c *gin.Context) (*InventoryR
// 遍历 commodities 切片
for _, item := range commodities {
// 生成键
key := fmt.Sprintf("%d_%d_%d", item.DeliverStoreId, item.ReceiveStoreId, item.State)
key := fmt.Sprintf("%d_%d_%d_%d", item.DeliverStoreId, item.ReceiveStoreId, item.CommodityId, item.State)
// 检查是否已经存在该键的汇总数据
if summary, ok := summaryMap[key]; ok {
// 如果已经存在,累加调拨数量和调拨金额
@ -750,6 +772,7 @@ func (m *InventoryReportByAllotReq) ReportAllotList(c *gin.Context) (*InventoryR
summaryMap[i].CategoryID = commodityInfo.ErpCategoryId
summaryMap[i].CategoryName = commodityInfo.ErpCategoryName
summaryMap[i].CommoditySerialNumber = commodityInfo.SerialNumber
summaryList = append(summaryList, *summary)
nTotalAllotCount += summary.AllotCount
@ -758,18 +781,21 @@ func (m *InventoryReportByAllotReq) ReportAllotList(c *gin.Context) (*InventoryR
// 排序规则:商品编号小>调出店铺编号小>调入门店编号小>状态为已完成
sort.Slice(summaryList, func(i, j int) bool {
if summaryList[i].CommodityId != summaryList[j].CommodityId {
return summaryList[i].CommodityId < summaryList[j].CommodityId
}
//if summaryList[i].CommodityId != summaryList[j].CommodityId {
// return summaryList[i].CommodityId < summaryList[j].CommodityId
//}
if summaryList[i].DeliverStoreId != summaryList[j].DeliverStoreId {
return summaryList[i].DeliverStoreId < summaryList[j].DeliverStoreId
}
if summaryList[i].ReceiveStoreId != summaryList[j].ReceiveStoreId {
return summaryList[i].ReceiveStoreId < summaryList[j].ReceiveStoreId
}
return summaryList[i].State < summaryList[j].State
return summaryList[i].State > summaryList[j].State
})
// 按照商品编号排序
SortReportByAllotDataCommodities(summaryList)
// 计算分页所需的切片索引
startIndex := page * m.PageSize
endIndex := (page + 1) * m.PageSize
@ -1299,6 +1325,7 @@ func (m *InventoryReportByOtherReq) ReportByOtherList(c *gin.Context) (*Inventor
}
summaryMap[i].CategoryID = commodityInfo.ErpCategoryId
summaryMap[i].CategoryName = commodityInfo.ErpCategoryName
summaryMap[i].CommoditySerialNumber = commodityInfo.SerialNumber
if summary.Type == 3 || summary.Type == 4 {
summaryMap[i].Count = -summaryMap[i].Count
@ -1326,7 +1353,7 @@ func (m *InventoryReportByOtherReq) ReportByOtherList(c *gin.Context) (*Inventor
}
}
var nTotalAllotCount uint32
var nTotalAllotCount int64
var nTotalAllotAmount float64
filteredData := make([]ReportByOtherData, 0)
for _, data := range summaryList {
@ -1335,7 +1362,7 @@ func (m *InventoryReportByOtherReq) ReportByOtherList(c *gin.Context) (*Inventor
(len(m.CategoryID) == 0 || tools.Uint32SliceContains(m.CategoryID, data.CategoryID)) &&
(m.Type == 0 || m.Type == data.Type) &&
((m.StartTime == "" && m.EndTime == "") || (data.StockTime.After(startTime) && data.StockTime.Before(endTime))) {
nTotalAllotCount += 1
nTotalAllotCount += data.Count
nTotalAllotAmount += data.Amount
filteredData = append(filteredData, data)
@ -1344,6 +1371,7 @@ func (m *InventoryReportByOtherReq) ReportByOtherList(c *gin.Context) (*Inventor
// 使用排序规则函数对汇总数据进行排序
sortSummaryList(filteredData)
SortReportByOtherDataCommodities(filteredData)
// 计算分页所需的切片索引
startIndex := page * m.PageSize
@ -1376,10 +1404,10 @@ func (m *InventoryReportByOtherReq) ReportByOtherList(c *gin.Context) (*Inventor
// 排序规则:商品编号小>门店编号小>产品入库>盘点入库>系统出库>盘点出库
func sortSummaryList(summaryList []ReportByOtherData) {
sort.Slice(summaryList, func(i, j int) bool {
// 按 CommodityId 排序
if summaryList[i].CommodityId != summaryList[j].CommodityId {
return summaryList[i].CommodityId < summaryList[j].CommodityId
}
//// 按 CommodityId 排序
//if summaryList[i].CommodityId != summaryList[j].CommodityId {
// return summaryList[i].CommodityId < summaryList[j].CommodityId
//}
// 如果 CommodityId 相同,则按 StoreId 排序
if summaryList[i].StoreId != summaryList[j].StoreId {
return summaryList[i].StoreId < summaryList[j].StoreId

View File

@ -65,7 +65,7 @@ func (e *LoginLog) GetPage(pageSize int, pageIndex int) ([]LoginLog, int, error)
if err := table.Order("info_id desc").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
//table.Where("`deleted_at` IS NULL").Count(&count)
//table.Where("`deleted_at` IS NULL").Total(&count)
return doc, int(count), nil
}

View File

@ -189,7 +189,7 @@ func CreateGoodsSerialNo() string {
if count > 0 {
continue
}
//if count, err := NewGoodsQuerySet(DB).SerialNoEq(serialNo).Count(); err == nil && count > 0 {
//if count, err := NewGoodsQuerySet(DB).SerialNoEq(serialNo).Total(); err == nil && count > 0 {
// continue
//}
return serialNo
@ -208,7 +208,7 @@ func CreateGoodsId() uint32 {
if count > 0 {
continue
}
//if count, err := NewGoodsQuerySet(DB).GoodsIdEq(orderId).Count(); err == nil && count > 0 {
//if count, err := NewGoodsQuerySet(DB).GoodsIdEq(orderId).Total(); err == nil && count > 0 {
// continue
//}
return orderId
@ -350,7 +350,7 @@ func (*GoodsOrder) TableName() string {
func CreateGoodsOrderSerialNo() string {
for {
serialNo := utils.GenSerialNo()
//if count, err := NewGoodsOrderQuerySet(DB).SerialNoEq(serialNo).Count(); err == nil && count > 0 {
//if count, err := NewGoodsOrderQuerySet(DB).SerialNoEq(serialNo).Total(); err == nil && count > 0 {
// continue
//}
return serialNo
@ -360,7 +360,7 @@ func CreateGoodsOrderSerialNo() string {
func CreateGoodsOrderId() uint32 {
for {
orderId := utils.GenUid()
//if count, err := NewGoodsOrderQuerySet(DB).OrderIdEq(orderId).Count(); err == nil && count > 0 {
//if count, err := NewGoodsOrderQuerySet(DB).OrderIdEq(orderId).Total(); err == nil && count > 0 {
// continue
//}
return orderId

View File

@ -84,7 +84,7 @@ func (e *SysOperLog) GetPage(pageSize int, pageIndex int, startTime string, endT
if err := table.Order("oper_id desc").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
//table.Where("`deleted_at` IS NULL").Count(&count)
//table.Where("`deleted_at` IS NULL").Total(&count)
return doc, int(count), nil
}

View File

@ -5,6 +5,7 @@ import (
"encoding/json"
"errors"
"fmt"
"github.com/gin-gonic/gin"
"github.com/wechatpay-apiv3/wechatpay-go/core"
"github.com/wechatpay-apiv3/wechatpay-go/core/option"
"github.com/wechatpay-apiv3/wechatpay-go/services/certificates"
@ -14,6 +15,7 @@ import (
"go-admin/app/admin/models/kuaidi"
orm "go-admin/common/global"
"go-admin/logger"
"go-admin/tools"
"go-admin/tools/config"
"golang.org/x/sync/errgroup"
"gorm.io/gorm"
@ -200,7 +202,7 @@ type OrderListReq struct {
PageSize int `json:"pageSize"`
}
func (m *OrderListReq) List(exportFlag int) ([]Order, int64, string, error) {
func (m *OrderListReq) List(exportFlag int, c *gin.Context) ([]Order, int64, string, error) {
orders := make([]Order, 0)
if m.PageSize == 0 {
m.PageSize = 10
@ -210,9 +212,9 @@ func (m *OrderListReq) List(exportFlag int) ([]Order, int64, string, error) {
var err error
// 如果卡片类型不为空则优先查询order_card表
if m.CardStatus != 0 {
orders, count, err = m.queryListFormOrderCard(exportFlag)
orders, count, err = m.queryListFormOrderCard(exportFlag, c)
} else {
orders, count, err = m.queryListFormOrder(exportFlag)
orders, count, err = m.queryListFormOrder(exportFlag, c)
}
filePath := ""
@ -227,11 +229,37 @@ func (m *OrderListReq) List(exportFlag int) ([]Order, int64, string, error) {
return orders, count, filePath, nil
}
func (m *OrderListReq) queryListFormOrderCard(exportFlag int) ([]Order, int64, error) {
func (m *OrderListReq) queryListFormOrderCard(exportFlag int, c *gin.Context) ([]Order, int64, error) {
var orderCards []OrderCard
orders := make([]Order, 0)
qs := orm.Eloquent.Table("order_card").Where("card_status=?", m.CardStatus)
// 非管理员才判断所属门店
if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") {
sysUser, err := GetSysUserByCtx(c)
if err != nil {
return nil, 0, err
}
// 返回sysUser未过期的门店id列表
storeList := GetValidStoreIDs(sysUser.StoreData)
if m.StoreId != 0 {
if !Contains(storeList, uint32(m.StoreId)) {
return nil, 0, errors.New("您没有该门店权限")
}
} else {
if len(storeList) > 0 {
if len(storeList) == 1 {
qs = qs.Where("store_id = ?", storeList[0])
} else {
qs = qs.Where("store_id IN (?)", storeList)
}
} else {
return nil, 0, errors.New("用户未绑定门店")
}
}
}
if m.SerialNumber != "" {
qs = qs.Where("serial_number=?", m.SerialNumber)
}
@ -331,7 +359,7 @@ func (m *OrderListReq) queryListFormOrderCard(exportFlag int) ([]Order, int64, e
return orders, count, nil
}
func (m *OrderListReq) queryListFormOrder(exportFlag int) ([]Order, int64, error) {
func (m *OrderListReq) queryListFormOrder(exportFlag int, c *gin.Context) ([]Order, int64, error) {
var orderCards []OrderCard
orders := make([]Order, 0)
if m.PageSize == 0 {
@ -340,6 +368,32 @@ func (m *OrderListReq) queryListFormOrder(exportFlag int) ([]Order, int64, error
var qs *gorm.DB
qs = orm.Eloquent.Table("order").Where("pay_status", 2)
// 非管理员才判断所属门店
if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") {
sysUser, err := GetSysUserByCtx(c)
if err != nil {
return nil, 0, err
}
// 返回sysUser未过期的门店id列表
storeList := GetValidStoreIDs(sysUser.StoreData)
if m.StoreId != 0 {
if !Contains(storeList, uint32(m.StoreId)) {
return nil, 0, errors.New("您没有该门店权限")
}
} else {
if len(storeList) > 0 {
if len(storeList) == 1 {
qs = qs.Where("store_id = ?", storeList[0])
} else {
qs = qs.Where("store_id IN (?)", storeList)
}
} else {
return nil, 0, errors.New("用户未绑定门店")
}
}
}
isDeliver := true
if m.SerialNumber != "" {
isDeliver = false
@ -1192,7 +1246,7 @@ func (m *Order) Revert() error {
var count int64
err = orm.Eloquent.Table("order_card").Where("order_id=?", orderCard.OrderId).
Where("card_status in (?)", []uint32{1, 2, 3}).Count(&count).Error
//NewOrderCardQuerySet(DB).OrderIdEq(order.ID).CardStatusIn(1, 2, 3).Count()
//NewOrderCardQuerySet(DB).OrderIdEq(order.ID).CardStatusIn(1, 2, 3).Total()
if err != nil {
logger.Error("err:", logger.Field("err", err))
return err
@ -1342,7 +1396,7 @@ func IsUserHaveUnreturnedOrders(uid uint32) (bool, error) {
sql := fmt.Sprintf("SELECT COUNT(*) AS count FROM order_card WHERE uid = %d AND pay_status=2 AND card_status IN (1,2,3) ;", uid)
//sql := fmt.Sprintf("SELECT COUNT(*) AS count FROM order_card WHERE uid = %d AND pay_status IN (1,2) AND card_status IN (1,2,3) ;", uid)
//count, err := NewOrderQuerySet(DB).UidEq(uint64(uid)).PayStatusEq(PayStatusPaid).CardStatusIn(1, 2, 3).Count()
//count, err := NewOrderQuerySet(DB).UidEq(uint64(uid)).PayStatusEq(PayStatusPaid).CardStatusIn(1, 2, 3).Total()
//if err != nil {
// logger.Error("err:",logger.Field("err",err))
// return false, err

View File

@ -110,7 +110,7 @@ func (e *Post) GetPage(pageSize int, pageIndex int) ([]Post, int, error) {
if err := table.Order("sort").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
//table.Where("`deleted_at` IS NULL").Count(&count)
//table.Where("`deleted_at` IS NULL").Total(&count)
return doc, int(count), nil
}

View File

@ -1,6 +1,7 @@
package models
import (
"encoding/json"
"errors"
"fmt"
"github.com/gin-gonic/gin"
@ -10,6 +11,7 @@ import (
"go-admin/tools"
"go-admin/tools/config"
"gorm.io/gorm"
"log"
"math"
"math/rand"
"sort"
@ -1043,6 +1045,7 @@ func updatePurchaseCommodityData(gdb *gorm.DB, orderId uint32, req *ErpPurchaseE
}
}
if !found {
reqCommodity.ID = 0
newCommodities = append(newCommodities, reqCommodity)
}
}
@ -1631,7 +1634,7 @@ func ExecuteErpPurchase(req *ErpPurchaseExecuteReq, c *gin.Context) (*ErpPurchas
return nil, err
}
if commodityInfo.IMEIType == 2 || commodityInfo.IMEIType == 3 {
// 如果是串码商品,根据 Count 拆分成对应数量的数据
// 如果是串码商品,根据 Total 拆分成对应数量的数据
for i := 0; i < int(inventory.Count); i++ {
imei := "" // 默认退货单执行时不需要串码
if inventory.PurchaseType == ErpProcureOrder && commodityInfo.IMEIType == 2 { // 采购单
@ -1911,8 +1914,8 @@ func FinishErpPurchaseDemand(req *FinishErpPurchaseDemandReq, sysUser *SysUser)
// }
//
// if len(demand) > 0 {
// totalNeedCount += demand[0].Count
// demandData.List[i].NeedCount = demand[0].Count
// totalNeedCount += demand[0].Total
// demandData.List[i].NeedCount = demand[0].Total
// }
//
// // 查询某个门店某个商品的库存情况
@ -1934,7 +1937,7 @@ func FinishErpPurchaseDemand(req *FinishErpPurchaseDemandReq, sysUser *SysUser)
//func GetCommodityStockByStoreId(commodityId, storeId uint32) (uint32, error) {
// var count int64
// err := orm.Eloquent.Table("erp_stock_commodity").Where("erp_commodity_id = ? and store_id = ? and state = 1",
// commodityId, storeId).Count(&count).Error
// commodityId, storeId).Total(&count).Error
// if err != nil {
// logger.Error("GetCommodityStockByStoreId count err:", logger.Field("err", err))
// return 0, err
@ -2338,7 +2341,7 @@ func FinishErpPurchaseDemand(req *FinishErpPurchaseDemandReq, sysUser *SysUser)
// var stockCount int64
// err := orm.Eloquent.Table("erp_stock_commodity").
// Where("erp_commodity_id = ? AND store_id = ? AND state = 1", commodityID, storeID).
// Count(&stockCount).Error
// Total(&stockCount).Error
// if err != nil {
// // Handle error
// return
@ -2883,20 +2886,60 @@ func GetLastMonthRange() (time.Time, time.Time) {
return firstDay, lastDay
}
// GetOnlineStores 查询所有在线门店信息
// GetOnlineStores 查询有效门店信息
func GetOnlineStores(c *gin.Context) ([]Store, error) {
sysUser, err := GetSysUserByCtx(c)
user, err := GetSysUserByCtx(c)
if err != nil {
return nil, err
}
var stores []Store
err = orm.Eloquent.Table("store").Where("is_online = ? and cooperative_business_id = ? ", 1,
sysUser.CooperativeBusinessId).Find(&stores).Error
if err != nil {
if user.RoleId == 1 { // 系统管理员
var stores []Store
err = orm.Eloquent.Table("store").Where("cooperative_business_id = ? ",
user.CooperativeBusinessId).Find(&stores).Error
if err != nil {
return nil, err
}
return stores, nil
}
// 解析门店数据
if err := json.Unmarshal([]byte(user.StoreData), &user.StoreList); err != nil {
return nil, err
}
return stores, nil
if len(user.StoreList) == 0 {
return nil, errors.New("no stores found")
}
// 当前时间
now := time.Now()
// 过滤掉过期的门店
validStores := make([]Store, 0)
for _, store := range user.StoreList {
expireTime, err := time.Parse(StoreDateTimeFormat, store.ExpireTime)
if err != nil {
log.Println("Error parsing time:", err, "ExpireTime:", store.ExpireTime)
continue
}
// 包含当天有效时间
expireTime = expireTime.Add(24*time.Hour - time.Second)
if expireTime.After(now) {
tempStore := Store{
Name: store.StoreName,
}
tempStore.ID = uint32(store.StoreID)
validStores = append(validStores, tempStore)
}
}
if len(validStores) == 0 {
return nil, nil
}
return validStores, nil
}
type Result struct {
@ -3295,7 +3338,7 @@ func getReportByOrderFromCommodityOrCategory(req *ErpPurchaseReportByOrderReq, c
}
if existingData, ok := commodityMapInfo[inventory.ErpCommodityId]; ok {
// 如果已经存在相同 ErpCommodityId 的数据,则累加 Amount 和 Count
// 如果已经存在相同 ErpCommodityId 的数据,则累加 Amount 和 Total
existingData.Amount += vAmount
existingData.Count += vCount
existingData.Price = existingData.Amount / float64(existingData.Count)
@ -3584,7 +3627,7 @@ func getOrderInventoryInfo(req *ErpPurchaseReportByOrderReq, erpPurchaseOrderId
}
if existingData, ok := commodityMap[v.ErpCommodityId]; ok {
// 如果已经存在相同 ErpCommodityId 的数据,则累加 Amount 和 Count
// 如果已经存在相同 ErpCommodityId 的数据,则累加 Amount 和 Total
existingData.Amount += vAmount
existingData.Count += vCount
existingData.Price = existingData.Amount / float64(existingData.Count)
@ -4476,7 +4519,7 @@ JOIN
// qs := orm.Eloquent.Table("erp_purchase_commodity")
//
// var count int64
// err := qs.Count(&count).Error
// err := qs.Total(&count).Error
// if err != nil {
// logger.Error("getAllOrderCommodity count err:", logger.Field("err", err))
// return nil, err
@ -5048,14 +5091,14 @@ func GetReportBySupplier(req *ErpPurchaseReportBySupplierReq, c *gin.Context) (
// ErpCommodityName: data.ErpCommodityName,
// ErpCategoryID: data.ErpCategoryID,
// ErpCategoryName: data.ErpCategoryName,
// Count: data.Count,
// Total: data.Total,
// Amount: data.Amount,
// RejectAmount: data.RejectAmount,
// Difference: data.Difference,
// }
// } else {
// // 如果键已存在,进行累加操作
// mergedMap[key].Count += data.Count
// mergedMap[key].Total += data.Total
// mergedMap[key].Amount += data.Amount
// mergedMap[key].RejectAmount += data.RejectAmount
// mergedMap[key].Difference += data.Difference

View File

@ -71,15 +71,17 @@ type RecycleCardOrderListReq struct {
AuditEndTime string `json:"audit_end_time"`
}
type RecycleCardOrderListRsp struct {
Count int64 `json:"count"`
Total int64 `json:"total"`
List []RecycleCardOrder `json:"list"`
PageIndex int `json:"pageIndex"`
PageSize int `json:"pageSize"`
Url string `json:"url"`
}
func (m *RecycleCardOrderListReq) List(c *gin.Context) (RecycleCardOrderListRsp, error) {
rsp := RecycleCardOrderListRsp{
PageIndex: m.PageIdx,
PageSize: m.PageSize,
}
page := m.PageIdx - 1
if page < 0 {
@ -193,7 +195,7 @@ func (m *RecycleCardOrderListReq) List(c *gin.Context) (RecycleCardOrderListRsp,
logger.Error("err:", logger.Field("err", err))
return rsp, err
}
rsp.Count = count
rsp.Total = count
//err = qs.Order("id DESC").Offset(m.PageNum * m.PageSize).Limit(m.PageSize).Find(&dailys).Error
if m.IsExport == 1 {
err = qs.Order("id DESC").Find(&list).Error

View File

@ -68,7 +68,7 @@ func (role *SysRole) GetPage(pageSize int, pageIndex int) ([]SysRole, int, error
if err := table.Order("role_sort").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
//table.Where("`deleted_at` IS NULL").Count(&count)
//table.Where("`deleted_at` IS NULL").Total(&count)
return doc, int(count), nil
}

View File

@ -849,7 +849,7 @@ func (m *ShareCardVmRecord) ProvideVmGameId(gameId uint32) {
record.ProvideVmUser(shareCards)
//var holdCount int64
//err = orm.Eloquent.Table("game_card_goods").Where("game_card_id in (?)", goodsIds).
// Where("status!=?", 1).Count(&holdCount).Error
// Where("status!=?", 1).Total(&holdCount).Error
//if err != nil {
// logger.Error("stock count err:",logger.Field("err",err))
// return
@ -2453,7 +2453,7 @@ func (m *FunctionUnusualCardListReq) List() ([]GameCardGoods, int64, error) {
// var shareCardBills []UserShareCardBill
// qs := NewUserShareCardBillQuerySet(DB).UidEq(uid)
//
// count, err := qs.Count()
// count, err := qs.Total()
// if err != nil {
// logger.Error("user share card bill count err:",logger.Field("err",err))
// return shareCardBills, 0, err

View File

@ -84,7 +84,7 @@ func (e *SysCategory) GetPage(pageSize int, pageIndex int) ([]SysCategory, int,
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
//table.Where("`deleted_at` IS NULL").Count(&count)
//table.Where("`deleted_at` IS NULL").Total(&count)
return doc, int(count), nil
}

View File

@ -94,7 +94,7 @@ func (e *SysContent) GetPage(pageSize int, pageIndex int) ([]SysContent, int, er
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
//table.Where("`deleted_at` IS NULL").Count(&count)
//table.Where("`deleted_at` IS NULL").Total(&count)
return doc, int(count), nil
}

View File

@ -74,7 +74,7 @@ func (e *SysFileInfo) GetPage(pageSize int, pageIndex int) ([]SysFileInfo, int,
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
//table.Where("`deleted_at` IS NULL").Count(&count)
//table.Where("`deleted_at` IS NULL").Total(&count)
return doc, int(count), nil
}

View File

@ -311,7 +311,7 @@ func (e *SysUser) GetPage(pageSize int, pageIndex int) ([]SysUserPage, int, erro
return nil, 0, err
}
//if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Order("sys_user.created_at DESC").Offset(-1).Limit(-1).Count(&count).Error; err != nil {
//if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Order("sys_user.created_at DESC").Offset(-1).Limit(-1).Total(&count).Error; err != nil {
// return nil, 0, err
//}
@ -515,3 +515,58 @@ func GetUserEffectiveStore(uid uint32) ([]StoreInfo, error) {
return validStores, nil
}
// GetUserEffectiveStoreById 获取店员当前的有效门店(商城发货使用)
func GetUserEffectiveStoreById(id uint32) ([]StoreInfo, error) {
user := new(SysUser)
err := orm.Eloquent.Table("sys_user").Where("user_id", id).Find(&user).Error
if err != nil {
log.Println("Error:", err, "UID:", id)
return nil, err
}
// 解析门店数据
if err := json.Unmarshal([]byte(user.StoreData), &user.StoreList); err != nil {
return nil, err
}
if len(user.StoreList) == 0 {
return nil, errors.New("no stores found")
}
// 当前时间
now := time.Now()
// 过滤掉过期的门店
validStores := make([]StoreInfo, 0)
for _, store := range user.StoreList {
expireTime, err := time.Parse(StoreDateTimeFormat, store.ExpireTime)
if err != nil {
log.Println("Error parsing time:", err, "ExpireTime:", store.ExpireTime)
continue
}
// 包含当天有效时间
expireTime = expireTime.Add(24*time.Hour - time.Second)
if expireTime.After(now) {
validStores = append(validStores, store)
}
}
if len(validStores) == 0 {
return nil, nil
}
// 按有效时间和 store_id 排序
sort.Slice(validStores, func(i, j int) bool {
timeI, _ := time.Parse(StoreDateTimeFormat, validStores[i].ExpireTime)
timeJ, _ := time.Parse(StoreDateTimeFormat, validStores[j].ExpireTime)
if timeI.Equal(timeJ) {
return validStores[i].StoreID < validStores[j].StoreID
}
return timeI.Before(timeJ)
})
return validStores, nil
}

View File

@ -44,7 +44,7 @@ func (e *DBColumns) GetPage(pageSize int, pageIndex int) ([]DBColumns, int, erro
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
//table.Count(&count)
//table.Total(&count)
return doc, int(count), nil
}

View File

@ -40,7 +40,7 @@ func (e *DBTables) GetPage(pageSize int, pageIndex int) ([]DBTables, int, error)
tools.Assert(true, "目前只支持mysql数据库", 500)
}
//table.Count(&count)
//table.Total(&count)
return doc, int(count), nil
}

View File

@ -69,7 +69,7 @@ func (e *SysTables) GetPage(pageSize int, pageIndex int) ([]SysTables, int, erro
if err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
return nil, 0, err
}
//table.Where("`deleted_at` IS NULL").Count(&count)
//table.Where("`deleted_at` IS NULL").Total(&count)
return doc, int(count), nil
}

View File

@ -288,7 +288,7 @@ type NewUserListResp struct {
ExportUrl string `json:"export_url"` // 导出excel地址
}
func GetNewUserList(req *NewUserListReq) (*NewUserListResp, error) {
func GetNewUserList(req *NewUserListReq, c *gin.Context) (*NewUserListResp, error) {
resp := &NewUserListResp{
PageIndex: req.PageIndex,
PageSize: req.PageSize,
@ -315,6 +315,33 @@ func GetNewUserList(req *NewUserListReq) (*NewUserListResp, error) {
qs := orm.Eloquent.Model(&UserInfo{}).Debug()
// 非管理员才判断所属门店
if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") {
sysUser, err := GetSysUserByCtx(c)
if err != nil {
return nil, err
}
var storeList []uint32
// 返回sysUser未过期的门店id列表
storeList = GetValidStoreIDs(sysUser.StoreData)
if req.StoreId != 0 {
if !Contains(storeList, uint32(req.StoreId)) {
return nil, errors.New("您没有该门店权限")
}
} else {
if len(storeList) > 0 {
if len(storeList) == 1 {
qs = qs.Where("store_id = ?", storeList[0])
} else {
qs = qs.Where("store_id IN (?)", storeList)
}
} else {
return nil, errors.New("用户未绑定门店")
}
}
}
if req.Tel != "" {
qs = qs.Where("user.tel", req.Tel)
}
@ -1441,7 +1468,7 @@ type UserInviteRecordListData struct {
MemberExpire time.Time `json:"memberExpire"` // 租卡会员到期时间
}
func (m *NewUserInviteRecordReq) NewList() (*UserInviteRecordListResp, error) {
func (m *NewUserInviteRecordReq) NewList(c *gin.Context) (*UserInviteRecordListResp, error) {
resp := new(UserInviteRecordListResp)
var records []struct {
UserInviteRecord
@ -1490,21 +1517,49 @@ func (m *NewUserInviteRecordReq) NewList() (*UserInviteRecordListResp, error) {
Group("user_invite_record.id").
Order("MAX(user_invite_record.action_time) DESC")
// 非管理员才判断所属门店
if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") {
sysUser, err := GetSysUserByCtx(c)
if err != nil {
return nil, err
}
// 返回sysUser未过期的门店id列表
validStoreList := GetValidStoreIDs(sysUser.StoreData)
if m.StoreId != 0 {
if !Contains(validStoreList, m.StoreId) {
return nil, errors.New("您没有该门店权限")
}
} else {
if len(validStoreList) > 0 {
if len(validStoreList) == 1 {
qs = qs.Where("user_invite_record.store_id = ?", validStoreList[0])
countQuery = countQuery.Where("user_invite_record.store_id = ?", validStoreList[0])
} else {
qs = qs.Where("user_invite_record.store_id IN (?)", validStoreList)
countQuery = countQuery.Where("user_invite_record.store_id IN (?)", validStoreList)
}
} else {
return nil, errors.New("用户未绑定门店")
}
}
}
if m.StoreId != 0 {
qs = qs.Where("store_id=?", m.StoreId)
countQuery = countQuery.Where("store_id=?", m.StoreId)
qs = qs.Where("user_invite_record.store_id=?", m.StoreId)
countQuery = countQuery.Where("user_invite_record.store_id=?", m.StoreId)
}
if m.InviteUserName != "" {
qs = qs.Where("B1.nick_name=?", m.InviteUserName)
countQuery = countQuery.Where("B1.nick_name=?", m.InviteUserName)
}
if m.FromUid != 0 {
qs = qs.Where("from_uid=?", m.FromUid)
countQuery = countQuery.Where("from_uid=?", m.FromUid)
qs = qs.Where("user_invite_record.from_uid=?", m.FromUid)
countQuery = countQuery.Where("user_invite_record.from_uid=?", m.FromUid)
}
if m.ToUid != 0 {
qs = qs.Where("to_uid=?", m.ToUid)
countQuery = countQuery.Where("to_uid=?", m.ToUid)
qs = qs.Where("user_invite_record.to_uid=?", m.ToUid)
countQuery = countQuery.Where("user_invite_record.to_uid=?", m.ToUid)
}
if m.UserTel != "" {
qs = qs.Where("B2.tel=?", m.UserTel)
@ -1579,16 +1634,16 @@ func (m *NewUserInviteRecordReq) NewList() (*UserInviteRecordListResp, error) {
}
if !m.RecordStartTime.IsZero() {
qs = qs.Where("action_time > ?", m.RecordStartTime)
countQuery = countQuery.Where("action_time > ?", m.RecordStartTime)
qs = qs.Where("user_invite_record.action_time > ?", m.RecordStartTime)
countQuery = countQuery.Where("user_invite_record.action_time > ?", m.RecordStartTime)
}
if !m.RecordEndTime.IsZero() {
qs = qs.Where("action_time < ?", m.RecordEndTime)
countQuery = countQuery.Where("action_time < ?", m.RecordEndTime)
qs = qs.Where("user_invite_record.action_time < ?", m.RecordEndTime)
countQuery = countQuery.Where("user_invite_record.action_time < ?", m.RecordEndTime)
}
if m.MemberLevel != 0 {
qs = qs.Where("user.member_level = ?", m.MemberLevel)
countQuery = countQuery.Where("user.member_level = ?", m.MemberLevel)
qs = qs.Where("B2.member_level = ?", m.MemberLevel)
countQuery = countQuery.Where("B2.member_level = ?", m.MemberLevel)
}
var count int64
@ -2795,7 +2850,7 @@ type AssistantInviteMemberReportListResp struct {
ExportUrl string `json:"export_url"` // 导出excel地址
}
func (m *AssistantInviteMemberReportReq) List() (*AssistantInviteMemberReportListResp, error) {
func (m *AssistantInviteMemberReportReq) List(c *gin.Context) (*AssistantInviteMemberReportListResp, error) {
resp := new(AssistantInviteMemberReportListResp)
var memberReport []InviteMemberReport
var users []SysUser
@ -3251,7 +3306,7 @@ func GetOrderSn() string {
orderSn = utils.GenSerialNo()
var count int64
err := orm.Eloquent.Table("user_open_member_record").Where("open_no=?", orderSn).Count(&count)
//count, err := NewUserOpenMemberRecordQuerySet(DB).OpenNoEq(orderSn).Count()
//count, err := NewUserOpenMemberRecordQuerySet(DB).OpenNoEq(orderSn).Total()
if err != nil {
logger.Error("err:", logger.Field("err", err))
}

View File

@ -12,15 +12,15 @@ func registerCooperativeManageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.Gi
cooperativeBusiness := v1.Group("/cooperative").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
cooperativeBusiness.POST("get_default_info", cooperativemanage.CooperativeGetDefaultInfo) // 获取合作商默认用户名和密码
cooperativeBusiness.POST("list", cooperativemanage.CooperativeBusinessList) // 获取合作商列表
cooperativeBusiness.POST("add", cooperativemanage.CooperativeAdd) // 获取合作商
cooperativeBusiness.POST("edit", cooperativemanage.CooperativeEdit) // 编辑供应商
cooperativeBusiness.POST("member_promotion/list", cooperativemanage.CooperativeMemberPromotionList) // 合作商推广会员列表
cooperativeBusiness.POST("member_promotion_store/list", cooperativemanage.CooperativeMemberPromotionStoreList) // 合作商推广会员门店列表
cooperativeBusiness.POST("member_promotion_day/list", cooperativemanage.CooperativeMemberPromotionDayList) // 合作商每天推广会员列表
cooperativeBusiness.POST("member_promotion_store_day/list", cooperativemanage.CooperativeMemberPromotionStoreDayList) // 合作商每天门店推广会员列表
//cooperativeBusiness.POST("member_promotion_statistic/list", cooperativemanage.CooperativeMemberPromotionStatisticList) // 合作商推广会员统计列表
cooperativeBusiness.POST("get_default_info", cooperativemanage.CooperativeGetDefaultInfo) // 获取合作商默认用户名和密码
cooperativeBusiness.POST("list", cooperativemanage.CooperativeBusinessList) // 获取合作商列表
cooperativeBusiness.POST("add", cooperativemanage.CooperativeAdd) // 获取合作商
cooperativeBusiness.POST("edit", cooperativemanage.CooperativeEdit) // 编辑供应商
cooperativeBusiness.POST("member_promotion/list", cooperativemanage.CooperativeMemberPromotionList) // 合作商推广会员列表
cooperativeBusiness.POST("member_promotion_store/list", cooperativemanage.CooperativeMemberPromotionStoreList) // 合作商推广会员门店列表
cooperativeBusiness.POST("member_promotion_day/list", cooperativemanage.CooperativeMemberPromotionDayList) // 合作商每天推广会员列表
cooperativeBusiness.POST("member_promotion_store_day/list", cooperativemanage.CooperativeMemberPromotionStoreDayList) // 合作商每天门店推广会员列表
cooperativeBusiness.POST("member_promotion_statistic/list", cooperativemanage.CooperativeMemberPromotionStatisticList) // 合作商推广会员统计列表
cooperativeBusiness.POST("member_promotion/settle_info", cooperativemanage.CooperativeMemberPromotionSettleInfo) // 合作商推广会员结算详情
cooperativeBusiness.POST("member_promotion/settle_confirm", cooperativemanage.CooperativeMemberPromotionSettleConfirm) // 合作商推广会员结算确认
//cooperativeBusiness.POST("member_promotion/settle/list", cooperativemanage.CooperativeMemberPromotionSettleList) // 合作商推广会员结算列表
@ -45,6 +45,6 @@ func registerCooperativeManageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.Gi
// 无需认证的路由代码
func registerCooperativeManageUnAuthRouter(v1 *gin.RouterGroup) {
cooperativeBusiness := v1.Group("/cooperative")
cooperativeBusiness.POST("member_promotion/settle/list", cooperativemanage.CooperativeMemberPromotionSettleList) // 合作商推广会员结算列表
cooperativeBusiness.POST("member_promotion_statistic/list", cooperativemanage.CooperativeMemberPromotionStatisticList) // 合作商推广会员统计列表
cooperativeBusiness.POST("member_promotion/settle/list", cooperativemanage.CooperativeMemberPromotionSettleList) // 合作商推广会员结算列表
//cooperativeBusiness.POST("member_promotion_statistic/list", cooperativemanage.CooperativeMemberPromotionStatisticList) // 合作商推广会员统计列表
}

View File

@ -3,11 +3,16 @@ package router
import (
"github.com/gin-gonic/gin"
"go-admin/app/admin/apis/goodsmanage"
"go-admin/app/admin/middleware"
jwt "go-admin/pkg/jwtauth"
)
// 需认证的路由代码
func registerGoodsManageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
goods := v1.Group("/goods").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
goods.POST("/goods_list", goodsmanage.GameCardGoodsList) // 获取游戏卡列表
}
}
// 无需认证的路由代码
@ -15,7 +20,6 @@ func registerGoodsManageUnAuthRouter(v1 *gin.RouterGroup) {
goods := v1.Group("/goods")
{
goods.POST("/list", goodsmanage.GameCardList) // 获取游戏列表
goods.POST("/goods_list", goodsmanage.GameCardGoodsList) // 获取游戏卡列表
goods.POST("/add", goodsmanage.GameCardAdd) // 添加游戏
goods.POST("/modify", goodsmanage.GameCardModify) // 修改游戏
goods.POST("/type", goodsmanage.GameCardTypes) // 获取游戏类型

View File

@ -4,12 +4,13 @@ import (
"github.com/gin-gonic/gin"
"go-admin/app/admin/apis/goodsmanage"
"go-admin/app/admin/apis/ordermanage"
"go-admin/app/admin/middleware"
jwt "go-admin/pkg/jwtauth"
)
// 需认证的路由代码
func registerOrderManageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
order := v1.Group("/order")
order := v1.Group("/order").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
order.POST("/list", ordermanage.OrderList) // 订单列表
order.POST("/list_export", ordermanage.OrderListExport) // 订单列表导出

View File

@ -10,16 +10,13 @@ import (
// 无需认证的路由代码
func registerRecycleCardManageUnAuthRouter(v1 *gin.RouterGroup) {
recycleCardRouter := v1.Group("/recycle_card")
{
recycleCardRouter.POST("order/detail", recyclecardmanage.RecycleCardOrderDetail)
recycleCardRouter.POST("order/check", recyclecardmanage.RecycleCardOrderCheck) // 管理端
recycleCardRouter.POST("config/update", recyclecardmanage.RecycleCardConfigUpdate) // 管理端
recycleCardRouter.POST("config/info", recyclecardmanage.RecycleCardConfigInfo) // 管理端
recycleCardRouter.POST("order/retrieve", recyclecardmanage.RecycleCardOrderRetrieve) // 管理端
}
}
// 需认证的路由代码

View File

@ -76,7 +76,7 @@ func examplesCheckRoleRouter(r *gin.Engine, authMiddleware *jwtauth.GinJWTMiddle
registerSysCategoryRouter(v1, authMiddleware)
// 商品
//registerGoodsManageRouter(v1, authMiddleware)
registerGoodsManageRouter(v1, authMiddleware)
// 活动
registerActivityManageRouter(v1, authMiddleware)
// 共享卡
@ -93,6 +93,8 @@ func examplesCheckRoleRouter(r *gin.Engine, authMiddleware *jwtauth.GinJWTMiddle
registerMallManageRouter(v1, authMiddleware)
// 回收卡
registerRecycleCardManageRouter(v1, authMiddleware)
// 游戏卡库存
registerStockManageRouter(v1, authMiddleware)
// 供应商
registerSupplierRouter(v1, authMiddleware)
@ -102,7 +104,7 @@ func examplesCheckRoleRouter(r *gin.Engine, authMiddleware *jwtauth.GinJWTMiddle
registerCommodityRouter(v1, authMiddleware)
// 收付款账号设置
registerCashierRouter(v1, authMiddleware)
// 库存管理
// erp库存管理
registerInventoryManageRouter(v1, authMiddleware)
// 零售订单管理
registerErpOrderManageRouter(v1, authMiddleware)

View File

@ -3,18 +3,24 @@ package router
import (
"github.com/gin-gonic/gin"
"go-admin/app/admin/apis/stockmanage"
"go-admin/app/admin/middleware"
jwt "go-admin/pkg/jwtauth"
)
// 需认证的路由代码
func registerStockManageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {
order := v1.Group("/stock").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())
{
order.POST("/list", stockmanage.GameCardGoodsStockInfoList) // 库存列表
order.POST("/cannibalize_task/list", stockmanage.CannibalizeTaskList) // 库存调拨列表
}
}
// 无需认证的路由代码
func registerStockManageUnAuthRouter(v1 *gin.RouterGroup) {
order := v1.Group("/stock")
{
order.POST("/list", stockmanage.GameCardGoodsStockInfoList) // 库存列表
//order.POST("/list", stockmanage.GameCardGoodsStockInfoList) // 库存列表
order.POST("/card/list", stockmanage.GameCardGoodsStockCardList) // 游戏卡列表
order.POST("/card/adds", stockmanage.GameCardGoodsStockAdds) // 游戏卡入库
order.POST("/card/dels", stockmanage.GameCardGoodsStockDels) // 游戏卡减库存
@ -24,9 +30,9 @@ func registerStockManageUnAuthRouter(v1 *gin.RouterGroup) {
order.POST("/cannibalize_task/import_goods", stockmanage.CannibalizeTaskImportGameCardGoods) //
order.POST("/cannibalize_task/deliver_goods", stockmanage.CannibalizeTaskDeliverGoods) //
order.POST("/cannibalize_task/put_in_storage", stockmanage.CannibalizeTaskPutInStorage) //
order.POST("/cannibalize_task/list", stockmanage.CannibalizeTaskList) //
order.POST("/cannibalize_task/goods_list", stockmanage.CannibalizeTaskGameCardGoodsList) //
order.POST("/cannibalize_task/del", stockmanage.CannibalizeTaskDel) //
//order.POST("/cannibalize_task/list", stockmanage.CannibalizeTaskList) // 库存调拨列表
order.POST("/cannibalize_task/goods_list", stockmanage.CannibalizeTaskGameCardGoodsList) //
order.POST("/cannibalize_task/del", stockmanage.CannibalizeTaskDel) //
//order.POST("/type", goodsmanage.GameCardTypes) // 获取游戏类型
}

View File

@ -15,6 +15,7 @@ func registerUserManageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMid
userInfo.POST("/invite_derive", usermanage.ExportDataUser)
userInfo.POST("/mark", usermanage.MarkUser)
userInfo.POST("/tel", usermanage.TelList)
userInfo.POST("/new_user_invite_record_list", usermanage.NewUserInviteRecordList)
}
}
@ -37,8 +38,6 @@ func registerUserManageUnAuthRouter(v1 *gin.RouterGroup) {
userInfo.POST("/member_record_list_export", usermanage.UserMemberRecordListExport)
userInfo.POST("/member_statistic_list", usermanage.UserMemberStatisticList)
userInfo.POST("/user_invite_record_list", usermanage.UserInviteRecordList)
userInfo.POST("/new_user_invite_record_list", usermanage.NewUserInviteRecordList)
userInfo.POST("/expire_member_sms_list", usermanage.ExpireMemberSmsSendRecordList)
}

View File

@ -5,8 +5,6 @@ settings:
# 服务器ip默认使用 0.0.0.0
# host: 192.168.1.109
host: 0.0.0.0
# 服务名称
name: mh_service
# 端口号

View File

@ -2719,6 +2719,39 @@ const docTemplate = `{
}
}
},
"/api/v1/goods/goods_list": {
"post": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"租卡系统-库存管理"
],
"summary": "查询库存游戏卡串码",
"parameters": [
{
"description": "查询库存游戏卡串码",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/models.GetGameCardGoodsListReq"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/models.GetGameCardGoodsListResp"
}
}
}
}
},
"/api/v1/group_send_message/template/list": {
"post": {
"consumes": [
@ -4021,6 +4054,39 @@ const docTemplate = `{
}
}
},
"/api/v1/mall/goods/order/list": {
"post": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"订单管理"
],
"summary": "查询商城订单列表",
"parameters": [
{
"description": "查询商城订单列表",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/models.GoodsOrderListReq"
}
}
],
"responses": {
"200": {
"description": "{\"code\": 200, \"data\": { \"total\": 4, \"pageIndex\":0, \"total_page\":10, \"list\":{} }}",
"schema": {
"$ref": "#/definitions/app.Response"
}
}
}
}
},
"/api/v1/mall/goods/user/vm_record": {
"post": {
"consumes": [
@ -4494,6 +4560,39 @@ const docTemplate = `{
}
}
},
"/api/v1/order/list": {
"post": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"租卡系统-订单管理"
],
"summary": "查询租赁订单列表",
"parameters": [
{
"description": "查询租赁订单列表",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/models.OrderListReq"
}
}
],
"responses": {
"200": {
"description": "{\"code\": 200, \"data\": { \"total\": 4, \"pageIndex\":0, \"total_page\":10, \"list\":{} }}",
"schema": {
"$ref": "#/definitions/app.Response"
}
}
}
}
},
"/api/v1/order/list_export": {
"post": {
"consumes": [
@ -4742,6 +4841,39 @@ const docTemplate = `{
}
}
},
"/api/v1/recycle_card/order/list": {
"post": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"租卡系统-订单管理"
],
"summary": "查询小程序回收订单",
"parameters": [
{
"description": "查询小程序回收订单",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/models.RecycleCardOrderListReq"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/models.RecycleCardOrderListRsp"
}
}
}
}
},
"/api/v1/role": {
"get": {
"security": [
@ -5006,6 +5138,72 @@ const docTemplate = `{
}
}
},
"/api/v1/stock/cannibalize_task/list": {
"post": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"租卡系统-库存管理"
],
"summary": "查询游戏卡库存调拨",
"parameters": [
{
"description": "查询游戏卡库存调拨",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/models.CannibalizeTaskListReq"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/models.CannibalizeTaskListResp"
}
}
}
}
},
"/api/v1/stock/list": {
"post": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"租卡系统-库存管理"
],
"summary": "查询小程序租卡库存列表",
"parameters": [
{
"description": "查询小程序租卡库存列表",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/models.GameCardGoodsStockListReq"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/models.GameCardGoodsStockListResp"
}
}
}
}
},
"/api/v1/store/add": {
"post": {
"consumes": [
@ -6401,6 +6599,90 @@ const docTemplate = `{
}
}
},
"models.CannibalizeStockTask": {
"type": "object",
"properties": {
"count": {
"description": "GameCardId uint32 ` + "`" + `json:\"game_card_id\"` + "`" + ` // 游戏卡id",
"type": "integer"
},
"createdAt": {
"description": "创建时间",
"type": "string"
},
"delivery_time": {
"type": "string"
},
"from_store_id": {
"type": "integer"
},
"from_store_name": {
"type": "string"
},
"id": {
"description": "数据库记录编号",
"type": "integer"
},
"in_storage_time": {
"type": "string"
},
"status": {
"description": "1-待填调拨卡 2-待发货 3-已发货 4-已入库",
"type": "integer"
},
"task_id": {
"description": "时间戳",
"type": "integer"
},
"to_store_id": {
"type": "integer"
},
"to_store_name": {
"type": "string"
}
}
},
"models.CannibalizeTaskListReq": {
"type": "object",
"properties": {
"pageIndex": {
"type": "integer"
},
"pageSize": {
"type": "integer"
},
"status": {
"type": "integer"
},
"store_id": {
"description": "门店id",
"type": "integer"
}
}
},
"models.CannibalizeTaskListResp": {
"type": "object",
"properties": {
"count": {
"type": "integer"
},
"list": {
"type": "array",
"items": {
"$ref": "#/definitions/models.CannibalizeStockTask"
}
},
"pageIndex": {
"type": "integer"
},
"pageSize": {
"type": "integer"
},
"total_page": {
"type": "integer"
}
}
},
"models.CashierStore": {
"type": "object",
"properties": {
@ -7719,6 +8001,10 @@ const docTemplate = `{
"models.ErpCommodityListReq": {
"type": "object",
"properties": {
"erp_barcode": {
"description": "商品条码",
"type": "string"
},
"erp_category_id": {
"description": "商品分类id",
"type": "integer"
@ -11065,6 +11351,197 @@ const docTemplate = `{
}
}
},
"models.GameCardGoods": {
"type": "object",
"properties": {
"card_type": {
"description": "-用户共享 -公共",
"type": "string"
},
"cooperative_business_id": {
"description": "合作商id",
"type": "integer"
},
"cooperative_name": {
"description": "合作商名称",
"type": "string"
},
"createdAt": {
"description": "创建时间",
"type": "string"
},
"function_state": {
"description": "1-异常 2-正常",
"type": "integer"
},
"game_card": {
"description": "游戏",
"allOf": [
{
"$ref": "#/definitions/models.GameCard"
}
]
},
"game_card_id": {
"description": "游戏卡id",
"type": "integer"
},
"id": {
"description": "数据库记录编号",
"type": "integer"
},
"provider": {
"description": "供应商",
"type": "string"
},
"serial_number": {
"description": "编号",
"type": "string"
},
"share_profit_type": {
"description": "1-非共享收益卡 2-共享收益卡",
"type": "integer"
},
"status": {
"description": "状态:1-库存中 2-在途 3-客户持有 4-调拨 5-待收回 6-已收回 7-锁定",
"type": "integer"
},
"stock_time": {
"description": "入库时间",
"type": "string"
},
"store": {
"description": "门店",
"allOf": [
{
"$ref": "#/definitions/models.Store"
}
]
},
"store_id": {
"description": "门店id",
"type": "integer"
},
"user_share_card_bill": {
"description": "StockRemovalType string ` + "`" + `json:\"stock_removal_type\"` + "`" + ` // 出库类型: card_retrieve 收回卡 card_issue_retrieve 收回卡异常",
"allOf": [
{
"$ref": "#/definitions/models.UserShareCardBill"
}
]
}
}
},
"models.GameCardGoodsStockInfo": {
"type": "object",
"properties": {
"cover_img": {
"description": "封面",
"type": "string"
},
"createdAt": {
"description": "创建时间",
"type": "string"
},
"game_card_id": {
"description": "游戏卡id",
"type": "integer"
},
"id": {
"description": "数据库记录编号",
"type": "integer"
},
"name": {
"description": "名称",
"type": "string"
},
"order_count": {
"type": "integer"
},
"price": {
"description": "价格",
"type": "integer"
},
"rent_stock": {
"description": "租借库存",
"type": "integer"
},
"store_id": {
"description": "门店id",
"type": "integer"
},
"store_stock": {
"description": "门店库存",
"type": "integer"
},
"total_stock": {
"description": "卡池-总数",
"type": "integer"
},
"user_hold_stock": {
"type": "integer"
}
}
},
"models.GameCardGoodsStockListReq": {
"type": "object",
"properties": {
"cooperative_business_id": {
"description": "合作商id",
"type": "integer"
},
"game_card_id": {
"description": "游戏卡id",
"type": "integer"
},
"game_card_name": {
"description": "游戏卡",
"type": "string"
},
"pageIndex": {
"type": "integer"
},
"pageSize": {
"type": "integer"
},
"store_id": {
"description": "门店id",
"type": "integer"
}
}
},
"models.GameCardGoodsStockListResp": {
"type": "object",
"properties": {
"card_hold_count": {
"type": "integer"
},
"card_total_count": {
"type": "integer"
},
"card_total_stock": {
"type": "integer"
},
"list": {
"type": "array",
"items": {
"$ref": "#/definitions/models.GameCardGoodsStockInfo"
}
},
"pageIndex": {
"type": "integer"
},
"pageSize": {
"type": "integer"
},
"total": {
"type": "integer"
},
"total_page": {
"type": "integer"
}
}
},
"models.GetErpPurchaseDemandReq": {
"type": "object",
"properties": {
@ -11125,6 +11602,78 @@ const docTemplate = `{
}
}
},
"models.GetGameCardGoodsListReq": {
"type": "object",
"properties": {
"game_card_id": {
"type": "integer"
},
"pageIndex": {
"type": "integer"
},
"pageSize": {
"type": "integer"
},
"serial_number": {
"description": "编号",
"type": "string"
},
"status": {
"type": "integer"
},
"store_id": {
"type": "integer"
}
}
},
"models.GetGameCardGoodsListResp": {
"type": "object",
"properties": {
"list": {
"type": "array",
"items": {
"$ref": "#/definitions/models.GameCardGoods"
}
},
"pageIndex": {
"type": "integer"
},
"total": {
"type": "integer"
},
"total_page": {
"type": "integer"
}
}
},
"models.GoodsOrderListReq": {
"type": "object",
"properties": {
"goods_id": {
"description": "商品id",
"type": "integer"
},
"order_id": {
"type": "integer"
},
"pageIndex": {
"type": "integer"
},
"pageSize": {
"type": "integer"
},
"refund_express_no": {
"description": "退货物流单号",
"type": "string"
},
"state": {
"type": "string"
},
"uid": {
"type": "integer"
}
}
},
"models.GroupSendMessageCreateTemplateListReq": {
"type": "object",
"properties": {
@ -13508,6 +14057,177 @@ const docTemplate = `{
}
}
},
"models.RecycleCardOrder": {
"type": "object",
"properties": {
"assistant_name": {
"description": "店员",
"type": "string"
},
"attribute": {
"type": "string"
},
"check_time": {
"type": "string"
},
"cooperative_business_id": {
"description": "合作商id",
"type": "integer"
},
"cooperative_name": {
"description": "合作商名称",
"type": "string"
},
"createdAt": {
"description": "创建时间",
"type": "string"
},
"depression_rate": {
"type": "integer"
},
"describe": {
"description": "描述",
"type": "string"
},
"evaluation_time": {
"type": "string"
},
"goods_id": {
"type": "integer"
},
"goods_img": {
"type": "string"
},
"goods_name": {
"type": "string"
},
"id": {
"description": "数据库记录编号",
"type": "integer"
},
"images": {
"description": "图片",
"type": "string"
},
"keyword": {
"type": "string"
},
"number": {
"description": "订单",
"type": "string"
},
"original_price": {
"description": "原价",
"type": "integer"
},
"price": {
"type": "integer"
},
"remark": {
"description": "备注",
"type": "string"
},
"retrieve_state": {
"description": "回收卡状态: 0-未完成 1-未确认 2-确认",
"type": "integer"
},
"retrieve_time": {
"description": "审核时",
"type": "string"
},
"serial_number": {
"type": "string"
},
"state": {
"description": "1-待回收 2-已完成 3-已被拒 4-已取消",
"type": "integer"
},
"store": {
"$ref": "#/definitions/models.Store"
},
"store_id": {
"type": "integer"
},
"store_name": {
"type": "string"
},
"uid": {
"type": "integer"
},
"user_info": {
"$ref": "#/definitions/models.UserInfo"
}
}
},
"models.RecycleCardOrderListReq": {
"type": "object",
"properties": {
"audit_end_time": {
"type": "string"
},
"audit_start_time": {
"type": "string"
},
"cooperative_business_id": {
"type": "integer"
},
"end_time": {
"type": "string"
},
"is_export": {
"description": "1-导出",
"type": "integer"
},
"number": {
"type": "string"
},
"pageIndex": {
"type": "integer"
},
"pageSize": {
"type": "integer"
},
"retrieve_state": {
"description": "回收卡状态: 0-未完成 1-未确认 2-确认",
"type": "integer"
},
"start_time": {
"type": "string"
},
"state": {
"type": "integer"
},
"store_id": {
"type": "integer"
},
"uid": {
"type": "integer"
}
}
},
"models.RecycleCardOrderListRsp": {
"type": "object",
"properties": {
"list": {
"type": "array",
"items": {
"$ref": "#/definitions/models.RecycleCardOrder"
}
},
"pageIndex": {
"type": "integer"
},
"pageSize": {
"type": "integer"
},
"total": {
"type": "integer"
},
"url": {
"type": "string"
}
}
},
"models.ReportAllotDetailData": {
"type": "object",
"properties": {
@ -13608,6 +14328,10 @@ const docTemplate = `{
"description": "商品名称",
"type": "string"
},
"commodity_serial_number": {
"description": "商品编号",
"type": "string"
},
"deliver_store_id": {
"description": "调出门店id",
"type": "integer"
@ -14111,6 +14835,46 @@ const docTemplate = `{
}
}
},
"models.ShareCardBillGame": {
"type": "object",
"properties": {
"bill_sn": {
"type": "string"
},
"count": {
"type": "integer"
},
"createdAt": {
"description": "创建时间",
"type": "string"
},
"game_card": {
"$ref": "#/definitions/models.GameCard"
},
"game_card_id": {
"type": "integer"
},
"id": {
"description": "数据库记录编号",
"type": "integer"
},
"share_cards": {
"type": "array",
"items": {
"$ref": "#/definitions/models.UserShareCard"
}
},
"state": {
"type": "string"
},
"uid": {
"type": "integer"
},
"user_share_card_bill_id": {
"type": "integer"
}
}
},
"models.ShopperPromotionCode": {
"type": "object",
"properties": {
@ -15521,6 +16285,160 @@ const docTemplate = `{
}
}
},
"models.UserShareCard": {
"type": "object",
"properties": {
"allot_card_goods_id": {
"description": "库存共享卡id",
"type": "integer"
},
"allot_serial_number": {
"description": "库存共享卡编号 分配收回卡 绑定新卡编号",
"type": "string"
},
"bill_sn": {
"type": "string"
},
"createdAt": {
"description": "创建时间",
"type": "string"
},
"game_card": {
"$ref": "#/definitions/models.GameCard"
},
"game_card_goods": {
"$ref": "#/definitions/models.GameCardGoods"
},
"game_card_goods_id": {
"type": "integer"
},
"game_card_id": {
"type": "integer"
},
"id": {
"description": "数据库记录编号",
"type": "integer"
},
"profit_state": {
"description": "1-未生效 2-生效",
"type": "integer"
},
"retrieve_game_card_goods_id": {
"description": "收回卡id",
"type": "integer"
},
"retrieve_serial_number": {
"description": "收卡编号",
"type": "string"
},
"serial_number": {
"description": "编号",
"type": "string"
},
"share_card_bill_game_id": {
"type": "integer"
},
"state": {
"type": "string"
},
"store_id": {
"description": "门店id",
"type": "integer"
},
"total_vm": {
"description": "累计积分",
"type": "integer"
},
"uid": {
"type": "integer"
},
"user_info": {
"$ref": "#/definitions/models.UserInfo"
},
"user_share_card": {
"$ref": "#/definitions/models.UserShareCard"
},
"user_share_card_bill_id": {
"type": "integer"
}
}
},
"models.UserShareCardBill": {
"type": "object",
"properties": {
"bill_games": {
"description": "user_share_card_bill",
"type": "array",
"items": {
"$ref": "#/definitions/models.ShareCardBillGame"
}
},
"bill_sn": {
"type": "string"
},
"createdAt": {
"description": "创建时间",
"type": "string"
},
"express_company": {
"description": "物流公司",
"type": "string"
},
"express_company_no": {
"description": "物流公司编号",
"type": "string"
},
"express_no": {
"description": "物流单号",
"type": "string"
},
"id": {
"description": "数据库记录编号",
"type": "integer"
},
"remark": {
"type": "string"
},
"retrieve_time": {
"description": "收回卡时间 申请收回",
"type": "string"
},
"send_card_time": {
"description": "递送卡时间",
"type": "string"
},
"send_card_type": {
"description": "1-送卡 2-邮寄",
"type": "integer"
},
"state": {
"type": "string"
},
"stock_removal_time": {
"description": "出库时间",
"type": "string"
},
"stock_time": {
"description": "入库时间",
"type": "string"
},
"store": {
"description": "门店",
"allOf": [
{
"$ref": "#/definitions/models.Store"
}
]
},
"store_id": {
"description": "门店id",
"type": "integer"
},
"uid": {
"type": "integer"
}
}
},
"tools.Params": {
"type": "object",
"properties": {

View File

@ -2708,6 +2708,39 @@
}
}
},
"/api/v1/goods/goods_list": {
"post": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"租卡系统-库存管理"
],
"summary": "查询库存游戏卡串码",
"parameters": [
{
"description": "查询库存游戏卡串码",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/models.GetGameCardGoodsListReq"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/models.GetGameCardGoodsListResp"
}
}
}
}
},
"/api/v1/group_send_message/template/list": {
"post": {
"consumes": [
@ -4010,6 +4043,39 @@
}
}
},
"/api/v1/mall/goods/order/list": {
"post": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"订单管理"
],
"summary": "查询商城订单列表",
"parameters": [
{
"description": "查询商城订单列表",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/models.GoodsOrderListReq"
}
}
],
"responses": {
"200": {
"description": "{\"code\": 200, \"data\": { \"total\": 4, \"pageIndex\":0, \"total_page\":10, \"list\":{} }}",
"schema": {
"$ref": "#/definitions/app.Response"
}
}
}
}
},
"/api/v1/mall/goods/user/vm_record": {
"post": {
"consumes": [
@ -4483,6 +4549,39 @@
}
}
},
"/api/v1/order/list": {
"post": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"租卡系统-订单管理"
],
"summary": "查询租赁订单列表",
"parameters": [
{
"description": "查询租赁订单列表",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/models.OrderListReq"
}
}
],
"responses": {
"200": {
"description": "{\"code\": 200, \"data\": { \"total\": 4, \"pageIndex\":0, \"total_page\":10, \"list\":{} }}",
"schema": {
"$ref": "#/definitions/app.Response"
}
}
}
}
},
"/api/v1/order/list_export": {
"post": {
"consumes": [
@ -4731,6 +4830,39 @@
}
}
},
"/api/v1/recycle_card/order/list": {
"post": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"租卡系统-订单管理"
],
"summary": "查询小程序回收订单",
"parameters": [
{
"description": "查询小程序回收订单",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/models.RecycleCardOrderListReq"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/models.RecycleCardOrderListRsp"
}
}
}
}
},
"/api/v1/role": {
"get": {
"security": [
@ -4995,6 +5127,72 @@
}
}
},
"/api/v1/stock/cannibalize_task/list": {
"post": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"租卡系统-库存管理"
],
"summary": "查询游戏卡库存调拨",
"parameters": [
{
"description": "查询游戏卡库存调拨",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/models.CannibalizeTaskListReq"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/models.CannibalizeTaskListResp"
}
}
}
}
},
"/api/v1/stock/list": {
"post": {
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"租卡系统-库存管理"
],
"summary": "查询小程序租卡库存列表",
"parameters": [
{
"description": "查询小程序租卡库存列表",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/models.GameCardGoodsStockListReq"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/models.GameCardGoodsStockListResp"
}
}
}
}
},
"/api/v1/store/add": {
"post": {
"consumes": [
@ -6390,6 +6588,90 @@
}
}
},
"models.CannibalizeStockTask": {
"type": "object",
"properties": {
"count": {
"description": "GameCardId uint32 `json:\"game_card_id\"` // 游戏卡id",
"type": "integer"
},
"createdAt": {
"description": "创建时间",
"type": "string"
},
"delivery_time": {
"type": "string"
},
"from_store_id": {
"type": "integer"
},
"from_store_name": {
"type": "string"
},
"id": {
"description": "数据库记录编号",
"type": "integer"
},
"in_storage_time": {
"type": "string"
},
"status": {
"description": "1-待填调拨卡 2-待发货 3-已发货 4-已入库",
"type": "integer"
},
"task_id": {
"description": "时间戳",
"type": "integer"
},
"to_store_id": {
"type": "integer"
},
"to_store_name": {
"type": "string"
}
}
},
"models.CannibalizeTaskListReq": {
"type": "object",
"properties": {
"pageIndex": {
"type": "integer"
},
"pageSize": {
"type": "integer"
},
"status": {
"type": "integer"
},
"store_id": {
"description": "门店id",
"type": "integer"
}
}
},
"models.CannibalizeTaskListResp": {
"type": "object",
"properties": {
"count": {
"type": "integer"
},
"list": {
"type": "array",
"items": {
"$ref": "#/definitions/models.CannibalizeStockTask"
}
},
"pageIndex": {
"type": "integer"
},
"pageSize": {
"type": "integer"
},
"total_page": {
"type": "integer"
}
}
},
"models.CashierStore": {
"type": "object",
"properties": {
@ -7708,6 +7990,10 @@
"models.ErpCommodityListReq": {
"type": "object",
"properties": {
"erp_barcode": {
"description": "商品条码",
"type": "string"
},
"erp_category_id": {
"description": "商品分类id",
"type": "integer"
@ -11054,6 +11340,197 @@
}
}
},
"models.GameCardGoods": {
"type": "object",
"properties": {
"card_type": {
"description": "-用户共享 -公共",
"type": "string"
},
"cooperative_business_id": {
"description": "合作商id",
"type": "integer"
},
"cooperative_name": {
"description": "合作商名称",
"type": "string"
},
"createdAt": {
"description": "创建时间",
"type": "string"
},
"function_state": {
"description": "1-异常 2-正常",
"type": "integer"
},
"game_card": {
"description": "游戏",
"allOf": [
{
"$ref": "#/definitions/models.GameCard"
}
]
},
"game_card_id": {
"description": "游戏卡id",
"type": "integer"
},
"id": {
"description": "数据库记录编号",
"type": "integer"
},
"provider": {
"description": "供应商",
"type": "string"
},
"serial_number": {
"description": "编号",
"type": "string"
},
"share_profit_type": {
"description": "1-非共享收益卡 2-共享收益卡",
"type": "integer"
},
"status": {
"description": "状态:1-库存中 2-在途 3-客户持有 4-调拨 5-待收回 6-已收回 7-锁定",
"type": "integer"
},
"stock_time": {
"description": "入库时间",
"type": "string"
},
"store": {
"description": "门店",
"allOf": [
{
"$ref": "#/definitions/models.Store"
}
]
},
"store_id": {
"description": "门店id",
"type": "integer"
},
"user_share_card_bill": {
"description": "StockRemovalType string `json:\"stock_removal_type\"` // 出库类型: card_retrieve 收回卡 card_issue_retrieve 收回卡异常",
"allOf": [
{
"$ref": "#/definitions/models.UserShareCardBill"
}
]
}
}
},
"models.GameCardGoodsStockInfo": {
"type": "object",
"properties": {
"cover_img": {
"description": "封面",
"type": "string"
},
"createdAt": {
"description": "创建时间",
"type": "string"
},
"game_card_id": {
"description": "游戏卡id",
"type": "integer"
},
"id": {
"description": "数据库记录编号",
"type": "integer"
},
"name": {
"description": "名称",
"type": "string"
},
"order_count": {
"type": "integer"
},
"price": {
"description": "价格",
"type": "integer"
},
"rent_stock": {
"description": "租借库存",
"type": "integer"
},
"store_id": {
"description": "门店id",
"type": "integer"
},
"store_stock": {
"description": "门店库存",
"type": "integer"
},
"total_stock": {
"description": "卡池-总数",
"type": "integer"
},
"user_hold_stock": {
"type": "integer"
}
}
},
"models.GameCardGoodsStockListReq": {
"type": "object",
"properties": {
"cooperative_business_id": {
"description": "合作商id",
"type": "integer"
},
"game_card_id": {
"description": "游戏卡id",
"type": "integer"
},
"game_card_name": {
"description": "游戏卡",
"type": "string"
},
"pageIndex": {
"type": "integer"
},
"pageSize": {
"type": "integer"
},
"store_id": {
"description": "门店id",
"type": "integer"
}
}
},
"models.GameCardGoodsStockListResp": {
"type": "object",
"properties": {
"card_hold_count": {
"type": "integer"
},
"card_total_count": {
"type": "integer"
},
"card_total_stock": {
"type": "integer"
},
"list": {
"type": "array",
"items": {
"$ref": "#/definitions/models.GameCardGoodsStockInfo"
}
},
"pageIndex": {
"type": "integer"
},
"pageSize": {
"type": "integer"
},
"total": {
"type": "integer"
},
"total_page": {
"type": "integer"
}
}
},
"models.GetErpPurchaseDemandReq": {
"type": "object",
"properties": {
@ -11114,6 +11591,78 @@
}
}
},
"models.GetGameCardGoodsListReq": {
"type": "object",
"properties": {
"game_card_id": {
"type": "integer"
},
"pageIndex": {
"type": "integer"
},
"pageSize": {
"type": "integer"
},
"serial_number": {
"description": "编号",
"type": "string"
},
"status": {
"type": "integer"
},
"store_id": {
"type": "integer"
}
}
},
"models.GetGameCardGoodsListResp": {
"type": "object",
"properties": {
"list": {
"type": "array",
"items": {
"$ref": "#/definitions/models.GameCardGoods"
}
},
"pageIndex": {
"type": "integer"
},
"total": {
"type": "integer"
},
"total_page": {
"type": "integer"
}
}
},
"models.GoodsOrderListReq": {
"type": "object",
"properties": {
"goods_id": {
"description": "商品id",
"type": "integer"
},
"order_id": {
"type": "integer"
},
"pageIndex": {
"type": "integer"
},
"pageSize": {
"type": "integer"
},
"refund_express_no": {
"description": "退货物流单号",
"type": "string"
},
"state": {
"type": "string"
},
"uid": {
"type": "integer"
}
}
},
"models.GroupSendMessageCreateTemplateListReq": {
"type": "object",
"properties": {
@ -13497,6 +14046,177 @@
}
}
},
"models.RecycleCardOrder": {
"type": "object",
"properties": {
"assistant_name": {
"description": "店员",
"type": "string"
},
"attribute": {
"type": "string"
},
"check_time": {
"type": "string"
},
"cooperative_business_id": {
"description": "合作商id",
"type": "integer"
},
"cooperative_name": {
"description": "合作商名称",
"type": "string"
},
"createdAt": {
"description": "创建时间",
"type": "string"
},
"depression_rate": {
"type": "integer"
},
"describe": {
"description": "描述",
"type": "string"
},
"evaluation_time": {
"type": "string"
},
"goods_id": {
"type": "integer"
},
"goods_img": {
"type": "string"
},
"goods_name": {
"type": "string"
},
"id": {
"description": "数据库记录编号",
"type": "integer"
},
"images": {
"description": "图片",
"type": "string"
},
"keyword": {
"type": "string"
},
"number": {
"description": "订单",
"type": "string"
},
"original_price": {
"description": "原价",
"type": "integer"
},
"price": {
"type": "integer"
},
"remark": {
"description": "备注",
"type": "string"
},
"retrieve_state": {
"description": "回收卡状态: 0-未完成 1-未确认 2-确认",
"type": "integer"
},
"retrieve_time": {
"description": "审核时",
"type": "string"
},
"serial_number": {
"type": "string"
},
"state": {
"description": "1-待回收 2-已完成 3-已被拒 4-已取消",
"type": "integer"
},
"store": {
"$ref": "#/definitions/models.Store"
},
"store_id": {
"type": "integer"
},
"store_name": {
"type": "string"
},
"uid": {
"type": "integer"
},
"user_info": {
"$ref": "#/definitions/models.UserInfo"
}
}
},
"models.RecycleCardOrderListReq": {
"type": "object",
"properties": {
"audit_end_time": {
"type": "string"
},
"audit_start_time": {
"type": "string"
},
"cooperative_business_id": {
"type": "integer"
},
"end_time": {
"type": "string"
},
"is_export": {
"description": "1-导出",
"type": "integer"
},
"number": {
"type": "string"
},
"pageIndex": {
"type": "integer"
},
"pageSize": {
"type": "integer"
},
"retrieve_state": {
"description": "回收卡状态: 0-未完成 1-未确认 2-确认",
"type": "integer"
},
"start_time": {
"type": "string"
},
"state": {
"type": "integer"
},
"store_id": {
"type": "integer"
},
"uid": {
"type": "integer"
}
}
},
"models.RecycleCardOrderListRsp": {
"type": "object",
"properties": {
"list": {
"type": "array",
"items": {
"$ref": "#/definitions/models.RecycleCardOrder"
}
},
"pageIndex": {
"type": "integer"
},
"pageSize": {
"type": "integer"
},
"total": {
"type": "integer"
},
"url": {
"type": "string"
}
}
},
"models.ReportAllotDetailData": {
"type": "object",
"properties": {
@ -13597,6 +14317,10 @@
"description": "商品名称",
"type": "string"
},
"commodity_serial_number": {
"description": "商品编号",
"type": "string"
},
"deliver_store_id": {
"description": "调出门店id",
"type": "integer"
@ -14100,6 +14824,46 @@
}
}
},
"models.ShareCardBillGame": {
"type": "object",
"properties": {
"bill_sn": {
"type": "string"
},
"count": {
"type": "integer"
},
"createdAt": {
"description": "创建时间",
"type": "string"
},
"game_card": {
"$ref": "#/definitions/models.GameCard"
},
"game_card_id": {
"type": "integer"
},
"id": {
"description": "数据库记录编号",
"type": "integer"
},
"share_cards": {
"type": "array",
"items": {
"$ref": "#/definitions/models.UserShareCard"
}
},
"state": {
"type": "string"
},
"uid": {
"type": "integer"
},
"user_share_card_bill_id": {
"type": "integer"
}
}
},
"models.ShopperPromotionCode": {
"type": "object",
"properties": {
@ -15510,6 +16274,160 @@
}
}
},
"models.UserShareCard": {
"type": "object",
"properties": {
"allot_card_goods_id": {
"description": "库存共享卡id",
"type": "integer"
},
"allot_serial_number": {
"description": "库存共享卡编号 分配收回卡 绑定新卡编号",
"type": "string"
},
"bill_sn": {
"type": "string"
},
"createdAt": {
"description": "创建时间",
"type": "string"
},
"game_card": {
"$ref": "#/definitions/models.GameCard"
},
"game_card_goods": {
"$ref": "#/definitions/models.GameCardGoods"
},
"game_card_goods_id": {
"type": "integer"
},
"game_card_id": {
"type": "integer"
},
"id": {
"description": "数据库记录编号",
"type": "integer"
},
"profit_state": {
"description": "1-未生效 2-生效",
"type": "integer"
},
"retrieve_game_card_goods_id": {
"description": "收回卡id",
"type": "integer"
},
"retrieve_serial_number": {
"description": "收卡编号",
"type": "string"
},
"serial_number": {
"description": "编号",
"type": "string"
},
"share_card_bill_game_id": {
"type": "integer"
},
"state": {
"type": "string"
},
"store_id": {
"description": "门店id",
"type": "integer"
},
"total_vm": {
"description": "累计积分",
"type": "integer"
},
"uid": {
"type": "integer"
},
"user_info": {
"$ref": "#/definitions/models.UserInfo"
},
"user_share_card": {
"$ref": "#/definitions/models.UserShareCard"
},
"user_share_card_bill_id": {
"type": "integer"
}
}
},
"models.UserShareCardBill": {
"type": "object",
"properties": {
"bill_games": {
"description": "user_share_card_bill",
"type": "array",
"items": {
"$ref": "#/definitions/models.ShareCardBillGame"
}
},
"bill_sn": {
"type": "string"
},
"createdAt": {
"description": "创建时间",
"type": "string"
},
"express_company": {
"description": "物流公司",
"type": "string"
},
"express_company_no": {
"description": "物流公司编号",
"type": "string"
},
"express_no": {
"description": "物流单号",
"type": "string"
},
"id": {
"description": "数据库记录编号",
"type": "integer"
},
"remark": {
"type": "string"
},
"retrieve_time": {
"description": "收回卡时间 申请收回",
"type": "string"
},
"send_card_time": {
"description": "递送卡时间",
"type": "string"
},
"send_card_type": {
"description": "1-送卡 2-邮寄",
"type": "integer"
},
"state": {
"type": "string"
},
"stock_removal_time": {
"description": "出库时间",
"type": "string"
},
"stock_time": {
"description": "入库时间",
"type": "string"
},
"store": {
"description": "门店",
"allOf": [
{
"$ref": "#/definitions/models.Store"
}
]
},
"store_id": {
"description": "门店id",
"type": "integer"
},
"uid": {
"type": "integer"
}
}
},
"tools.Params": {
"type": "object",
"properties": {

View File

@ -363,6 +363,63 @@ definitions:
required:
- print_list_info
type: object
models.CannibalizeStockTask:
properties:
count:
description: GameCardId uint32 `json:"game_card_id"` // 游戏卡id
type: integer
createdAt:
description: 创建时间
type: string
delivery_time:
type: string
from_store_id:
type: integer
from_store_name:
type: string
id:
description: 数据库记录编号
type: integer
in_storage_time:
type: string
status:
description: 1-待填调拨卡 2-待发货 3-已发货 4-已入库
type: integer
task_id:
description: 时间戳
type: integer
to_store_id:
type: integer
to_store_name:
type: string
type: object
models.CannibalizeTaskListReq:
properties:
pageIndex:
type: integer
pageSize:
type: integer
status:
type: integer
store_id:
description: 门店id
type: integer
type: object
models.CannibalizeTaskListResp:
properties:
count:
type: integer
list:
items:
$ref: '#/definitions/models.CannibalizeStockTask'
type: array
pageIndex:
type: integer
pageSize:
type: integer
total_page:
type: integer
type: object
models.CashierStore:
properties:
store_id:
@ -1324,6 +1381,9 @@ definitions:
type: object
models.ErpCommodityListReq:
properties:
erp_barcode:
description: 商品条码
type: string
erp_category_id:
description: 商品分类id
type: integer
@ -3768,6 +3828,138 @@ definitions:
description: 查看人数
type: integer
type: object
models.GameCardGoods:
properties:
card_type:
description: -用户共享 -公共
type: string
cooperative_business_id:
description: 合作商id
type: integer
cooperative_name:
description: 合作商名称
type: string
createdAt:
description: 创建时间
type: string
function_state:
description: 1-异常 2-正常
type: integer
game_card:
allOf:
- $ref: '#/definitions/models.GameCard'
description: 游戏
game_card_id:
description: 游戏卡id
type: integer
id:
description: 数据库记录编号
type: integer
provider:
description: 供应商
type: string
serial_number:
description: 编号
type: string
share_profit_type:
description: 1-非共享收益卡 2-共享收益卡
type: integer
status:
description: 状态:1-库存中 2-在途 3-客户持有 4-调拨 5-待收回 6-已收回 7-锁定
type: integer
stock_time:
description: 入库时间
type: string
store:
allOf:
- $ref: '#/definitions/models.Store'
description: 门店
store_id:
description: 门店id
type: integer
user_share_card_bill:
allOf:
- $ref: '#/definitions/models.UserShareCardBill'
description: 'StockRemovalType string `json:"stock_removal_type"`
// 出库类型: card_retrieve 收回卡 card_issue_retrieve 收回卡异常'
type: object
models.GameCardGoodsStockInfo:
properties:
cover_img:
description: 封面
type: string
createdAt:
description: 创建时间
type: string
game_card_id:
description: 游戏卡id
type: integer
id:
description: 数据库记录编号
type: integer
name:
description: 名称
type: string
order_count:
type: integer
price:
description: 价格
type: integer
rent_stock:
description: 租借库存
type: integer
store_id:
description: 门店id
type: integer
store_stock:
description: 门店库存
type: integer
total_stock:
description: 卡池-总数
type: integer
user_hold_stock:
type: integer
type: object
models.GameCardGoodsStockListReq:
properties:
cooperative_business_id:
description: 合作商id
type: integer
game_card_id:
description: 游戏卡id
type: integer
game_card_name:
description: 游戏卡
type: string
pageIndex:
type: integer
pageSize:
type: integer
store_id:
description: 门店id
type: integer
type: object
models.GameCardGoodsStockListResp:
properties:
card_hold_count:
type: integer
card_total_count:
type: integer
card_total_stock:
type: integer
list:
items:
$ref: '#/definitions/models.GameCardGoodsStockInfo'
type: array
pageIndex:
type: integer
pageSize:
type: integer
total:
type: integer
total_page:
type: integer
type: object
models.GetErpPurchaseDemandReq:
properties:
erp_category_id:
@ -3811,6 +4003,54 @@ definitions:
description: 数据总条数
type: integer
type: object
models.GetGameCardGoodsListReq:
properties:
game_card_id:
type: integer
pageIndex:
type: integer
pageSize:
type: integer
serial_number:
description: 编号
type: string
status:
type: integer
store_id:
type: integer
type: object
models.GetGameCardGoodsListResp:
properties:
list:
items:
$ref: '#/definitions/models.GameCardGoods'
type: array
pageIndex:
type: integer
total:
type: integer
total_page:
type: integer
type: object
models.GoodsOrderListReq:
properties:
goods_id:
description: 商品id
type: integer
order_id:
type: integer
pageIndex:
type: integer
pageSize:
type: integer
refund_express_no:
description: 退货物流单号
type: string
state:
type: string
uid:
type: integer
type: object
models.GroupSendMessageCreateTemplateListReq:
properties:
pageIndex:
@ -5522,6 +5762,124 @@ definitions:
description: 每页展示条数
type: integer
type: object
models.RecycleCardOrder:
properties:
assistant_name:
description: 店员
type: string
attribute:
type: string
check_time:
type: string
cooperative_business_id:
description: 合作商id
type: integer
cooperative_name:
description: 合作商名称
type: string
createdAt:
description: 创建时间
type: string
depression_rate:
type: integer
describe:
description: 描述
type: string
evaluation_time:
type: string
goods_id:
type: integer
goods_img:
type: string
goods_name:
type: string
id:
description: 数据库记录编号
type: integer
images:
description: 图片
type: string
keyword:
type: string
number:
description: 订单
type: string
original_price:
description: 原价
type: integer
price:
type: integer
remark:
description: 备注
type: string
retrieve_state:
description: '回收卡状态: 0-未完成 1-未确认 2-确认'
type: integer
retrieve_time:
description: 审核时
type: string
serial_number:
type: string
state:
description: 1-待回收 2-已完成 3-已被拒 4-已取消
type: integer
store:
$ref: '#/definitions/models.Store'
store_id:
type: integer
store_name:
type: string
uid:
type: integer
user_info:
$ref: '#/definitions/models.UserInfo'
type: object
models.RecycleCardOrderListReq:
properties:
audit_end_time:
type: string
audit_start_time:
type: string
cooperative_business_id:
type: integer
end_time:
type: string
is_export:
description: 1-导出
type: integer
number:
type: string
pageIndex:
type: integer
pageSize:
type: integer
retrieve_state:
description: '回收卡状态: 0-未完成 1-未确认 2-确认'
type: integer
start_time:
type: string
state:
type: integer
store_id:
type: integer
uid:
type: integer
type: object
models.RecycleCardOrderListRsp:
properties:
list:
items:
$ref: '#/definitions/models.RecycleCardOrder'
type: array
pageIndex:
type: integer
pageSize:
type: integer
total:
type: integer
url:
type: string
type: object
models.ReportAllotDetailData:
properties:
audit_time:
@ -5596,6 +5954,9 @@ definitions:
commodity_name:
description: 商品名称
type: string
commodity_serial_number:
description: 商品编号
type: string
deliver_store_id:
description: 调出门店id
type: integer
@ -5967,6 +6328,33 @@ definitions:
description: 门店名称
type: string
type: object
models.ShareCardBillGame:
properties:
bill_sn:
type: string
count:
type: integer
createdAt:
description: 创建时间
type: string
game_card:
$ref: '#/definitions/models.GameCard'
game_card_id:
type: integer
id:
description: 数据库记录编号
type: integer
share_cards:
items:
$ref: '#/definitions/models.UserShareCard'
type: array
state:
type: string
uid:
type: integer
user_share_card_bill_id:
type: integer
type: object
models.ShopperPromotionCode:
properties:
code:
@ -6989,6 +7377,114 @@ definitions:
description: 总条数
type: integer
type: object
models.UserShareCard:
properties:
allot_card_goods_id:
description: 库存共享卡id
type: integer
allot_serial_number:
description: 库存共享卡编号 分配收回卡 绑定新卡编号
type: string
bill_sn:
type: string
createdAt:
description: 创建时间
type: string
game_card:
$ref: '#/definitions/models.GameCard'
game_card_goods:
$ref: '#/definitions/models.GameCardGoods'
game_card_goods_id:
type: integer
game_card_id:
type: integer
id:
description: 数据库记录编号
type: integer
profit_state:
description: 1-未生效 2-生效
type: integer
retrieve_game_card_goods_id:
description: 收回卡id
type: integer
retrieve_serial_number:
description: 收卡编号
type: string
serial_number:
description: 编号
type: string
share_card_bill_game_id:
type: integer
state:
type: string
store_id:
description: 门店id
type: integer
total_vm:
description: 累计积分
type: integer
uid:
type: integer
user_info:
$ref: '#/definitions/models.UserInfo'
user_share_card:
$ref: '#/definitions/models.UserShareCard'
user_share_card_bill_id:
type: integer
type: object
models.UserShareCardBill:
properties:
bill_games:
description: user_share_card_bill
items:
$ref: '#/definitions/models.ShareCardBillGame'
type: array
bill_sn:
type: string
createdAt:
description: 创建时间
type: string
express_company:
description: 物流公司
type: string
express_company_no:
description: 物流公司编号
type: string
express_no:
description: 物流单号
type: string
id:
description: 数据库记录编号
type: integer
remark:
type: string
retrieve_time:
description: 收回卡时间 申请收回
type: string
send_card_time:
description: 递送卡时间
type: string
send_card_type:
description: 1-送卡 2-邮寄
type: integer
state:
type: string
stock_removal_time:
description: 出库时间
type: string
stock_time:
description: 入库时间
type: string
store:
allOf:
- $ref: '#/definitions/models.Store'
description: 门店
store_id:
description: 门店id
type: integer
uid:
type: integer
type: object
tools.Params:
properties:
treeCode:
@ -8889,6 +9385,27 @@ paths:
tags:
- 采购管理
- V1.3.0
/api/v1/goods/goods_list:
post:
consumes:
- application/json
parameters:
- description: 查询库存游戏卡串码
in: body
name: request
required: true
schema:
$ref: '#/definitions/models.GetGameCardGoodsListReq'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/models.GetGameCardGoodsListResp'
summary: 查询库存游戏卡串码
tags:
- 租卡系统-库存管理
/api/v1/group_send_message/template/list:
post:
consumes:
@ -9716,6 +10233,28 @@ paths:
summary: 登录日志列表
tags:
- system/日志
/api/v1/mall/goods/order/list:
post:
consumes:
- application/json
parameters:
- description: 查询商城订单列表
in: body
name: request
required: true
schema:
$ref: '#/definitions/models.GoodsOrderListReq'
produces:
- application/json
responses:
"200":
description: '{"code": 200, "data": { "total": 4, "pageIndex":0, "total_page":10,
"list":{} }}'
schema:
$ref: '#/definitions/app.Response'
summary: 查询商城订单列表
tags:
- 订单管理
/api/v1/mall/goods/user/vm_record:
post:
consumes:
@ -10014,6 +10553,28 @@ paths:
summary: 操作日志列表update
tags:
- system/日志
/api/v1/order/list:
post:
consumes:
- application/json
parameters:
- description: 查询租赁订单列表
in: body
name: request
required: true
schema:
$ref: '#/definitions/models.OrderListReq'
produces:
- application/json
responses:
"200":
description: '{"code": 200, "data": { "total": 4, "pageIndex":0, "total_page":10,
"list":{} }}'
schema:
$ref: '#/definitions/app.Response'
summary: 查询租赁订单列表
tags:
- 租卡系统-订单管理
/api/v1/order/list_export:
post:
consumes:
@ -10171,6 +10732,27 @@ paths:
summary: 上传图片
tags:
- system/公共接口
/api/v1/recycle_card/order/list:
post:
consumes:
- application/json
parameters:
- description: 查询小程序回收订单
in: body
name: request
required: true
schema:
$ref: '#/definitions/models.RecycleCardOrderListReq'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/models.RecycleCardOrderListRsp'
summary: 查询小程序回收订单
tags:
- 租卡系统-订单管理
/api/v1/role:
get:
description: 获取JSON
@ -10339,6 +10921,48 @@ paths:
summary: 系统信息
tags:
- system/系统信息
/api/v1/stock/cannibalize_task/list:
post:
consumes:
- application/json
parameters:
- description: 查询游戏卡库存调拨
in: body
name: request
required: true
schema:
$ref: '#/definitions/models.CannibalizeTaskListReq'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/models.CannibalizeTaskListResp'
summary: 查询游戏卡库存调拨
tags:
- 租卡系统-库存管理
/api/v1/stock/list:
post:
consumes:
- application/json
parameters:
- description: 查询小程序租卡库存列表
in: body
name: request
required: true
schema:
$ref: '#/definitions/models.GameCardGoodsStockListReq'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/models.GameCardGoodsStockListResp'
summary: 查询小程序租卡库存列表
tags:
- 租卡系统-库存管理
/api/v1/store/add:
post:
consumes:

View File

@ -80,7 +80,7 @@ func SetGameCardStock() {
//var userHoldCount int64
//err = DBTest.Table("order").Where("game_card_id", cardStocks[i].GameCardId).
// Where("store_id", cardStocks[i].StoreId).Where("card_status in (?)", 2, 3).Count(&userHoldCount).Error
// Where("store_id", cardStocks[i].StoreId).Where("card_status in (?)", 2, 3).Total(&userHoldCount).Error
//if err != nil {
// fmt.Println("err:", err)
//}