Переглянути джерело

Merge remote-tracking branch 'origin/master'

master
DengBiao 8 місяці тому
джерело
коміт
9b133cbdcc
15 змінених файлів з 885 додано та 22 видалено
  1. +35
    -0
      app/admin/hdl/order/hdl_order_list.go
  2. +13
    -0
      app/admin/hdl/order/hdl_order_pay.go
  3. +12
    -11
      app/admin/md/good_list_resp.go
  4. +21
    -0
      app/admin/md/goods_pay.go
  5. +6
    -0
      app/admin/md/md_goods_list.go
  6. +19
    -0
      app/admin/svc/goods/svc_goods_list.go
  7. +484
    -0
      app/admin/svc/order/svc_order_list.go
  8. +118
    -0
      app/admin/svc/order/svc_order_pay.go
  9. +24
    -2
      app/db/db_goods_list.go
  10. +78
    -0
      app/db/db_order_list.go
  11. +22
    -0
      app/db/db_sku.go
  12. +17
    -0
      app/db/model/order.go
  13. +14
    -0
      app/db/model/order_goods.go
  14. +19
    -1
      app/router/admin_router.go
  15. +3
    -8
      go.mod

+ 35
- 0
app/admin/hdl/order/hdl_order_list.go Переглянути файл

@@ -0,0 +1,35 @@
package order

import (
"applet/app/admin/svc/order"
"github.com/gin-gonic/gin"
)

func OrderList(c *gin.Context) {
order.OrderList(c)
}

func OrderTotal(c *gin.Context) {
order.OrderTotal(c)
}

func OrderCancel(c *gin.Context) {
order.OrderCancel(c)
}

func OrderDetail(c *gin.Context) {
order.OrderDetail(c)
}

func OrderOutput(c *gin.Context) {
order.OrderOutput(c)
}
func OrderEdit(c *gin.Context) {
order.OrderEdit(c)
}
func OrderEditNum(c *gin.Context) {
order.OrderEditNum(c)
}
func OrderDel(c *gin.Context) {
order.OrderDel(c)
}

+ 13
- 0
app/admin/hdl/order/hdl_order_pay.go Переглянути файл

@@ -0,0 +1,13 @@
package order

import (
"applet/app/admin/svc/order"
"github.com/gin-gonic/gin"
)

func GoodsPayCalcAmount(c *gin.Context) {
order.GoodsPayCalcAmount(c)
}
func GoodsPayCreate(c *gin.Context) {
order.GoodsPayCreate(c)
}

+ 12
- 11
app/admin/md/good_list_resp.go Переглянути файл

@@ -3,15 +3,16 @@ package md
import "applet/app/db/model"

type MallGoodListResp struct {
GoodsId string `json:"id"` // 商品id
Price string `json:"price"`
CreateAt string `json:"create_at"`
UpdateAt string `json:"update_at"`
SkuList []model.Sku `json:"skuList"`
Title string `json:"title"`
Image string `json:"image"`
SaleStateText string `json:"state_text"`
SaleState int `json:"sale_state"`
CategoryId string `json:"category_id"`
Sales int `json:"sales"`
GoodsId string `json:"id"` // 商品id
Price string `json:"price"`
CreateAt string `json:"create_at"`
UpdateAt string `json:"update_at"`
SkuList []model.Sku `json:"skuList"`
Title string `json:"title"`
Image string `json:"image"`
SaleStateText string `json:"state_text"`
SaleState int `json:"sale_state"`
CategoryId string `json:"category_id"`
Sales int `json:"sales"`
Spe []map[string]interface{} `json:"spe"`
}

+ 21
- 0
app/admin/md/goods_pay.go Переглянути файл

@@ -0,0 +1,21 @@
package md

type GoodsPayParam struct {
GoodsInfo []GoodsInfo `json:"goods_info"`
EnterpriseId string `json:"enterprise_id"`
BuyInfo BuyInfo `json:"buy_info"`
}
type BuyInfo struct {
Name string `json:"name"`
Phone string `json:"phone"`
Date string `json:"date"`
Time string `json:"time"`
Address string `json:"address"`
}
type GoodsInfo struct {
GoodsId string `json:"goods_id"`
SkuId string `json:"sku_id"`
SkuCode string `json:"sku_code"`
Num string `json:"num"`
GoodsTitle string `json:"goods_title"`
}

+ 6
- 0
app/admin/md/md_goods_list.go Переглянути файл

@@ -22,6 +22,8 @@ type MallGoodsListReq struct {
PageSize string `json:"pageSize"`
OrderBy string `json:"order_by"`
OrderBySate string `json:"order_by_sate"`
StartPrice string `json:"start_price"`
EndPrice string `json:"end_price"`
}

