From b68f799ee5562864642cf925ab58391cd5544825 Mon Sep 17 00:00:00 2001
From: yinbentan <yinbentan@live.com>
Date: 星期六, 06 七月 2024 17:41:59 +0800
Subject: [PATCH] 出入库明细筛选添加仓库关联,防止脏数据污染
---
controllers/operation.go | 252 +++++++++++++++++++++++++++++++++++--------------
1 files changed, 179 insertions(+), 73 deletions(-)
diff --git a/controllers/operation.go b/controllers/operation.go
index 2cc1671..2f10d27 100644
--- a/controllers/operation.go
+++ b/controllers/operation.go
@@ -9,8 +9,6 @@
"github.com/shopspring/decimal"
"github.com/xuri/excelize/v2"
"gorm.io/gorm"
- "io/ioutil"
- "sort"
"strconv"
"strings"
"time"
@@ -63,26 +61,54 @@
return
}
- if err := slf.FormatLocation(¶ms); err != nil {
- util.ResponseFormat(c, code.RequestParamError, err.Error())
- return
- }
-
if CheckDetailsRepeat(params.Details) {
util.ResponseFormat(c, code.RequestParamError, "鏄庣粏涓笉鑳藉瓨鍦ㄩ噸澶嶇殑浜у搧")
return
}
- operationType, err := models.NewOperationTypeSearch().SetID(uint(params.OperationTypeId)).First()
- if err != nil {
- util.ResponseFormat(c, code.RequestParamError, err.Error())
+ if params.BaseOperationType != constvar.BaseOperationTypeAdjust {
+ if err := slf.FormatLocation(¶ms); err != nil {
+ util.ResponseFormat(c, code.RequestParamError, err.Error())
+ return
+ }
+
+ var operationType *models.OperationType
+ var err error
+ if params.OperationTypeId == 0 {
+ operationType, err := models.NewOperationTypeSearch().
+ SetWarehouseId(params.WarehouseId).SetBaseOperationType(params.BaseOperationType).
+ First()
+ if err != nil || params.WarehouseId != operationType.WarehouseId {
+ util.ResponseFormat(c, code.RequestParamError, "鍙傛暟缂哄け")
+ return
+ }
+ } else {
+ operationType, err = models.NewOperationTypeSearch().SetID(uint(params.OperationTypeId)).First()
+ if err != nil {
+ util.ResponseFormat(c, code.RequestParamError, err.Error())
+ return
+ }
+ }
+ params.BaseOperationType = operationType.BaseOperationType
+ params.WarehouseId = operationType.WarehouseId
+ }
+
+ if params.DealerType == "" {
+ CheckInventoryDealerType(¶ms)
+ }
+
+ userInfo := middleware.GetUserInfo(c)
+ if userInfo == nil {
+ util.ResponseFormat(c, code.SetStatusError, "鐧诲綍鐢ㄦ埛淇℃伅涓虹┖锛岃鐧诲綍鍚庨噸璇曪紒")
return
}
- userInfo := middleware.GetUserInfo(c)
params.CreatedBy = userInfo.Username
params.Status = constvar.OperationStatus_Ready
//params.Number = strconv.FormatInt(time.Now().Unix(), 10)
- params.BaseOperationType = operationType.BaseOperationType
+
+ for _, detail := range params.Details {
+ detail.BaseOperationType = params.BaseOperationType
+ }
var numberNum int64
if err := mysqlx.GetDB().Model(&models.Operation{}).Where("number=?", params.Number).Count(&numberNum).Error; err != nil {
@@ -93,7 +119,7 @@
util.ResponseFormat(c, code.RequestParamError, "鍗曞彿宸插瓨鍦�")
return
}
- err = models.WithTransaction(func(db *gorm.DB) error {
+ err := models.WithTransaction(func(db *gorm.DB) error {
if err := models.NewOperationSearch().Create(¶ms); err != nil {
return err
}
@@ -120,23 +146,57 @@
util.ResponseFormat(c, code.Success, "娣诲姞鎴愬姛")
}
-func CheckDetailsRepeat(details []*models.OperationDetails) bool {
- var detailIDs []string
- var tempID string
- for _, v := range details {
- detailIDs = append(detailIDs, v.ProductId)
+func CheckInventoryDealerType(params *models.Operation) {
+ var dictType constvar.MiniDictType
+ dictName := "鍏朵粬"
+ switch params.BaseOperationType {
+ case constvar.BaseOperationTypeIncoming:
+ dictType = constvar.StorageType
+ //dictName = dictName + "鍏ュ簱"
+ case constvar.BaseOperationTypeOutgoing:
+ dictType = constvar.StockoutType
+ //dictName = dictName + "鍑哄簱"
+ case constvar.BaseOperationTypeInternal:
+ dictType = constvar.TransferType
+ //dictName = dictName + "璋冩嫧"
+ case constvar.BaseOperationTypeDisuse:
+ dictType = constvar.DisuseType
+ //dictName = dictName + "鎶ュ簾"
+ case constvar.BaseOperationTypeAdjust:
+ dictType = constvar.TakeStockType
+ //dictName = dictName + "鐩樼偣"
+ default:
+ return
}
- sort.Strings(detailIDs)
- for _, v := range detailIDs {
- if v != tempID {
- tempID = v
- } else {
- return true
+ miniDict, err := models.NewMiniDictSearch().SetType(dictType).SetName(dictName).First()
+ if err == gorm.ErrRecordNotFound {
+ miniDict = &models.MiniDict{
+ Type: dictType,
+ Name: dictName,
}
+ models.NewMiniDictSearch().Create(miniDict)
+ }
+ params.DealerType = miniDict.Name
+}
+
+// CheckDetailsRepeat 鍑哄簱銆佸叆搴撱�佺洏鐐规秹鍙婁骇鍝侀噸澶嶆�ф鏌ワ紙浠ヤ骇鍝佺紪鍙枫�佸嚭搴撳簱鎴跨紪鍙枫�佸叆搴撳簱鎴跨紪鍙凤級
+// 瀛樺湪閲嶅鍊� true锛� 涓嶅瓨鍦ㄨ繑鍥� false
+func CheckDetailsRepeat(details []*models.OperationDetails) bool {
+ if len(details) == 0 {
+ return false
+ }
+ var detailKeyMap = make(map[string]bool)
+ for _, v := range details {
+ key := fmt.Sprintf("%v%v%v", v.ProductId, v.FromLocationID, v.ToLocationID)
+ detailKeyMap[key] = true
+ }
+ if len(detailKeyMap) != len(details) { // 闀垮害鐩稿悓锛屼笉瀛樺湪閲嶅鍊硷紱闀垮害涓嶅悓瀛樺湪瀛樺湪涓嶅悓
+ return true
}
return false
}
+// FormatLocation 浣嶇疆妫�鏌�
func (slf OperationController) FormatLocation(params *models.Operation) error {
operationType, err := models.NewOperationTypeSearch().SetID(uint(params.OperationTypeId)).First()
if err != nil {
@@ -191,16 +251,18 @@
}
if params.OperationTypeId == 0 && int(params.BaseOperationType) == 0 {
- return errors.New("鏈瘑鍒璁板綍绫诲瀷")
+ return errors.New("鏈瘑鍒璁板綍绫诲瀷1")
+ } else if params.OperationTypeId == 0 && params.BaseOperationType != 0 && params.WarehouseId == 0 {
+ return errors.New("鏈瘑鍒璁板綍绫诲瀷2")
}
if params.OperationDate == "" {
return errors.New("璇烽�夋嫨瀹夋帓鏃ユ湡")
}
- if params.LocationID == 0 {
- return errors.New("璇烽�夋嫨婧愪綅缃�")
- }
+ //if params.LocationID == 0 {
+ // return errors.New("璇烽�夋嫨婧愪綅缃�")
+ //}
if len(params.Details) <= 0 {
return errors.New("璇锋坊鍔犳槑缁嗕俊鎭�")
@@ -224,12 +286,11 @@
// GetOperationInfo
// @Tags 鍏ュ簱/鍑哄簱
-// @Summary 鍏ュ簱/鍑哄簱鍒楄〃
+// @Summary 鎿嶄綔璇︽儏鎺ュ彛
// @Produce application/json
-//
-// @Param id path string true "id"
-//
-// @Success 200 {object} util.Response "鎴愬姛"
+// @Param id path string true "id"
+// @Param Authorization header string true "token"
+// @Success 200 {object} util.Response{data=models.Operation} "鎴愬姛"
// @Router /api-wms/v1/operation/getOperationInfo/{id} [get]
func (slf OperationController) GetOperationInfo(c *gin.Context) {
number := c.Param("id")
@@ -243,6 +304,26 @@
util.ResponseFormat(c, code.RequestParamError, err.Error())
return
}
+
+ if operation.BaseOperationType == constvar.BaseOperationTypeOutgoing || operation.BaseOperationType == constvar.BaseOperationTypeInternal { //鏌ヨ瀹炴椂鍦ㄥ簱搴撳瓨
+ productIds := make([]string, 0)
+ locationIds := make([]int, 0)
+ for _, v := range operation.Details {
+ productIds = append(productIds, v.ProductId)
+ locationIds = append(locationIds, v.FromLocationID)
+ }
+ locationAmountMap, err := service.GetLocationAmounts(productIds, locationIds)
+ if err != nil {
+ util.ResponseFormat(c, code.RequestParamError, "鏌ヨ浜у搧搴撳瓨閿欒")
+ return
+ }
+ for _, v := range operation.Details {
+ if locationAmountMap[v.ProductId] != nil {
+ v.StockAmount = locationAmountMap[v.ProductId][v.FromLocationID]
+ }
+ }
+ }
+
util.ResponseFormat(c, code.Success, operation)
}
@@ -251,7 +332,7 @@
// @Summary 鍏ュ簱/鍑哄簱鍒楄〃
// @Produce application/json
// @Param object body request.OperationList true "鏌ヨ鍙傛暟"
-// @Success 200 {object} util.Response "鎴愬姛"
+// @Success 200 {object} util.ResponseList{data=[]models.Operation} "鎴愬姛"
// @Router /api-wms/v1/operation/list [post]
func (slf OperationController) List(c *gin.Context) {
var params request.OperationList
@@ -282,12 +363,33 @@
costMap[material.ID] = material.Cost
salePriceMap[material.ID] = material.SalePrice
}
- list, total, err := search.SetOperationTypeId(params.OperationTypeId).SetPreload(true).SetOrder("created_at desc").Find()
+ list, total, err := search.SetOperationTypeId(params.OperationTypeId).
+ SetBaseOperationType(params.BaseOperationType).
+ SetPreload(true).SetOrder("created_at desc").Find()
if err != nil {
util.ResponseFormat(c, code.RequestError, "鏌ユ壘澶辫触:"+err.Error())
return
}
+ //userList, err := user.GetUserList()
+ //userMap := make(map[string]string)
+ //if err == nil {
+ // for _, user := range userList {
+ // userMap[user.UserName] = user.NickName
+ // }
+ //}
+ userInfo := middleware.GetUserInfo(c)
+ if userInfo == nil {
+ util.ResponseFormat(c, code.SetStatusError, "鐧诲綍鐢ㄦ埛淇℃伅涓虹┖锛岃鐧诲綍鍚庨噸璇曪紒")
+ return
+ }
for _, v := range list {
+ v.CreatedBy = userInfo.NickName
+ //if err == nil {
+ if userInfo != nil {
+ // v.CreatedBy = userMap[v.CreatedBy]
+ // v.CheckedBy = userMap[v.CheckedBy]
+ v.CheckedBy = userInfo.NickName
+ }
for _, v1 := range v.Details {
//v1.SalePrice = decimal.NewFromFloat(1.2345)
//v1.Cost = decimal.NewFromFloat(9.678)
@@ -303,8 +405,8 @@
if !params.PageInfo.Check() {
return errors.New("鏁版嵁鍒嗛〉淇℃伅閿欒")
}
- if params.OperationTypeId == 0 {
- return errors.New("operationTypeId涓�0")
+ if params.OperationTypeId == 0 && params.BaseOperationType == 0 {
+ return errors.New("operationTypeId鍜宐aseOperationType涓嶈兘鍚屾椂涓�0")
}
return nil
}
@@ -339,9 +441,12 @@
util.ResponseFormat(c, code.RequestParamError, "鏄庣粏涓笉鑳藉瓨鍦ㄩ噸澶嶇殑浜у搧")
return
}
- if err := slf.FormatLocation(¶ms); err != nil {
- util.ResponseFormat(c, code.RequestParamError, err.Error())
- return
+
+ if params.BaseOperationType != constvar.BaseOperationTypeAdjust {
+ if err := slf.FormatLocation(¶ms); err != nil {
+ util.ResponseFormat(c, code.RequestParamError, err.Error())
+ return
+ }
}
if err := models.WithTransaction(func(tx *gorm.DB) error {
if err := models.NewOperationDetailsSearch().SetOrm(tx).SetOperationId(params.Id).Delete(); err != nil {
@@ -753,22 +858,19 @@
return
}
- if warehouse.FileTemplateCategoryIn == constvar.FileTemplateCategory_JialianInput1 {
- fileUrl, err = JialianOperation2(warehouse.FileTemplateCategoryIn, operation)
- if err != nil {
- util.ResponseFormat(c, code.RequestParamError, err.Error())
- return
- }
-
- } else if warehouse.FileTemplateCategoryIn == constvar.FileWarehouseCategory_JialianInput2 {
+ if warehouse.FileTemplateCategoryIn == constvar.FileWarehouseCategory_JialianInput2 {
fileUrl, err = JialianOperation1(warehouse.FileTemplateCategoryIn, operation)
if err != nil {
util.ResponseFormat(c, code.RequestParamError, err.Error())
return
}
-
+ } else {
+ fileUrl, err = JialianOperation2(constvar.FileTemplateCategory_JialianInput1, operation)
+ if err != nil {
+ util.ResponseFormat(c, code.RequestParamError, err.Error())
+ return
+ }
}
-
} else if companyName == "geruimi" {
fileUrl, err = ExportInputSelfmade(constvar.FileTemplateCategory_Selfmade, operation)
if err != nil {
@@ -793,15 +895,15 @@
return
}
- if warehouse.FileTemplateCategoryOut == constvar.FileTemplateCategory_JialianOutput1 {
- fileUrl, err = JialianOperation2(warehouse.FileTemplateCategoryOut, operation)
+ if warehouse.FileTemplateCategoryOut == constvar.FileWarehouseCategory_JialianOutput2 {
+ fileUrl, err = JialianOperation1(warehouse.FileTemplateCategoryOut, operation)
if err != nil {
util.ResponseFormat(c, code.RequestParamError, err.Error())
return
}
- } else if warehouse.FileTemplateCategoryOut == constvar.FileWarehouseCategory_JialianOutput2 {
- fileUrl, err = JialianOperation1(warehouse.FileTemplateCategoryOut, operation)
+ } else {
+ fileUrl, err = JialianOperation2(constvar.FileTemplateCategory_JialianOutput1, operation)
if err != nil {
util.ResponseFormat(c, code.RequestParamError, err.Error())
return
@@ -841,8 +943,6 @@
// 璇诲彇妯℃澘鍐呭
f, err := excelize.OpenReader(readerCloser)
- //fl, err := os.Open("E:\\瀹剁汉鍑哄叆搴撳崟.xlsx")
- //f, err := excelize.OpenReader(fl)
if err != nil {
return "", errors.New("璇诲彇excel妯$増澶辫触锛�" + err.Error())
}
@@ -894,11 +994,13 @@
totalAmount := decimal.NewFromInt(0) // 鎬婚噾棰�
totalPrice := decimal.NewFromInt(0) // 鎬讳环
rowIndex := 6
+ str := ""
for i, v := range operation.Details {
//璁剧疆琛ㄥ崟鏈�澶�6鏉℃暟鎹�
if i > 6 {
break
}
+ str += v.Remark
f.SetCellValue(sheet, "B"+strconv.Itoa(rowIndex), v.Product.Name) // 浜у搧鍚嶇О
f.SetCellValue(sheet, "C"+strconv.Itoa(rowIndex), v.Product.Specs) //瑙勬牸
f.SetCellValue(sheet, "D"+strconv.Itoa(rowIndex), attributeValueMap[fmt.Sprintf("%d%s", attributeMap["棰滆壊"], v.ProductId)]) //棰滆壊
@@ -958,7 +1060,8 @@
}
// 澶囨敞 绗�13琛�
- f.SetCellValue(sheet, "B13", "澶囨敞锛�"+operation.Remark)
+ //f.SetCellValue(sheet, "B13", "澶囨敞锛�"+operation.Comment)
+ f.SetCellValue(sheet, "B13", "澶囨敞锛�"+str)
// 绗�14琛�
f.SetCellValue(sheet, "C14", operation.Manager) // 瀹℃牳
f.SetCellValue(sheet, "F14", operation.Accountant) // 淇濈
@@ -969,9 +1072,7 @@
}
fileUrl, err := upload.UploadFileToSeaWeed(string(constvar.FileType_File), uuid.NewV4().String()+".xlsx", buf.Bytes())
- ioutil.WriteFile("E:\\"+uuid.NewV4().String()+".xlsx", buf.Bytes(), 0644)
if err != nil {
- //ioutil.WriteFile("E:\\"+uuid.NewV4().String()+".xlsx", buf.Bytes(), 0644)
logx.Errorf("file upload err: %v", err)
return "", err
}
@@ -1002,25 +1103,32 @@
sheet := "Sheet1"
f.SetCellValue(sheet, "A2", "鍗曚綅(閮ㄩ棬):"+operation.CompanyName) // 鍗曚綅閮ㄩ棬
- f.SetCellValue(sheet, "H2", operation.OperationDate) // 鏃堕棿
- f.SetCellValue(sheet, "O2", operation.Number) // 缂栧彿
+ f.SetCellValue(sheet, "J2", operation.OperationDate) // 鏃堕棿
+ f.SetCellValue(sheet, "Q2", operation.Number) // 缂栧彿
totalAmount := decimal.NewFromInt(0) // 鎬婚噾棰�
totalPrice := decimal.NewFromInt(0) // 鎬讳环
rowIndex := 5
+ str := ""
for i, v := range operation.Details {
//璁剧疆琛ㄥ崟鏈�澶�9鏉℃暟鎹�
if i > 9 {
break
}
- f.SetCellValue(sheet, "A"+strconv.Itoa(rowIndex), v.Product.Name) // 浜у搧鍚嶇О
- f.SetCellValue(sheet, "B"+strconv.Itoa(rowIndex), v.Product.Specs) //瑙勬牸
- f.SetCellValue(sheet, "C"+strconv.Itoa(rowIndex), v.TotalGrossWeight.String()) //閲嶉噺
- f.SetCellValue(sheet, "D"+strconv.Itoa(rowIndex), v.Amount.String()) //鏁伴噺
- f.SetCellValue(sheet, "E"+strconv.Itoa(rowIndex), v.AuxiliaryAmount.String()) //杈呭姪鏁伴噺
- f.SetCellValue(sheet, "F"+strconv.Itoa(rowIndex), v.AuxiliaryUnit) //杈呭姪鍗曚綅
+ str += v.Remark
+ f.SetCellValue(sheet, "A"+strconv.Itoa(rowIndex), v.Product.Name) // 鍝佸悕
+ f.SetCellValue(sheet, "B"+strconv.Itoa(rowIndex), v.Product.Type) // 鍨嬪彿
+ f.SetCellValue(sheet, "C"+strconv.Itoa(rowIndex), v.Product.Unit) // 鍗曚綅
+ f.SetCellValue(sheet, "D"+strconv.Itoa(rowIndex), v.Amount.String()) // 鏁伴噺
+ unit := service.CreateMoreUnit(v.Amount, v.Product.MoreUnitList)
+ for _, v1 := range unit {
+ if !v1.Amount.IsZero() {
+ f.SetCellValue(sheet, "E"+strconv.Itoa(rowIndex), v1.Amount) // 杈呮暟閲�
+ f.SetCellValue(sheet, "F"+strconv.Itoa(rowIndex), v1.Unit) // 杈呭崟浣�
+ break
+ }
+ }
f.SetCellValue(sheet, "G"+strconv.Itoa(rowIndex), v.Product.SalePrice.String()) // 鍗曚环
-
// 閲戦
if !v.Product.SalePrice.IsZero() {
ap := v.Amount.Mul(v.Product.SalePrice)
@@ -1071,7 +1179,8 @@
}
}
- f.SetCellValue(sheet, "Q5", operation.Remark) // 澶囨敞
+ //f.SetCellValue(sheet, "Q5", operation.Comment) // 澶囨敞
+ f.SetCellValue(sheet, "Q5", str) // 澶囨敞
// 绗�14琛�
f.SetCellValue(sheet, "B15", operation.Manager) // 涓荤
@@ -1084,7 +1193,6 @@
}
fileUrl, err := upload.UploadFileToSeaWeed(string(constvar.FileType_File), uuid.NewV4().String()+".xlsx", buf.Bytes())
- ioutil.WriteFile("E:\\"+uuid.NewV4().String()+".xlsx", buf.Bytes(), 0644)
if err != nil {
logx.Errorf("file upload err: %v", err)
return "", err
@@ -1168,7 +1276,6 @@
logx.Errorf("file upload err: %v", err)
return "", err
}
-
return fileUrl, nil
}
@@ -1343,8 +1450,7 @@
// @Tags 鍏ュ簱/鍑哄簱
// @Summary 鑾峰彇浜哄憳鍒楄〃
// @Produce application/json
-// @Param object body request.OperationCondition true "鍙傛暟"
-// @Success 200 {object} util.ResponseList{data=[]inventory_order.WorkerInfo} "鎴愬姛"
+// @Success 200 {object} util.Response "鎴愬姛"
// @Router /api-wms/v1/operation/getPersonnelList [get]
func (slf OperationController) GetPersonnelList(c *gin.Context) {
cli := inventory_order.NewInventoryOrderServiceClient(init_client.ApsConn)
--
Gitblit v1.8.0