package controllers
|
|
import (
|
"errors"
|
"fmt"
|
"github.com/gin-gonic/gin"
|
"github.com/spf13/cast"
|
"gorm.io/gorm"
|
"strconv"
|
"strings"
|
"wms/constvar"
|
"wms/extend/code"
|
"wms/extend/util"
|
"wms/models"
|
"wms/pkg/logx"
|
"wms/pkg/structx"
|
"wms/request"
|
)
|
|
type WarehouseController struct{}
|
|
// Add
|
// @Tags 仓库
|
// @Summary 添加仓库
|
// @Produce application/json
|
// @Param object body request.AddWarehouse true "仓库信息"
|
// @Success 200 {object} util.Response "成功"
|
// @Router /api-wms/v1/warehouse/warehouse [post]
|
func (slf WarehouseController) Add(c *gin.Context) {
|
var reqParams request.AddWarehouse
|
var params models.Warehouse
|
if err := c.BindJSON(&reqParams); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "参数解析失败,数据类型错误")
|
return
|
}
|
if err := structx.AssignTo(reqParams, ¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "数据转换错误")
|
return
|
}
|
|
if err := slf.ParamsCheck(params); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, err.Error())
|
return
|
}
|
//创建视图
|
view := &models.Location{
|
Name: params.Code,
|
JointName: params.Code,
|
Type: constvar.LocationTypeView,
|
}
|
id, err := models.NewLocationSearch().CreateReturnId(view)
|
if err != nil {
|
util.ResponseFormat(c, code.SaveFail, "视图创建失败")
|
return
|
}
|
//创建默认位置
|
location := &models.Location{
|
Name: "默认位置",
|
JointName: params.Code + "/默认位置",
|
Type: constvar.LocationTypeInternal,
|
ReplenishLocation: true,
|
ParentId: id,
|
}
|
locationId, err := models.NewLocationSearch().CreateReturnId(location)
|
if err != nil {
|
util.ResponseFormat(c, code.SaveFail, "位置创建失败")
|
return
|
}
|
params.LocationId = locationId
|
err = models.WithTransaction(func(tx *gorm.DB) error {
|
err := models.NewWarehouseSearch().SetOrm(tx).Create(¶ms)
|
if err != nil {
|
return err
|
}
|
//创建三个默认操作类型
|
var types []*models.OperationType
|
inType := &models.OperationType{
|
Name: params.Name + "-入库",
|
BaseOperationType: constvar.BaseOperationTypeIncoming,
|
WarehouseId: params.Id,
|
}
|
types = append(types, inType)
|
outType := &models.OperationType{
|
Name: params.Name + "-出库",
|
BaseOperationType: constvar.BaseOperationTypeOutgoing,
|
WarehouseId: params.Id,
|
}
|
types = append(types, outType)
|
internalType := &models.OperationType{
|
Name: params.Name + "-内部调拨",
|
BaseOperationType: constvar.BaseOperationTypeInternal,
|
WarehouseId: params.Id,
|
}
|
types = append(types, internalType)
|
err = models.NewOperationTypeSearch().SetOrm(tx).CreateBatch(types)
|
return err
|
})
|
if err != nil {
|
_ = models.NewLocationSearch().SetID(locationId).Delete()
|
logx.Errorf("warehouse create err: %v", err)
|
util.ResponseFormat(c, code.SaveFail, "插入失败")
|
return
|
}
|
|
util.ResponseFormat(c, code.Success, "添加成功")
|
}
|
|
// UpdateWarehouse
|
// @Tags 仓库
|
// @Summary 编辑仓库
|
// @Produce application/json
|
// @Param object body models.Warehouse true "仓库信息"
|
// @Success 200 {object} util.Response "成功"
|
// @Router /api-wms/v1/warehouse/updateWarehouse [post]
|
func (slf WarehouseController) UpdateWarehouse(c *gin.Context) {
|
var params models.Warehouse
|
if err := c.BindJSON(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, fmt.Sprintf("参数解析失败: %v"+err.Error()))
|
return
|
}
|
if err := slf.ParamsCheck(params); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, err.Error())
|
return
|
}
|
warehouse, err := models.NewWarehouseSearch().SetID(params.Id).First()
|
if err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "仓库不存在")
|
return
|
}
|
err = models.WithTransaction(func(db *gorm.DB) error {
|
//更新作业类型名称
|
if params.Name != warehouse.Name {
|
m := make(map[string]interface{})
|
m["name"] = params.Name + "-入库"
|
err := models.NewOperationTypeSearch().SetOrm(db).SetBaseOperationType(constvar.BaseOperationTypeIncoming).SetWarehouseId(params.Id).UpdateByMap(m)
|
if err != nil {
|
return err
|
}
|
m["name"] = params.Name + "-出库"
|
err = models.NewOperationTypeSearch().SetOrm(db).SetBaseOperationType(constvar.BaseOperationTypeOutgoing).SetWarehouseId(params.Id).UpdateByMap(m)
|
if err != nil {
|
return err
|
}
|
m["name"] = params.Name + "-内部调拨"
|
err = models.NewOperationTypeSearch().SetOrm(db).SetBaseOperationType(constvar.BaseOperationTypeInternal).SetWarehouseId(params.Id).UpdateByMap(m)
|
if err != nil {
|
return err
|
}
|
}
|
err = models.NewWarehouseSearch().SetID(params.Id).Update(¶ms)
|
return err
|
})
|
|
if err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "修改失败")
|
return
|
}
|
|
util.ResponseFormat(c, code.UpdateSuccess, "更新成功")
|
}
|
|
func (slf WarehouseController) ParamsCheck(params models.Warehouse) (err error) {
|
var oldRecord *models.Warehouse
|
if params.Id != 0 {
|
oldRecord, err = models.NewWarehouseSearch().SetID(params.Id).First()
|
if err == gorm.ErrRecordNotFound {
|
return errors.New("记录不存在")
|
}
|
}
|
//更新位置信息
|
if oldRecord != nil && params.Code != oldRecord.Code {
|
locations, err := models.NewLocationSearch().SetJointName(oldRecord.Code).FindNotTotal()
|
if err != nil {
|
return errors.New("查询位置信息失败")
|
}
|
|
err = models.WithTransaction(func(db *gorm.DB) error {
|
for _, location := range locations {
|
m := make(map[string]interface{})
|
index := strings.Index(location.JointName, "/")
|
if index > 0 {
|
m["joint_name"] = params.Code + location.JointName[index:]
|
} else {
|
m["joint_name"] = params.Code
|
}
|
err = models.NewLocationSearch().SetOrm(db).SetID(location.Id).UpdateByMap(m)
|
if err != nil {
|
return err
|
}
|
}
|
return nil
|
})
|
if err != nil {
|
return errors.New("更新位置信息失败")
|
}
|
}
|
if oldRecord == nil {
|
record, err := models.NewWarehouseSearch().SetCode(params.Code).First()
|
if record != nil && record.Code == params.Code {
|
fmt.Println(err)
|
return errors.New("仓库编号重复")
|
}
|
}
|
if params.Code == "" {
|
return errors.New("缩写不能为空")
|
}
|
return nil
|
}
|
|
// List
|
// @Tags 仓库
|
// @Summary 查询仓库列表
|
// @Produce application/json
|
// @Param object query request.GetWarehouseList true "查询参数"
|
// @Success 200 {object} util.ResponseList{data=[]models.Warehouse} "成功"
|
// @Router /api-wms/v1/warehouse/warehouse [get]
|
func (slf WarehouseController) List(c *gin.Context) {
|
var params request.GetWarehouseList
|
if err := c.ShouldBindQuery(¶ms); err != nil {
|
util.ResponseFormat(c, code.RequestParamError, err.Error())
|
return
|
}
|
list, total, err := models.NewWarehouseSearch().SetPage(params.Page, params.PageSize).SetKeyword(params.Keyword).SetOrder("id desc").Find()
|
if err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "查找失败")
|
return
|
}
|
//获取位置信息
|
ids := make([]int, 0)
|
for _, warehouse := range list {
|
ids = append(ids, warehouse.LocationId)
|
}
|
locations, err := models.NewLocationSearch().SetIds(ids).FindNotTotal()
|
if err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "位置信息查找失败")
|
return
|
}
|
for _, warehouse := range list {
|
for _, location := range locations {
|
if warehouse.LocationId == location.Id {
|
warehouse.WarehouseLocation = warehouse.Code + "/" + location.Name
|
break
|
}
|
}
|
}
|
|
util.ResponseFormatList(c, code.Success, list, cast.ToInt(total))
|
}
|
|
// Delete
|
// @Tags 仓库
|
// @Summary 删除仓库
|
// @Produce application/json
|
// @Param id path string true "仓库id"
|
// @Success 200 {object} util.Response "成功"
|
// @Router /api-wms/v1/warehouse/warehouse/{id} [delete]
|
func (slf WarehouseController) Delete(c *gin.Context) {
|
id, _ := strconv.Atoi(c.Param("id"))
|
if id == 0 {
|
util.ResponseFormat(c, code.RequestParamError, "空的记录id")
|
return
|
}
|
|
first, err := models.NewWarehouseSearch().SetID(id).First()
|
if err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "获取仓库信息失败")
|
return
|
}
|
err = models.WithTransaction(func(tx *gorm.DB) error {
|
//删除位置信息
|
err = models.NewLocationSearch().SetOrm(tx).SetJointName(first.Code).Delete()
|
if err != nil {
|
return err
|
}
|
//删除操作类型
|
err = models.NewOperationTypeSearch().SetOrm(tx).SetWarehouseId(first.Id).Delete()
|
if err != nil {
|
return err
|
}
|
//删除仓库
|
err = models.NewWarehouseSearch().SetOrm(tx).SetID(id).Delete()
|
return err
|
})
|
if err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "删除仓库失败")
|
return
|
}
|
|
util.ResponseFormat(c, code.UpdateSuccess, "删除成功")
|
}
|
|
// GetWarehouseDetails
|
// @Tags 仓库
|
// @Summary 获取仓库详情
|
// @Produce application/json
|
// @Param id path string true "仓库id"
|
// @Success 200 {object} util.Response{data=models.Warehouse} "成功"
|
// @Router /api-wms/v1/warehouse/getWarehouseDetails/{id} [get]
|
func (slf WarehouseController) GetWarehouseDetails(c *gin.Context) {
|
id, _ := strconv.Atoi(c.Param("id"))
|
if id == 0 {
|
util.ResponseFormat(c, code.RequestParamError, "空的记录id")
|
return
|
}
|
|
first, err := models.NewWarehouseSearch().SetID(id).First()
|
if err != nil {
|
util.ResponseFormat(c, code.RequestParamError, "获取仓库信息失败")
|
return
|
}
|
util.ResponseFormat(c, code.UpdateSuccess, first)
|
}
|