type GoodsRangeData struct {
@@ -50,3 +52,7 @@ type GoodListResp struct {
Image string `json:"image"`
State string `json:"state"`
}
type Sku struct {
Name string `json:"name"`
Value string `json:"value"`
}

+ 19
- 0
app/admin/svc/goods/svc_goods_list.go Переглянути файл

@@ -65,6 +65,25 @@ func GetMallGoodsList(c *gin.Context, req *md.MallGoodsListReq) (interface{}, in
}
// 获取价格、库存、重量范围、利润空间
goods.Price = item["price"]
// spe
var spe []map[string]interface{}
var speTmp []map[string]interface{}
utils.Unserialize([]byte(item["spe"]), &spe)
for _, itemSpe := range spe {
tmp := make(map[string]interface{})
tmp["type"] = "text"
tmp["name"] = itemSpe["name"]
subTmp := make([]map[string]interface{}, 0)
for i, v := range itemSpe["values"].([]interface{}) {
subTmp = append(subTmp, map[string]interface{}{
"key": i,
"name": v,
})
}
tmp["values"] = subTmp
speTmp = append(speTmp, tmp)
}
goods.Spe = speTmp
goodsListResp = append(goodsListResp, goods)
}



+ 484
- 0
app/admin/svc/order/svc_order_list.go Переглянути файл

@@ -0,0 +1,484 @@
package order

import (
"applet/app/admin/md"
"applet/app/db"
"applet/app/db/model"
"applet/app/e"
"applet/app/svc"
"applet/app/utils"
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
"github.com/tidwall/gjson"
)

func OrderList(c *gin.Context) {
var args map[string]string
if err := c.ShouldBindJSON(&args); err != nil {
e.OutErr(c, e.ERR_INVALID_ARGS, err)
return
}
eg := db.Db
list, total := db.GetOrderList(eg, args)
data := make([]map[string]string, 0)
if list != nil {
stateArr := []string{"待制作", "制作中", "烘焙中", "分拣中", "已完成", "已取消"}
enterpriseIds := make([]int, 0)
for _, v := range *list {
enterpriseIds = append(enterpriseIds, v.EnterpriseId)
}
enterpriseMap := make(map[int]model.Enterprise)
if len(enterpriseIds) > 0 {
enterpriseData := make([]model.Enterprise, 0)
eg.In("id", enterpriseIds).Find(&enterpriseData)
for _, v := range enterpriseData {
enterpriseMap[v.Id] = v
}
}
for _, v := range *list {
v1 := JudgePackageOrdOrdState(&v)
isCanCancel := "1"
if v1.State > 0 {
isCanCancel = "0"
}
enterpriseName := ""
_, ok := enterpriseMap[v.EnterpriseId]
if ok {
enterpriseName = enterpriseMap[v.EnterpriseId].Name
}
var tmp = map[string]string{
"buy_phone": v1.BuyPhone,
"oid": utils.Int64ToStr(v1.Oid),
"id": utils.IntToStr(v1.Id),
"amount": v1.Amount,
"state_str": stateArr[v1.State],
"state": utils.IntToStr(v1.State),
"time": gjson.Get(v1.BuyInfo, "time").String(),
"date": gjson.Get(v1.BuyInfo, "date").String(),
"create_at": v1.CreateAt.Format("2006-01-02 15:04:05"),
"is_can_cancel": isCanCancel,
"enterprise_name": enterpriseName,
}
data = append(data, tmp)
}
}
state := []map[string]string{
{"name": "待制作", "value": "0"},
{"name": "制作中", "value": "1"},
{"name": "烘焙中", "value": "2"},
{"name": "分拣中", "value": "3"},
{"name": "已完成", "value": "4"},
{"name": "已取消", "value": "5"},
}
res := map[string]interface{}{
"total": total,
"list": data,
"state": state,
}
e.OutSuc(c, res, nil)
return
}

