| | |
| | | "github.com/shopspring/decimal" |
| | | "github.com/xuri/excelize/v2" |
| | | "gorm.io/gorm" |
| | | "sort" |
| | | "strconv" |
| | | "strings" |
| | | "time" |
| | |
| | | params.WarehouseId = operationType.WarehouseId |
| | | } |
| | | |
| | | if params.InventoryDealerType == 0 { |
| | | if params.DealerType == "" { |
| | | CheckInventoryDealerType(¶ms) |
| | | } |
| | | |
| | |
| | | |
| | | func CheckInventoryDealerType(params *models.Operation) { |
| | | var dictType constvar.MiniDictType |
| | | dictName := "其它" |
| | | dictName := "其他" |
| | | switch params.BaseOperationType { |
| | | case constvar.BaseOperationTypeIncoming: |
| | | dictType = constvar.StorageType |
| | | //dictName = "其它入库" |
| | | //dictName = dictName + "入库" |
| | | case constvar.BaseOperationTypeOutgoing: |
| | | dictType = constvar.StockoutType |
| | | //dictName = "其它出库" |
| | | //dictName = dictName + "出库" |
| | | case constvar.BaseOperationTypeInternal: |
| | | dictType = constvar.TransferType |
| | | //dictName = "其它调拨" |
| | | //dictName = dictName + "调拨" |
| | | case constvar.BaseOperationTypeDisuse: |
| | | dictType = constvar.DisuseType |
| | | //dictName = "其它报废" |
| | | //dictName = dictName + "报废" |
| | | case constvar.BaseOperationTypeAdjust: |
| | | dictType = constvar.TakeStockType |
| | | //dictName = "其它盘点" |
| | | //dictName = dictName + "盘点" |
| | | default: |
| | | return |
| | | } |
| | | miniDict, _ := models.NewMiniDictSearch().SetType(dictType).SetName(dictName).First() |
| | | if miniDict != nil { |
| | | params.InventoryDealerType = int(miniDict.ID) |
| | | } else { |
| | | dict := &models.MiniDict{ |
| | | miniDict, err := models.NewMiniDictSearch().SetType(dictType).SetName(dictName).First() |
| | | if err == gorm.ErrRecordNotFound { |
| | | miniDict = &models.MiniDict{ |
| | | Type: dictType, |
| | | Name: dictName, |
| | | } |
| | | models.NewMiniDictSearch().Create(dict) |
| | | miniDict, err := models.NewMiniDictSearch().SetType(dictType).SetName(dictName).First() |
| | | if err != nil { |
| | | return |
| | | } |
| | | params.InventoryDealerType = int(miniDict.ID) |
| | | models.NewMiniDictSearch().Create(miniDict) |
| | | } |
| | | params.DealerType = miniDict.Name |
| | | } |
| | | |
| | | // CheckDetailsRepeat 出库、入库、盘点涉及产品重复性检查(以产品编号、出库库房编号、入库库房编号) |
| | | // 存在重复值 true; 不存在返回 false |
| | | func CheckDetailsRepeat(details []*models.OperationDetails) bool { |
| | | var detailIDs []string |
| | | var tempID string |
| | | for _, v := range details { |
| | | detailIDs = append(detailIDs, v.ProductId) |
| | | if len(details) == 0 { |
| | | return false |
| | | } |
| | | sort.Strings(detailIDs) |
| | | for _, v := range detailIDs { |
| | | if v != tempID { |
| | | tempID = v |
| | | } else { |
| | | return true |
| | | } |
| | | 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 |
| | | } |
| | |
| | | |
| | | // 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") |
| | |
| | | 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) |
| | | } |
| | | |
| | |
| | | util.ResponseFormat(c, code.RequestError, "查找失败:"+err.Error()) |
| | | return |
| | | } |
| | | //userList, err := service.GetUserList() |
| | | //userList, err := user.GetUserList() |
| | | //userMap := make(map[string]string) |
| | | //if err == nil { |
| | | // for _, user := range userList { |
| | |
| | | // } |
| | | //} |
| | | 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.CreatedBy = userInfo.NickName |
| | | v.CheckedBy = userInfo.NickName |
| | | } |
| | | for _, v1 := range v.Details { |
| | |
| | | return |
| | | } |
| | | } else { |
| | | fileUrl, err = JialianOperation2(warehouse.FileTemplateCategoryIn, operation) |
| | | fileUrl, err = JialianOperation2(constvar.FileTemplateCategory_JialianInput1, operation) |
| | | if err != nil { |
| | | util.ResponseFormat(c, code.RequestParamError, err.Error()) |
| | | return |
| | |
| | | } |
| | | |
| | | } else { |
| | | fileUrl, err = JialianOperation2(warehouse.FileTemplateCategoryOut, operation) |
| | | fileUrl, err = JialianOperation2(constvar.FileTemplateCategory_JialianOutput1, operation) |
| | | if err != nil { |
| | | util.ResponseFormat(c, code.RequestParamError, err.Error()) |
| | | return |
| | |
| | | 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)]) //颜色 |
| | |
| | | } |
| | | |
| | | // 备注 第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) // 保管 |
| | |
| | | totalAmount := decimal.NewFromInt(0) // 总金额 |
| | | totalPrice := decimal.NewFromInt(0) // 总价 |
| | | rowIndex := 5 |
| | | str := "" |
| | | for i, v := range operation.Details { |
| | | //设置表单最多9条数据 |
| | | if i > 9 { |
| | | break |
| | | } |
| | | 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, "Q5", operation.Remark) // 备注 |
| | | //f.SetCellValue(sheet, "Q5", operation.Comment) // 备注 |
| | | f.SetCellValue(sheet, "Q5", str) // 备注 |
| | | |
| | | // 第14行 |
| | | f.SetCellValue(sheet, "B15", operation.Manager) // 主管 |