Browse Source

药品出库

张保健 3 years ago
parent
commit
00687a6179
5 changed files with 258 additions and 0 deletions
  1. 5 0
      models/drug.go
  2. 2 0
      models/drug_stock.go
  3. 5 0
      models/stock_models.go
  4. 14 0
      service/stock_service.go
  5. 232 0
      service/warhouse_service.go

+ 5 - 0
models/drug.go View File

@@ -16,7 +16,12 @@ type BaseDrugLib struct {
16 16
 	DrugDosageForm              int64   `gorm:"column:drug_dosage_form" json:"drug_dosage_form" form:"drug_dosage_form"`
17 17
 	MedicalInsuranceLevel       int64   `gorm:"column:medical_insurance_level" json:"medical_insurance_level" form:"medical_insurance_level"`
18 18
 	MaxUnit                     string  `gorm:"column:max_unit" json:"max_unit" form:"max_unit"`
19
+	MinNumber					int64 	`gorm:"column:min_number" json:"min_number" form:"min_number"`
19 20
 	MinUnit                     string  `gorm:"column:min_unit" json:"min_unit" form:"min_unit"`
21
+	Dose                     	float64  `gorm:"column:dose" json:"dose" form:"dose"`
22
+	DoseUnit                    string  `gorm:"column:Dose_unit" json:"Dose_unit" form:"Dose_unit"`
23
+	MinPrice                    string  `gorm:"column:min_price" json:"min_price" form:"min_price"`
24
+
20 25
 	UnitMatrixing               string  `gorm:"column:unit_matrixing" json:"unit_matrixing" form:"unit_matrixing"`
21 26
 	RetailPrice                 float64 `gorm:"column:retail_price" json:"retail_price" form:"retail_price"`
22 27
 	LastPrice                   float64 `gorm:"column:last_price" json:"last_price" form:"last_price"`

+ 2 - 0
models/drug_stock.go View File

@@ -78,6 +78,7 @@ type DrugWarehouseOutInfo struct {
78 78
 	DrugId                  int64   `gorm:"column:drug_id" json:"drug_id" form:"drug_id"`
79 79
 	WarehousingOutTarget    int64   `gorm:"column:warehousing_out_target" json:"warehousing_out_target" form:"warehousing_out_target"`
80 80
 	Count                   int64   `gorm:"column:count" json:"count" form:"count"`
81
+	CountUnit               string   `gorm:"column:count_unit" json:"count_unit" form:"count_unit"`
81 82
 	Price                   float64 `gorm:"column:price" json:"price" form:"price"`
82 83
 	TotalPrice              float64 `gorm:"column:total_price" json:"total_price" form:"total_price"`
83 84
 	ProductDate             int64   `gorm:"column:product_date" json:"product_date" form:"product_date"`
@@ -210,6 +211,7 @@ type DrugAutomaticReduceDetail struct {
210 211
 	OrgId                   int64  `gorm:"column:org_id" json:"org_id" form:"org_id"`
211 212
 	DrugId                  int64  `gorm:"column:drug_id" json:"drug_id" form:"drug_id"`
212 213
 	Count                   int64  `gorm:"column:count" json:"count" form:"count"`
214
+	CountUnit               string  `gorm:"column:count_unit" json:"count_unit" form:"count_unit"`
213 215
 }
214 216
 
215 217
 func (DrugAutomaticReduceDetail) TableName() string {

+ 5 - 0
models/stock_models.go View File

@@ -79,6 +79,11 @@ type WarehousingInfo struct {
79 79
 	ProductDate      int64       `gorm:"column:product_date" json:"product_date"`
80 80
 	ExpiryDate       int64       `gorm:"column:expiry_date" json:"expiry_date"`
81 81
 	WarehousingCount int64       `gorm:"column:warehousing_count" json:"warehousing_count"`
82
+	WarehousingUnit  string      `gorm:"column:warehousing_unit" json:"warehousing_unit"`
83
+	MaxUnit 		 string       `gorm:"column:max_unit" json:"max_unit"`
84
+	MinUnit 		 string       `gorm:"column:min_unit" json:"min_unit"`
85
+	StockMaxNumber   int64       `gorm:"column:stock_max_number" json:"stock_max_number"`
86
+	StockMinNumber   int64       `gorm:"column:stock_min_number" json:"stock_min_number"`
82 87
 	Price            float64     `gorm:"column:price" json:"price"`
83 88
 	TotalPrice       float64     `gorm:"column:total_price" json:"total_price"`
84 89
 	Dealer           int64       `gorm:"column:dealer" json:"dealer"`

+ 14 - 0
service/stock_service.go View File

@@ -458,6 +458,14 @@ func FindLastWarehousingInfo(order string) (info models.WarehousingInfo, err err
458 458
 
459 459
 }
460 460
 
461
+// 出库时先进先出,找出最先入库的批次
462
+func FindLastWarehousingInfoByID(drug_id int64) (info models.WarehousingInfo, err error) {
463
+	err = readDb.Model(&models.WarehousingInfo{}).Where("drup_id = ? AND status = 1 AND (stock_max_number > 0 or stock_min_number > 0) ", drug_id).Order("ctime").First(&info).Error
464
+
465
+	return info, err
466
+
467
+}
468
+
461 469
 func FindLastDrugWarehousingInfo(order string) (info models.DrugWarehouseInfo, err error) {
462 470
 	err = readDb.Model(&models.DrugWarehouseInfo{}).Where("warehousing_order = ? AND status = 1", order).Last(&info).Error
463 471
 
@@ -1409,6 +1417,7 @@ func UpDateDrugWarehousingInfo(info *models.DrugWarehouseInfo) (err error) {
1409 1417
 	return err
1410 1418
 }
1411 1419
 
1420
+
1412 1421
 func EditWarehousing(warehouse models.Warehousing) {
1413 1422
 	err = readDb.Model(&models.Warehousing{}).Where("warehousing_order = ? AND status = 1", warehouse.WarehousingOrder).Update(map[string]interface{}{"mtime": time.Now().Unix(), "warehousing_time": warehouse.WarehousingTime, "modifier": warehouse.Modifier, "dealer": warehouse.Dealer, "manufacturer": warehouse.Manufacturer}).Error
1414 1423
 
@@ -1587,6 +1596,11 @@ func UpDateWarehouseOutStatus(id int64) (err error) {
1587 1596
 	return
1588 1597
 }
1589 1598
 
1599
+func UpDateWarehouseInfoByStock(info *models.WarehousingInfo) (err error) {
1600
+	err = writeDb.Save(&info).Error
1601
+	return err
1602
+}
1603
+
1590 1604
 func UpDateDrugWarehouseOutStatus(id int64) (err error) {
1591 1605
 	err = readDb.Model(&models.DrugWarehouseOutInfo{}).Where("id = ? AND status = 1", id).Update(map[string]interface{}{"status": 0, "mtime": time.Now().Unix()}).Error
1592 1606
 	return

+ 232 - 0
service/warhouse_service.go View File

@@ -0,0 +1,232 @@
1
+package service
2
+
3
+import (
4
+	"XT_New/models"
5
+	_"fmt"
6
+	"strings"
7
+	"time"
8
+	"math"
9
+	"XT_New/utils"
10
+	"strconv"
11
+	"errors"
12
+	"github.com/jinzhu/gorm"
13
+)
14
+
15
+// 药品出库
16
+
17
+func DrugsDelivery(orgID int64, advice *models.DoctorAdvice) (err error) {
18
+	// 1.判断药品是否来自专用字典的药品库
19
+	// 2.判断当天当前机构有没有创建出库单,没有则创建
20
+	// 3.创建出库流程
21
+	// 3.1 实现先进先出逻辑 由于药品执行后,不可以修改和删除,所以不考虑出库后的退库和修改出库数量等
22
+	isHasWay := false
23
+	record_time := int64(0)
24
+	if advice.Way == 1 {
25
+		isHasWay = true
26
+		record_time = advice.RecordDate
27
+	}
28
+	if isHasWay {
29
+		//判断当天当前机构有没有创建出库单,没有则创建
30
+		out, err := FindDrugStockOutByIsSys(orgID, 1, record_time)
31
+		if err == gorm.ErrRecordNotFound {
32
+			timeStr := time.Now().Format("2006-01-02")
33
+			timeArr := strings.Split(timeStr, "-")
34
+			total, _ := FindAllDrugWarehouseOut(orgID)
35
+			total = total + 1
36
+			warehousing_out_order := strconv.FormatInt(orgID, 10) + timeArr[0] + timeArr[1] + timeArr[2] + "000"
37
+			number, _ := strconv.ParseInt(warehousing_out_order, 10, 64)
38
+			number = number + total
39
+			warehousing_out_order = "YPCKD" + strconv.FormatInt(number, 10)
40
+			// creater := adminUserInfo.AdminUser.Id
41
+			warehouseOut := models.DrugWarehouseOut{
42
+				WarehouseOutOrderNumber: warehousing_out_order,
43
+				OperationTime:           time.Now().Unix(),
44
+				OrgId:                   orgID,
45
+				Creater:                 0,
46
+				Ctime:                   time.Now().Unix(),
47
+				Status:                  1,
48
+				WarehouseOutTime:        record_time,
49
+				Dealer:                  0,
50
+				Manufacturer:            0,
51
+				Type:                    1,
52
+				IsSys:                   1,
53
+			}
54
+			err := AddSigleDrugWarehouseOut(&warehouseOut)
55
+			if err != nil {
56
+				utils.TraceLog("创建出库单失败 err = %v", err)
57
+				return err
58
+			} else {
59
+				out = warehouseOut
60
+			}
61
+		} 
62
+
63
+		// 出库流程
64
+		// 1.查询改药品在药品库的规格信息,并将处方里的规格进行换算(尽量将拆零单位转换成包装单位)
65
+		drup,_ := FindBaseDrugLibRecord(orgID,advice.DrugId)
66
+		if drup.ID > 0 {
67
+			prescribingNumber := advice.PrescribingNumber
68
+			DrugDeliverInfo(orgID ,prescribingNumber ,&out ,&drup ,advice)
69
+		} else {
70
+			return errors.New("药品信息不存在")
71
+		}
72
+			
73
+	}
74
+
75
+	return
76
+} 
77
+// 药品出库 递归方式
78
+func DrugDeliverInfo(orgID int64,prescribingNumber float64,warehouseout *models.DrugWarehouseOut,drup *models.BaseDrugLib,advice *models.DoctorAdvice) (err error) {
79
+	// 判断处方里药品单位是拆零单位还是包装单位,	如果是包装单位,则根据规格,将包装数量转为拆零数量
80
+	var deliver_number int64 = 0
81
+	var stock_number int64 = 0
82
+
83
+	prescribingNumber_temp := strconv.FormatFloat(math.Abs(prescribingNumber), 'f', 0, 64)
84
+	count, _ := strconv.ParseInt(prescribingNumber_temp, 10, 64)
85
+	if advice.PrescribingNumberUnit == drup.MaxUnit {
86
+		deliver_number = count * drup.MinNumber
87
+	} else {
88
+		deliver_number = count
89
+	}
90
+
91
+	// 根据先进先出原则,查询最先入库的批次,进行出库
92
+	// 如果没有对应的库存,则报错
93
+	warehouse,err := FindLastWarehousingInfoByID(advice.DrugId)
94
+	if err != nil {
95
+		return err
96
+	}
97
+
98
+	// 将该批次的剩余库存数量转换为拆零数量
99
+	stock_number = warehouse.StockMaxNumber * drup.MinNumber + warehouse.StockMinNumber
100
+	// 当库存数量大于或等于出库数量的话,则正常出库该批次
101
+	if stock_number >= deliver_number {
102
+		warehouseOutInfo := &models.DrugWarehouseOutInfo{
103
+			WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
104
+			WarehouseOutId:          warehouseout.ID,
105
+			Status:                  1,
106
+			Ctime:                   time.Now().Unix(),
107
+			Remark:                  "",
108
+			OrgId:                   orgID,
109
+			Type:                    1,
110
+			Manufacturer:            0,
111
+			Dealer:                  0,
112
+			IsSys:                   1,
113
+			SysRecordTime:           advice.RecordDate,
114
+			DrugId:                  advice.DrugId,
115
+		}
116
+		warehouseOutInfo.Count = deliver_number
117
+		warehouseOutInfo.CountUnit = drup.MinUnit
118
+		errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
119
+		if errOne != nil {
120
+			return errOne
121
+		} else {
122
+			// prescribingNumber := strconv.FormatFloat(math.Abs(item.PrescribingNumber), 'f', 0, 64)
123
+			// count, _ := strconv.ParseInt(prescribingNumber, 10, 64)
124
+			details := &models.DrugAutomaticReduceDetail{
125
+				WarehouseOutId:          warehouseOutInfo.ID,
126
+				WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
127
+				PatientId:               advice.PatientId,
128
+				Ctime:                   time.Now().Unix(),
129
+				Mtime:                   time.Now().Unix(),
130
+				Status:                  1,
131
+				RecordTime:              advice.RecordDate,
132
+				OrgId:                   orgID,
133
+				DrugId:                  advice.DrugId,
134
+				Count:                   deliver_number,
135
+				CountUnit:				 drup.MinUnit,
136
+			}
137
+			errTwo := AddSigleDrugAutoReduceRecordInfo(details)
138
+			if errTwo != nil {
139
+				return errTwo
140
+			}
141
+		}
142
+		// 出库完成后,要减去对应批次的库存数量
143
+		// 判断处方里药品单位是拆零单位还是包装单位,	如果是拆零单位,则根据规格,将拆零数量转为包装数量
144
+		var maxNumber int64 = 0
145
+		var minNumber int64 = 0
146
+		if advice.PrescribingNumberUnit == drup.MinUnit {
147
+			maxNumber = count / drup.MinNumber
148
+			minNumber = count % drup.MinNumber
149
+		} else {
150
+			maxNumber = count
151
+		}
152
+
153
+		if warehouse.StockMaxNumber < maxNumber {
154
+			return errors.New("库存数量不足")
155
+		}
156
+
157
+		warehouse.StockMaxNumber = warehouse.StockMaxNumber - maxNumber
158
+		warehouse.Mtime = time.Now().Unix()
159
+		if warehouse.StockMinNumber < minNumber {
160
+			warehouse.StockMaxNumber = warehouse.StockMaxNumber - 1
161
+			warehouse.StockMinNumber = warehouse.StockMinNumber + drup.MinNumber - minNumber
162
+		} else {
163
+			warehouse.StockMinNumber = warehouse.StockMinNumber - minNumber
164
+		}
165
+
166
+		if warehouse.StockMaxNumber < 0 {
167
+			return errors.New("库存数量不足")
168
+		}
169
+		errThree := UpDateWarehouseInfoByStock(&warehouse)
170
+		if errThree != nil {
171
+			return errThree
172
+		}
173
+
174
+		return nil
175
+	}  else {
176
+		// 当改批次的库存数量小于出库数量的话,则先把该批次出库完后,再进行递归出库
177
+		warehouseOutInfo := &models.DrugWarehouseOutInfo{
178
+			WarehouseOutOrderNumber: warehouseout.WarehouseOutOrderNumber,
179
+			WarehouseOutId:          warehouseout.ID,
180
+			Status:                  1,
181
+			Ctime:                   time.Now().Unix(),
182
+			Remark:                  "",
183
+			OrgId:                   orgID,
184
+			Type:                    1,
185
+			Manufacturer:            0,
186
+			Dealer:                  0,
187
+			IsSys:                   1,
188
+			SysRecordTime:           advice.RecordDate,
189
+			DrugId:                  advice.DrugId,
190
+		}
191
+		// prescribingNumber := strconv.FormatFloat(math.Abs(item.PrescribingNumber), 'f', 0, 64)
192
+		// count, _ := strconv.ParseInt(prescribingNumber, 10, 64)
193
+		warehouseOutInfo.Count = stock_number
194
+		warehouseOutInfo.CountUnit = drup.MinUnit
195
+		
196
+		errOne := AddSigleDrugWarehouseOutInfo(warehouseOutInfo)
197
+		if errOne != nil {
198
+			return errOne
199
+		} else {
200
+			details := &models.DrugAutomaticReduceDetail{
201
+				WarehouseOutId:          warehouseOutInfo.ID,
202
+				WarehouseOutOrderNumber: warehouseOutInfo.WarehouseOutOrderNumber,
203
+				PatientId:               advice.PatientId,
204
+				Ctime:                   time.Now().Unix(),
205
+				Mtime:                   time.Now().Unix(),
206
+				Status:                  1,
207
+				RecordTime:              advice.RecordDate,
208
+				OrgId:                   orgID,
209
+				DrugId:                  advice.DrugId,
210
+				Count:                   stock_number,
211
+				CountUnit:				 drup.MinUnit,
212
+			}
213
+			errTwo := AddSigleDrugAutoReduceRecordInfo(details)
214
+			if errTwo != nil {
215
+				return errTwo
216
+			}
217
+		}
218
+		// 出库完成后,要将该批次库存清零
219
+		warehouse.StockMaxNumber = 0
220
+		warehouse.StockMinNumber = 0
221
+		warehouse.Mtime = time.Now().Unix()
222
+		errThree := UpDateWarehouseInfoByStock(&warehouse)
223
+		if errThree != nil {
224
+			return errThree
225
+		}
226
+		// 清零完该库存后,还有剩余出库未出完,进行对应的递归操作
227
+		prescribingNumber_two_temp := deliver_number - stock_number
228
+		advice.PrescribingNumber = float64(prescribingNumber_two_temp)
229
+		advice.PrescribingNumberUnit = drup.MinUnit
230
+		DrugDeliverInfo(orgID ,prescribingNumber,warehouseout,drup ,advice )
231
+	}
232
+}