// JudgePackageOrdOrdState 判断订单状态
func JudgePackageOrdOrdState(ord *model.Order) *model.Order {
if ord.State == 5 {
return ord
}
var ordState, oldOrdState int
oldOrdState = ord.State
ordState = oldOrdState
//全部订单
countAll, err := db.Db.Where("oid =?", ord.Oid).Count(&model.OrderGoods{})
if err != nil {
return ord
}
//1、判断是否有 `制作中` 有一个就是制作中
count1, err := db.Db.Where("oid =?", ord.Oid).And("state =?", 1).Count(&model.OrderGoods{})
if err != nil {
return ord
}
if count1 > 0 {
ordState = 1
}
//3、判断是否有 `烘焙中` 要全部制作完成
count2, err := db.Db.Where("oid =?", ord.Oid).And("state =?", 2).Count(&model.OrderGoods{})
if err != nil {
return ord
}
if count2 > 0 && count2 == countAll {
ordState = 2
}
//3、判断是否有 `分拣中` 要全部烘焙完成
count3, err := db.Db.Where("oid =?", ord.Oid).And("state =?", 3).Count(&model.OrderGoods{})
if err != nil {
return ord
}
if count3 > 0 && count3 == countAll {
ordState = 3
}
//4、判断是否有 `已完成` 要全部已完成
count4, err := db.Db.Where("oid =?", ord.Oid).And("state =?", 4).Count(&model.OrderGoods{})
if err != nil {
return ord
}
if count4 > 0 && count4 == countAll {
ordState = 4
}
if ordState != oldOrdState {
ord.State = ordState
_, err2 := db.Db.Where("oid=?", ord.Oid).Cols("state").Update(&ord)
if err2 != nil {
return ord
}
}
return ord
}
func OrderTotal(c *gin.Context) {
var args map[string]string
if err := c.ShouldBindJSON(&args); err != nil {
e.OutErr(c, e.ERR_INVALID_ARGS, err)
return
}
eg := db.Db
where := "1=1"

if args["phone"] != "" {
where += " and buy_phone like '%" + args["phone"] + "%'"
}
if args["oid"] != "" {
where += " and oid like '%" + args["oid"] + "%'"
}
if args["goods_title"] != "" {
var orderGoods []model.OrderGoods
eg.Where("goods_title like ?", "%"+args["goods_title"]+"%").Find(&orderGoods)
oids := "-1"
for _, v := range orderGoods {
oids += "," + utils.Int64ToStr(v.Oid)
}
where += " and oid in(" + oids + ")"
}
sql := "select SUM(IF(state!=5,amount,0)) as amount,SUM(IF(state!=5,1,0)) as alls,SUM(IF(state=0,1,0)) as wait_do,SUM(IF(state=1,1,0)) as dos,SUM(IF(state=2,1,0)) as baking,SUM(IF(state=3,1,0)) as sorting,SUM(IF(state=4,1,0)) as success,SUM(IF(state=5,1,0)) as cancel from `order` where %s"
sql = fmt.Sprintf(sql, where)
nativeString, _ := db.QueryNativeString(eg, sql)
var res = make([]string, 0)
for _, v := range nativeString {
res = append(res, "订单总金额(元):"+v["amount"])
res = append(res, "总订单数量:"+v["alls"])
res = append(res, "待制作订单数:"+v["wait_do"])
res = append(res, "待烘焙订单数:"+v["dos"])
res = append(res, "已完成订单数:"+v["success"])
res = append(res, "已取消订单数:"+v["cancel"])
}
e.OutSuc(c, res, nil)
return
}

func OrderCancel(c *gin.Context) {
var args map[string]string
if err := c.ShouldBindJSON(&args); err != nil {
e.OutErr(c, e.ERR_INVALID_ARGS, err)
return
}
eg := db.Db
order := db.GetOrderById(eg, args["oid"])
if order == nil {
e.OutErr(c, 400, e.NewErr(400, "订单不存在"))
return
}
order = JudgePackageOrdOrdState(order)
if order.State == 5 {
e.OutErr(c, 400, e.NewErr(400, "订单已取消"))
return
}
if order.State > 0 {
e.OutErr(c, 400, e.NewErr(400, "订单制作中,不能取消"))
return
}
order.State = 5
eg.Where("oid=?", order.Oid).Cols("state").Update(order)
eg.Where("oid=?", order.Oid).Cols("state").Update(&model.OrderGoods{State: 5})
e.OutSuc(c, "success", nil)
return
}

func OrderDetail(c *gin.Context) {
var args map[string]string
if err := c.ShouldBindJSON(&args); err != nil {
e.OutErr(c, e.ERR_INVALID_ARGS, err)
return
}
eg := db.Db
order := db.GetOrderById(eg, args["oid"])
if order == nil {
e.OutErr(c, 400, e.NewErr(400, "订单不存在"))
return
}
order = JudgePackageOrdOrdState(order)
var enterpriseData model.Enterprise
eg.Where("id=?", order.EnterpriseId).Get(&enterpriseData)
stateArr := []string{"待制作", "制作中", "烘焙中", "分拣中", "已完成", "已取消"}
enterpriseName := enterpriseData.Name

//订单商品
var orderGoods []model.OrderGoods
eg.Where("oid=?", args["oid"]).Find(&orderGoods)
skuIds := make([]int64, 0)
gids := make([]int64, 0)

for _, v := range orderGoods {
skuIds = append(skuIds, v.SkuId)
gids = append(gids, v.GoodsId)
}
//查商品和sku
goodsMap := db.GetGoodsMore(eg, gids)
goodsInfo := make([]map[string]interface{}, 0)
scheme, host, subDomain, moreSubDomain := svc.ImageBucketNew(c)
var tmpMap interface{}
var skus []model.Sku
eg.Table("sku").In("goods_id", gids).Find(&skus)
for _, v := range orderGoods {
skuList := make([]model.Sku, 0)
for _, skuItem := range skus {
if skuItem.GoodsId == v.GoodsId {
skuList = append(skuList, skuItem)
}
}
tmp := map[string]interface{}{
"goods_img": "",
"id": utils.IntToStr(v.Id),
"sku_id": utils.Int64ToStr(v.SkuId),
"goods_id": utils.Int64ToStr(v.GoodsId),
"num": utils.IntToStr(v.Num),
"amount": utils.Float64ToStr(utils.StrToFloat64(v.Price) * float64(v.Num)),
"sku_str": "",
"spe": "",
"sku_list": skuList,
"goods_title": v.GoodsTitle,
}

skuData := make([]md.Sku, 0)
json.Unmarshal([]byte(v.Sku), &skuData)
skuStr := ""
for _, v1 := range skuData {
if skuStr != "" {
skuStr += ";"
}
skuStr += v1.Name + ":" + v1.Value
}
tmp["sku_str"] = skuStr

// spe
var spe []map[string]interface{}
var speTmp []map[string]interface{}
utils.Unserialize([]byte(goodsMap[v.GoodsId].Spe), &spe)
for _, itemSpe := range spe {
tmp1 := make(map[string]interface{})
tmp1["type"] = "text"
tmp1["name"] = itemSpe["name"]
subTmp := make([]map[string]interface{}, 0)
for i, v2 := range itemSpe["values"].([]interface{}) {
subTmp = append(subTmp, map[string]interface{}{
"key": i,
"name": v2,
})
}
tmp1["values"] = subTmp
speTmp = append(speTmp, tmp1)
}
tmp["spe"] = speTmp
// 商品主图
if goodsMap[v.GoodsId].ImageList != "" {
utils.Unserialize([]byte(goodsMap[v.GoodsId].ImageList), &tmpMap)
var imageListUrlTmp []string
for _, v := range tmpMap.([]interface{}) {
imageListUrlTmp = append(imageListUrlTmp, svc.ImageFormatWithBucketNew(scheme, host, subDomain, moreSubDomain, v.(string)))
}
if imageListUrlTmp != nil {
tmp["goods_img"] = imageListUrlTmp[0]
}
}
goodsInfo = append(goodsInfo, tmp)
}

var res = map[string]interface{}{
"buy_phone": order.BuyPhone,
"oid": utils.Int64ToStr(order.Oid),
"id": utils.IntToStr(order.Id),
"amount": order.Amount,
"state_str": stateArr[order.State],
"state": utils.IntToStr(order.State),
"date": gjson.Get(order.BuyInfo, "date").String(),
"buy_name": gjson.Get(order.BuyInfo, "name").String(),
"address": gjson.Get(order.BuyInfo, "address").String(),
"time": gjson.Get(order.BuyInfo, "time").String(),
"create_at": order.CreateAt.Format("2006-01-02 15:04:05"),
"enterprise_name": enterpriseName,
"goods_info": goodsInfo,
}
e.OutSuc(c, res, nil)
return
}

