From d6472c05b4b3b1777cecf6b74f8cfc23967d1713 Mon Sep 17 00:00:00 2001 From: chenlin Date: Thu, 19 Sep 2024 20:19:53 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BF=AE=E6=94=B9=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E8=B0=83=E6=8B=A8=E5=85=A5=E5=BA=93=E7=BC=96=E5=8F=B7=E7=94=9F?= =?UTF-8?q?=E6=88=90=E8=A7=84=E5=88=99=EF=BC=9B=202=E3=80=81=E9=87=87?= =?UTF-8?q?=E8=B4=AD=E5=85=A5=E5=BA=93=E7=9A=84=E8=AE=A1=E5=88=92=E5=8D=95?= =?UTF-8?q?=E4=BB=B7=E5=92=8C=E6=89=A7=E8=A1=8C=E5=8D=95=E4=BB=B7=E4=BF=9D?= =?UTF-8?q?=E7=95=993=E4=BD=8D=E5=B0=8F=E6=95=B0=EF=BC=8C=E6=96=B9?= =?UTF-8?q?=E4=BE=BF=E9=87=87=E8=B4=AD=E5=A4=84=E7=90=86=E9=99=A4=E4=B8=8D?= =?UTF-8?q?=E5=B0=BD=E7=9A=84=E6=83=85=E5=86=B5=EF=BC=9B=203=E3=80=81?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=95=86=E5=93=81=E8=B5=84=E6=96=99=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E5=85=A5=E5=8F=82=E5=88=86=E9=A1=B5=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E6=8E=A5=E5=8F=A3=E6=8A=A5=E9=94=99=E7=9A=84?= =?UTF-8?q?=E7=BC=BA=E9=99=B7=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/apis/purchasemanage/purchase.go | 1 + app/admin/models/commodity.go | 4 ++ app/admin/models/purchase.go | 67 ++++++++++++++++++----- tools/utils.go | 5 ++ 4 files changed, 62 insertions(+), 15 deletions(-) diff --git a/app/admin/apis/purchasemanage/purchase.go b/app/admin/apis/purchasemanage/purchase.go index af450dd..6af9f37 100644 --- a/app/admin/apis/purchasemanage/purchase.go +++ b/app/admin/apis/purchasemanage/purchase.go @@ -285,6 +285,7 @@ func ErpPurchaseDetail(c *gin.Context) { v.EffectiveCount = nCount // 有效数量 v.ErpCategoryID = erpCommodity.ErpCategoryId v.ErpCategoryName = erpCommodity.ErpCategoryName + v.Price = math.Round(v.Price*1000) / 1000 commodityList = append(commodityList, v) } diff --git a/app/admin/models/commodity.go b/app/admin/models/commodity.go index f1a848b..943b28c 100644 --- a/app/admin/models/commodity.go +++ b/app/admin/models/commodity.go @@ -509,6 +509,10 @@ func (m *ErpCommodityListReq) List() (*ErpCommodityListResp, error) { // 计算分页所需的切片索引 startIndex := page * m.PageSize + if (len(commodities)/m.PageSize + 1) < startIndex { + startIndex = 0 + page = 0 + } endIndex := (page + 1) * m.PageSize if endIndex > len(commodities) { endIndex = len(commodities) diff --git a/app/admin/models/purchase.go b/app/admin/models/purchase.go index 2dd697b..dbb9d2b 100644 --- a/app/admin/models/purchase.go +++ b/app/admin/models/purchase.go @@ -782,29 +782,63 @@ func (m *ErpPurchaseOrder) IdInit() error { return nil } -// GetPurchaseInventorySn 生成入库编号 +//// GetPurchaseInventorySn 生成入库编号 有重复的情况 +//func GetPurchaseInventorySn() string { +// count := 0 +// for { +// if count > 5 { +// return "" +// } +// nowTime := time.Now() +// sn := nowTime.Format("060102") +// sn += fmt.Sprintf("%d", nowTime.Unix()%100) +// rand.Seed(nowTime.UnixNano()) +// sn += fmt.Sprintf("%d", rand.Int31n(100)) +// exist, err := QueryRecordExist(fmt.Sprintf("SELECT * FROM erp_purchase_inventory WHERE serial_number='%s'", sn)) +// if err != nil { +// logger.Error("sn err:", logger.Field("err", err)) +// count++ +// continue +// } +// if err == nil && !exist { +// return sn +// } +// return "" +// } +//} + +var mu sync.Mutex + +// GetPurchaseInventorySn generates a unique inventory serial number func GetPurchaseInventorySn() string { - count := 0 - for { - if count > 5 { - return "" - } + const maxRetries = 5 + + mu.Lock() + defer mu.Unlock() + + for retryCount := 0; retryCount < maxRetries; retryCount++ { nowTime := time.Now() - sn := nowTime.Format("060102") - sn += fmt.Sprintf("%d", nowTime.Unix()%100) - rand.Seed(nowTime.UnixNano()) - sn += fmt.Sprintf("%d", rand.Int31n(100)) + // 使用日期格式精确到天 + datePart := nowTime.Format("060102") // 格式为 YYMMDD + // 生成10位随机数 + rand.Seed(nowTime.UnixNano() + int64(retryCount)) // 为了确保每次生成不同的随机数 + randomNum := rand.Int63n(1e10) // 10位随机数,范围从0到9999999999 + randomPart := fmt.Sprintf("%010d", randomNum) // 确保随机数是10位的,前面补零 + + // 拼接日期部分和随机数部分 + sn := fmt.Sprintf("%s%s", datePart, randomPart) + exist, err := QueryRecordExist(fmt.Sprintf("SELECT * FROM erp_purchase_inventory WHERE serial_number='%s'", sn)) if err != nil { logger.Error("sn err:", logger.Field("err", err)) - count++ continue } - if err == nil && !exist { + if !exist { return sn } - return "" } + + return "" // 返回空字符串,如果在最大重试次数后仍未找到唯一编号 } // CheckCreateErpPurchaseOrderParam 新增采购订单-检查参数 @@ -1296,8 +1330,8 @@ func InventoryErpPurchaseUpdateStock(gdb *gorm.DB, list []ErpPurchaseInventory, ErpCategoryName: commodityInfo.ErpCategoryName, ErpSupplierId: purchaseOrder.ErpSupplierId, ErpSupplierName: purchaseOrder.ErpSupplierName, - StaffCostPrice: tools.RoundToTwoDecimalPlaces(v.EmployeePrice - v.ImplementationPrice), - WholesalePrice: tools.RoundToTwoDecimalPlaces(v.ImplementationPrice), + StaffCostPrice: tools.RoundToThreeDecimalPlaces(v.EmployeePrice - v.ImplementationPrice), + WholesalePrice: tools.RoundToThreeDecimalPlaces(v.ImplementationPrice), State: InStock, StorageType: PurchaseInventory, // 采购入库 FirstStockTime: nowTime, @@ -5740,6 +5774,9 @@ func CancelAuditUpdateStock(begin *gorm.DB, req ErpPurchaseOrder) error { // Inventories: inventoryList, //} + // 赋值采购退货单号 + purchaseOrder.RejectedSerialNumber = purchaseOrder.SerialNumber + // 按照采购退货更新库存 err = InventoryErpPurchaseUpdateRejectStock(begin, inventoryList, purchaseOrder) if err != nil { diff --git a/tools/utils.go b/tools/utils.go index dc7fa11..dc8de87 100644 --- a/tools/utils.go +++ b/tools/utils.go @@ -116,6 +116,11 @@ func RoundToTwoDecimalPlaces(num float64) float64 { return math.Round(num*100) / 100 } +// RoundToThreeDecimalPlaces 将float64类型四舍五入保留3位小数 +func RoundToThreeDecimalPlaces(num float64) float64 { + return math.Round(num*1000) / 1000 +} + // Uint32SliceContains 检查 uint32 切片中是否包含特定的值 func Uint32SliceContains(slice []uint32, val uint32) bool { for _, item := range slice {