| 
					
				 | 
			
			
				@@ -12,14 +12,72 @@ import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"fmt" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"github.com/beego/beego/v2/core/logs" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"gorm.io/gorm" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"math/rand" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"sort" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"strconv" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"strings" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"time" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 type StockTemplate struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (e *StockTemplate) GetStockNumber(stock string) (number string, err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	switch stock { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	case models.TypeStockIn: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var stockIn models.StockIn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			rand.New(rand.NewSource(time.Now().UnixNano())) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 生成随机数后八位 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			randomSuffix := rand.Intn(99999999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 格式化年月日 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			date := time.Now().Format("20060102") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 组合成16位随机数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			randomNumber := fmt.Sprintf("%s%08d", date, randomSuffix) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 查询数据库,检查随机数是否存在 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if err = db.DB.Where("number = ?", randomNumber).First(&stockIn).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if err == gorm.ErrRecordNotFound { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return "RK" + randomNumber, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					logs.Error("db error: %s", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return number, err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	case models.TypeStockOut: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var stockOut models.StockOut 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			rand.New(rand.NewSource(time.Now().UnixNano())) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 生成随机数后八位 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			randomSuffix := rand.Intn(99999999) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 格式化年月日 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			date := time.Now().Format("20060102") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 组合成16位随机数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			randomNumber := fmt.Sprintf("%s%08d", date, randomSuffix) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 查询数据库,检查随机数是否存在 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if err = db.DB.Where("number = ?", randomNumber).First(&stockOut).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if err == gorm.ErrRecordNotFound { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return "CK" + randomNumber, nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					logs.Error("db error: %s", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return number, err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return number, errors.New("生成随机数失败") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // GetMedicineInfo 通过名称、生产企业、规格、批号查询药品信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (e *StockTemplate) GetMedicineInfo(deptId int, medicine map[string]interface{}) (medicineInfo map[string]interface{}, err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -31,6 +89,65 @@ func (e *StockTemplate) GetMedicineInfo(deptId int, medicine map[string]interfac 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	err = db.DB.Raw(sql, productID, enterpriseID, specID, batchNumber).Scan(&medicineInfo).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (e *StockTemplate) GetMedicineInfoForImg(medicine map[string]interface{}) (medicineImg models.MedicineImg, err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	productID := utils.ToInt(medicine[models.FieldProductID]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	enterpriseID := utils.ToInt(medicine[models.FieldEnterpriseID]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	specID := utils.ToInt(medicine[models.FieldSpecID]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	unitID := utils.ToInt(medicine[models.FieldUnitID]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	dosageFormID := utils.ToInt(medicine[models.FieldDosageFormID]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	batchNumber := utils.ToString(medicine[models.FieldBatchNumber]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	medicineImg.BatchNumber = batchNumber 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	medicineImg.ApprovalNumber = utils.ToString(medicine[models.FieldApprovalNumber]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	medicineImg.QualificationNumber = utils.ToString(medicine[models.FieldQualificationNumber]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	medicineImg.ProductionDate = utils.ToString(medicine[models.FieldProducedDate]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	medicineImg.ExpiryDate = utils.ToString(medicine[models.FieldExpiryDate]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	product := models.Product{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err = db.DB.Model(&product).First(&product, productID).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		medicineImg.Product = product.Name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	enterprise := models.Enterprise{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err = db.DB.Model(&enterprise).First(&enterprise, enterpriseID).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		medicineImg.Enterprise = enterprise.Name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	spec := models.Spec{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err = db.DB.Model(&spec).First(&spec, specID).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		medicineImg.Spec = spec.Name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	unit := models.Unit{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if unitID > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err = db.DB.Model(&unit).First(&unit, unitID).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			medicineImg.Unit = unit.Name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	dosageForm := models.DosageForm{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if dosageFormID > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err = db.DB.Model(&dosageForm).First(&dosageForm, dosageFormID).Error; err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			medicineImg.DosageForm = dosageForm.Name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (e *StockTemplate) GetMedicineInfoScanCodeForImg(medicine map[string]interface{}) (medicineImg models.MedicineImg, err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	medicineImg.Product = utils.ToString(medicine[models.FieldProductName]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	medicineImg.Enterprise = utils.ToString(medicine[models.FieldEnterpriseName]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	medicineImg.Spec = utils.ToString(medicine[models.FieldSpecName]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	medicineImg.Unit = utils.ToString(medicine[models.FieldUnitName]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	medicineImg.DosageForm = utils.ToString(medicine[models.FieldDosageFormName]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	medicineImg.BatchNumber = utils.ToString(medicine[models.FieldBatchNumber]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	medicineImg.ApprovalNumber = utils.ToString(medicine[models.FieldApprovalNumber]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	medicineImg.QualificationNumber = utils.ToString(medicine[models.FieldQualificationNumber]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	medicineImg.ProductionDate = utils.ToString(medicine[models.FieldProducedDate]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	medicineImg.ExpiryDate = utils.ToString(medicine[models.FieldExpiryDate]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // FirstOrCreateMedicineInfo 查询或创建 品名、生产企业、规格、单位、剂型 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (e *StockTemplate) FirstOrCreateMedicineInfo(deptId, createBy int, medicine *map[string]interface{}) (err error) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -116,6 +233,13 @@ func (e *StockTemplate) FirstOrCreateMedicineInfo(deptId, createBy int, medicine 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // BatchStockTemplateIn 批量入库 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (e *StockTemplate) BatchStockTemplateIn(req *dto.BatchStockTemplateInInsertReq) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	number, err := e.GetStockNumber(models.TypeStockIn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		logs.Error("获取: %s", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	//var err error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	tx := db.DB.Begin() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -135,7 +259,7 @@ func (e *StockTemplate) BatchStockTemplateIn(req *dto.BatchStockTemplateInInsert 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			for k, v := range c.MedicineInfo { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				sql += fmt.Sprintf("`%s`='%v',", k, v) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			sql += fmt.Sprintf("`%s`='%v',", "purchase_unit_price", c.UnitPrice) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			sql += fmt.Sprintf("`%s`='%v',", "unit_price", c.UnitPrice) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			sql = sql[:len(sql)-1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			err = tx.Exec(sql).Error 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -150,9 +274,32 @@ func (e *StockTemplate) BatchStockTemplateIn(req *dto.BatchStockTemplateInInsert 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				logs.Error("db error: %s", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				return global.CreateFailedErr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 添加药品图片信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			medicineImg, err := e.GetMedicineInfoForImg(c.MedicineInfo) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				logs.Error("获取药品图片信息失败: %s", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return global.CreateFailedErr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			medicineImg.DeptId = req.DeptId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			medicineImg.CreateBy = req.CreateBy 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			err = tx.Where(models.MedicineImg{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Product:     medicineImg.Product, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Enterprise:  medicineImg.Enterprise, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Spec:        medicineImg.Spec, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				BatchNumber: medicineImg.BatchNumber, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				ControlBy: model2.ControlBy{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					DeptId: req.DeptId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}}). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Assign(medicineImg).FirstOrCreate(&medicineImg).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				logs.Error("添加药品图片信息失败: %s", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return global.CreateFailedErr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			medicineInfoId = utils.ToInt(medicineInfo["id"]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			err = tx.Table(models.GetMedicineInfoTableName(req.DeptId)).Where("id = ?", medicineInfoId).Update("purchase_unit_price", c.UnitPrice).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			err = tx.Table(models.GetMedicineInfoTableName(req.DeptId)).Where("id = ?", medicineInfoId).Update("unit_price", c.UnitPrice).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				logs.Error("db error: %s", err) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -168,6 +315,7 @@ func (e *StockTemplate) BatchStockTemplateIn(req *dto.BatchStockTemplateInInsert 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			Operator:       c.Operator, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			ForwardingUnit: c.ForwardingUnit, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			Date:           c.Date, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Number:         number, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			ControlBy: model2.ControlBy{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				DeptId:   req.DeptId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				CreateBy: req.CreateBy, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -182,7 +330,7 @@ func (e *StockTemplate) BatchStockTemplateIn(req *dto.BatchStockTemplateInInsert 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		c.Id = stockInRecord.Id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		var inventory models.MedicineInventory 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		err = tx.Last(&inventory, "medicine_id = ?", medicineInfoId).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err = tx.Last(&inventory, "medicine_id = ? and dept_id = ?", medicineInfoId, req.DeptId).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			logs.Error("db error: %s", err) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -217,13 +365,59 @@ func (e *StockTemplate) BatchStockTemplateIn(req *dto.BatchStockTemplateInInsert 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (e *StockTemplate) CheckStockForQrcode(Qrcode string, stock string) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var err error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if !strings.HasPrefix(Qrcode, "9") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	switch stock { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	case models.TypeStockIn: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var stockIn models.StockIn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err = db.DB.Where("qrcode = ?", Qrcode).First(&stockIn).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if errors.Is(err, gorm.ErrRecordNotFound) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return errors.New("通过条码信息查询入库记录失败") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return errors.New(fmt.Sprintf("条码[%s]已入库,禁止重复入库", Qrcode)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	case models.TypeStockOut: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var stockOut models.StockOut 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err = db.DB.Where("qrcode = ?", Qrcode).First(&stockOut).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if errors.Is(err, gorm.ErrRecordNotFound) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return errors.New("通过条码信息查询入库记录失败") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return errors.New(fmt.Sprintf("条码[%s]已出库,禁止重复出库", Qrcode)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // BatchStockTemplateIn 扫码入库 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (e *StockTemplate) StockTemplateInScanCode(req *dto.BatchStockTemplateInInsertReq) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	number, err := e.GetStockNumber(models.TypeStockIn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		logs.Error("获取: %s", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, s := range req.StockInList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err := e.CheckStockForQrcode(s.Qrcode, models.TypeStockIn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	//var err error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	tx := db.DB.Begin() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for _, c := range req.StockInList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		mi := make(map[string]interface{}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for k, v := range c.MedicineInfo { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			mi[k] = v 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// 检查药品信息是否已存在 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		err := e.FirstOrCreateMedicineInfo(req.DeptId, req.CreateBy, &c.MedicineInfo) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -248,6 +442,7 @@ func (e *StockTemplate) StockTemplateInScanCode(req *dto.BatchStockTemplateInIns 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				sql += fmt.Sprintf("`%s`='%v',", k, v) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			sql += fmt.Sprintf("`%s`='%v',", "unit_price", c.UnitPrice) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			sql += fmt.Sprintf("`%s`='%v',", "qrcode", c.Qrcode) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			sql = sql[:len(sql)-1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			err = tx.Exec(sql).Error 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -262,6 +457,30 @@ func (e *StockTemplate) StockTemplateInScanCode(req *dto.BatchStockTemplateInIns 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				logs.Error("db error: %s", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				return global.CreateFailedErr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			// 添加药品图片信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			medicineImg, err := e.GetMedicineInfoScanCodeForImg(mi) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				logs.Error("获取药品图片信息失败: %s", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return global.CreateFailedErr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			medicineImg.Qrcode = c.Qrcode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			medicineImg.DeptId = req.DeptId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			medicineImg.CreateBy = req.CreateBy 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			err = tx.Where(models.MedicineImg{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Product:     medicineImg.Product, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Enterprise:  medicineImg.Enterprise, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Spec:        medicineImg.Spec, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				BatchNumber: medicineImg.BatchNumber, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				ControlBy: model2.ControlBy{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					DeptId: req.DeptId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}}). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Assign(medicineImg).FirstOrCreate(&medicineImg).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				logs.Error("添加药品图片信息失败: %s", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return global.CreateFailedErr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			medicineInfoId = utils.ToInt(medicineInfo["id"]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			err = tx.Table(models.GetMedicineInfoTableName(req.DeptId)).Where("id = ?", medicineInfoId).Update("unit_price", c.UnitPrice).Error 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -280,6 +499,8 @@ func (e *StockTemplate) StockTemplateInScanCode(req *dto.BatchStockTemplateInIns 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			Operator:       c.Operator, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			ForwardingUnit: c.ForwardingUnit, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			Date:           c.Date, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Qrcode:         c.Qrcode, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Number:         number, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			ControlBy: model2.ControlBy{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				DeptId:   req.DeptId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				CreateBy: req.CreateBy, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -294,7 +515,7 @@ func (e *StockTemplate) StockTemplateInScanCode(req *dto.BatchStockTemplateInIns 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		c.Id = stockInRecord.Id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		var inventory models.MedicineInventory 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		err = tx.Last(&inventory, "medicine_id = ?", medicineInfoId).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err = tx.Last(&inventory, "medicine_id = ? and dept_id = ?", medicineInfoId, req.DeptId).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			logs.Error("db error: %s", err) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -332,6 +553,11 @@ func (e *StockTemplate) StockTemplateInScanCode(req *dto.BatchStockTemplateInIns 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // StockTemplateIn 入库 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (e *StockTemplate) StockTemplateIn(c *dto.StockTemplateInInsertReq) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var err error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	number, err := e.GetStockNumber(models.TypeStockIn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		logs.Error("获取: %s", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// 检查药品信息是否已存在 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	medicineInfo, err := e.GetMedicineInfo(c.DeptId, c.MedicineInfo) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -362,9 +588,33 @@ func (e *StockTemplate) StockTemplateIn(c *dto.StockTemplateInInsertReq) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			logs.Error("db error: %s", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return global.CreateFailedErr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// 添加药品图片信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		medicineImg, err := e.GetMedicineInfoForImg(c.MedicineInfo) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			logs.Error("获取药品图片信息失败: %s", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return global.CreateFailedErr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		medicineImg.DeptId = c.DeptId 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		medicineImg.CreateBy = c.CreateBy 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err = tx.Where(models.MedicineImg{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Product:     medicineImg.Product, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Enterprise:  medicineImg.Enterprise, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Spec:        medicineImg.Spec, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			BatchNumber: medicineImg.BatchNumber, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			ControlBy: model2.ControlBy{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				DeptId: c.DeptId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}}). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Assign(medicineImg).FirstOrCreate(&medicineImg).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			logs.Error("添加药品图片信息失败: %s", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return global.CreateFailedErr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		medicineInfoId = utils.ToInt(medicineInfo["id"]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		err = tx.Table(models.GetMedicineInfoTableName(c.DeptId)).Where("id = ?", medicineInfoId).Update("purchase_unit_price", c.UnitPrice).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err = tx.Table(models.GetMedicineInfoTableName(c.DeptId)).Where("id = ?", medicineInfoId).Update("unit_price", c.UnitPrice).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			logs.Error("db error: %s", err) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -380,6 +630,7 @@ func (e *StockTemplate) StockTemplateIn(c *dto.StockTemplateInInsertReq) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Operator:       c.Operator, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		ForwardingUnit: c.ForwardingUnit, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Date:           c.Date, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Number:         number, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		ControlBy: model2.ControlBy{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			DeptId:   c.DeptId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			CreateBy: c.CreateBy, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -394,7 +645,7 @@ func (e *StockTemplate) StockTemplateIn(c *dto.StockTemplateInInsertReq) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	c.Id = stockInRecord.Id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var inventory models.MedicineInventory 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	err = tx.Last(&inventory, "medicine_id = ?", medicineInfoId).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	err = tx.Last(&inventory, "medicine_id = ? and dept_id = ?", medicineInfoId, c.DeptId).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		logs.Error("db error: %s", err) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -461,7 +712,7 @@ func (e *StockTemplate) StockTemplateInEdit(c *dto.StockTemplateInEditReq) error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		medicineInfoId = utils.ToInt(medicineInfo["id"]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		c.MedicineInfo["purchase_unit_price"] = c.UnitPrice 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		c.MedicineInfo["unit_price"] = c.UnitPrice 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		err = tx.Table(models.GetMedicineInfoTableName(c.DeptId)).Where("id = ?", medicineInfoId).Updates(c.MedicineInfo).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			tx.Rollback() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -532,7 +783,7 @@ func (e *StockTemplate) StockTemplateInEdit(c *dto.StockTemplateInEditReq) error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 3、修改的数量差 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			err = tx.Model(models.MedicineInventory{}).Where("medicine_id = ? AND id >= ?", medicineInfoId, medicineInventory.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			err = tx.Model(models.MedicineInventory{}).Where("medicine_id = ? AND id >= ? AND dept_id = ?", medicineInfoId, medicineInventory.Id, c.DeptId). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				UpdateColumn("balance", gorm.Expr("balance + ?", c.Quantity-medicineInventory.TotalIn)).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				tx.Rollback() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -545,7 +796,7 @@ func (e *StockTemplate) StockTemplateInEdit(c *dto.StockTemplateInEditReq) error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// 2 查询收发记录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		newMedicineInventory := models.MedicineInventory{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		err = tx.Model(models.MedicineInventory{}).Where("id < ? AND medicine_id = ?", medicineInventory.Id, medicineInfoId).Last(&newMedicineInventory).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err = tx.Model(models.MedicineInventory{}).Where("id < ? AND medicine_id = ? AND dept_id = ?", medicineInventory.Id, medicineInfoId, c.DeptId).Last(&newMedicineInventory).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			logs.Error("db error: %s", err) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -568,7 +819,7 @@ func (e *StockTemplate) StockTemplateInEdit(c *dto.StockTemplateInEditReq) error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// 查询原药品id当前收发记录结余最小值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		var balance *int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		err = tx.Model(&models.MedicineInventory{}).Select("MIN(balance)"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Where("id >= ? AND medicine_id = ?", medicineInventory.Id, StockInInfo.MedicineID).Scan(&balance).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Where("id >= ? AND medicine_id = ? AND dept_id = ?", medicineInventory.Id, StockInInfo.MedicineID, c.DeptId).Scan(&balance).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			logs.Error("db error: %s", err) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -581,7 +832,7 @@ func (e *StockTemplate) StockTemplateInEdit(c *dto.StockTemplateInEditReq) error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// 3、修改原药品id的数量差 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		err = tx.Model(models.MedicineInventory{}).Where("medicine_id = ? AND id > ?", medicineInventory.MedicineID, medicineInventory.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err = tx.Model(models.MedicineInventory{}).Where("medicine_id = ? AND id > ? AND dept_id = ?", medicineInventory.MedicineID, medicineInventory.Id, c.DeptId). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			UpdateColumn("balance", gorm.Expr("balance - ?", c.Quantity)).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			tx.Rollback() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -589,7 +840,7 @@ func (e *StockTemplate) StockTemplateInEdit(c *dto.StockTemplateInEditReq) error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return global.UpdateFailedErr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// 4、修改新药品id的数量差 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		err = tx.Model(models.MedicineInventory{}).Where("medicine_id = ? AND id > ?", medicineInfoId, medicineInventory.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err = tx.Model(models.MedicineInventory{}).Where("medicine_id = ? AND id > ? AND dept_id = ?", medicineInfoId, medicineInventory.Id, c.DeptId). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			UpdateColumn("balance", gorm.Expr("balance + ?", c.Quantity)).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			tx.Rollback() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -626,7 +877,7 @@ func (e *StockTemplate) StockTemplateInDelete(c *dto.StockTemplateInDeleteReq) e 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// 3 查询当前收发记录结余最小值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var balance *int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	err = tx.Model(&models.MedicineInventory{}).Select("MIN(balance)"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		Where("id > ? AND medicine_id = ?", medicineInventory.Id, StockInInfo.MedicineID).Scan(&balance).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Where("id > ? AND medicine_id = ? AND dept_id = ?", medicineInventory.Id, StockInInfo.MedicineID, c.DeptId).Scan(&balance).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		logs.Error("db error: %s", err) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -655,7 +906,7 @@ func (e *StockTemplate) StockTemplateInDelete(c *dto.StockTemplateInDeleteReq) e 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// 6 修改原药品id的数量差 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	err = tx.Model(models.MedicineInventory{}).Where("medicine_id = ? AND id > ?", medicineInventory.MedicineID, medicineInventory.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	err = tx.Model(models.MedicineInventory{}).Where("medicine_id = ? AND id > ? AND dept_id = ?", medicineInventory.MedicineID, medicineInventory.Id, c.DeptId). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		UpdateColumn("balance", gorm.Expr("balance - ?", medicineInventory.TotalIn)).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		tx.Rollback() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -670,7 +921,11 @@ func (e *StockTemplate) StockTemplateInDelete(c *dto.StockTemplateInDeleteReq) e 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // StockTemplateOut 出库 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (e *StockTemplate) StockTemplateOut(c *dto.StockTemplateOutInsertReq) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var err error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	number, err := e.GetStockNumber(models.TypeStockIn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		logs.Error("获取: %s", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// 检查药品信息是否已存在 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	medicineInfo, err := e.GetMedicineInfo(c.DeptId, c.MedicineInfo) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err != nil { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -710,6 +965,7 @@ func (e *StockTemplate) StockTemplateOut(c *dto.StockTemplateOutInsertReq) error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Operator:      c.Operator, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		ReceivingUnit: c.ReceivingUnit, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		Date:          c.Date, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Number:        number, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		ControlBy: model2.ControlBy{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			DeptId:   c.DeptId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			CreateBy: c.CreateBy, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -724,7 +980,7 @@ func (e *StockTemplate) StockTemplateOut(c *dto.StockTemplateOutInsertReq) error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	c.Id = stockOutRecord.Id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var inventory models.MedicineInventory 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	err = tx.Last(&inventory, "medicine_id = ?", medicineInfoId).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	err = tx.Last(&inventory, "medicine_id = ? and dept_id = ?", medicineInfoId, c.DeptId).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		logs.Error("db error: %s", err) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -824,7 +1080,7 @@ func (e *StockTemplate) StockTemplateOutEdit(c *dto.StockTemplateOutEditReq) err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 查询收发记录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			lastMedicineInventory := models.MedicineInventory{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			err = tx.Model(models.MedicineInventory{}).Where("id < ? AND medicine_id = ?", medicineInventory.Id, medicineInfoId).Last(&lastMedicineInventory).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			err = tx.Model(models.MedicineInventory{}).Where("id < ? AND medicine_id = ? AND dept_id = ?", medicineInventory.Id, medicineInfoId, c.DeptId).Last(&lastMedicineInventory).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				logs.Error("db error: %s", err) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -838,7 +1094,7 @@ func (e *StockTemplate) StockTemplateOutEdit(c *dto.StockTemplateOutEditReq) err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 查询新药品id当前收发记录结余最小值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			var balance *int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			err = tx.Model(&models.MedicineInventory{}).Select("MIN(balance)"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				Where("id >= ? AND medicine_id = ?", medicineInventory.Id, medicineInfoId).Scan(&balance).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Where("id >= ? AND medicine_id = ? AND dept_id = ?", medicineInventory.Id, medicineInfoId, c.DeptId).Scan(&balance).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				logs.Error("db error: %s", err) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -863,7 +1119,7 @@ func (e *StockTemplate) StockTemplateOutEdit(c *dto.StockTemplateOutEditReq) err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// 3、修改的数量差 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			err = tx.Model(models.MedicineInventory{}).Where("medicine_id = ? AND id >= ?", medicineInfoId, medicineInventory.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			err = tx.Model(models.MedicineInventory{}).Where("medicine_id = ? AND id >= ? AND dept_id = ?", medicineInfoId, medicineInventory.Id, c.DeptId). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				UpdateColumn("balance", gorm.Expr("balance - ?", c.Quantity-medicineInventory.TotalOut)).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				tx.Rollback() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -876,7 +1132,7 @@ func (e *StockTemplate) StockTemplateOutEdit(c *dto.StockTemplateOutEditReq) err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// 2 查询收发记录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		newMedicineInventory := models.MedicineInventory{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		err = tx.Model(models.MedicineInventory{}).Where("id < ? AND medicine_id = ?", medicineInventory.Id, medicineInfoId).Last(&newMedicineInventory).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err = tx.Model(models.MedicineInventory{}).Where("id < ? AND medicine_id = ? AND dept_id = ?", medicineInventory.Id, medicineInfoId, c.DeptId).Last(&newMedicineInventory).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			logs.Error("db error: %s", err) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -891,7 +1147,7 @@ func (e *StockTemplate) StockTemplateOutEdit(c *dto.StockTemplateOutEditReq) err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// 3 查询新药品id当前收发记录结余最小值 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		var balance *int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		err = tx.Model(&models.MedicineInventory{}).Select("MIN(balance)"). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			Where("id >= ? AND medicine_id = ?", medicineInventory.Id, medicineInfoId).Scan(&balance).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Where("id >= ? AND medicine_id = ? AND dept_id = ?", medicineInventory.Id, medicineInfoId, c.DeptId).Scan(&balance).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			logs.Error("db error: %s", err) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -917,7 +1173,7 @@ func (e *StockTemplate) StockTemplateOutEdit(c *dto.StockTemplateOutEditReq) err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// 3、修改原药品id的数量差 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		err = tx.Model(models.MedicineInventory{}).Where("medicine_id = ? AND id > ?", medicineInventory.MedicineID, medicineInventory.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err = tx.Model(models.MedicineInventory{}).Where("medicine_id = ? AND id > ? AND dept_id = ?", medicineInventory.MedicineID, medicineInventory.Id, c.DeptId). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			UpdateColumn("balance", gorm.Expr("balance + ?", c.Quantity)).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			tx.Rollback() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -925,7 +1181,7 @@ func (e *StockTemplate) StockTemplateOutEdit(c *dto.StockTemplateOutEditReq) err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			return global.UpdateFailedErr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// 4、修改新药品id的数量差 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		err = tx.Model(models.MedicineInventory{}).Where("medicine_id = ? AND id > ?", medicineInfoId, medicineInventory.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err = tx.Model(models.MedicineInventory{}).Where("medicine_id = ? AND id > ? AND dept_id = ?", medicineInfoId, medicineInventory.Id, c.DeptId). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			UpdateColumn("balance", gorm.Expr("balance - ?", c.Quantity)).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			tx.Rollback() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -978,7 +1234,7 @@ func (e *StockTemplate) StockTemplateOutDelete(c *dto.StockTemplateOutDeleteReq) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// 6 修改原药品id的数量差 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	err = tx.Model(models.MedicineInventory{}).Where("medicine_id = ? AND id > ?", medicineInventory.MedicineID, medicineInventory.Id). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	err = tx.Model(models.MedicineInventory{}).Where("medicine_id = ? AND id > ? AND dept_id = ?", medicineInventory.MedicineID, medicineInventory.Id, c.DeptId). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		UpdateColumn("balance", gorm.Expr("balance + ?", medicineInventory.TotalOut)).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		tx.Rollback() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -992,6 +1248,11 @@ func (e *StockTemplate) StockTemplateOutDelete(c *dto.StockTemplateOutDeleteReq) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // BatchStockTemplateOut 批量出库 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (e *StockTemplate) BatchStockTemplateOut(req *dto.BatchStockTemplateOutInsertReq) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	number, err := e.GetStockNumber(models.TypeStockIn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		logs.Error("获取: %s", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	tx := db.DB.Begin() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for _, c := range req.StockOutList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		// 检查药品信息是否已存在 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1036,6 +1297,7 @@ func (e *StockTemplate) BatchStockTemplateOut(req *dto.BatchStockTemplateOutInse 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			Operator:      c.Operator, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			ReceivingUnit: c.ReceivingUnit, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			Date:          c.Date, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Number:        number, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			ControlBy: model2.ControlBy{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				DeptId:   req.DeptId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				CreateBy: req.CreateBy, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1050,7 +1312,7 @@ func (e *StockTemplate) BatchStockTemplateOut(req *dto.BatchStockTemplateOutInse 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		c.Id = stockOutRecord.Id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		var inventory models.MedicineInventory 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		err = tx.Last(&inventory, "medicine_id = ?", medicineInfoId).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err = tx.Last(&inventory, "medicine_id = ? and dept_id = ?", medicineInfoId, req.DeptId).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			logs.Error("db error: %s", err) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1087,6 +1349,18 @@ func (e *StockTemplate) BatchStockTemplateOut(req *dto.BatchStockTemplateOutInse 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // StockTemplateOutScanCode 扫码出库 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (e *StockTemplate) StockTemplateOutScanCode(req *dto.BatchStockTemplateOutInsertReq) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	number, err := e.GetStockNumber(models.TypeStockIn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		logs.Error("获取: %s", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, s := range req.StockOutList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err := e.CheckStockForQrcode(s.Qrcode, models.TypeStockOut) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	tx := db.DB.Begin() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for _, c := range req.StockOutList { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		medicineName := c.MedicineInfo[models.FieldProductName] 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1139,6 +1413,8 @@ func (e *StockTemplate) StockTemplateOutScanCode(req *dto.BatchStockTemplateOutI 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			Operator:      c.Operator, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			ReceivingUnit: c.ReceivingUnit, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			Date:          c.Date, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Qrcode:        c.Qrcode, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			Number:        number, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			ControlBy: model2.ControlBy{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				DeptId:   req.DeptId, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				CreateBy: req.CreateBy, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1153,7 +1429,7 @@ func (e *StockTemplate) StockTemplateOutScanCode(req *dto.BatchStockTemplateOutI 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		c.Id = stockOutRecord.Id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		var inventory models.MedicineInventory 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		err = tx.Last(&inventory, "medicine_id = ?", medicineInfoId).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		err = tx.Last(&inventory, "medicine_id = ? and dept_id = ?", medicineInfoId, req.DeptId).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			logs.Error("db error: %s", err) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1513,7 +1789,7 @@ func (e *StockTemplate) StockOperatorList(c *dto.StockOperatorListReq, deptId in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (e *StockTemplate) StockInquiryList(c *dto.StockStatListReq, deptId int) (list []map[string]interface{}, count int64, err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	mtable := models.GetMedicineInfoTableName(deptId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	whereSql := " WHERE mi.dept_id = " + strconv.Itoa(deptId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	whereSql := "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if c.ProductID > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		whereSql += " AND m_info.product_id = " + strconv.Itoa(c.ProductID) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1529,16 +1805,16 @@ func (e *StockTemplate) StockInquiryList(c *dto.StockStatListReq, deptId int) (l 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if len(c.EndDate) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		whereSql += " AND m_info.expiry_date <= '" + c.EndDate + "'" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(whereSql) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		whereSql = " WHERE " + strings.TrimLeft(whereSql, " AND ") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	offset := (c.Page - 1) * c.PageSize 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	//sql := "SELECT * FROM (SELECT a.* FROM (SELECT * FROM medicine_inventory ORDER BY id DESC LIMIT 100) a GROUP BY a.medicine_id) b " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	//	"LEFT JOIN " + mtable + " ON b.medicine_id=" + mtable + ".id WHERE " + whereSql 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	sql := "SELECT mi.*,m_info.* FROM (SELECT medicine_id,MAX(id) AS latest_id FROM medicine_inventory WHERE deleted_at is null GROUP BY medicine_id) AS mi_latest " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	sql := "SELECT mi.*,m_info.* FROM (SELECT medicine_id,MAX(id) AS latest_id FROM medicine_inventory WHERE dept_id = " + strconv.Itoa(deptId) + " AND deleted_at is null GROUP BY medicine_id) AS mi_latest " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		"JOIN medicine_inventory AS mi ON mi.medicine_id=mi_latest.medicine_id AND mi.id=mi_latest.latest_id " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		"LEFT JOIN " + mtable + " AS m_info ON mi.medicine_id=m_info.id" + whereSql + " order by m_info.expiry_date limit ? offset ?;" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	sqlWhereCount := "SELECT COUNT(1) FROM (SELECT medicine_id,MAX(id) AS latest_id FROM medicine_inventory WHERE deleted_at is null GROUP BY medicine_id) AS mi_latest " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	sqlWhereCount := "SELECT COUNT(1) FROM (SELECT medicine_id,MAX(id) AS latest_id FROM medicine_inventory WHERE dept_id = " + strconv.Itoa(deptId) + " AND deleted_at is null GROUP BY medicine_id) AS mi_latest " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		"JOIN medicine_inventory AS mi ON mi.medicine_id=mi_latest.medicine_id AND mi.id=mi_latest.latest_id " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		"LEFT JOIN " + mtable + " AS m_info ON mi.medicine_id=m_info.id" + whereSql 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1581,7 +1857,7 @@ func (e *StockTemplate) StockInquiryList(c *dto.StockStatListReq, deptId int) (l 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (e *StockTemplate) StockInquiryExcel(c *dto.StockStatListReq, deptId int) (list []map[string]interface{}, err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	mtable := models.GetMedicineInfoTableName(deptId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	whereSql := " WHERE mi.dept_id = " + strconv.Itoa(deptId) + " AND deleted_at is null" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	whereSql := "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if c.ProductID > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		whereSql += " AND m_info.product_id = " + strconv.Itoa(c.ProductID) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1597,8 +1873,10 @@ func (e *StockTemplate) StockInquiryExcel(c *dto.StockStatListReq, deptId int) ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if len(c.EndDate) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		whereSql += " AND m_info.expiry_date <= '" + c.EndDate + "'" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	sql := "SELECT mi.*,m_info.* FROM (SELECT medicine_id,MAX(id) AS latest_id FROM medicine_inventory GROUP BY medicine_id) AS mi_latest " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(whereSql) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		whereSql = " WHERE " + strings.TrimLeft(whereSql, " AND ") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	sql := "SELECT mi.*,m_info.* FROM (SELECT medicine_id,MAX(id) AS latest_id FROM medicine_inventory WHERE dept_id = " + strconv.Itoa(deptId) + " AND deleted_at is null GROUP BY medicine_id) AS mi_latest " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		"JOIN medicine_inventory AS mi ON mi.medicine_id=mi_latest.medicine_id AND mi.id=mi_latest.latest_id " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		"LEFT JOIN " + mtable + " AS m_info ON mi.medicine_id=m_info.id" + whereSql + " order by m_info.expiry_date" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1633,15 +1911,18 @@ func (e *StockTemplate) StockInquiryExcel(c *dto.StockStatListReq, deptId int) ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (e *StockTemplate) StockStat(c *dto.StockStatReq, deptId int) (list []map[string]interface{}, count int64, err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	mtable := models.GetMedicineInfoTableName(deptId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	whereSql := " WHERE mi.dept_id = " + strconv.Itoa(deptId) + " AND deleted_at is null" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	whereSql := "" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if c.ProductID > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		whereSql += " AND m_info.product_id = " + strconv.Itoa(c.ProductID) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if c.SpecID > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		whereSql += " AND m_info.spec_id = " + strconv.Itoa(c.SpecID) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(whereSql) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		whereSql = " WHERE " + strings.TrimLeft(whereSql, " AND ") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var result []map[string]interface{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	sql := "SELECT mi.balance,m_info.product_id,m_info.spec_id,m_info.unit_id FROM (SELECT medicine_id,MAX(id) AS latest_id FROM medicine_inventory GROUP BY medicine_id) AS mi_latest " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	sql := "SELECT mi.balance,m_info.product_id,m_info.spec_id,m_info.unit_id FROM (SELECT medicine_id,MAX(id) AS latest_id FROM medicine_inventory WHERE dept_id = " + strconv.Itoa(deptId) + " AND deleted_at is null GROUP BY medicine_id) AS mi_latest " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		"JOIN medicine_inventory AS mi ON mi.medicine_id=mi_latest.medicine_id AND mi.id=mi_latest.latest_id " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		"LEFT JOIN " + mtable + " AS m_info ON mi.medicine_id=m_info.id" + whereSql 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1712,11 +1993,10 @@ func (e *StockTemplate) StockStat(c *dto.StockStatReq, deptId int) (list []map[s 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (e *StockTemplate) StockHomeStat(deptId int) (list map[string]interface{}, count int64, err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	mtable := models.GetMedicineInfoTableName(deptId) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	whereSql := " WHERE mi.dept_id = " + strconv.Itoa(deptId) + " AND deleted_at is null" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	var result []map[string]interface{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	sql := "SELECT mi.balance,m_info.unit_price FROM (SELECT medicine_id,MAX(id) AS latest_id FROM medicine_inventory GROUP BY medicine_id) AS mi_latest " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	sql := "SELECT mi.balance,m_info.unit_price FROM (SELECT medicine_id,MAX(id) AS latest_id FROM medicine_inventory WHERE dept_id = " + strconv.Itoa(deptId) + " AND deleted_at is null GROUP BY medicine_id) AS mi_latest " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		"JOIN medicine_inventory AS mi ON mi.medicine_id=mi_latest.medicine_id AND mi.id=mi_latest.latest_id " + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		"LEFT JOIN " + mtable + " AS m_info ON mi.medicine_id=m_info.id" + whereSql 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		"LEFT JOIN " + mtable + " AS m_info ON mi.medicine_id=m_info.id" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	err = db.DB.Raw(sql).Scan(&result).Error 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err != nil { 
			 |