func OrderOutput(c *gin.Context) {
}
func OrderEdit(c *gin.Context) {
var args map[string]string
if err := c.ShouldBindJSON(&args); err != nil {
e.OutErr(c, e.ERR_INVALID_ARGS, err)
return
}
eg := db.Db
order := db.GetOrderById(eg, args["oid"])
if order == nil {
e.OutErr(c, 400, e.NewErr(400, "订单不存在"))
return
}
var tmp md.BuyInfo
json.Unmarshal([]byte(order.BuyInfo), &tmp)
tmp.Time = args["time"]
tmp.Date = args["date"]
tmp.Phone = args["phone"]
tmp.Name = args["name"]
tmp.Address = args["address"]
order.BuyPhone = args["phone"]
order.BuyInfo = utils.SerializeStr(tmp)
eg.Where("id=?", order.Id).Cols("buy_phone,buy_info").Update(order)
e.OutSuc(c, "success", nil)
return
}
func OrderDel(c *gin.Context) {
var args map[string]string
if err := c.ShouldBindJSON(&args); err != nil {
e.OutErr(c, e.ERR_INVALID_ARGS, err)
return
}
eg := db.Db
order := db.GetOrderById(eg, args["oid"])
if order == nil {
e.OutErr(c, 400, e.NewErr(400, "订单不存在"))
return
}
sess := eg.NewSession()
defer sess.Close()
sess.Begin()
orderGoodsSku := db.GetOrderGoodsById(eg, args["id"])
i, err2 := eg.Where("id=?", args["id"]).Delete(&model.OrderGoods{})
if i == 0 || err2 != nil {
sess.Rollback()
e.OutErr(c, 400, e.NewErr(400, "删除失败"))
return
}
//销量扣除
sql := `UPDATE goods SET sale=sale-%d WHERE id=%d`
sql = fmt.Sprintf(sql, orderGoodsSku.Num, orderGoodsSku.GoodsId)
db.QueryNativeStringSess(sess, sql)
order.Amount = utils.Float64ToStr(utils.StrToFloat64(order.Amount) - float64(orderGoodsSku.Num)*utils.StrToFloat64(orderGoodsSku.Price))
_, err := sess.Where("id=?", order.Id).Cols("amount").Update(order)
if err != nil {
sess.Rollback()
e.OutErr(c, 400, e.NewErr(400, "修改失败"))
return
}
sess.Commit()
e.OutSuc(c, "success", nil)
return
}
func OrderEditNum(c *gin.Context) {
var args map[string]string
if err := c.ShouldBindJSON(&args); err != nil {
e.OutErr(c, e.ERR_INVALID_ARGS, err)
return
}
eg := db.Db
order := db.GetOrderById(eg, args["oid"])
if order == nil {
e.OutErr(c, 400, e.NewErr(400, "订单不存在"))
return
}
order = JudgePackageOrdOrdState(order)
if order.State == 5 {
e.OutErr(c, 400, e.NewErr(400, "订单已取消,不能修改"))
return
}
if order.State > 0 {
e.OutErr(c, 400, e.NewErr(400, "订单制作中,不能修改"))
return
}
sess := eg.NewSession()
defer sess.Close()
sess.Begin()

orderGoods := db.GetOrderGoodsByIdSess(sess, args["id"])
isHasSku := 0
if orderGoods.SkuId != utils.StrToInt64(args["sku_id"]) {
orderGoodsSku := db.GetOrderGoodsBySkuIdSess(sess, args["oid"], args["sku_id"])
if orderGoodsSku != nil {
isHasSku = 1
//先删掉修改的 ,然后改另外的sku
i, err := sess.Where("id=?", args["id"]).Delete(&model.OrderGoods{})
if i == 0 || err != nil {
sess.Rollback()
e.OutErr(c, 400, e.NewErr(400, "修改失败"))
return
}
//销量扣除
sql := `UPDATE goods SET sale=sale-%d WHERE id=%d`
sql = fmt.Sprintf(sql, orderGoods.Num, orderGoods.GoodsId)
db.QueryNativeStringSess(sess, sql)
//销量增加
sqlSecond := `UPDATE goods SET sale=sale+%d WHERE id=%d`
sqlSecond = fmt.Sprintf(sqlSecond, args["num"], orderGoodsSku.GoodsId)
db.QueryNativeStringSess(sess, sqlSecond)
//重新计算价格
orderGoodsSku.Num += utils.StrToInt(args["num"])
order.Amount = utils.Float64ToStr(utils.StrToFloat64(order.Amount) + utils.StrToFloat64(args["num"])*utils.StrToFloat64(orderGoodsSku.Price))
_, err = sess.Where("id=?", orderGoodsSku.Id).Cols("num").Update(orderGoodsSku)
if err != nil {
sess.Rollback()
e.OutErr(c, 400, e.NewErr(400, "修改失败"))
return
}
} else {
orderGoods.SkuId = utils.StrToInt64(args["sku_id"])
_, sku, _ := db.GetMallSkuBySkuId(eg, args["sku_id"], utils.Int64ToStr(orderGoods.GoodsId))
if sku != nil {
orderGoods.SkuCode = sku.SkuCode
orderGoods.Sku = sku.Sku
}
}
}
if isHasSku == 0 {
num := utils.StrToInt(args["num"]) - orderGoods.Num
if num < 0 { //少要了 就总金额 减少
num = orderGoods.Num - utils.StrToInt(args["num"])
order.Amount = utils.Float64ToStr(utils.StrToFloat64(order.Amount) - float64(num)*utils.StrToFloat64(orderGoods.Price))
//销量扣除
sqlSecond := `UPDATE goods SET sale=sale-%d WHERE id=%d`
sqlSecond = fmt.Sprintf(sqlSecond, num, orderGoods.GoodsId)
db.QueryNativeStringSess(sess, sqlSecond)
} else {
order.Amount = utils.Float64ToStr(utils.StrToFloat64(order.Amount) + float64(num)*utils.StrToFloat64(orderGoods.Price))
//销量增加
sqlSecond := `UPDATE goods SET sale=sale+%d WHERE id=%d`
sqlSecond = fmt.Sprintf(sqlSecond, num, orderGoods.GoodsId)
db.QueryNativeStringSess(sess, sqlSecond)
}
orderGoods.Num = utils.StrToInt(args["num"])
_, err := sess.Where("id=?", orderGoods.Id).Cols("num,sku_code,sku_id,sku").Update(orderGoods)
if err != nil {
sess.Rollback()
e.OutErr(c, 400, e.NewErr(400, "修改失败"))
return
}
}
_, err := sess.Where("id=?", order.Id).Cols("amount").Update(order)
if err != nil {
sess.Rollback()
e.OutErr(c, 400, e.NewErr(400, "修改失败"))
return
}
sess.Commit()
e.OutSuc(c, "success", nil)
return
}

