1.小程序调用erp登录接口不判断验证码; 2.修改原接口的翻页相关字段; 3.修复float64转int32精度丢失的缺陷; 4.注释库存导入时采购价需大于0的校验; 5.相关域名改成生产环境域名;
508 lines
15 KiB
Go
508 lines
15 KiB
Go
package mallmanage
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"github.com/codinl/go-logger"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/rs/zerolog/log"
|
|
"go-admin/app/admin/models"
|
|
orm "go-admin/common/global"
|
|
"go-admin/tools/app"
|
|
"net/http"
|
|
)
|
|
|
|
func GoodsCreate(c *gin.Context) {
|
|
goods := &models.Goods{}
|
|
if c.ShouldBindJSON(goods) != nil {
|
|
logger.Errorf("para err")
|
|
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
|
return
|
|
}
|
|
goods.SaleStatus = 2
|
|
discount, err := json.Marshal(goods.GoodsDiscount)
|
|
if err != nil {
|
|
logger.Error("goods discount err:", err)
|
|
app.Error(c, http.StatusInternalServerError, errors.New("goods create err"), "创建商品失败")
|
|
return
|
|
}
|
|
goods.DiscountList = string(discount)
|
|
err = goods.GoodsCreate()
|
|
if err != nil {
|
|
logger.Errorf("err:%#v", err)
|
|
msg := "创建商品失败"
|
|
app.Error(c, http.StatusInternalServerError, errors.New("goods create err"), msg)
|
|
return
|
|
}
|
|
//cat, err := models.GetGoodsCat(goods.CatId)
|
|
//if err != nil {
|
|
// log.Error().Msgf("cat err:%#v", err)
|
|
// app.Error(c, http.StatusInternalServerError, errors.New("goods cat err"), "创建商品失败")
|
|
// return
|
|
//}
|
|
//goods.GoodsCat = cat
|
|
|
|
app.OK(c, goods, "创建商品成功")
|
|
}
|
|
|
|
func GoodsList(c *gin.Context) {
|
|
req := &models.GoodsListReq{}
|
|
if c.ShouldBindJSON(req) != nil {
|
|
logger.Errorf("para err")
|
|
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
|
return
|
|
}
|
|
goodsList, totalCount, err := req.GoodsList()
|
|
if err != nil {
|
|
logger.Errorf("err:%#v", err)
|
|
msg := "获取商品列表失败"
|
|
app.Error(c, http.StatusInternalServerError, errors.New("goods list err"), msg)
|
|
return
|
|
}
|
|
|
|
var ids []uint32
|
|
for _, goods := range goodsList {
|
|
ids = append(ids, goods.GoodsId)
|
|
}
|
|
|
|
if len(ids) > 0 {
|
|
cm := models.GetGoodsFirstSkuCombo(ids)
|
|
fmt.Println(cm)
|
|
if cm != nil {
|
|
for j, combo := range cm {
|
|
for i, goods := range goodsList {
|
|
if combo.GoodsId == goods.GoodsId {
|
|
goodsList[i].Combo = &cm[j]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
ret := map[string]interface{}{
|
|
"count": totalCount,
|
|
"list": goodsList,
|
|
"page_index": req.PageIdx,
|
|
"page_size": req.PageSize,
|
|
//"total_page": totalPage,
|
|
}
|
|
app.OK(c, ret, "")
|
|
}
|
|
|
|
func GoodsEdit(c *gin.Context) {
|
|
goods := &models.Goods{}
|
|
if c.ShouldBindJSON(goods) != nil {
|
|
logger.Errorf("para err")
|
|
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
|
return
|
|
}
|
|
|
|
if goods.GoodsDiscount != nil {
|
|
discount, err := json.Marshal(goods.GoodsDiscount)
|
|
if err != nil {
|
|
logger.Error("goods discount err:", err)
|
|
app.Error(c, http.StatusInternalServerError, errors.New("goods create err"), "创建商品失败")
|
|
return
|
|
}
|
|
goods.DiscountList = string(discount)
|
|
}
|
|
err := goods.Edit()
|
|
if err != nil {
|
|
logger.Errorf("err:%#v", err)
|
|
msg := "商品编辑失败"
|
|
app.Error(c, http.StatusInternalServerError, errors.New("goods edit err"), msg)
|
|
return
|
|
}
|
|
app.OK(c, nil, "商品编辑成功")
|
|
}
|
|
|
|
func GoodsDetail(c *gin.Context) {
|
|
goods := &models.Goods{}
|
|
if c.ShouldBindJSON(goods) != nil {
|
|
logger.Errorf("para err")
|
|
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
|
return
|
|
}
|
|
err := goods.GetDetail()
|
|
if err != nil {
|
|
logger.Errorf("err:%#v", err)
|
|
msg := "获取商品详情失败"
|
|
app.Error(c, http.StatusInternalServerError, errors.New("goods edit err"), msg)
|
|
return
|
|
}
|
|
app.OK(c, goods, "")
|
|
}
|
|
|
|
func GoodsDelete(c *gin.Context) {
|
|
req := &struct {
|
|
Id uint32 `json:"id"`
|
|
}{}
|
|
if c.ShouldBindJSON(req) != nil {
|
|
logger.Errorf("para err")
|
|
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
|
return
|
|
}
|
|
err := orm.Eloquent.Table("goods").Where("id=?", req.Id).Delete(&models.Goods{}).Error
|
|
//err := goods.GetDetail()
|
|
if err != nil {
|
|
logger.Errorf("err:%#v", err)
|
|
msg := "删除商品详情失败"
|
|
app.Error(c, http.StatusInternalServerError, errors.New("goods delete err"), msg)
|
|
return
|
|
}
|
|
app.OK(c, nil, "操作成功")
|
|
return
|
|
}
|
|
|
|
func GoodsAttributeAdd(c *gin.Context) {
|
|
attribute := &models.GoodsAttribute{}
|
|
if c.ShouldBindJSON(attribute) != nil {
|
|
logger.Errorf("para err")
|
|
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
|
return
|
|
}
|
|
if attribute.SpecValueIndex == "" || attribute.GoodsId == 0 {
|
|
logger.Errorf("para err")
|
|
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
|
return
|
|
}
|
|
indexSort, err := models.IndexSortString(attribute.SpecValueIndex)
|
|
if err != nil {
|
|
logger.Error("err:", err)
|
|
app.Error(c, http.StatusInternalServerError, errors.New("sort spec value err"), "添加商品规格失败")
|
|
return
|
|
}
|
|
attribute.SpecValueList = indexSort
|
|
exist, err := models.QueryRecordExist(
|
|
fmt.Sprintf("SELECT * FROM goods_attribute WHERE spec_value_index = '%s' ANd goods_id=%d",
|
|
indexSort, attribute.GoodsId))
|
|
if err != nil {
|
|
log.Error().Msgf("exist attribute err:%#v", err)
|
|
app.Error(c, http.StatusInternalServerError, err, "添加商品规格失败")
|
|
return
|
|
}
|
|
goods, err := models.GetGoods(attribute.GoodsId)
|
|
if err != nil {
|
|
logger.Error("get goods err")
|
|
app.Error(c, http.StatusInternalServerError, errors.New("get goods err"), "添加商品不存在")
|
|
return
|
|
}
|
|
|
|
if !exist {
|
|
attribute.SerialNo = goods.SerialNo
|
|
attribute.CatId = goods.CatId
|
|
attribute.Name = goods.Name
|
|
attribute.Title = goods.Title
|
|
//attribute.MainImage = goods.MainImage // 规格图
|
|
attribute.SetSpecValues()
|
|
|
|
specIds := make([]int, 0)
|
|
for i, _ := range attribute.SpecValues {
|
|
specIds = append(specIds, int(attribute.SpecValues[i].SpecId))
|
|
}
|
|
if goods.SpecIndex != "" && goods.SpecIndex != models.IndexToString(specIds) {
|
|
logger.Error("goods spec err:")
|
|
app.Error(c, http.StatusInternalServerError, errors.New("goods spec err"), "添加商品规格不一致")
|
|
return
|
|
}
|
|
|
|
specValue, err := json.Marshal(attribute.SpecValues)
|
|
if err != nil {
|
|
logger.Error("marshal spec values err:", err)
|
|
app.Error(c, http.StatusInternalServerError, errors.New("marshal spec values err"), "添加商品规格失败")
|
|
return
|
|
}
|
|
begin := orm.Eloquent.Begin()
|
|
attribute.SpecValueList = string(specValue)
|
|
err = begin.Create(attribute).Error
|
|
if err != nil {
|
|
begin.Rollback()
|
|
log.Error().Msgf("create attribute err:%#v", err)
|
|
app.Error(c, http.StatusInternalServerError, errors.New("create attribute err"), "添加商品规格失败")
|
|
return
|
|
}
|
|
rm := uint32(0)
|
|
vm := uint32(0)
|
|
for _, combo := range attribute.Combos {
|
|
combo.GoodsAttributeId = attribute.ID
|
|
combo.GoodsId = goods.GoodsId
|
|
combo.SerialNo = goods.SerialNo
|
|
combo.CatId = goods.CatId
|
|
combo.Name = goods.Name
|
|
combo.Title = goods.Title
|
|
combo.MainImage = goods.MainImage
|
|
rm = combo.PriceRm
|
|
vm = combo.PriceVm
|
|
fmt.Println("combo.PriceRm:", combo.PriceRm)
|
|
err = begin.Create(&combo).Error
|
|
if err != nil {
|
|
begin.Rollback()
|
|
log.Error().Msgf("create goods attribute combo:", err)
|
|
app.Error(c, http.StatusInternalServerError, err, "添加商品规格失败")
|
|
return
|
|
}
|
|
}
|
|
|
|
if rm != 0 || vm != 0 {
|
|
err = orm.Eloquent.Debug().Table("goods").Where("id=?", goods.ID).Updates(&map[string]interface{}{
|
|
"price_vm": vm,
|
|
"price_rm": rm,
|
|
}).Error
|
|
if err != nil {
|
|
begin.Rollback()
|
|
log.Error().Msgf(" goods update err:", err)
|
|
app.Error(c, http.StatusInternalServerError, err, "添加商品规格失败")
|
|
return
|
|
}
|
|
}
|
|
err = begin.Commit().Error
|
|
if err != nil {
|
|
begin.Rollback()
|
|
log.Error().Msgf("commit err:", err)
|
|
app.Error(c, http.StatusInternalServerError, err, "添加商品规格失败")
|
|
return
|
|
}
|
|
} else {
|
|
log.Error().Msgf("goods spec exist ")
|
|
app.Error(c, http.StatusInternalServerError, errors.New("goods spec exist"), "商品规格重复")
|
|
return
|
|
}
|
|
miniRm := uint32(0)
|
|
if len(attribute.Combos) > 0 {
|
|
miniRm = attribute.Combos[0].PriceRm
|
|
}
|
|
for i, _ := range attribute.Combos {
|
|
if attribute.Combos[i].PriceRm < miniRm {
|
|
miniRm = attribute.Combos[i].PriceRm
|
|
}
|
|
}
|
|
//fmt.Println("更新规格值")
|
|
models.UpdateSpecList(attribute.GoodsId, miniRm)
|
|
//fmt.Println("添加规格值成功----")
|
|
app.OK(c, nil, "添加规格值成功")
|
|
return
|
|
}
|
|
|
|
func GoodsAttributeUpdate(c *gin.Context) {
|
|
attribute := &models.GoodsAttribute{}
|
|
if c.ShouldBindJSON(attribute) != nil {
|
|
logger.Errorf("para err")
|
|
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
|
return
|
|
}
|
|
//attrString, err := json.Marshal(attribute)
|
|
//if err != nil {
|
|
// logger.Error("attrString err:", err)
|
|
//}
|
|
//fmt.Println("attrString:", string(attrString))
|
|
if attribute.ID == 0 {
|
|
logger.Errorf("para err")
|
|
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
|
return
|
|
}
|
|
indexSort, err := models.IndexSortString(attribute.SpecValueIndex)
|
|
if err != nil {
|
|
logger.Error("err:", err)
|
|
app.Error(c, http.StatusInternalServerError, errors.New("sort spec value err"), "添加商品规格失败")
|
|
return
|
|
}
|
|
attribute.SpecValueList = indexSort
|
|
|
|
goods, err := models.GetGoods(attribute.GoodsId)
|
|
if err != nil {
|
|
logger.Error("get goods err")
|
|
app.Error(c, http.StatusInternalServerError, errors.New("get goods err"), "添加商品不存在")
|
|
return
|
|
}
|
|
|
|
attribute.SetSpecValues()
|
|
|
|
specIds := make([]int, 0)
|
|
for i, _ := range attribute.SpecValues {
|
|
specIds = append(specIds, int(attribute.SpecValues[i].SpecId))
|
|
}
|
|
if goods.SpecIndex != "" && goods.SpecIndex != models.IndexToString(specIds) {
|
|
logger.Error("goods spec err:")
|
|
app.Error(c, http.StatusInternalServerError, errors.New("goods spec err"), "添加商品规格不一致")
|
|
return
|
|
}
|
|
|
|
specValue, err := json.Marshal(attribute.SpecValues)
|
|
if err != nil {
|
|
logger.Error("marshal spec values err:", err)
|
|
app.Error(c, http.StatusInternalServerError, errors.New("marshal spec values err"), "添加商品规格失败")
|
|
return
|
|
}
|
|
|
|
attribute.SpecValueList = string(specValue)
|
|
//fmt.Println("规格 Combos", attribute.Combos)
|
|
begin := orm.Eloquent.Begin()
|
|
err = begin.Save(attribute).Error
|
|
if err != nil {
|
|
begin.Rollback()
|
|
logger.Errorf("save err:%#v", err)
|
|
msg := "商品规格编辑失败"
|
|
app.Error(c, http.StatusInternalServerError, errors.New("goods edit err"), msg)
|
|
return
|
|
}
|
|
//fmt.Println("Combos", attribute.Combos)
|
|
if len(attribute.Combos) != 0 {
|
|
//fmt.Println("更新Combos数据")
|
|
for _, combo := range attribute.Combos {
|
|
//fmt.Println("规格id combo :", combo.ID)
|
|
err := begin.Table("goods_attribute_combo").Where("id=?", combo.ID).Updates(map[string]interface{}{
|
|
"price_vm": combo.PriceVm,
|
|
"price_rm": combo.PriceRm,
|
|
}).Error
|
|
if err != nil {
|
|
begin.Rollback()
|
|
logger.Errorf("update combo err:%#v", err)
|
|
msg := "商品规格编辑失败"
|
|
app.Error(c, http.StatusInternalServerError, errors.New("goods edit err"), msg)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
err = begin.Commit().Error
|
|
if err != nil {
|
|
begin.Rollback()
|
|
logger.Error("commit err:", err)
|
|
msg := "商品规格编辑失败"
|
|
app.Error(c, http.StatusInternalServerError, errors.New("goods edit err"), msg)
|
|
return
|
|
}
|
|
|
|
app.OK(c, nil, "商品规格编辑成功")
|
|
//fmt.Println("添加规格值成功----")
|
|
return
|
|
}
|
|
|
|
func GoodsAttributeMDel(c *gin.Context) {
|
|
attributeIds := &struct {
|
|
GoodsAttributeIds []uint32 `json:"goods_attribute_ids"`
|
|
}{}
|
|
if c.ShouldBindJSON(attributeIds) != nil {
|
|
logger.Errorf("para err")
|
|
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
|
return
|
|
}
|
|
if len(attributeIds.GoodsAttributeIds) == 0 {
|
|
app.OK(c, nil, "操作成功")
|
|
return
|
|
}
|
|
attribute, err := models.GetGoodsAttribute(attributeIds.GoodsAttributeIds[0])
|
|
if err != nil {
|
|
log.Error().Msgf("attribute err:%#v", err)
|
|
app.Error(c, http.StatusInternalServerError, err, "删除商品规格失败")
|
|
return
|
|
}
|
|
|
|
for i, _ := range attributeIds.GoodsAttributeIds {
|
|
begin := orm.Eloquent.Begin()
|
|
err := begin.Table("goods_attribute").Where("id=?", attributeIds.GoodsAttributeIds[i]).
|
|
Delete(&models.GoodsAttribute{}).Error
|
|
if err != nil {
|
|
begin.Rollback()
|
|
log.Error().Msgf("goods attribute del err:%#v", err)
|
|
app.Error(c, http.StatusInternalServerError, err, "删除商品规格失败")
|
|
return
|
|
}
|
|
err = begin.Table("goods_attribute_combo").Where("goods_attribute_id=?", attributeIds.GoodsAttributeIds[i]).
|
|
Delete(&models.GoodsAttributeCombo{}).Error
|
|
if err != nil {
|
|
begin.Rollback()
|
|
log.Error().Msgf("goods attribute del err:%#v", err)
|
|
app.Error(c, http.StatusInternalServerError, err, "删除商品规格失败")
|
|
return
|
|
}
|
|
err = begin.Commit().Error
|
|
if err != nil {
|
|
begin.Rollback()
|
|
log.Error().Msgf("commit err:%#v", err)
|
|
app.Error(c, http.StatusInternalServerError, err, "删除商品规格失败")
|
|
return
|
|
}
|
|
}
|
|
|
|
models.UpdateSpecList(attribute.GoodsId, 1000000)
|
|
fmt.Println("删除规格:----")
|
|
app.OK(c, nil, "操作成功")
|
|
return
|
|
}
|
|
|
|
func DeliverTaskList(c *gin.Context) {
|
|
req := &models.DeliverTaskReq{}
|
|
if c.ShouldBindJSON(req) != nil {
|
|
logger.Errorf("para err")
|
|
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
|
return
|
|
}
|
|
sysUser, err := models.GetSysUserByCtx(c)
|
|
if err != nil {
|
|
logger.Error("err:", err)
|
|
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
|
return
|
|
}
|
|
req.StoreId = sysUser.StoreId
|
|
fmt.Println("StoreId:", req.StoreId)
|
|
list, totalCount, err := req.List(c)
|
|
if err != nil {
|
|
logger.Errorf("err:%#v", err)
|
|
msg := "获取发货列表失败"
|
|
app.Error(c, http.StatusInternalServerError, errors.New("goods list err"), msg)
|
|
return
|
|
}
|
|
ret := map[string]interface{}{
|
|
"total": totalCount,
|
|
"list": list,
|
|
"page_index": req.PageIdx,
|
|
"page_size": req.PageSize,
|
|
}
|
|
app.OK(c, ret, "")
|
|
}
|
|
|
|
func DeliverTaskDetail(c *gin.Context) {
|
|
req := &struct {
|
|
DeliverTaskId uint32 `json:"deliver_task_id" binding:"required"`
|
|
}{}
|
|
if c.ShouldBindJSON(req) != nil {
|
|
logger.Errorf("para err")
|
|
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
|
|
return
|
|
}
|
|
var task models.DeliverTask
|
|
err := orm.Eloquent.Table("deliver_task").Where("id=?", req.DeliverTaskId).
|
|
Find(&task).Error
|
|
if err != nil {
|
|
log.Error().Msgf("deliver task err:%#v", err)
|
|
app.Error(c, http.StatusInternalServerError, err, "获取详情失败")
|
|
return
|
|
}
|
|
|
|
var subs []*models.DeliverTaskSub
|
|
err = orm.Eloquent.Table("deliver_task_sub").Where("deliver_task_id=?", req.DeliverTaskId).Find(&subs).Error
|
|
if err != nil {
|
|
log.Error().Msgf("deliver task err:%#v", err)
|
|
app.Error(c, http.StatusInternalServerError, err, "获取详情失败")
|
|
return
|
|
}
|
|
|
|
models.DeliverTaskSubListSetDetail(subs)
|
|
|
|
task.Subs = subs
|
|
//list, totalCount, err := req.List()
|
|
//if err != nil {
|
|
// logger.Errorf("err:%#v", err)
|
|
// msg := "获取发货列表失败"
|
|
// app.Error(c, http.StatusInternalServerError, errors.New("goods list err"), msg)
|
|
// return
|
|
//}
|
|
//ret := map[string]interface{}{
|
|
// "count": totalCount,
|
|
// "list": list,
|
|
// "page_index": req.PageIdx,
|
|
// "page_size": req.PageSize,
|
|
//}
|
|
app.OK(c, task, "")
|
|
}
|