jiangshuai
2023-09-27 65f900c88f0f90ee3b29e9b985723b8f94aaeb0b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package controllers
 
import (
    "fmt"
    "github.com/gin-gonic/gin"
    "github.com/shopspring/decimal"
    "gorm.io/gorm"
    "strconv"
    "time"
    "wms/constvar"
    "wms/extend/code"
    "wms/extend/util"
    "wms/models"
    "wms/request"
)
 
type LocationProductAmountController struct {
}
 
// List
// @Tags      库存盘点
// @Summary   库存盘点列表
// @Produce   application/json
// @Param         object  body  request.PageInfo true  "查询参数"
// @Success   200 {object} util.Response    "成功"
// @Router    /api-wms/v1/locationProductamount/list [post]
func (slf LocationProductAmountController) List(c *gin.Context) {
    var params request.PageInfo
    if err := c.BindJSON(&params); err != nil {
        util.ResponseFormat(c, code.RequestParamError, "参数解析失败,数据类型错误:"+err.Error())
        return
    }
    if params.Check() {
        util.ResponseFormat(c, code.RequestParamError, "参数异常")
        return
    }
 
    search := models.NewLocationProductAmountSearch()
    search.SetPage(params.Page, params.PageSize)
 
    search.Orm = search.Orm.Model(&models.LocationProductAmountWithOperation{}).Table("wms_location_product_amount").Select("wms_location_product_amount.*,wms_operation.amount as adjust_amount").InnerJoins("inner join wms_location_product on wms_location_product.id=wms_location_product_amount.location_product_id").InnerJoins("inner join wms_operation_details on wms_operation_details.product_id=wms_location_product.product_id").InnerJoins("inner join wms_operation on wms_operation.id=wms_operation_details.operation_id").Where("wms_operation.base_operation_type=?", constvar.BaseOperationTypeAdjust)
 
    var (
        records = make([]*models.ResponseDisuseList, 0)
        total   int64
    )
 
    if err := search.Orm.Count(&total).Error; err != nil {
        util.ResponseFormat(c, code.RequestError, fmt.Errorf("find count err: %v", err))
        return
    }
    search.Orm = search.Orm.Preload("LocationProduct").Preload("LocationProduct.Location").Preload("LocationProduct.Product")
    if params.Page*params.PageSize > 0 {
        search.Orm = search.Orm.Offset((params.Page - 1) * params.PageSize).Limit(params.PageSize)
    }
    if err := search.Orm.Find(&records).Error; err != nil {
        util.ResponseFormat(c, code.RequestError, fmt.Errorf("find count err: %v", err))
        return
    }
 
    util.ResponseFormatListWithPage(c, code.Success, records, int(total), params.Page, params.PageSize)
}
 
// Add
// @Tags      库存盘点
// @Summary   添加库存盘点信息
// @Produce   application/json
// @Param     object  body  request.AddLocationProductAmount true  "入库/出库信息"
// @Success   200 {object} util.Response "成功"
// @Router    /api-wms/v1/locationProductamount/add [post]
func (slf LocationProductAmountController) Add(c *gin.Context) {
    var reqParams request.AddLocationProductAmount
    if err := c.BindJSON(&reqParams); err != nil {
        util.ResponseFormat(c, code.RequestParamError, "参数解析失败,数据类型错误")
        return
    }
    if reqParams.LocationId == 0 {
        util.ResponseFormat(c, code.RequestParamError, "参数异常,请选择位置")
        return
    }
    if reqParams.ProductId == "" {
        util.ResponseFormat(c, code.RequestParamError, "参数异常,请选择产品")
        return
    }
 
    var existCount int64
    if err := models.NewOperationSearch().Orm.Table("wms_operation").InnerJoins("inner join wms_operation_details on wms_operation_details.operation_id=wms_operation.id").Where("wms_operation.from_location_id=? and wms_operation_details.product_id=? and wms_operation.base_operation_type=? and wms_operaton.status=?", reqParams.LocationId, reqParams.ProductId, constvar.BaseOperationTypeAdjust, constvar.OperationStatus_Ready).Count(&existCount).Error; err != nil {
        util.ResponseFormat(c, code.RequestParamError, err.Error())
        return
    }
    if existCount > 0 {
        util.ResponseFormat(c, code.RequestError, "该商品在已选中的位置存在未验证的库存盘点信息,无法继续添加相关信息")
        return
    }
 
    locProduct, err := models.NewLocationProductSearch().SetLocationId(reqParams.LocationId).SetProductId(reqParams.ProductId).First()
    if err != nil {
        util.ResponseFormat(c, code.RequestParamError, "参数异常,未找到该上架规则")
        return
    }
    if locProduct.Id == 0 {
        util.ResponseFormat(c, code.RequestError, "不存在该上架规则,无法进行库存盘点")
        return
    }
    location, err := models.NewLocationSearch().SetType(int(constvar.LocationTypeAdjust)).First()
    if err != nil {
        util.ResponseFormat(c, code.RequestParamError, err.Error())
        return
    }
    reqParams.AdjustAmount = reqParams.Amount.Sub(reqParams.DifferenceAmount)
    //reqParams.AdjustAmount = reqParams.DifferenceAmount.Sub(reqParams.Amount)
    locAmount := models.LocationProductAmount{
        LocationProductId: locProduct.Id,
        Amount:            decimal.NewFromInt(0),
    }
    detail := &models.OperationDetails{
        ProductId: reqParams.ProductId,
        Amount:    reqParams.AdjustAmount,
    }
    operation := models.Operation{
        Number:            strconv.FormatInt(time.Now().Unix(), 10),
        Status:            constvar.OperationStatus_Ready,
        OperationDate:     time.Now().Format("2006-01-02 15:04:05"),
        Comment:           "库存盘点",
        BaseOperationType: constvar.BaseOperationTypeAdjust,
        Details:           []*models.OperationDetails{detail},
        FromLocationID:    reqParams.LocationId,
        ToLocationID:      location.Id,
    }
 
    //if reqParams.AdjustAmount.GreaterThanOrEqual(decimal.NewFromInt(0)) {
    //    operation.FromLocationID = Location.Id
    //    operation.ToLocationID = reqParams.LocationId
    //} else {
    //    operation.FromLocationID = reqParams.LocationId
    //    operation.ToLocationID = Location.Id
    //}
 
    if err := models.WithTransaction(func(tx *gorm.DB) error {
        if err := models.NewOperationSearch().SetOrm(tx).Create(&operation); err != nil {
            return err
        }
        if err := models.NewLocationProductAmountSearch().SetOrm(tx).Create(&locAmount); err != nil {
            return err
        }
        return nil
    }); err != nil {
        util.ResponseFormat(c, code.RequestError, err.Error())
        return
    }
 
    util.ResponseFormat(c, code.Success, "添加成功")
}