+ 118
- 0
app/admin/svc/order/svc_order_pay.go Переглянути файл

@@ -0,0 +1,118 @@
package order

import (
"applet/app/admin/md"
"applet/app/db"
"applet/app/db/model"
"applet/app/e"
"applet/app/utils"
"fmt"
"github.com/gin-gonic/gin"
"time"
)

func GoodsPayCalcAmount(c *gin.Context) {
var req md.GoodsPayParam
if err := c.ShouldBindJSON(&req); err != nil {
e.OutErr(c, e.ERR_INVALID_ARGS, err)
return
}
amount, _ := commCalc(c, req)
res := map[string]string{
"amount": utils.Float64ToStr(amount),
}
e.OutSuc(c, res, nil)
return
}
func GoodsPayCreate(c *gin.Context) {
var req md.GoodsPayParam
if err := c.ShouldBindJSON(&req); err != nil {
e.OutErr(c, e.ERR_INVALID_ARGS, err)
return
}
amount, skuPrice := commCalc(c, req)
if amount <= 0 {
e.OutErr(c, 400, e.NewErr(400, "价格计算错误,下单失败"))
return
}
sess := db.Db.NewSession()
defer sess.Close()
sess.Begin()
sess.Commit()
var order = model.Order{
Oid: utils.StrToInt64(utils.OrderUUID(utils.StrToInt(req.EnterpriseId))),
CreateAt: time.Now(),
EnterpriseId: utils.StrToInt(req.EnterpriseId),
BuyInfo: utils.SerializeStr(req.BuyInfo),
BuyPhone: req.BuyInfo.Phone,
Amount: utils.Float64ToStr(amount),
}
one, err := sess.InsertOne(&order)
if one == 0 || err != nil {
sess.Rollback()
e.OutErr(c, 400, e.NewErr(400, "下单失败"))
return
}
var orderGoods = make([]model.OrderGoods, 0)
goodsTotal := make(map[int64]int)
skuIds := make([]int64, 0)
gids := make([]int64, 0)
for _, v := range req.GoodsInfo {
skuIds = append(skuIds, utils.StrToInt64(v.SkuId))
gids = append(gids, utils.StrToInt64(v.GoodsId))
}
skuMap := db.GetSkuMore(db.Db, skuIds)
goodsMap := db.GetGoodsMore(db.Db, gids)

for _, v := range req.GoodsInfo {
tmp := model.OrderGoods{
Oid: order.Oid,
GoodsId: utils.StrToInt64(v.GoodsId),
GoodsTitle: goodsMap[utils.StrToInt64(v.GoodsId)].Title,
SkuId: utils.StrToInt64(v.SkuId),
SkuCode: skuMap[utils.StrToInt64(v.SkuId)].SkuCode,
Sku: skuMap[utils.StrToInt64(v.SkuId)].Sku,
Num: utils.StrToInt(v.Num),
Price: skuPrice[v.SkuId],
}
goodsTotal[tmp.GoodsId] += tmp.Num
orderGoods = append(orderGoods, tmp)
}
for k, v := range goodsTotal {
sql := `UPDATE goods SET sale=sale-%d WHERE goods_id=%d`
sql = fmt.Sprintf(sql, v, k)
db.QueryNativeStringSess(sess, sql)
}
one, err = sess.Insert(&orderGoods)
if one == 0 || err != nil {
sess.Rollback()
e.OutErr(c, 400, e.NewErr(400, "下单失败"))
return
}
e.OutSuc(c, "success", nil)
return
}
func commCalc(c *gin.Context, req md.GoodsPayParam) (float64, map[string]string) {
skuPrice := make(map[string]string, 0)
skuIds := make([]int64, 0)
for _, v := range req.GoodsInfo {
skuIds = append(skuIds, utils.StrToInt64(v.SkuId))
}
if len(skuIds) == 0 {
return 0, skuPrice
}
engine := db.Db
skuMap := db.GetSkuMore(engine, skuIds)
//计算价格 TODO 对应方案的价格怎么算
var amount float64 = 0
for _, v := range req.GoodsInfo {
sku, ok := skuMap[utils.StrToInt64(v.SkuId)]
if ok == false {
return 0, skuPrice
}
skuPrice[v.SkuId] = sku.Price
amount += utils.StrToFloat64(sku.Price) * utils.StrToFloat64(v.Num)
}
return amount, skuPrice

}

+ 24
- 2
app/db/db_goods_list.go Переглянути файл

@@ -128,9 +128,15 @@ func GetMallGoodsListLeftOnMallSku(engine *xorm.Engine, req *md.MallGoodsListReq
}

if req.SaleState == "1" { // 销售中
whereCondition = whereCondition + " AND sale_state = 1"
whereCondition = whereCondition + " AND mg.sale_state = 1"
} else if req.SaleState == "2" { // 已下架
whereCondition = whereCondition + " AND sale_state = 2"
whereCondition = whereCondition + " AND mg.sale_state = 2"
}
if utils.StrToFloat64(req.StartPrice) > 0 { // 价格区间
whereCondition = whereCondition + " AND mg.price >=" + req.StartPrice
}
if utils.StrToFloat64(req.EndPrice) > 0 { // 价格区间
whereCondition = whereCondition + " AND mg.price <=" + req.EndPrice
}

if req.OrderBySate == "" {
@@ -146,6 +152,8 @@ func GetMallGoodsListLeftOnMallSku(engine *xorm.Engine, req *md.MallGoodsListReq
orderBy = "mg.profit_rate DESC"
case "sale_count_desc":
orderBy = "mg.sale_count DESC"
case "price_desc":
orderBy = "mg.price DESC"
}
}
if req.OrderBySate == "asc" {
@@ -156,6 +164,8 @@ func GetMallGoodsListLeftOnMallSku(engine *xorm.Engine, req *md.MallGoodsListReq
orderBy = "mg.profit_rate ASC"
case "sale_count_desc":
orderBy = "mg.sale_count ASC"
case "price_desc":
orderBy = "mg.price ASC"
}
}

@@ -275,3 +285,15 @@ func GetMallGoodsById(Db *xorm.Engine, goodsId string) (mm *model.Goods, err err
}
return &m, nil
}
func GetGoodsMore(engine *xorm.Engine, gids []int64) map[int64]model.Goods {
skuMap := make(map[int64]model.Goods)
var skus []model.Goods
err := engine.In("goods_id", gids).Find(&skus)
if err != nil {
return skuMap
}
for _, v := range skus {
skuMap[v.GoodsId] = v
}
return skuMap
}

+ 78
- 0
app/db/db_order_list.go Переглянути файл

@@ -0,0 +1,78 @@
package db

import (
"applet/app/db/model"
"applet/app/utils"
"xorm.io/xorm"
)

func GetOrderById(eg *xorm.Engine, id string) *model.Order {
var order model.Order
get, err := eg.Where("oid=?", id).Get(&order)
if get == false || err != nil {
return nil
}
return &order
}
func GetOrderGoodsById(eg *xorm.Engine, id string) *model.OrderGoods {
var order model.OrderGoods
get, err := eg.Where("id=?", id).Get(&order)
if get == false || err != nil {
return nil
}
return &order
}
func GetOrderGoodsBySkuId(eg *xorm.Engine, oid, skuId string) *model.OrderGoods {
var order model.OrderGoods
get, err := eg.Where("oid=? and sku_id=?", oid, skuId).Get(&order)
if get == false || err != nil {
return nil
}
return &order
}

func GetOrderGoodsByIdSess(sess *xorm.Session, id string) *model.OrderGoods {
var order model.OrderGoods
get, err := sess.Where("id=?", id).Get(&order)
if get == false || err != nil {
return nil
}
return &order
}
func GetOrderGoodsBySkuIdSess(sess *xorm.Session, oid, skuId string) *model.OrderGoods {
var order model.OrderGoods
get, err := sess.Where("oid=? and sku_id=?", oid, skuId).Get(&order)
if get == false || err != nil {
return nil
}
return &order
}
func GetOrderList(eg *xorm.Engine, param map[string]string) (*[]model.Order, int64) {
var order []model.Order
sess := eg.Where("1=1")
if param["phone"] != "" {
sess.And("buy_phone like ?", "%"+param["phone"]+"%")
}
if param["oid"] != "" {
sess.And("oid like ?", "%"+param["oid"]+"%")
}
if param["state"] != "" {
sess.And("state =", param["state"])
}
if param["goods_title"] != "" {
var orderGoods []model.OrderGoods
eg.Where("goods_title like ?", "%"+param["goods_title"]+"%").Find(&orderGoods)
oids := []int64{-1}
for _, v := range orderGoods {
oids = append(oids, v.Oid)
}
sess.In("oid", oids)
}
size := utils.StrToInt(param["limit"])
start := (utils.StrToInt(param["page"]) - 1) * size
count, err := sess.Limit(size, start).OrderBy("id desc").FindAndCount(&order)
if err != nil {
return nil, count
}
return &order, count
}

+ 22
- 0
app/db/db_sku.go Переглянути файл

@@ -20,3 +20,25 @@ func GetMallSkuBySkuCode(engine *xorm.Engine, skuCode, goodsId string) (isHas bo
}
return isHas, &m, nil
}

func GetMallSkuBySkuId(engine *xorm.Engine, skuId, goodsId string) (isHas bool, mm *model.Sku, err error) {
isHas = false
var m model.Sku
isHas, err = engine.Where("sku_id=?", skuId).And("goods_id!=?", goodsId).Get(&m)
if err != nil {
return isHas, &m, err
}
return isHas, &m, nil
}
func GetSkuMore(engine *xorm.Engine, skuIds []int64) map[int64]model.Sku {
skuMap := make(map[int64]model.Sku)
var skus []model.Sku
err := engine.Table("sku").In("sku_id", skuIds).Find(&skus)
if err != nil {
return skuMap
}
for _, v := range skus {
skuMap[v.SkuId] = v
}
return skuMap
}

+ 17
- 0
app/db/model/order.go Переглянути файл

@@ -0,0 +1,17 @@
package model

import (
"time"
)

type Order struct {
Id int `json:"id" xorm:"not null pk autoincr INT(11)"`
Oid int64 `json:"oid" xorm:"comment('订单号') BIGINT(20)"`
State int `json:"state" xorm:"default 0 comment('状态 0待制作 1制作中 2烘焙中 3分拣中 4已完成 5已取消') INT(11)"`
CreateAt time.Time `json:"create_at" xorm:"comment('下单时间') DATETIME"`
CancelAt time.Time `json:"cancel_at" xorm:"comment('取消时间') DATETIME"`
EnterpriseId int `json:"enterprise_id" xorm:"default 0 comment('校企id') INT(11)"`
BuyInfo string `json:"buy_info" xorm:"comment('购买人信息 json') VARCHAR(2000)"`
Amount string `json:"amount" xorm:"default 0.00 comment('付款金额') DECIMAL(20,2)"`
BuyPhone string `json:"buy_phone" xorm:"comment('购买人手机 ') VARCHAR(20)"`
}

+ 14
- 0
app/db/model/order_goods.go Переглянути файл

@@ -0,0 +1,14 @@
package model

type OrderGoods struct {
Id int `json:"id" xorm:"not null pk autoincr INT(11)"`
Oid int64 `json:"oid" xorm:"default 0 comment('订单号') BIGINT(20)"`
GoodsId int64 `json:"goods_id" xorm:"default 0 comment('商品id') INT(11)"`
SkuId int64 `json:"sku_id" xorm:"default 0 comment('sku') INT(255)"`
Num int `json:"num" xorm:"default 0 comment('购买数量') INT(11)"`
Price string `json:"price" xorm:"default 0.00 comment('单价') DECIMAL(20,2)"`
SkuCode string `json:"sku_code" xorm:"default 0.00 comment('') VARCHAR(255)"`
Sku string `json:"sku_code" xorm:"default 0.00 comment('') VARCHAR(255)"`
GoodsTitle string `json:"goods_title" xorm:"default 0.00 comment('') VARCHAR(255)"`
State int `json:"state" xorm:"default 0 comment('状态 0待制作 1制作中 2烘焙中 3分拣中 4已完成 ') INT(11)"`
}

+ 19
- 1
app/router/admin_router.go Переглянути файл

@@ -4,6 +4,7 @@ import (
"applet/app/admin/hdl"
categoryHdl "applet/app/admin/hdl/category"
goodsHdl "applet/app/admin/hdl/goods"
orderHdl "applet/app/admin/hdl/order"
"applet/app/admin/mw"
"applet/app/cfg"
"github.com/gin-gonic/gin"
@@ -122,7 +123,22 @@ func rRole(r *gin.RouterGroup) {
r.GET("/adminInfo", hdl.AdminInfo) //获取管理员信息
r.POST("/bindAdminRole", hdl.BindAdminRole) //绑定角色
}

func rGoodsPay(r *gin.RouterGroup) {
r.GET("/enterpriseList", hdl.EnterpriseList) //校企列表
r.GET("/goodsList", goodsHdl.GetMallGoodsList) //商品列表
r.POST("/calcAmount", orderHdl.GoodsPayCalcAmount) //商品下单计算价格
r.POST("/create", orderHdl.GoodsPayCreate) //商品下单
}
func rOrder(r *gin.RouterGroup) {
r.POST("/list", orderHdl.OrderList) //用户订单
r.POST("/total", orderHdl.OrderTotal) //用户订单统计
r.POST("/cancel", orderHdl.OrderCancel) //用户订单取消
r.POST("/detail", orderHdl.OrderDetail) //用户订单详情
r.POST("/output", orderHdl.OrderOutput) //用户订单导出
r.POST("/del", orderHdl.OrderDel) //用户订单商品删除
r.POST("/edit", orderHdl.OrderEdit) //用户订单修改购买人信息
r.POST("/editNum", orderHdl.OrderEditNum) //用户订单修改订单数
}
func AdminRoute(r *gin.RouterGroup) {
r.GET("/demo", hdl.Demo)

@@ -147,4 +163,6 @@ func AdminRoute(r *gin.RouterGroup) {
rRole(r.Group("/role")) //权限管理
rSetCenter(r.Group("/setCenter")) //设置中心
rUser(r.Group("/user")) //用户管理
rGoodsPay(r.Group("/goodsPay")) //商品下单
rOrder(r.Group("/order")) //用户订单
}

+ 3
- 8
go.mod Переглянути файл

@@ -3,15 +3,12 @@ module applet
go 1.15

require (
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751
github.com/antchfx/htmlquery v1.3.0 // indirect
github.com/antchfx/xmlquery v1.3.18 // indirect
github.com/boombuler/barcode v1.0.1
github.com/dchest/uniuri v0.0.0-20200228104902-7aecb25e1fe5
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/forgoer/openssl v0.0.0-20201023062029-c3112b0c8700
github.com/gin-contrib/sessions v0.0.3
github.com/gin-gonic/gin v1.6.3
github.com/go-openapi/spec v0.20.3 // indirect
github.com/go-openapi/swag v0.19.15 // indirect
@@ -26,23 +23,21 @@ require (
github.com/golang/snappy v0.0.3 // indirect
github.com/gomodule/redigo v2.0.0+incompatible
github.com/gookit/color v1.3.8 // indirect
github.com/gorilla/sessions v1.2.1 // indirect
github.com/jinzhu/copier v0.4.0 // indirect
github.com/jinzhu/copier v0.4.0
github.com/json-iterator/go v1.1.10 // indirect
github.com/kennygrant/sanitize v1.2.4 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/makiuchi-d/gozxing v0.0.0-20210324052758-57132e828831
github.com/mcuadros/go-defaults v1.2.0 // indirect
github.com/mcuadros/go-defaults v1.2.0
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/onsi/ginkgo v1.15.0 // indirect
github.com/onsi/gomega v1.10.5 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pkg/errors v0.9.1
github.com/qiniu/api.v7/v7 v7.8.2
github.com/robfig/cron/v3 v3.0.1
github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d // indirect
github.com/smartystreets/goconvey v1.6.4 // indirect
github.com/sony/sonyflake v1.0.0
github.com/stretchr/testify v1.7.0 // indirect
github.com/swaggo/swag v1.7.0


Завантаження…
Відмінити
Зберегти