Parcourir la source

Merge branch '20230223_xt_api_new_branch' of http://git.shengws.com/csx/XT_New into 20230223_xt_api_new_branch

28169 il y a 6 mois
Parent
révision
c148ada9d5

+ 41 - 0
common/crypto.go Voir le fichier

@@ -0,0 +1,41 @@
1
+package common
2
+
3
+import (
4
+	"crypto/hmac"
5
+	"crypto/sha256"
6
+)
7
+
8
+const (
9
+	// HMAC签名算法
10
+	HMAC_SHA256 = "HMAC-SHA256"
11
+)
12
+
13
+// HMAC_Sha256 加密
14
+func HMAC_Sha256(data string, secret string) []byte {
15
+	h := hmac.New(sha256.New, []byte(secret))
16
+	h.Write([]byte(data))
17
+	return h.Sum(nil)
18
+}
19
+
20
+// RSASHA256 加密
21
+// func RSASHA256(data string, Key string) (string, error) {
22
+// 	h := sha256.New()
23
+// 	h.Write([]byte(data))
24
+// 	hashed := h.Sum(nil)
25
+// 	block, _ := pem.Decode([]byte(Key))
26
+// 	if block == nil {
27
+// 		return "", errors.New("private key error")
28
+// 	}
29
+
30
+// 	privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
31
+// 	if err != nil {
32
+// 		return "", err
33
+// 	}
34
+
35
+// 	signature, err := rsa.SignPKCS1v15(cryptorand.Reader, privateKey, crypto.SHA256, hashed)
36
+// 	if err != nil {
37
+// 		return "", err
38
+// 	}
39
+
40
+// 	return base64.StdEncoding.EncodeToString(signature), nil
41
+// }

+ 23 - 0
common/json.go Voir le fichier

@@ -0,0 +1,23 @@
1
+package common
2
+
3
+import (
4
+	"encoding/json"
5
+)
6
+
7
+func GetPostDataWithMap(post map[string]interface{}) (string, error) {
8
+	//json := jsoniter.Config{
9
+	//	MarshalFloatWith6Digits: true,
10
+	//	EscapeHTML:              false,
11
+	//	SortMapKeys:             true, //本身高灯平台仅要求对最外层json key进行asci码升序排序,但map是无序且随机的,所以签名和post数据均排序以保持一致
12
+	//	UseNumber:               true,
13
+	//	DisallowUnknownFields:   false,
14
+	//	CaseSensitive:           true,
15
+	//}.Froze()
16
+
17
+	s, err := json.Marshal(&post)
18
+	if err != nil {
19
+		return "", err
20
+	}
21
+
22
+	return string(s), nil
23
+}

+ 27 - 0
common/rand.go Voir le fichier

@@ -0,0 +1,27 @@
1
+package common
2
+
3
+import (
4
+	"fmt"
5
+	"math/rand"
6
+	"strings"
7
+	"time"
8
+)
9
+
10
+const (
11
+	numLen = 10 //随机序列长度
12
+)
13
+
14
+var (
15
+	numeric = [numLen]byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} //随机序列
16
+)
17
+
18
+func GetRand(width int) string {
19
+	r := len(numeric)
20
+	rand.Seed(time.Now().UnixNano())
21
+
22
+	var sb strings.Builder
23
+	for i := 0; i < width; i++ {
24
+		fmt.Fprintf(&sb, "%d", numeric[rand.Intn(r)])
25
+	}
26
+	return sb.String()
27
+}

+ 817 - 47
controllers/fapiao_controller.go Voir le fichier

@@ -1,34 +1,185 @@
1 1
 package controllers
2 2
 
3 3
 import (
4
+	"XT_New/common"
4 5
 	"XT_New/enums"
6
+	"XT_New/invoice"
5 7
 	"XT_New/models"
6 8
 	"XT_New/service"
7 9
 	"XT_New/service/fapiao"
8 10
 	"XT_New/utils"
11
+	"encoding/base64"
12
+	"encoding/json"
9 13
 	"fmt"
10 14
 	"github.com/astaxie/beego"
11
-	"github.com/gaodengyun/goldencloud-sdk-go/goldencloud/common"
12
-	"github.com/gaodengyun/goldencloud-sdk-go/goldencloud/invoice"
15
+	"github.com/shopspring/decimal"
16
+	"math"
17
+	"strconv"
18
+	"strings"
13 19
 	"time"
14 20
 )
15 21
 
16
-type FapiaoApiController struct {
17
-	BaseAuthAPIController
18
-}
19
-
20 22
 func FaPiaoApiRegistRouters() {
21 23
 	beego.Router("/api/fapiao/sms/code", &FapiaoApiController{}, "get:GetLoginUploadCode")
22 24
 	beego.Router("/api/fapiao/sms/login", &FapiaoApiController{}, "get:Login")
23 25
 	beego.Router("/api/fapiao/qrcode/get", &FapiaoApiController{}, "get:GetQRCode")
24
-	beego.Router("/api/fapiao/stock/get", &FapiaoApiController{}, "get:GetFaPiaoStock")
26
+
25 27
 	beego.Router("/api/fapiao/blue", &FapiaoApiController{}, "get:OpenFaPiao")
26 28
 	beego.Router("/api/fapiao/red", &FapiaoApiController{}, "get:RedFaPiao")
27 29
 
28 30
 	beego.Router("/api/order/fapiao/list", &FapiaoApiController{}, "get:GetOrderFaPiaoList")
29
-	beego.Router("/api/fapiao/list", &FapiaoApiController{}, "get:GetFaPiaoList")
31
+	beego.Router("/api/gdfapiao/list", &FapiaoApiController{}, "get:GetFaPiaoList")
32
+
33
+}
34
+
35
+type FapiaoApiController struct {
36
+	BaseAuthAPIController
37
+}
38
+
39
+type InvoiceRequest struct {
40
+	SellerName           string                `json:"seller_name,omitempty"`            // 销方名称
41
+	SellerTaxpayerNum    string                `json:"seller_taxpayer_num"`              // 销方纳税人识别号
42
+	SellerAddress        string                `json:"seller_address"`                   // 销方地址
43
+	SellerTel            string                `json:"seller_tel"`                       // 销方电话
44
+	SellerBankName       string                `json:"seller_bank_name"`                 // 销方银行名称
45
+	SellerBankAccount    string                `json:"seller_bank_account"`              // 销方银行账号
46
+	TitleType            int                   `json:"title_type"`                       // 抬头类型:1 个人、政府事业单位;2 企业
47
+	BuyerTitle           string                `json:"buyer_title"`                      // 购方名称
48
+	BuyerTaxpayerNum     string                `json:"buyer_taxpayer_num,omitempty"`     // 购方纳税人识别号
49
+	BuyerAddress         string                `json:"buyer_address,omitempty"`          // 购方地址
50
+	BuyerPhone           string                `json:"buyer_phone,omitempty"`            // 购方电话
51
+	BuyerBankName        string                `json:"buyer_bank_name,omitempty"`        // 购方银行名称
52
+	BuyerBankAccount     string                `json:"buyer_bank_account,omitempty"`     // 购方银行账号
53
+	BuyerEmail           string                `json:"buyer_email,omitempty"`            // 收票人邮箱
54
+	OrderID              string                `json:"order_id"`                         // 商户订单号
55
+	InvoiceTypeCode      string                `json:"invoice_type_code,omitempty"`      // 开具发票类型
56
+	CallbackURL          string                `json:"callback_url"`                     // 发票结果回传地址
57
+	Drawer               string                `json:"drawer"`                           // 开票人姓名
58
+	Payee                string                `json:"payee,omitempty"`                  // 收款人姓名
59
+	Checker              string                `json:"checker,omitempty"`                // 复核人姓名
60
+	TerminalCode         string                `json:"terminal_code"`                    // 税盘号
61
+	UserOpenID           string                `json:"user_openid,omitempty"`            // 商家用户标识
62
+	SpecialInvoiceKind   string                `json:"special_invoice_kind,omitempty"`   // 特殊票种标识
63
+	AmountHasTax         string                `json:"amount_has_tax"`                   // 含税总金额
64
+	TaxAmount            string                `json:"tax_amount"`                       // 总税额
65
+	AmountWithoutTax     string                `json:"amount_without_tax"`               // 不含税总金额
66
+	Remark               string                `json:"remark,omitempty"`                 // 备注
67
+	StoreNo              string                `json:"store_no,omitempty"`               // 门店编码
68
+	Template             int                   `json:"template"`                         // 发票模板
69
+	Info                 *InvoiceInfo          `json:"info,omitempty"`                   // 冠名票信息
70
+	TaxpayerConfirmation *TaxpayerConfirmation `json:"taxpayer_confirmation,omitempty"`  // 纳税人确认信息
71
+	SpecificBusinessCode string                `json:"specific_business_code,omitempty"` // 特定业务代码
72
+	RealStaticRent       *RealStaticRent       `json:"real_static_rent,omitempty"`       // 不动产经营租赁信息
73
+	PassengerTransport   []PassengerTransport  `json:"passenger_transport,omitempty"`    // 旅客运输信息
74
+	GoodsTransport       []GoodsTransport      `json:"goods_transport,omitempty"`        // 货物运输信息
75
+	AgriculturalPurchase *AgriculturalPurchase `json:"agricultural_purchase,omitempty"`  // 农产品收购信息
76
+	BuildingService      *BuildingService      `json:"building_service,omitempty"`       // 建筑服务信息
77
+	RealStaticSales      *RealStaticSales      `json:"real_static_sales,omitempty"`      // 不动产销售信息
78
+	TractorCombine       *TractorCombine       `json:"tractor_combine,omitempty"`        // 拖拉机与联合收割机信息
79
+	UsedCarService       *UsedCarService       `json:"used_car_service,omitempty"`       // 二手车服务信息
80
+	UsedCarSell          *UsedCarSell          `json:"used_car_sell,omitempty"`          // 二手车销售信息
81
+	DeductionService     *DeductionService     `json:"deduction_service,omitempty"`      // 差额征税信息
82
+	Items                []Item                `json:"items"`                            // 项目商品明细
83
+}
84
+
85
+type InvoiceInfo struct {
86
+	UseDate    string `json:"use_date,omitempty"`    // 入园日期
87
+	TicketName string `json:"ticket_name,omitempty"` // 票据名称
88
+}
89
+
90
+type TaxpayerConfirmation struct {
91
+	RenewableResourceRecyclingFlag int    `json:"renewable_resource_recycling_flag,omitempty"` // 再生资源回收单位标志
92
+	DrawWithNoBuyerFlag            int    `json:"draw_with_nobuyer_flag,omitempty"`            // 无购买方纳税人信息继续开票标志
93
+	NotDutyFreeReason              string `json:"not_dutyfree_reason,omitempty"`               // 放弃享受减按1%征收率原因
94
+}
95
+
96
+type RealStaticRent struct {
97
+	PropertyNum   string `json:"property_num"`    // 房屋产权证号
98
+	Location      string `json:"location"`        // 不动产地址 (省市区县)
99
+	AddressDetail string `json:"address_detail"`  // 不动产详细地址
100
+	RentBeginDate string `json:"rent_begin_date"` // 租赁期起
101
+	RentEndDate   string `json:"rent_end_date"`   // 租赁期止
102
+	IntercityFlag string `json:"intercity_flag"`  // 跨地市标志
103
+	UnitOfArea    int    `json:"unit_of_area"`    // 面积单位
104
+}
105
+
106
+type PassengerTransport struct {
107
+	Traveler         string `json:"traveler,omitempty"`          // 出行人
108
+	IDType           int    `json:"id_type,omitempty"`           // 证件类型
109
+	IDNumber         string `json:"id_number,omitempty"`         // 证件号码
110
+	TravelDate       string `json:"travel_date,omitempty"`       // 出行日期
111
+	DeparturePlace   string `json:"departure_place,omitempty"`   // 出发地
112
+	DestinationPlace string `json:"destination_palce,omitempty"` // 到达地
113
+	VehicleType      int    `json:"vehicle_type,omitempty"`      // 交通工具类型
114
+	Level            string `json:"level,omitempty"`             // 等级
115
+}
30 116
 
117
+type GoodsTransport struct {
118
+	TransportNumber  string `json:"transport_number,omitempty"`  // 运输工具号牌
119
+	TransportKind    string `json:"transport_kind,omitempty"`    // 运输工具种类
120
+	GoodsName        string `json:"goods_name,omitempty"`        // 货物名称
121
+	DeparturePlace   string `json:"departure_place,omitempty"`   // 出发地
122
+	DestinationPlace string `json:"destination_place,omitempty"` // 到达地
31 123
 }
124
+
125
+type AgriculturalPurchase struct {
126
+	IDType string `json:"id_type,omitempty"` // 证件类型
127
+}
128
+
129
+type BuildingService struct {
130
+	Site            string `json:"site"`                  // 建筑服务发生地
131
+	DetailSite      string `json:"detail_site,omitempty"` // 详细地址
132
+	BuildingProject string `json:"building_project"`      // 建筑项目名称
133
+	CrossSign       string `json:"cross_sign"`            // 跨地市标志
134
+}
135
+
136
+type RealStaticSales struct {
137
+	PropertyNum        string `json:"property_num,omitempty"`         // 房屋产权证书号
138
+	Location           string `json:"location"`                       // 不动产地址
139
+	AddressDetail      string `json:"address_detail,omitempty"`       // 不动产详细地址
140
+	CrossSign          string `json:"cross_sign"`                     // 跨市标志
141
+	UnitOfArea         int    `json:"unit_of_area"`                   // 面积单位
142
+	OnlineContractCode string `json:"online_contract_code,omitempty"` // 不动产单元代码/网签合同编码
143
+}
144
+
145
+type TractorCombine struct {
146
+	ChassisNumber string `json:"chassis_number,omitempty"` // 底盘号或机架号
147
+	EngineNumber  string `json:"engine_number"`            // 发动机号
148
+	IsRegister    string `json:"is_register,omitempty"`    // 是否用于拖拉机和联合收割机登记
149
+}
150
+
151
+type UsedCarService struct {
152
+	TicketSN        string `json:"ticket_sn"`         // 发票号码
153
+	PaperTicketCode string `json:"paper_ticket_code"` // 纸票发票代码
154
+	PaperTicketSN   string `json:"paper_ticket_sn"`   // 纸票发票号码
155
+}
156
+
157
+type UsedCarSell struct {
158
+	FrameNumber             string `json:"frame_number"`             // 车架号码
159
+	LicensePlateNumber      string `json:"license_plate_number"`     // 车牌号
160
+	BrandModel              string `json:"brand_model"`              // 厂牌型号
161
+	RegistrationCertificate string `json:"registration_certificate"` // 登记证号
162
+	TransferOfficeName      string `json:"transfer_office_name"`     // 转入地车辆管理所名称
163
+	NatureOfEnterprise      string `json:"nature_of_enterprise"`     // 企业性质
164
+}
165
+
166
+type DeductionService struct {
167
+	TaxDiffServiceFlag int    `json:"tax_diff_service_flag,omitempty"` // 差额征税标识
168
+	TaxableServiceName string `json:"taxable_service_name,omitempty"`  // 差额征税项目名称
169
+}
170
+
171
+type Item struct {
172
+	ItemName      string  `json:"item_name"`           // 商品名称
173
+	ItemSpec      string  `json:"item_spec,omitempty"` // 商品规格
174
+	ItemUnit      string  `json:"item_unit"`           // 商品单位
175
+	ItemQuantity  float64 `json:"item_quantity"`       // 商品数量
176
+	ItemPrice     float64 `json:"item_price"`          // 商品单价
177
+	ItemAmount    float64 `json:"item_amount"`         // 商品金额
178
+	ItemTaxRate   float64 `json:"item_tax_rate"`       // 商品税率
179
+	ItemTaxAmount float64 `json:"item_tax_amount"`     // 商品税额
180
+	RowType       int     `json:"row_type"`            // 行性质标志
181
+}
182
+
32 183
 func (c *FapiaoApiController) GetFaPiaoList() {
33 184
 	page, _ := c.GetInt64("page", -1)
34 185
 	limit, _ := c.GetInt64("limit", -1)
@@ -62,8 +213,8 @@ func (c *FapiaoApiController) GetFaPiaoList() {
62 213
 	order, err, total := service.GetFaPiaoList(org_id, page, limit, startTime, endTime)
63 214
 	if err == nil {
64 215
 		c.ServeSuccessJSON(map[string]interface{}{
65
-			"order": order,
66
-			"total": total,
216
+			"fapiao_record": order,
217
+			"total":         total,
67 218
 		})
68 219
 
69 220
 	} else {
@@ -120,99 +271,718 @@ func (c *FapiaoApiController) GetOrderFaPiaoList() {
120 271
 }
121 272
 
122 273
 func (c *FapiaoApiController) GetLoginUploadCode() {
123
-	sdk := invoice.NewSdk(common.HMAC_SHA256, "8ca4ee7b152c0abceff9", "17402aff152dbeedf7a7b30be553f4c4", "", "test")
274
+	sdk := invoice.NewSdk(common.HMAC_SHA256, "5058f0defd12047ee2a7", "51440fbee667ea9a53aaa68c9c408367", "", "test")
124 275
 	var config models.FapiaoConfig
125 276
 	config, _ = service.FindFaPiaoConfigInfo(c.GetAdminUserInfo().CurrentOrgId)
126 277
 	routerAddress, postData := fapiao.GetSMSCode(config) //发票开具
127
-	r, err := sdk.HttpPost("https://apigw-test.goldentec.com", routerAddress, postData)
278
+	fmt.Println(routerAddress)
279
+	fmt.Println(postData)
280
+	r, err := sdk.HttpPost("https://apigw.goldentec.com", routerAddress, postData)
128 281
 	if err != nil {
129 282
 		fmt.Println(err)
130 283
 	} else {
131
-		fmt.Println(string(r))
284
+		var resp SmsCode
285
+		// 将 byte 切片转换为结构体
286
+		json.Unmarshal(r, &resp)
287
+		if resp.Code == 0 {
288
+			c.ServeSuccessJSON(map[string]interface{}{
289
+				"msg": resp.Message,
290
+			})
291
+		}
132 292
 	}
133 293
 }
134 294
 
295
+type SmsCode struct {
296
+	Code    int    `json:"code"`
297
+	Message string `json:"message"`
298
+}
299
+
135 300
 func (c *FapiaoApiController) Login() {
136
-	GetQRStatus(c.GetAdminUserInfo().CurrentOrgId)
137 301
 	code := c.GetString("code")
138 302
 	var config models.FapiaoConfig
139 303
 	config, _ = service.FindFaPiaoConfigInfo(c.GetAdminUserInfo().CurrentOrgId)
140
-	sdk := invoice.NewSdk(common.HMAC_SHA256, "8ca4ee7b152c0abceff9", "17402aff152dbeedf7a7b30be553f4c4", "", "test")
304
+	sdk := invoice.NewSdk(common.HMAC_SHA256, "5058f0defd12047ee2a7", "51440fbee667ea9a53aaa68c9c408367", "", "test")
141 305
 	routerAddress, postData := fapiao.Login(code, config) //发票开具
142
-	r, err := sdk.HttpPost("https://apigw-test.goldentec.com", routerAddress, postData)
306
+	r, err := sdk.HttpPost("https://apigw.goldentec.com", routerAddress, postData)
143 307
 	if err != nil {
144 308
 		fmt.Println(err)
145 309
 	} else {
146
-		fmt.Println(string(r))
310
+		var resp SmsCode
311
+		// 将 byte 切片转换为结构体
312
+		json.Unmarshal(r, &resp)
313
+		if resp.Code == 0 {
314
+			c.ServeSuccessJSON(map[string]interface{}{
315
+				"msg": resp.Message,
316
+			})
317
+		}
147 318
 	}
148 319
 }
149
-
150 320
 func (c *FapiaoApiController) GetQRCode() {
151
-	sdk := invoice.NewSdk(common.HMAC_SHA256, "8ca4ee7b152c0abceff9", "17402aff152dbeedf7a7b30be553f4c4", "", "test")
321
+	sdk := invoice.NewSdk(common.HMAC_SHA256, "5058f0defd12047ee2a7", "51440fbee667ea9a53aaa68c9c408367", "", "test")
152 322
 	var config models.FapiaoConfig
153 323
 	config, _ = service.FindFaPiaoConfigInfo(c.GetAdminUserInfo().CurrentOrgId)
154 324
 	routerAddress, postData := fapiao.GetQRCode(config) //发票开具
155
-	r, err := sdk.HttpPost("https://apigw-test.goldentec.com", routerAddress, postData)
325
+	r, err := sdk.HttpPost("https://apigw.goldentec.com", routerAddress, postData)
156 326
 	if err != nil {
157 327
 		fmt.Println(err)
158 328
 	} else {
159
-		fmt.Println(string(r))
329
+		var resp QRAuth
330
+		// 将 byte 切片转换为结构体
331
+		err := json.Unmarshal(r, &resp)
332
+		fmt.Println(resp)
333
+		if err != nil {
334
+			fmt.Println("Error unmarshalling:", err)
335
+		} else {
336
+			if resp.Code == 0 {
337
+				decodedBytes, _ := base64.StdEncoding.DecodeString(resp.Data.QrCode)
338
+				if len(resp.Data.AuthId) == 0 { //还没进行授权,则获取二维码信息
339
+					c.ServeSuccessJSON(map[string]interface{}{
340
+						"cus_status": 1,
341
+						"qr_code":    string(decodedBytes),
342
+					})
343
+
344
+				} else {
345
+					status := GetQRStatus(c.GetAdminUserInfo().CurrentOrgId, resp.Data.AuthId)
346
+					if status == "UNDEFINE" {
347
+						c.ServeSuccessJSON(map[string]interface{}{
348
+							"cus_status": -1,
349
+							"msg":        "未定义",
350
+						})
351
+					} else if status == "UNHANDLED" {
352
+						c.ServeSuccessJSON(map[string]interface{}{
353
+							"cus_status": 1,
354
+							"qr_code":    string(decodedBytes),
355
+						})
356
+					} else if status == "REAL_AUTH_SUCCESS" {
357
+						c.ServeSuccessJSON(map[string]interface{}{
358
+							"cus_status": 2,
359
+							"msg":        "已经实名认证成功",
360
+						})
361
+					} else if status == "REFRESH" {
362
+						c.ServeSuccessJSON(map[string]interface{}{
363
+							"cus_status": 1,
364
+							"qr_code":    string(decodedBytes),
365
+						})
366
+					} else if status == "NEED_RELOGIN_BUREAU" {
367
+						c.ServeSuccessJSON(map[string]interface{}{
368
+							"cus_status": -3,
369
+							"msg":        "登录失效,请重新短信登录税局",
370
+						})
371
+
372
+					}
373
+				}
374
+
375
+			} else {
376
+				c.ServeSuccessJSON(map[string]interface{}{
377
+					"cus_status": -4,
378
+					"msg":        resp.Message,
379
+				})
380
+			}
381
+
382
+		}
383
+		//fmt.Println(string(r))
160 384
 	}
161 385
 }
386
+func (c *FapiaoApiController) OpenFaPiao() {
387
+	//var config models.FapiaoConfig
388
+	//config, _ = service.FindFaPiaoConfigInfo(c.GetAdminUserInfo().CurrentOrgId)
162 389
 
163
-func (c *FapiaoApiController) GetFaPiaoStock() {
164
-	sdk := invoice.NewSdk(common.HMAC_SHA256, "8ca4ee7b152c0abceff9", "17402aff152dbeedf7a7b30be553f4c4", "", "test")
390
+	//认证接口
391
+	sdk := invoice.NewSdk(common.HMAC_SHA256, "5058f0defd12047ee2a7", "51440fbee667ea9a53aaa68c9c408367", "", "test")
392
+	status := GetQRStatusTwo(c.GetAdminUserInfo().CurrentOrgId)
393
+	fmt.Println("11112222")
394
+
395
+	fmt.Println(status)
396
+	if status == 0 {
397
+		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeAuthWrong)
398
+		return
399
+	}
400
+	//查询余量接口
401
+	//routerAddress, postData := fapiao.QueryStock(config)
402
+	//r, err := sdk.HttpPost("https://apigw.goldentec.com", routerAddress, postData)
403
+	//fmt.Println(string(r))
404
+	//if err != nil {
405
+	//	fmt.Println(err)
406
+	//} else {
407
+	//	var resp2 FapiaoStock
408
+	//	// 将 byte 切片转换为结构体
409
+	//	err2 := json.Unmarshal(r, &resp2)
410
+	//	if err2 != nil {
411
+	//		fmt.Println(err2)
412
+	//
413
+	//	} else {
414
+	//		if resp2.Code == 0 {
415
+	//			if resp2.Data.LeftQuantity <= 0 {
416
+	//				c.ServeSuccessJSON(map[string]interface{}{
417
+	//					"msg":    "发票余量不足,请登录高灯平台申领发票",
418
+	//					"status": -1,
419
+	//				})
420
+	//				return
421
+	//			}
422
+	//		}
423
+	//	}
424
+	//}
425
+	//return
426
+
427
+	//开蓝票逻辑
428
+	order_ids := c.GetString("order_ids")
429
+	admin_user_id, _ := c.GetInt64("admin_user_id")
430
+	ids := strings.Split(order_ids, ",")
431
+	orders, _ := service.GetFaPiaoOrderByIDS(ids)
432
+	var MedfeeSumamt float64 = 0  //治疗费用
433
+	var PsnCashPay float64 = 0    //治疗费用
434
+	var FundPaySumamt float64 = 0 //治疗费用
435
+
436
+	var details []models.HisOrderInfo
437
+	var numbers []string
438
+	decimal.DivisionPrecision = 2
439
+
440
+	for _, oss := range orders {
441
+		MedfeeSumamt, _ = decimal.NewFromFloat(MedfeeSumamt).Add(decimal.NewFromFloat(oss.MedfeeSumamt)).Float64()
442
+		PsnCashPay, _ = decimal.NewFromFloat(PsnCashPay).Add(decimal.NewFromFloat(oss.PsnCashPay)).Float64()
443
+		FundPaySumamt, _ = decimal.NewFromFloat(FundPaySumamt).Add(decimal.NewFromFloat(oss.FundPaySumamt)).Float64()
444
+		numbers = append(numbers, oss.Number)
445
+	}
446
+	details, _ = service.GetFaPiaoOrderInfoByNumbers(numbers)
447
+	role, _ := service.GetAdminUserRole(admin_user_id, c.GetAdminUserInfo().CurrentOrgId)
448
+	role.UserName = "邹碧琳"
449
+	type CostType struct {
450
+		name  string
451
+		price float64
452
+	}
453
+	var cts []CostType
454
+	var ct CostType
455
+
456
+	var bedCostTotal float64 = 0                        //床位总费
457
+	var operationCostTotal float64 = 0                  //手术费
458
+	var otherCostTotal float64 = 0                      //其他费用
459
+	var materialCostTotal float64 = 0                   //材料费
460
+	var westernMedicineCostTotal float64 = 0            //西药费
461
+	var chineseTraditionalMedicineCostTotal float64 = 0 //中成药
462
+	var checkCostTotal float64 = 0                      //检查费
463
+	var laboratoryCostTotal float64 = 0                 //化验费
464
+	var treatCostTotal float64 = 0                      //治疗费用
465
+	var huliCostTotal float64 = 0                       //治疗费用
466
+	var zhencaCostTotal float64 = 0                     //治疗费用
467
+
468
+	for _, item := range details {
469
+		if item.MedChrgitmType == "01" { //床位费
470
+			bedCostTotal, _ = decimal.NewFromFloat(bedCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
471
+		}
472
+		if item.MedChrgitmType == "07" { //护理费
473
+			huliCostTotal, _ = decimal.NewFromFloat(huliCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
474
+		}
475
+		if c.GetAdminUserInfo().CurrentOrgId == 10188 || c.GetAdminUserInfo().CurrentOrgId == 10217 {
476
+			if item.MedChrgitmType == "03" { //检查费
477
+				laboratoryCostTotal, _ = decimal.NewFromFloat(laboratoryCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
478
+			}
479
+		} else {
480
+			if item.MedChrgitmType == "03" { //检查费
481
+				checkCostTotal, _ = decimal.NewFromFloat(checkCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
482
+			}
483
+
484
+		}
485
+		if item.MedChrgitmType == "04" { //化验费
486
+			laboratoryCostTotal, _ = decimal.NewFromFloat(laboratoryCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
487
+		}
488
+
489
+		if item.MedChrgitmType == "05" || item.MedChrgitmType == "1402" || item.MedChrgitmType == "1403" { //治疗费
490
+			treatCostTotal, _ = decimal.NewFromFloat(treatCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
491
+		}
492
+
493
+		if item.MedChrgitmType == "06" { //手术费
494
+			operationCostTotal, _ = decimal.NewFromFloat(operationCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
495
+		}
496
+
497
+		if item.MedChrgitmType == "08" { //材料费
498
+			materialCostTotal, _ = decimal.NewFromFloat(materialCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
499
+		}
500
+
501
+		if item.MedChrgitmType == "09" { //西药费
502
+			westernMedicineCostTotal, _ = decimal.NewFromFloat(westernMedicineCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
503
+		}
504
+
505
+		if item.MedChrgitmType == "11" { //中成费
506
+			chineseTraditionalMedicineCostTotal, _ = decimal.NewFromFloat(chineseTraditionalMedicineCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
507
+		}
508
+
509
+		if item.MedChrgitmType == "14" || item.MedChrgitmType == "0" || item.MedChrgitmType == "12" { //其他费
510
+			otherCostTotal, _ = decimal.NewFromFloat(otherCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
511
+		}
512
+
513
+		if item.MedChrgitmType == "02" { //诊察
514
+			zhencaCostTotal, _ = decimal.NewFromFloat(zhencaCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
515
+		}
516
+	}
517
+	if bedCostTotal > 0 {
518
+		ct.name = "床位费"
519
+		ct.price = bedCostTotal
520
+		cts = append(cts, ct)
521
+	}
522
+
523
+	if operationCostTotal > 0 {
524
+		ct.name = "手术费"
525
+		ct.price = operationCostTotal
526
+		cts = append(cts, ct)
527
+
528
+	}
529
+	if otherCostTotal > 0 {
530
+		ct.name = "其他费"
531
+		ct.price = otherCostTotal
532
+		cts = append(cts, ct)
533
+
534
+	}
535
+	if materialCostTotal > 0 {
536
+		ct.name = "材料费"
537
+		ct.price = materialCostTotal
538
+		cts = append(cts, ct)
539
+
540
+	}
541
+	if westernMedicineCostTotal > 0 {
542
+		ct.name = "西药费"
543
+		ct.price = westernMedicineCostTotal
544
+		cts = append(cts, ct)
545
+
546
+	}
547
+	if chineseTraditionalMedicineCostTotal > 0 {
548
+		ct.name = "中成药费"
549
+		ct.price = chineseTraditionalMedicineCostTotal
550
+		cts = append(cts, ct)
551
+
552
+	}
553
+	if checkCostTotal > 0 {
554
+		ct.name = "检查费"
555
+		ct.price = checkCostTotal
556
+		cts = append(cts, ct)
557
+
558
+	}
559
+	if laboratoryCostTotal > 0 {
560
+		ct.name = "化验费"
561
+		ct.price = laboratoryCostTotal
562
+		cts = append(cts, ct)
563
+
564
+	}
565
+	if treatCostTotal > 0 {
566
+		ct.name = "治疗费"
567
+		ct.price = treatCostTotal
568
+		cts = append(cts, ct)
569
+
570
+	}
571
+	if huliCostTotal > 0 {
572
+		ct.name = "护理费"
573
+		ct.price = huliCostTotal
574
+		cts = append(cts, ct)
575
+
576
+	}
577
+
578
+	if zhencaCostTotal > 0 {
579
+		ct.name = "诊察费"
580
+		ct.price = zhencaCostTotal
581
+		cts = append(cts, ct)
582
+
583
+	}
584
+	fmt.Println(cts)
585
+	org_config, _ := service.FindMedicalInsuranceInfo(c.GetAdminUserInfo().CurrentOrgId)
586
+	var config2 models.FapiaoConfig
587
+	config2, _ = service.FindFaPiaoConfigInfo(c.GetAdminUserInfo().CurrentOrgId)
588
+	number := strconv.FormatInt(time.Now().Unix(), 10) + "_" + strconv.FormatInt(orders[0].UserOrgId, 10) + "_" + strconv.FormatInt(orders[0].PatientId, 10)
589
+	amountWithoutTax, _, taxAmount, amountHasTax := CalculatePriceDetails(MedfeeSumamt, 1, 0.13)
590
+
591
+	postData3 := map[string]interface{}{
592
+		"seller_name":          org_config.OrgName,
593
+		"seller_taxpayer_num":  config2.SellerTaxpayerNum,
594
+		"seller_address":       config2.SellerAddress,
595
+		"seller_tel":           config2.SellerTel,
596
+		"seller_bank_name":     config2.SellerBankName,
597
+		"seller_bank_account":  config2.SellerBankAccount,
598
+		"title_type":           1,
599
+		"buyer_title":          orders[0].PsnName,
600
+		"buyer_taxpayer_num":   "",
601
+		"buyer_address":        "",
602
+		"buyer_phone":          "",
603
+		"buyer_bank_name":      "",
604
+		"buyer_bank_account":   "",
605
+		"buyer_email":          "",
606
+		"order_id":             number,
607
+		"invoice_type_code":    "082",
608
+		"callback_url":         "http://www.goldentec.com/callback",
609
+		"drawer":               role.UserName,
610
+		"payee":                "",
611
+		"checker":              "",
612
+		"terminal_code":        config2.TerminalCode,
613
+		"user_openid":          "",
614
+		"special_invoice_kind": "",
615
+		"zsfs":                 "",
616
+		"deduction":            "",
617
+		"amount_has_tax":       amountHasTax,
618
+		"tax_amount":           taxAmount,
619
+		"amount_without_tax":   amountWithoutTax,
620
+		"remark":               "医疗发票",
621
+	}
622
+
623
+	////项目商品明细
624
+	items := make([]map[string]interface{}, 0)
625
+	for _, ct := range cts {
626
+		item := make(map[string]interface{})
627
+		amountWithoutTax, _, taxAmount, _ := CalculatePriceDetails(ct.price, 1, 0.06)
628
+		item["name"] = ct.name
629
+		item["tax_code"] = "3070202000000000000"
630
+		item["models"] = ""
631
+		item["unit"] = ""
632
+		item["total_price"] = amountWithoutTax
633
+		item["total"] = "1"
634
+		item["price"] = amountWithoutTax
635
+		item["tax_rate"] = "0.06"
636
+		item["tax_amount"] = taxAmount
637
+		item["discount"] = "0"
638
+		item["preferential_policy_flag"] = ""
639
+		item["zero_tax_flag"] = ""
640
+		item["vat_special_management"] = ""
641
+		items = append(items, item)
642
+	}
643
+
644
+	postData3["items"] = items
645
+	routerAddress, postData4 := fapiao.Blue(postData3) //发票开具
646
+	r, err4 := sdk.HttpPost("https://apigw.goldentec.com", routerAddress, postData4)
647
+	fmt.Println("blue")
648
+	fmt.Println(string(r))
649
+	if err4 != nil {
650
+		fmt.Println(err4)
651
+	} else {
652
+		var resp OpenFaPiaoResultResponse
653
+		// 将 byte 切片转换为结构体
654
+		err := json.Unmarshal(r, &resp)
655
+		fmt.Println(resp)
656
+		if err != nil {
657
+			fmt.Println("Error unmarshalling:", err)
658
+		} else {
659
+			fmt.Println(resp)
660
+
661
+			if resp.Code == 0 {
662
+				//开具蓝票成功,请求查询接口,获取发票相关数据
663
+				routerAddress2, postData2 := fapiao.Query(config2.SellerTaxpayerNum, resp.Data.OrderSn, number)
664
+				r3, err2 := sdk.HttpPost("https://apigw.goldentec.com", routerAddress2, postData2)
665
+				fmt.Println("query")
666
+				fmt.Println(string(r3))
667
+				if err2 != nil {
668
+					fmt.Println(err2)
669
+				} else {
670
+					var resp3 QueryFaPiaoResultResponse
671
+					// 将 byte 切片转换为结构体
672
+					json.Unmarshal(r3, &resp3)
673
+					if resp3.Code == 0 {
674
+						var fapiao models.HisFaPiaoOrder
675
+						fapiao.InvoiceId = resp.Data.InvoiceId
676
+						fapiao.OrderSn = resp.Data.OrderSn
677
+						fapiao.TicketSn = resp3.Data.TicketSn
678
+						fapiao.TicketDate = resp3.Data.TicketDate
679
+						fapiao.AmountWithTax = resp3.Data.AmountWithoutTax
680
+						fapiao.AmountWithoutTax = resp3.Data.AmountWithoutTax
681
+						fapiao.TaxAmount = resp3.Data.TaxAmount
682
+						fapiao.IsRedWashed = strconv.FormatInt(int64(resp3.Data.IsRedWashed), 10)
683
+						fapiao.PdfUrl = resp3.Data.PdfUrl
684
+						fapiao.OfdUrl = resp3.Data.OfdUrl
685
+						fapiao.XmlUrl = resp3.Data.XmlUrl
686
+						fapiao.FapiaoStatus = "1"
687
+						fapiao.OrderIds = order_ids
688
+						fapiao.UserOrgId = c.GetAdminUserInfo().CurrentOrgId
689
+						fapiao.Status = 1
690
+						fapiao.PatientId = orders[0].PatientId
691
+						fapiao.Ctime = time.Now().Unix()
692
+						fapiao.Mtime = time.Now().Unix()
693
+						fapiao.Creator = role.UserName
694
+						fapiao.MedfeeSumamt = MedfeeSumamt
695
+						fapiao.FundPaySumamt = FundPaySumamt
696
+						fapiao.PsnCashPay = PsnCashPay
697
+						err5 := service.SaveFaPiaoOrder(fapiao)
698
+						fmt.Println(err5)
699
+						if err5 == nil {
700
+							service.UpdateFaPiaoNumber(resp3.Data.TicketSn, ids) //同步发票号码
701
+							c.ServeSuccessJSON(map[string]interface{}{
702
+								"msg": "开具成功",
703
+							})
704
+						}
705
+					} else {
706
+						//错误处理
707
+
708
+					}
709
+				}
710
+			} else {
711
+				//错误处理
712
+
713
+			}
714
+		}
715
+	}
716
+}
717
+func (c *FapiaoApiController) RedFaPiao() {
718
+	//认证
719
+	status := GetQRStatusTwo(c.GetAdminUserInfo().CurrentOrgId)
720
+	if status == 0 {
721
+		c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeAuthWrong)
722
+		return
723
+	}
724
+
725
+	id, _ := c.GetInt64("id")
726
+	admin_user_id, _ := c.GetInt64("admin_user_id")
727
+	role2, _ := service.GetAdminUserRole(admin_user_id, c.GetAdminUserInfo().CurrentOrgId)
728
+	fapiao_config, _ := service.GetFaPiaoOrderById(id)
165 729
 	var config models.FapiaoConfig
166 730
 	config, _ = service.FindFaPiaoConfigInfo(c.GetAdminUserInfo().CurrentOrgId)
167
-	routerAddress, postData := fapiao.QueryStock(config) //发票开具
168
-	r, err := sdk.HttpPost("https://apigw-test.goldentec.com", routerAddress, postData)
731
+	sdk := invoice.NewSdk(common.HMAC_SHA256, "5058f0defd12047ee2a7", "51440fbee667ea9a53aaa68c9c408367", "", "test")
732
+	routerAddress, postData := fapiao.Red(config.SellerTaxpayerNum, "", fapiao_config.OrderSn) //发票开具
733
+	fmt.Println("postData")
734
+	fmt.Println(postData)
735
+	fmt.Println("postData")
736
+	red, err := sdk.HttpPost("https://apigw.goldentec.com", routerAddress, postData)
737
+	fmt.Println("red")
738
+	fmt.Println(red)
739
+	fmt.Println("red")
740
+
169 741
 	if err != nil {
170 742
 		fmt.Println(err)
171 743
 	} else {
172
-		fmt.Println(string(r))
173
-	}
744
+		var resp RedResult
745
+		// 将 byte 切片转换为结构体
746
+		json.Unmarshal(red, &resp)
174 747
 
175
-}
748
+		fmt.Println("resp")
749
+		fmt.Println(resp)
750
+		fmt.Println("resp")
176 751
 
177
-func (c *FapiaoApiController) OpenFaPiao() {
178
-	GetQRStatus(c.GetAdminUserInfo().CurrentOrgId)
179
-	sdk := invoice.NewSdk(common.HMAC_SHA256, "8ca4ee7b152c0abceff9", "17402aff152dbeedf7a7b30be553f4c4", "", "test")
752
+		if resp.Code == 0 {
753
+			if resp.Data[0].State == 1 {
754
+				//查询红票开具情况
755
+				routerAddress2, postData2 := fapiao.Query(config.SellerTaxpayerNum, fapiao_config.OrderSn, "")
756
+				r3, _ := sdk.HttpPost("https://apigw.goldentec.com", routerAddress2, postData2)
757
+				var resp3 QueryFaPiaoResultResponse
758
+				// 将 byte 切片转换为结构体
759
+				json.Unmarshal(r3, &resp3)
760
+
761
+				fmt.Println("resp")
762
+				fmt.Println(string(r3))
763
+				fmt.Println(resp3)
764
+				fmt.Println("resp")
765
+				if resp3.Code == 0 {
766
+					if resp3.Data.IsRedWashed == 1 {
767
+						fapiao_config.IsRedWashed = "1"
768
+						fapiao_config.Status = 0
769
+						fapiao_config.RedInvoiceId = resp.Data[0].InvoiceId
770
+						fapiao_config.RedInvoiceCreator = role2.UserName
771
+						service.SaveFaPiaoOrder(fapiao_config)
772
+						//将结算表的发票号码清空
773
+						service.UpdateFaPiaoNumberByNumber(fapiao_config.TicketSn)
774
+						c.ServeSuccessJSON(map[string]interface{}{
775
+							"msg": "红冲成功",
776
+						})
777
+					} else {
778
+						c.ServeSuccessJSON(map[string]interface{}{
779
+							"msg": "红冲失败",
780
+						})
781
+					}
782
+				} else {
783
+					c.ServeSuccessJSON(map[string]interface{}{
784
+						"msg": "红冲失败",
785
+					})
786
+				}
787
+			} else {
788
+				c.ServeSuccessJSON(map[string]interface{}{
789
+					"msg": "红冲失败",
790
+				})
791
+			}
792
+		} else {
793
+
794
+			c.ServeSuccessJSON(map[string]interface{}{
795
+				"msg": "红冲失败",
796
+			})
797
+		}
798
+	}
799
+}
800
+func GetQRStatusTwo(org_id int64) (status int64) {
801
+	sdk := invoice.NewSdk(common.HMAC_SHA256, "5058f0defd12047ee2a7", "51440fbee667ea9a53aaa68c9c408367", "", "test")
180 802
 	var config models.FapiaoConfig
181
-	config, _ = service.FindFaPiaoConfigInfo(c.GetAdminUserInfo().CurrentOrgId)
182
-	routerAddress, postData := fapiao.Blue(config) //发票开具
183
-	r, err := sdk.HttpPost("https://apigw-test.goldentec.com", routerAddress, postData)
803
+	config, _ = service.FindFaPiaoConfigInfo(org_id)
804
+	routerAddress, postData := fapiao.GetQRCode(config) //发票开具
805
+	r, err := sdk.HttpPost("https://apigw.goldentec.com", routerAddress, postData)
184 806
 	if err != nil {
185 807
 		fmt.Println(err)
186 808
 	} else {
187
-		fmt.Println(string(r))
809
+		var resp QRAuth
810
+		// 将 byte 切片转换为结构体
811
+		err := json.Unmarshal(r, &resp)
812
+		fmt.Println(resp)
813
+		if err != nil {
814
+			fmt.Println("Error unmarshalling:", err)
815
+		} else {
816
+			if len(resp.Data.AuthId) == 0 { //还没实名认证
817
+
818
+			} else {
819
+				status = 1
820
+				status_str := GetQRStatus(org_id, resp.Data.AuthId)
821
+				if status_str == "UNDEFINE" {
822
+					status = 0
823
+				} else if status_str == "UNHANDLED" {
824
+					status = 0
825
+				} else if status_str == "REAL_AUTH_SUCCESS" {
826
+					status = 1
827
+				} else if status_str == "REFRESH" {
828
+					status = 0
829
+				} else if status_str == "NEED_RELOGIN_BUREAU" {
830
+					status = 0
831
+
832
+				}
833
+			}
834
+		}
188 835
 	}
836
+	return
189 837
 }
190 838
 
191
-func (c *FapiaoApiController) RedFaPiao() {
192
-	GetQRStatus(c.GetAdminUserInfo().CurrentOrgId)
839
+type RedResult struct {
840
+	Code int `json:"code"`
841
+	Data []struct {
842
+		State     int    `json:"state"`
843
+		Message   string `json:"message"`
844
+		OrderSn   string `json:"order_sn"`
845
+		InvoiceId string `json:"invoice_id"`
846
+	} `json:"data"`
847
+	Message string `json:"message"`
848
+}
849
+type QueryFaPiaoResultResponse struct {
850
+	Code int `json:"code"`
851
+	Data struct {
852
+		OrderSn          string `json:"order_sn"`
853
+		Status           int    `json:"status"`
854
+		Message          string `json:"message"`
855
+		TicketDate       string `json:"ticket_date"`
856
+		TicketSn         string `json:"ticket_sn"`
857
+		TicketCode       string `json:"ticket_code"`
858
+		CheckCode        string `json:"check_code"`
859
+		AmountWithTax    string `json:"amount_with_tax"`
860
+		AmountWithoutTax string `json:"amount_without_tax"`
861
+		TaxAmount        string `json:"tax_amount"`
862
+		IsRedWashed      int    `json:"is_red_washed"`
863
+		PdfUrl           string `json:"pdf_url"`
864
+		OfdUrl           string `json:"ofd_url"`
865
+		XmlUrl           string `json:"xml_url"`
866
+	} `json:"data"`
867
+	Message string `json:"message"`
868
+}
869
+type OpenFaPiaoResultResponse struct {
870
+	Code    int    `json:"code"`
871
+	Message string `json:"message"`
872
+	Data    struct {
873
+		State     int    `json:"state"`
874
+		OrderSn   string `json:"order_sn"`
875
+		InvoiceId string `json:"invoice_id"`
876
+	} `json:"data"`
877
+}
878
+type SurplusStockResponse struct {
879
+	Code    int    `json:"code"`
880
+	Message string `json:"message"`
881
+	Data    struct {
882
+		LeftQuantity int `json:"left_quantity"`
883
+	} `json:"data"`
884
+}
885
+
886
+func GetFaPiaoStock(org_id int64) (left_quantity int) {
193 887
 	sdk := invoice.NewSdk(common.HMAC_SHA256, "8ca4ee7b152c0abceff9", "17402aff152dbeedf7a7b30be553f4c4", "", "test")
194
-	//var config models.FapiaoConfig
195
-	//config, _ = service.FindFaPiaoConfigInfo(c.GetAdminUserInfo().CurrentOrgId)
196
-	routerAddress, postData := fapiao.Red() //发票开具
888
+	var config models.FapiaoConfig
889
+	config, _ = service.FindFaPiaoConfigInfo(org_id)
890
+	routerAddress, postData := fapiao.QueryStock(config)
197 891
 	r, err := sdk.HttpPost("https://apigw-test.goldentec.com", routerAddress, postData)
198 892
 	if err != nil {
199 893
 		fmt.Println(err)
200 894
 	} else {
201
-		fmt.Println(string(r))
895
+		var resp SurplusStockResponse
896
+		// 将 byte 切片转换为结构体
897
+		err := json.Unmarshal(r, &resp)
898
+		if err != nil {
899
+			fmt.Println("Error unmarshalling:", err)
900
+		} else {
901
+			if resp.Code == 0 {
902
+				left_quantity = resp.Data.LeftQuantity
903
+			}
904
+		}
202 905
 	}
906
+	return
203 907
 }
204 908
 
205
-func GetQRStatus(org_id int64) {
206
-	redis := service.RedisClient()
207
-	defer redis.Close()
208
-	sdk := invoice.NewSdk(common.HMAC_SHA256, "8ca4ee7b152c0abceff9", "17402aff152dbeedf7a7b30be553f4c4", "", "test")
909
+type Response struct {
910
+	Code    int    `json:"code"`
911
+	Message string `json:"message"`
912
+	Data    struct {
913
+		Status string `json:"status"`
914
+	} `json:"data"`
915
+}
916
+
917
+func GetQRStatus(org_id int64, auth_id string) (status string) {
918
+	sdk := invoice.NewSdk(common.HMAC_SHA256, "5058f0defd12047ee2a7", "51440fbee667ea9a53aaa68c9c408367", "", "test")
919
+	fmt.Println(sdk)
209 920
 	var config models.FapiaoConfig
210 921
 	config, _ = service.FindFaPiaoConfigInfo(org_id)
211
-	routerAddress, postData := fapiao.GetQRStatus("", config) //发票开具
212
-	r, err := sdk.HttpPost("https://apigw-test.goldentec.com", routerAddress, postData)
922
+	fmt.Println(config)
923
+	routerAddress, postData := fapiao.GetQRStatus(auth_id, config) //发票开具
924
+	fmt.Println(routerAddress)
925
+	fmt.Println(postData)
926
+	r, err := sdk.HttpPost("https://apigw.goldentec.com", routerAddress, postData)
213 927
 	if err != nil {
928
+		status = "FAILD"
214 929
 		fmt.Println(err)
215 930
 	} else {
931
+		fmt.Println(r)
932
+
933
+		var resp Response
934
+
935
+		// 将 byte 切片转换为结构体
936
+		err := json.Unmarshal(r, &resp)
216 937
 		fmt.Println(string(r))
938
+		if err != nil {
939
+			status = "FAILD"
940
+			fmt.Println("Error unmarshalling:", err)
941
+		} else {
942
+			status = resp.Data.Status
943
+			fmt.Printf("Parsed struct: %+v\n", resp)
944
+		}
217 945
 	}
946
+	return status
947
+	//return
948
+}
949
+
950
+// 计算商品价格、税额等函数
951
+func CalculatePriceDetails(totalCost float64, itemCount int, taxRate float64) (string, string, string, string) {
952
+	// 商品不含税总金额,保留两位小数
953
+	amountWithoutTax := roundTo(totalCost/(1+taxRate), 2)
954
+
955
+	// 商品不含税单价,保留八位小数
956
+	pricePerItem := roundTo(amountWithoutTax/float64(itemCount), 8)
957
+
958
+	// 税额,保留两位小数
959
+	taxAmount := roundTo(amountWithoutTax*taxRate, 2)
960
+
961
+	// 含税总金额
962
+	amountHasTax := amountWithoutTax + taxAmount
963
+
964
+	return fmt.Sprintf("%f", amountWithoutTax), fmt.Sprintf("%f", pricePerItem), fmt.Sprintf("%f", taxAmount), fmt.Sprintf("%f", amountHasTax)
965
+}
966
+
967
+// 保留指定小数位数的函数
968
+func roundTo(value float64, places int) float64 {
969
+	scale := math.Pow(10, float64(places))
970
+	return math.Round(value*scale) / scale
971
+}
972
+
973
+type QRAuth struct {
974
+	Code    int    `json:"code"`
975
+	Message string `json:"message"`
976
+	Data    struct {
977
+		AuthId string `json:"auth_id"`
978
+		QrCode string `json:"qr_code"`
979
+	} `json:"data"`
980
+}
981
+
982
+type FapiaoStock struct {
983
+	Code int `json:"code"`
984
+	Data struct {
985
+		LeftQuantity int `json:"left_quantity"`
986
+	} `json:"data"`
987
+	Message string `json:"message"`
218 988
 }

+ 6 - 0
controllers/statistics_api_controller.go Voir le fichier

@@ -87,6 +87,9 @@ func (c *StatisticsApiController) GetPatientWeightDetail() {
87 87
 	end_time := c.GetString("end_time")
88 88
 	add_type, _ := c.GetInt64("add_type")
89 89
 	dry_type, _ := c.GetInt64("dry_type")
90
+	fmt.Println("dry_type")
91
+	fmt.Println(dry_type)
92
+
90 93
 	after_type, _ := c.GetInt64("after_type")
91 94
 	page, _ := c.GetInt64("page")
92 95
 	limit, _ := c.GetInt64("limit")
@@ -146,6 +149,9 @@ func (c *StatisticsApiController) GetPatientBP() {
146 149
 		}
147 150
 		endTime = theTime.Unix()
148 151
 	}
152
+	fmt.Println(startTime)
153
+	fmt.Println(endTime)
154
+
149 155
 	item, _ := service.GetNewDialysisBloodChartData(c.GetAdminUserInfo().CurrentOrgId, startTime, endTime, statistics_type)
150 156
 	c.ServeSuccessJSON(map[string]interface{}{
151 157
 		"list": item,

+ 3 - 0
enums/error_code.go Voir le fichier

@@ -285,6 +285,8 @@ const ( // ErrorCode
285 285
 	ErrorAdivceCode = 600000010
286 286
 
287 287
 	ErrorTimeCodeParamWrong = 600000012
288
+
289
+	ErrorCodeAuthWrong = 600000013
288 290
 )
289 291
 
290 292
 var ErrCodeMsgs = map[int]string{
@@ -549,6 +551,7 @@ var ErrCodeMsgs = map[int]string{
549 551
 	ErrorAdivceCode:                       "该患者已开药,请先删除药品或耗材",
550 552
 
551 553
 	ErrorTimeCodeParamWrong: "时间跨度不能超过一个月",
554
+	ErrorCodeAuthWrong:      "尚未实名认证,请先认证",
552 555
 }
553 556
 
554 557
 type SGJError struct {

+ 88 - 0
invoice/sdk.go Voir le fichier

@@ -0,0 +1,88 @@
1
+package invoice
2
+
3
+import (
4
+	"encoding/base64"
5
+	"errors"
6
+	"io/ioutil"
7
+	"net/http"
8
+	"strconv"
9
+	"strings"
10
+	"time"
11
+
12
+	"XT_New/common"
13
+)
14
+
15
+func NewSdk(algorithm, appkey, appsecret, privateKey, env string) *Client {
16
+	return &Client{
17
+		env:        env,
18
+		appkey:     appkey,
19
+		appsecret:  appsecret,
20
+		algorithm:  algorithm,
21
+		privateKey: privateKey,
22
+	}
23
+}
24
+
25
+type Client struct {
26
+	env        string
27
+	appkey     string
28
+	appsecret  string
29
+	privateKey string
30
+	algorithm  string
31
+}
32
+
33
+func (this *Client) HttpPost(baseUrl string, routerAddress string, post map[string]interface{}) ([]byte, error) {
34
+
35
+	// 获取转换后的post字符串
36
+	postData, err := common.GetPostDataWithMap(post)
37
+	if err != nil {
38
+		return nil, err
39
+	}
40
+
41
+	timestamp := strconv.FormatInt(time.Now().Unix(), 10)                //获取时间戳
42
+	nonce := common.GetRand(6)                                           //6位随机数
43
+	auth, err := this.getAuth(routerAddress, postData, timestamp, nonce) //认证串
44
+	if err != nil {
45
+		return nil, err
46
+	}
47
+
48
+	client := &http.Client{}
49
+
50
+	reqest, err := http.NewRequest("POST", baseUrl+routerAddress, strings.NewReader((postData)))
51
+	if err != nil {
52
+		return nil, err
53
+	}
54
+
55
+	reqest.Header.Add("Authorization", auth)
56
+	reqest.Header.Add("Content-Type", "application/json")
57
+
58
+	r, err := client.Do(reqest)
59
+	if err != nil {
60
+		return nil, err
61
+	}
62
+	defer r.Body.Close()
63
+
64
+	return ioutil.ReadAll(r.Body)
65
+}
66
+
67
+// getAuth 获取授权字符串
68
+func (this *Client) getAuth(routerAddress string, postData string, timestamp string, nonce string) (string, error) {
69
+
70
+	originStr := "algorithm=" + this.algorithm + "|appkey=" + this.appkey + "|nonce=" + nonce + "|timestamp=" + timestamp + "|" + routerAddress + "|" + postData
71
+
72
+	var signs string
73
+	var err error
74
+	switch this.algorithm {
75
+	case common.HMAC_SHA256:
76
+		signs = base64.StdEncoding.EncodeToString(common.HMAC_Sha256(originStr, this.appsecret))
77
+	default:
78
+		panic(errors.New("algorithm not exists"))
79
+	}
80
+
81
+	if err != nil {
82
+		return "", err
83
+	}
84
+
85
+	auth := "algorithm=" + this.algorithm + ",appkey=" + this.appkey + ",nonce=" + nonce + ",timestamp=" + timestamp + ",signature=" + signs
86
+
87
+	return auth, nil
88
+}

+ 26 - 23
models/fapiao.go Voir le fichier

@@ -61,29 +61,32 @@ func (HisOrderByFaPiao) TableName() string {
61 61
 }
62 62
 
63 63
 type HisFaPiaoOrder struct {
64
-	ID               int64   `gorm:"column:id" json:"id" form:"id"`
65
-	InvoiceId        string  `gorm:"column:invoice_id" json:"invoice_id" form:"invoice_id"`
66
-	OrderSn          string  `gorm:"column:order_sn" json:"order_sn" form:"order_sn"`
67
-	TicketSn         string  `gorm:"column:ticket_sn" json:"ticket_sn" form:"ticket_sn"`
68
-	TicketDate       string  `gorm:"column:ticket_date" json:"ticket_date" form:"ticket_date"`
69
-	AmountWithTax    string  `gorm:"column:amount_with_tax" json:"amount_with_tax" form:"amount_with_tax"`
70
-	AmountWithoutTax string  `gorm:"column:amount_without_tax" json:"amount_without_tax" form:"amount_without_tax"`
71
-	TaxAmount        string  `gorm:"column:tax_amount" json:"tax_amount" form:"tax_amount"`
72
-	IsRedWashed      string  `gorm:"column:is_red_washed" json:"is_red_washed" form:"is_red_washed"`
73
-	PdfUrl           string  `gorm:"column:pdf_url" json:"pdf_url" form:"pdf_url"`
74
-	OfdUrl           string  `gorm:"column:ofd_url" json:"ofd_url" form:"ofd_url"`
75
-	XmlUrl           string  `gorm:"column:xml_url" json:"xml_url" form:"xml_url"`
76
-	FapiaoStatus     string  `gorm:"column:fapiao_status" json:"fapiao_status" form:"fapiao_status"`
77
-	OrderIds         string  `gorm:"column:order_ids" json:"order_ids" form:"order_ids"`
78
-	UserOrgId        int64   `gorm:"column:user_org_id" json:"user_org_id" form:"user_org_id"`
79
-	Status           int64   `gorm:"column:status" json:"status" form:"status"`
80
-	PatientId        int64   `gorm:"column:patient_id" json:"patient_id" form:"patient_id"`
81
-	Ctime            int64   `gorm:"column:ctime" json:"ctime" form:"ctime"`
82
-	Mtime            int64   `gorm:"column:mtime" json:"mtime" form:"mtime"`
83
-	Creator          string  `gorm:"column:creator" json:"creator" form:"creator"`
84
-	MedfeeSumamt     float64 `gorm:"column:medfee_sumamt" json:"medfee_sumamt" form:"medfee_sumamt"`
85
-	PsnCashPay       float64 `gorm:"column:psn_cash_pay" json:"psn_cash_pay" form:"psn_cash_pay"`
86
-	FundPaySumamt    float64 `gorm:"column:fund_pay_sumamt" json:"fund_pay_sumamt" form:"fund_pay_sumamt"`
64
+	ID                int64    `gorm:"column:id" json:"id" form:"id"`
65
+	InvoiceId         string   `gorm:"column:invoice_id" json:"invoice_id" form:"invoice_id"`
66
+	OrderSn           string   `gorm:"column:order_sn" json:"order_sn" form:"order_sn"`
67
+	TicketSn          string   `gorm:"column:ticket_sn" json:"ticket_sn" form:"ticket_sn"`
68
+	TicketDate        string   `gorm:"column:ticket_date" json:"ticket_date" form:"ticket_date"`
69
+	AmountWithTax     string   `gorm:"column:amount_with_tax" json:"amount_with_tax" form:"amount_with_tax"`
70
+	AmountWithoutTax  string   `gorm:"column:amount_without_tax" json:"amount_without_tax" form:"amount_without_tax"`
71
+	TaxAmount         string   `gorm:"column:tax_amount" json:"tax_amount" form:"tax_amount"`
72
+	IsRedWashed       string   `gorm:"column:is_red_washed" json:"is_red_washed" form:"is_red_washed"`
73
+	PdfUrl            string   `gorm:"column:pdf_url" json:"pdf_url" form:"pdf_url"`
74
+	OfdUrl            string   `gorm:"column:ofd_url" json:"ofd_url" form:"ofd_url"`
75
+	XmlUrl            string   `gorm:"column:xml_url" json:"xml_url" form:"xml_url"`
76
+	FapiaoStatus      string   `gorm:"column:fapiao_status" json:"fapiao_status" form:"fapiao_status"`
77
+	OrderIds          string   `gorm:"column:order_ids" json:"order_ids" form:"order_ids"`
78
+	UserOrgId         int64    `gorm:"column:user_org_id" json:"user_org_id" form:"user_org_id"`
79
+	Status            int64    `gorm:"column:status" json:"status" form:"status"`
80
+	PatientId         int64    `gorm:"column:patient_id" json:"patient_id" form:"patient_id"`
81
+	Ctime             int64    `gorm:"column:ctime" json:"ctime" form:"ctime"`
82
+	Mtime             int64    `gorm:"column:mtime" json:"mtime" form:"mtime"`
83
+	Creator           string   `gorm:"column:creator" json:"creator" form:"creator"`
84
+	MedfeeSumamt      float64  `gorm:"column:medfee_sumamt" json:"medfee_sumamt" form:"medfee_sumamt"`
85
+	PsnCashPay        float64  `gorm:"column:psn_cash_pay" json:"psn_cash_pay" form:"psn_cash_pay"`
86
+	FundPaySumamt     float64  `gorm:"column:fund_pay_sumamt" json:"fund_pay_sumamt" form:"fund_pay_sumamt"`
87
+	RedInvoiceId      string   `gorm:"column:red_invoice_id" json:"red_invoice_id" form:"red_invoice_id"`
88
+	RedInvoiceCreator string   `gorm:"column:red_invoice_creator" json:"red_invoice_creator" form:"red_invoice_creator"`
89
+	Patients          Patients `gorm:"ForeignKey:PatientId;AssociationForeignKey:ID" json:"patient"`
87 90
 }
88 91
 
89 92
 func (HisFaPiaoOrder) TableName() string {

+ 2 - 59
service/fapiao/bule.go Voir le fichier

@@ -1,63 +1,6 @@
1 1
 package fapiao
2 2
 
3
-import "XT_New/models"
4
-
5
-func Blue(config models.FapiaoConfig) (routerAddress string, postData map[string]interface{}) {
6
-
7
-	routerAddress = "/tax-api/invoice/blue/v1"
8
-
9
-	postData = map[string]interface{}{
10
-		"seller_name":          "wkbb invoice blue test",
11
-		"seller_taxpayer_num":  "your seller_taxpayer_num",
12
-		"seller_address":       "",
13
-		"seller_tel":           "",
14
-		"seller_bank_name":     "",
15
-		"seller_bank_account":  "",
16
-		"title_type":           1,
17
-		"buyer_title":          "海南高灯科技",
18
-		"buyer_taxpayer_num":   "",
19
-		"buyer_address":        "",
20
-		"buyer_bank_name":      "",
21
-		"buyer_bank_account":   "",
22
-		"buyer_phone":          "",
23
-		"buyer_email":          "",
24
-		"taker_phone":          "",
25
-		"order_id":             "fc5fec2d1b6942658c009a151d4cffa5",
26
-		"invoice_type_code":    "032",
27
-		"callback_url":         "http://www.test.com",
28
-		"drawer":               "TEST",
29
-		"payee":                "TEST",
30
-		"checker":              "TEST",
31
-		"terminal_code":        "661234567789",
32
-		"user_openid":          "ba9ea0bdfa1f460993c990564caab18f",
33
-		"special_invoice_kind": "",
34
-		"zsfs":                 "",
35
-		"deduction":            "",
36
-		"amount_has_tax":       "66.66",
37
-		"tax_amount":           "66.66",
38
-		"amount_without_tax":   "66.66",
39
-		"remark":               "readme",
40
-	}
41
-
42
-	//项目商品明细
43
-	items := make([]map[string]interface{}, 1)
44
-	item := make(map[string]interface{})
45
-	item["name"] = "海鲜真划算"
46
-	item["tax_code"] = "your tax_code"
47
-	item["models"] = "zyx"
48
-	item["unit"] = "个"
49
-	item["total_price"] = "66.66"
50
-	item["total"] = "5"
51
-	item["price"] = "17.22"
52
-	item["tax_rate"] = "66.66"
53
-	item["tax_amount"] = "66.66"
54
-	item["discount"] = "66.66"
55
-	item["preferential_policy_flag"] = "0"
56
-	item["zero_tax_flag"] = "0"
57
-	item["vat_special_management"] = ""
58
-	items[0] = item
59
-
60
-	postData["items"] = items
61
-
3
+func Blue(postData map[string]interface{}) (string, map[string]interface{}) {
4
+	routerAddress := "/tax-api/invoice/blue/v1"
62 5
 	return routerAddress, postData
63 6
 }

+ 1 - 1
service/fapiao/qrcode.go Voir le fichier

@@ -15,7 +15,7 @@ func GetQRCode(config models.FapiaoConfig) (routerAddress string, postData map[s
15 15
 
16 16
 func GetQRStatus(auth_id string, config models.FapiaoConfig) (routerAddress string, postData map[string]interface{}) {
17 17
 
18
-	routerAddress = "tax-api/invoice/auth/query-qrcode-status/v1"
18
+	routerAddress = "/tax-api/invoice/auth/query-qrcode-status/v1"
19 19
 	postData = map[string]interface{}{
20 20
 		"taxpayer_id":   config.TaxpayerId,
21 21
 		"terminal_code": config.TerminalCode,

+ 5 - 5
service/fapiao/query.go Voir le fichier

@@ -2,14 +2,14 @@ package fapiao
2 2
 
3 3
 import "XT_New/models"
4 4
 
5
-func Query() (routerAddress string, postData map[string]interface{}) {
5
+func Query(seller_taxpayer_num string, order_sn string, order_id string) (routerAddress string, postData map[string]interface{}) {
6 6
 
7 7
 	routerAddress = "/tax-api/invoice/query/v1"
8 8
 
9 9
 	postData = map[string]interface{}{
10
-		"seller_taxpayer_num": "500102010004038",
11
-		"order_sn":            "",
12
-		"order_id":            "gp_20190828115454_742_11296_31131",
10
+		"seller_taxpayer_num": seller_taxpayer_num,
11
+		"order_sn":            order_sn,
12
+		"order_id":            order_id,
13 13
 		"is_red":              0,
14 14
 	}
15 15
 
@@ -21,7 +21,7 @@ func QueryStock(config models.FapiaoConfig) (routerAddress string, postData map[
21 21
 	postData = map[string]interface{}{
22 22
 		"taxpayer_id":       config.TaxpayerId,
23 23
 		"terminal_code":     config.TerminalCode,
24
-		"invoice_type_code": "007",
24
+		"invoice_type_code": "026",
25 25
 	}
26 26
 	return routerAddress, postData
27 27
 }

+ 6 - 5
service/fapiao/red.go Voir le fichier

@@ -1,15 +1,16 @@
1 1
 package fapiao
2 2
 
3
-func Red() (routerAddress string, postData map[string]interface{}) {
3
+func Red(seller_taxpayer_num string, callback_url string, order_sn string) (routerAddress string, postData map[string]interface{}) {
4 4
 
5
-	routerAddress = "/tax-api/invoice/red/v1"
5
+	routerAddress = "/tax-api/invoice/red/quick/v1"
6 6
 
7 7
 	invoices := make([]map[string]interface{}, 1)
8 8
 
9 9
 	invoice := make(map[string]interface{})
10
-	invoice["seller_taxpayer_num"] = "111112222233333"
11
-	invoice["callback_url"] = "http://test.feehi.com/sign/mock/invoice-callback.php"
12
-	invoice["order_sn"] = "6555407740980870214"
10
+	invoice["seller_taxpayer_num"] = seller_taxpayer_num
11
+	invoice["callback_url"] = callback_url
12
+	invoice["order_sn"] = order_sn
13
+	invoice["apply_reason"] = "2"
13 14
 
14 15
 	invoices[0] = invoice
15 16
 

+ 33 - 4
service/fapiao_service.go Voir le fichier

@@ -69,12 +69,11 @@ func GetFaPiaoSettleList(user_org_id int64, page int64, limit int64, start_time_
69 69
 	return
70 70
 }
71 71
 
72
-func GetFaPiaoList(user_org_id int64, page int64, limit int64, start_time_timestamp int64, end_time_timestamp int64) (order []*models.HisOrder, err error, total int64) {
72
+func GetFaPiaoList(user_org_id int64, page int64, limit int64, start_time_timestamp int64, end_time_timestamp int64) (order []*models.HisFaPiaoOrder, err error, total int64) {
73 73
 	offset := (page - 1) * limit
74 74
 	db := readDb.Model(&models.HisFaPiaoOrder{})
75
-	db = db.Preload("Patients", "status = 1 AND user_org_id = ?", user_org_id).
76
-		Preload("HisFaPiaoOrder", "status = 1")
77
-	db = db.Where("ctime >= ? and ctime <= ? and user_org_id = ?", start_time_timestamp, end_time_timestamp, user_org_id)
75
+	db = db.Preload("Patients", "status = 1 AND user_org_id = ?", user_org_id)
76
+	db = db.Where("ctime >= ? and ctime <= ? and user_org_id = ? and status = 1", start_time_timestamp, end_time_timestamp, user_org_id)
78 77
 	// Count the total number of records
79 78
 	db = db.Count(&total)
80 79
 	// Apply pagination
@@ -83,3 +82,33 @@ func GetFaPiaoList(user_org_id int64, page int64, limit int64, start_time_timest
83 82
 	err = db.Find(&order).Error
84 83
 	return
85 84
 }
85
+
86
+func GetFaPiaoOrderByIDS(ids []string) (orders []models.HisOrder, err error) {
87
+	err = readDb.Model(&models.HisOrder{}).Where("id in (?) AND status = 1", ids).Find(&orders).Error
88
+	return
89
+}
90
+
91
+func GetFaPiaoOrderById(id int64) (orders models.HisFaPiaoOrder, err error) {
92
+	err = readDb.Model(&models.HisFaPiaoOrder{}).Where("id = ?", id).Find(&orders).Error
93
+	return
94
+}
95
+
96
+func GetFaPiaoOrderInfoByNumbers(numbers []string) (infos []models.HisOrderInfo, err error) {
97
+	err = readDb.Model(&models.HisOrderInfo{}).Where("order_number in (?)", numbers).Find(&infos).Error
98
+	return
99
+}
100
+
101
+func SaveFaPiaoOrder(fapiao models.HisFaPiaoOrder) (err error) {
102
+	err = writeDb.Save(&fapiao).Error
103
+	return
104
+}
105
+
106
+func UpdateFaPiaoNumber(number string, ids []string) (err error) {
107
+	err = XTWriteDB().Model(&models.HisOrder{}).Where("id in (?)", ids).Updates(map[string]interface{}{"fa_piao_number": number}).Error
108
+	return
109
+}
110
+
111
+func UpdateFaPiaoNumberByNumber(number string) (err error) {
112
+	err = XTWriteDB().Model(&models.HisOrder{}).Where("fa_piao_number = ?", number).Updates(map[string]interface{}{"fa_piao_number": ""}).Error
113
+	return
114
+}

+ 456 - 189
service/statistis_qc_service.go Voir le fichier

@@ -1248,14 +1248,18 @@ type Patient struct {
1248 1248
 	IDCardNo string `gorm:"column:id_card_no"`
1249 1249
 }
1250 1250
 
1251
+func (Patient) TableName() string {
1252
+	return "xt_patients"
1253
+}
1254
+
1251 1255
 // xt_assessment_before_dislysis model
1252 1256
 type Assessment struct {
1253
-	ID             uint      `gorm:"id"`
1254
-	PatientID      uint      `gorm:"column:patient_id"`
1255
-	SystolicBP     int       `gorm:"column:systolic_blood_pressure"`
1256
-	DiastolicBP    int       `gorm:"column:diastolic_blood_pressure"`
1257
-	AssessmentDate time.Time `gorm:"column:assessment_date"`
1258
-	UserOrgID      int       `gorm:"column:user_org_id"`
1257
+	ID             uint    `gorm:"id"`
1258
+	PatientID      uint    `gorm:"column:patient_id"`
1259
+	SystolicBP     float64 `gorm:"column:systolic_blood_pressure"`
1260
+	DiastolicBP    float64 `gorm:"column:diastolic_blood_pressure"`
1261
+	AssessmentDate int64   `gorm:"column:assessment_date"`
1262
+	UserOrgID      int     `gorm:"column:user_org_id"`
1259 1263
 }
1260 1264
 
1261 1265
 func (Assessment) TableName() string {
@@ -1768,105 +1772,265 @@ type DialysisDataTwo struct {
1768 1772
 	WeightStatus      string   `json:"weight_status"`
1769 1773
 }
1770 1774
 
1771
-func GetNewDialysisWeightDetailTableTen(user_org_id int64, start_time int64, end_time int64, addType, dryType, afterType, page, limit int64) ([]DialysisDataTwo, int64, error) {
1775
+//func GetNewDialysisWeightDetailTableTen(user_org_id int64, start_time int64, end_time int64, addType, dryType, afterType, page, limit int64) ([]DialysisDataTwo, int64, error) {
1776
+//	offset := (page - 1) * limit
1777
+//	var dialysisData []DialysisDataTwo
1778
+//	var total int64
1779
+//	// 构建基本查询
1780
+//	query := readDb.Table("xt_assessment_before_dislysis b").
1781
+//		Select(`
1782
+//			p.dialysis_no AS dialysis_no,
1783
+//			p.name AS patient_name,
1784
+//			p.gender AS gender,
1785
+//			FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS age,
1786
+//			b.assessment_date AS assessment_date,
1787
+//			b.dry_weight AS dry_weight,
1788
+//			b.weight_before AS weight_before,
1789
+//			a.weight_after AS weight_after,
1790
+//			(
1791
+//				SELECT a2.weight_after
1792
+//				FROM xt_assessment_after_dislysis a2
1793
+//				JOIN xt_assessment_before_dislysis b2
1794
+//				ON a2.patient_id = b2.patient_id
1795
+//				AND a2.assessment_date = b2.assessment_date
1796
+//				WHERE b2.patient_id = b.patient_id
1797
+//				AND b2.assessment_date < b.assessment_date
1798
+//				ORDER BY b2.assessment_date DESC LIMIT 1
1799
+//			) AS last_weight_after,
1800
+//			CASE
1801
+//				WHEN (
1802
+//					SELECT a2.weight_after
1803
+//					FROM xt_assessment_after_dislysis a2
1804
+//					JOIN xt_assessment_before_dislysis b2
1805
+//					ON a2.patient_id = b2.patient_id
1806
+//					AND a2.assessment_date = b2.assessment_date
1807
+//					WHERE b2.patient_id = b.patient_id
1808
+//					AND b2.assessment_date < b.assessment_date
1809
+//					ORDER BY b2.assessment_date DESC LIMIT 1
1810
+//				) IS NOT NULL
1811
+//				THEN (b.weight_before - (
1812
+//					SELECT a2.weight_after
1813
+//					FROM xt_assessment_after_dislysis a2
1814
+//					JOIN xt_assessment_before_dislysis b2
1815
+//					ON a2.patient_id = b2.patient_id
1816
+//					AND a2.assessment_date = b2.assessment_date
1817
+//					WHERE b2.patient_id = b.patient_id
1818
+//					AND b2.assessment_date < b.assessment_date
1819
+//					ORDER BY b2.assessment_date DESC LIMIT 1
1820
+//				)) / (
1821
+//					SELECT a2.weight_after
1822
+//					FROM xt_assessment_after_dislysis a2
1823
+//					JOIN xt_assessment_before_dislysis b2
1824
+//					ON a2.patient_id = b2.patient_id
1825
+//					AND a2.assessment_date = b2.assessment_date
1826
+//					WHERE b2.patient_id = b.patient_id
1827
+//					AND b2.assessment_date < b.assessment_date
1828
+//					ORDER BY b2.assessment_date DESC LIMIT 1
1829
+//				)
1830
+//				ELSE NULL
1831
+//			END AS weight_add,
1832
+//			CASE
1833
+//				WHEN b.dry_weight IS NOT NULL THEN
1834
+//					CASE
1835
+//						WHEN b.dry_weight < 40 THEN '小于40'
1836
+//						WHEN b.dry_weight BETWEEN 40 AND 50 THEN '40~50'
1837
+//						WHEN b.dry_weight BETWEEN 50 AND 60 THEN '50~60'
1838
+//						WHEN b.dry_weight BETWEEN 60 AND 70 THEN '60~70'
1839
+//						WHEN b.dry_weight > 70 THEN '大于70'
1840
+//					END
1841
+//				ELSE '其他'
1842
+//			END AS dry_weight_category,
1843
+//			CASE
1844
+//				WHEN b.dry_weight IS NOT NULL THEN
1845
+//					CASE
1846
+//						WHEN ABS(a.weight_after - b.dry_weight) <= 0.3 THEN '达标'
1847
+//						ELSE '不达标'
1848
+//					END
1849
+//				ELSE '其他'
1850
+//			END AS weight_status
1851
+//		`).
1852
+//		Joins("JOIN xt_patients p ON p.id = b.patient_id").
1853
+//		Joins("JOIN xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date AND a.status = 1").
1854
+//		Where("b.user_org_id = ?", user_org_id).
1855
+//		Where("b.assessment_date >= ?", start_time).
1856
+//		Where("b.assessment_date <= ?", end_time).
1857
+//		Where("b.status = ?", 1)
1858
+//
1859
+//	fmt.Println("dry_type")
1860
+//	fmt.Println(dryType)
1861
+//	switch dryType {
1862
+//	case 1:
1863
+//		query.Where("dry_weight_category = '小于40'")
1864
+//	case 2:
1865
+//		query.Where("dry_weight_category = '40~50'")
1866
+//	case 3:
1867
+//		query.Where("dry_weight_category = '50~60'")
1868
+//	case 4:
1869
+//		query.Where("dry_weight_category = '60~70'")
1870
+//	case 5:
1871
+//		query.Where("dry_weight_category = '大于70'")
1872
+//	}
1873
+//
1874
+//	// 根据传入的 add_type 值动态构建条件
1875
+//	addTypeCondition(query, addType)
1876
+//	// 根据传入的 dry_type 值动态构建条件
1877
+//	//fmt.Println("dry_type")
1878
+//	//fmt.Println(dryType)
1879
+//
1880
+//	//dryTypeCondition(query, dryType)
1881
+//	// 根据传入的 after_type 值动态构建条件
1882
+//	afterTypeCondition(query, afterType)
1883
+//	// 获取总记录数
1884
+//	if err := query.Count(&total).Error; err != nil {
1885
+//		return nil, 0, fmt.Errorf("count query failed: %v", err)
1886
+//	}
1887
+//	// 获取分页数据
1888
+//	rows, err := query.Order("p.id, b.assessment_date").Offset(int(offset)).Limit(int(limit)).Rows()
1889
+//	if err != nil {
1890
+//		return nil, 0, fmt.Errorf("pagination query failed: %v", err)
1891
+//	}
1892
+//	defer rows.Close()
1893
+//	// 处理结果集
1894
+//	for rows.Next() {
1895
+//		var data DialysisDataTwo
1896
+//		if err := rows.Scan(
1897
+//			&data.DialysisNo,
1898
+//			&data.PatientName,
1899
+//			&data.Gender,
1900
+//			&data.Age,
1901
+//			&data.AssessmentDate,
1902
+//			&data.DryWeight,
1903
+//			&data.WeightBefore,
1904
+//			&data.WeightAfter,
1905
+//			&data.LastWeightAfter,
1906
+//			&data.WeightAdd,
1907
+//			&data.DryWeightCategory,
1908
+//			&data.WeightStatus,
1909
+//		); err != nil {
1910
+//			return nil, 0, fmt.Errorf("row scan failed: %v", err)
1911
+//		}
1912
+//		// 将每一行结果追加到切片中
1913
+//		dialysisData = append(dialysisData, data)
1914
+//	}
1915
+//	return dialysisData, total, nil
1916
+//}
1917
+
1918
+func GetNewDialysisWeightDetailTableTen(
1919
+	user_org_id int64,
1920
+	start_time int64,
1921
+	end_time int64,
1922
+	addType, dryType, afterType, page, limit int64,
1923
+) ([]DialysisDataTwo, int64, error) {
1772 1924
 	offset := (page - 1) * limit
1773 1925
 	var dialysisData []DialysisDataTwo
1774 1926
 	var total int64
1927
+
1775 1928
 	// 构建基本查询
1776 1929
 	query := readDb.Table("xt_assessment_before_dislysis b").
1777 1930
 		Select(`
1778
-			p.dialysis_no AS dialysis_no, 
1779
-			p.name AS patient_name, 
1780
-			p.gender AS gender, 
1781
-			FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS age,
1782
-			b.assessment_date AS assessment_date, 
1783
-			b.dry_weight AS dry_weight, 
1784
-			b.weight_before AS weight_before, 
1785
-			a.weight_after AS weight_after,
1786
-			(
1787
-				SELECT a2.weight_after 
1788
-				FROM xt_assessment_after_dislysis a2
1789
-				JOIN xt_assessment_before_dislysis b2 
1790
-				ON a2.patient_id = b2.patient_id 
1791
-				AND a2.assessment_date = b2.assessment_date
1792
-				WHERE b2.patient_id = b.patient_id 
1793
-				AND b2.assessment_date < b.assessment_date
1794
-				ORDER BY b2.assessment_date DESC LIMIT 1
1795
-			) AS last_weight_after,
1796
-			CASE 
1797
-				WHEN (
1798
-					SELECT a2.weight_after 
1799
-					FROM xt_assessment_after_dislysis a2
1800
-					JOIN xt_assessment_before_dislysis b2 
1801
-					ON a2.patient_id = b2.patient_id 
1802
-					AND a2.assessment_date = b2.assessment_date
1803
-					WHERE b2.patient_id = b.patient_id 
1804
-					AND b2.assessment_date < b.assessment_date
1805
-					ORDER BY b2.assessment_date DESC LIMIT 1
1806
-				) IS NOT NULL
1807
-				THEN (b.weight_before - (
1808
-					SELECT a2.weight_after 
1809
-					FROM xt_assessment_after_dislysis a2
1810
-					JOIN xt_assessment_before_dislysis b2 
1811
-					ON a2.patient_id = b2.patient_id 
1812
-					AND a2.assessment_date = b2.assessment_date
1813
-					WHERE b2.patient_id = b.patient_id 
1814
-					AND b2.assessment_date < b.assessment_date
1815
-					ORDER BY b2.assessment_date DESC LIMIT 1
1816
-				)) / (
1817
-					SELECT a2.weight_after 
1818
-					FROM xt_assessment_after_dislysis a2
1819
-					JOIN xt_assessment_before_dislysis b2 
1820
-					ON a2.patient_id = b2.patient_id 
1821
-					AND a2.assessment_date = b2.assessment_date
1822
-					WHERE b2.patient_id = b.patient_id 
1823
-					AND b2.assessment_date < b.assessment_date
1824
-					ORDER BY b2.assessment_date DESC LIMIT 1
1825
-				)
1826
-				ELSE NULL
1827
-			END AS weight_add,
1828
-			CASE 
1829
-				WHEN b.dry_weight IS NOT NULL THEN 
1830
-					CASE 
1831
-						WHEN b.dry_weight < 40 THEN '小于40'
1832
-						WHEN b.dry_weight BETWEEN 40 AND 50 THEN '40~50'
1833
-						WHEN b.dry_weight BETWEEN 50 AND 60 THEN '50~60'
1834
-						WHEN b.dry_weight BETWEEN 60 AND 70 THEN '60~70'
1835
-						WHEN b.dry_weight > 70 THEN '大于70'
1836
-					END
1837
-				ELSE '其他'
1838
-			END AS dry_weight_category,
1839
-			CASE 
1840
-				WHEN b.dry_weight IS NOT NULL THEN 
1841
-					CASE 
1842
-						WHEN ABS(a.weight_after - b.dry_weight) <= 0.3 THEN '达标'
1843
-						ELSE '不达标'
1844
-					END
1845
-				ELSE '其他'
1846
-			END AS weight_status
1847
-		`).
1931
+            p.dialysis_no AS dialysis_no, 
1932
+            p.name AS patient_name, 
1933
+            p.gender AS gender, 
1934
+            FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS age,
1935
+            b.assessment_date AS assessment_date, 
1936
+            b.dry_weight AS dry_weight, 
1937
+            b.weight_before AS weight_before, 
1938
+            a.weight_after AS weight_after,
1939
+            (
1940
+                SELECT a2.weight_after 
1941
+                FROM xt_assessment_after_dislysis a2
1942
+                JOIN xt_assessment_before_dislysis b2 
1943
+                ON a2.patient_id = b2.patient_id 
1944
+                AND a2.assessment_date = b2.assessment_date
1945
+                WHERE b2.patient_id = b.patient_id 
1946
+                AND b2.assessment_date < b.assessment_date
1947
+                ORDER BY b2.assessment_date DESC LIMIT 1
1948
+            ) AS last_weight_after,
1949
+            CASE 
1950
+                WHEN (
1951
+                    SELECT a2.weight_after 
1952
+                    FROM xt_assessment_after_dislysis a2
1953
+                    JOIN xt_assessment_before_dislysis b2 
1954
+                    ON a2.patient_id = b2.patient_id 
1955
+                    AND a2.assessment_date = b2.assessment_date
1956
+                    WHERE b2.patient_id = b.patient_id 
1957
+                    AND b2.assessment_date < b.assessment_date
1958
+                    ORDER BY b2.assessment_date DESC LIMIT 1
1959
+                ) IS NOT NULL
1960
+                THEN (b.weight_before - (
1961
+                    SELECT a2.weight_after 
1962
+                    FROM xt_assessment_after_dislysis a2
1963
+                    JOIN xt_assessment_before_dislysis b2 
1964
+                    ON a2.patient_id = b2.patient_id 
1965
+                    AND a2.assessment_date = b2.assessment_date
1966
+                    WHERE b2.patient_id = b.patient_id 
1967
+                    AND b2.assessment_date < b.assessment_date
1968
+                    ORDER BY b2.assessment_date DESC LIMIT 1
1969
+                )) / (
1970
+                    SELECT a2.weight_after 
1971
+                    FROM xt_assessment_after_dislysis a2
1972
+                    JOIN xt_assessment_before_dislysis b2 
1973
+                    ON a2.patient_id = b2.patient_id 
1974
+                    AND a2.assessment_date = b2.assessment_date
1975
+                    WHERE b2.patient_id = b.patient_id 
1976
+                    AND b2.assessment_date < b.assessment_date
1977
+                    ORDER BY b2.assessment_date DESC LIMIT 1
1978
+                )
1979
+                ELSE NULL
1980
+            END AS weight_add,
1981
+            CASE 
1982
+                WHEN b.dry_weight IS NOT NULL THEN 
1983
+                    CASE 
1984
+                        WHEN ABS(a.weight_after - b.dry_weight) <= 0.3 THEN '达标'
1985
+                        ELSE '不达标'
1986
+                    END
1987
+                ELSE '其他'
1988
+            END AS weight_status
1989
+        `).
1848 1990
 		Joins("JOIN xt_patients p ON p.id = b.patient_id").
1849 1991
 		Joins("JOIN xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date AND a.status = 1").
1850 1992
 		Where("b.user_org_id = ?", user_org_id).
1851 1993
 		Where("b.assessment_date >= ?", start_time).
1852 1994
 		Where("b.assessment_date <= ?", end_time).
1853 1995
 		Where("b.status = ?", 1)
1854
-	// 根据传入的 add_type 值动态构建条件
1855
-	addTypeCondition(query, addType)
1996
+
1856 1997
 	// 根据传入的 dry_type 值动态构建条件
1857
-	dryTypeCondition(query, dryType)
1858
-	// 根据传入的 after_type 值动态构建条件
1998
+	fmt.Println("00=-----11111")
1999
+	fmt.Println(dryType)
2000
+
2001
+	switch dryType {
2002
+	case 1:
2003
+		fmt.Println("00=-----11111")
2004
+		fmt.Println(dryType)
2005
+		query = query.Where("b.dry_weight < ?", 40)
2006
+	case 2:
2007
+		query = query.Where("b.dry_weight BETWEEN ? AND ?", 40, 50)
2008
+	case 3:
2009
+		query = query.Where("b.dry_weight BETWEEN ? AND ?", 50, 60)
2010
+	case 4:
2011
+		query = query.Where("b.dry_weight BETWEEN ? AND ?", 60, 70)
2012
+	case 5:
2013
+		query = query.Where("b.dry_weight > ?", 70)
2014
+	}
2015
+
2016
+	//// 根据传入的 add_type 值动态构建条件
2017
+	addTypeCondition(query, addType)
2018
+	//
2019
+	//// 根据传入的 after_type 值动态构建条件
1859 2020
 	afterTypeCondition(query, afterType)
2021
+
1860 2022
 	// 获取总记录数
1861 2023
 	if err := query.Count(&total).Error; err != nil {
1862 2024
 		return nil, 0, fmt.Errorf("count query failed: %v", err)
1863 2025
 	}
2026
+
1864 2027
 	// 获取分页数据
1865 2028
 	rows, err := query.Order("p.id, b.assessment_date").Offset(int(offset)).Limit(int(limit)).Rows()
1866 2029
 	if err != nil {
1867 2030
 		return nil, 0, fmt.Errorf("pagination query failed: %v", err)
1868 2031
 	}
1869 2032
 	defer rows.Close()
2033
+
1870 2034
 	// 处理结果集
1871 2035
 	for rows.Next() {
1872 2036
 		var data DialysisDataTwo
@@ -1881,7 +2045,6 @@ func GetNewDialysisWeightDetailTableTen(user_org_id int64, start_time int64, end
1881 2045
 			&data.WeightAfter,
1882 2046
 			&data.LastWeightAfter,
1883 2047
 			&data.WeightAdd,
1884
-			&data.DryWeightCategory,
1885 2048
 			&data.WeightStatus,
1886 2049
 		); err != nil {
1887 2050
 			return nil, 0, fmt.Errorf("row scan failed: %v", err)
@@ -1896,41 +2059,30 @@ func GetNewDialysisWeightDetailTableTen(user_org_id int64, start_time int64, end
1896 2059
 func addTypeCondition(query *gorm.DB, addType int64) {
1897 2060
 	switch addType {
1898 2061
 	case 1:
1899
-		query.Where("weight_add <= 0.03")
2062
+		query = query.Where("weight_add <= 0.03")
1900 2063
 	case 2:
1901
-		query.Where("weight_add > 0.03 AND weight_add < 0.05")
2064
+		query = query.Where("weight_add > 0.03 AND weight_add < 0.05")
1902 2065
 	case 3:
1903
-		query.Where("weight_add >= 0.05")
2066
+		query = query.Where("weight_add >= 0.05")
1904 2067
 	case 4:
1905
-		query.Where("weight_add IS NULL")
2068
+		query = query.Where("weight_add IS NULL")
1906 2069
 	}
1907 2070
 }
1908 2071
 
1909 2072
 // dryType 条件处理
1910 2073
 func dryTypeCondition(query *gorm.DB, dryType int64) {
1911
-	switch dryType {
1912
-	case 1:
1913
-		query.Where("dry_weight_category = '小于40'")
1914
-	case 2:
1915
-		query.Where("dry_weight_category = '40~50'")
1916
-	case 3:
1917
-		query.Where("dry_weight_category = '50~60'")
1918
-	case 4:
1919
-		query.Where("dry_weight_category = '60~70'")
1920
-	case 5:
1921
-		query.Where("dry_weight_category = '大于70'")
1922
-	}
2074
+
1923 2075
 }
1924 2076
 
1925 2077
 // afterType 条件处理
1926 2078
 func afterTypeCondition(query *gorm.DB, afterType int64) {
1927 2079
 	switch afterType {
1928 2080
 	case 1:
1929
-		query.Where("weight_status = '达标'")
2081
+		query = query.Where("weight_status = '达标'")
1930 2082
 	case 2:
1931
-		query.Where("weight_status = '不达标'")
2083
+		query = query.Where("weight_status = '不达标'")
1932 2084
 	case 3:
1933
-		query.Where("weight_status = '其他'")
2085
+		query = query.Where("weight_status = '其他'")
1934 2086
 	}
1935 2087
 }
1936 2088
 
@@ -1949,102 +2101,217 @@ type DialysisDataThree struct {
1949 2101
 	BPStatus            string  `json:"血压达标状态"`
1950 2102
 }
1951 2103
 
1952
-func GetNewDialysisBPDetailTableTen(user_org_id int64, start_time int64, end_time int64, addType, page, limit int64) ([]DialysisDataThree, int64, error) {
2104
+//	func GetNewDialysisBPDetailTableTen(user_org_id int64, start_time int64, end_time int64, addType, page, limit int64) ([]DialysisDataThree, int64, error) {
2105
+//		offset := (page - 1) * limit
2106
+//		var total int64
2107
+//		var results []DialysisDataThree
2108
+//		// SQL 查询
2109
+//		query := `
2110
+//			SELECT
2111
+//				p.dialysis_no AS 透析号,
2112
+//				p.name AS 患者姓名,
2113
+//				p.gender AS 性别,
2114
+//				FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS 年龄,
2115
+//				b.assessment_date AS 透析日期,
2116
+//				b.dry_weight AS 干体重,
2117
+//				CONCAT(b.systolic_blood_pressure, '/', b.diastolic_blood_pressure) AS 透前血压,
2118
+//				CONCAT(a.systolic_blood_pressure, '/', a.diastolic_blood_pressure) AS 透后血压,
2119
+//				GROUP_CONCAT(CONCAT(m.systolic_blood_pressure, '/', m.diastolic_blood_pressure) ORDER BY m.monitoring_date ASC SEPARATOR ',') AS 监测记录血压,
2120
+//				(SELECT mr.ultrafiltration_rate
2121
+//				 FROM xt_monitoring_record mr
2122
+//				 WHERE mr.patient_id = p.id AND mr.monitoring_date = b.assessment_date
2123
+//				 ORDER BY mr.operate_time DESC
2124
+//				 LIMIT 1) AS 超滤率,
2125
+//				(SELECT mr.ultrafiltration_volume
2126
+//				 FROM xt_monitoring_record mr
2127
+//				 WHERE mr.patient_id = p.id AND mr.monitoring_date = b.assessment_date
2128
+//				 ORDER BY mr.operate_time DESC
2129
+//				 LIMIT 1) AS 超滤总量,
2130
+//				CASE
2131
+//					WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
2132
+//						CASE
2133
+//							WHEN b.systolic_blood_pressure < 140 OR b.diastolic_blood_pressure < 90 THEN '达标'
2134
+//							ELSE '不达标'
2135
+//						END
2136
+//					WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
2137
+//						CASE
2138
+//							WHEN b.systolic_blood_pressure < 160 OR b.diastolic_blood_pressure < 90 THEN '达标'
2139
+//							ELSE '不达标'
2140
+//						END
2141
+//				END AS 血压达标状态
2142
+//			FROM
2143
+//				xt_patients p
2144
+//			JOIN
2145
+//				xt_assessment_before_dislysis b ON p.id = b.patient_id
2146
+//			JOIN
2147
+//				xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date
2148
+//			JOIN
2149
+//				xt_monitoring_record m ON p.id = m.patient_id AND m.monitoring_date = b.assessment_date
2150
+//			WHERE
2151
+//				b.user_org_id = ?
2152
+//				AND b.assessment_date >= ?
2153
+//				AND b.assessment_date <= ?
2154
+//				AND (
2155
+//					(? = 1 AND CASE
2156
+//						WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
2157
+//							CASE
2158
+//								WHEN b.systolic_blood_pressure < 140 OR b.diastolic_blood_pressure < 90 THEN 1
2159
+//								ELSE 0
2160
+//							END
2161
+//						WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
2162
+//							CASE
2163
+//								WHEN b.systolic_blood_pressure < 160 OR b.diastolic_blood_pressure < 90 THEN 1
2164
+//								ELSE 0
2165
+//							END
2166
+//					END = 1)
2167
+//					OR
2168
+//					(? = 2 AND CASE
2169
+//						WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
2170
+//							CASE
2171
+//								WHEN b.systolic_blood_pressure >= 140 AND b.diastolic_blood_pressure >= 90 THEN 1
2172
+//								ELSE 0
2173
+//							END
2174
+//						WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
2175
+//							CASE
2176
+//								WHEN b.systolic_blood_pressure >= 160 AND b.diastolic_blood_pressure >= 90 THEN 1
2177
+//								ELSE 0
2178
+//							END
2179
+//					END = 1)
2180
+//				)
2181
+//			GROUP BY
2182
+//				p.id, b.assessment_date
2183
+//			ORDER BY
2184
+//				p.id, b.assessment_date
2185
+//			LIMIT ? OFFSET ?;
2186
+//		`
2187
+//
2188
+//		// 计算总数
2189
+//		countQuery := `
2190
+//			SELECT COUNT(*)
2191
+//			FROM
2192
+//				xt_patients p
2193
+//			JOIN
2194
+//				xt_assessment_before_dislysis b ON p.id = b.patient_id
2195
+//			WHERE
2196
+//				b.user_org_id = ?
2197
+//				AND b.assessment_date >= ?
2198
+//				AND b.assessment_date <= ?
2199
+//		`
2200
+//
2201
+//		// 执行统计查询
2202
+//		if err := readDb.Raw(countQuery, user_org_id, start_time, end_time).Scan(&total).Error; err != nil {
2203
+//			return nil, 0, fmt.Errorf("error calculating total count: %v", err)
2204
+//		}
2205
+//
2206
+//		// 执行数据查询
2207
+//		if err := readDb.Raw(query, user_org_id, start_time, end_time, addType, addType, limit, offset).Scan(&results).Error; err != nil {
2208
+//			return nil, 0, fmt.Errorf("error executing query: %v", err)
2209
+//		}
2210
+//
2211
+//		return results, total, nil
2212
+//	}
2213
+func GetNewDialysisBPDetailTableTen(
2214
+	user_org_id int64,
2215
+	start_time int64,
2216
+	end_time int64,
2217
+	addType, page, limit int64,
2218
+) ([]DialysisDataThree, int64, error) {
1953 2219
 	offset := (page - 1) * limit
1954 2220
 	var total int64
1955 2221
 	var results []DialysisDataThree
2222
+
1956 2223
 	// SQL 查询
1957 2224
 	query := `
1958
-		SELECT
1959
-			p.dialysis_no AS 透析号,
1960
-			p.name AS 患者姓名,
1961
-			p.gender AS 性别,
1962
-			FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS 年龄,
1963
-			b.assessment_date AS 透析日期,
1964
-			b.dry_weight AS 干体重,
1965
-			CONCAT(b.systolic_blood_pressure, '/', b.diastolic_blood_pressure) AS 透前血压,
1966
-			CONCAT(a.systolic_blood_pressure, '/', a.diastolic_blood_pressure) AS 透后血压,
1967
-			GROUP_CONCAT(CONCAT(m.systolic_blood_pressure, '/', m.diastolic_blood_pressure) ORDER BY m.monitoring_date ASC SEPARATOR ',') AS 监测记录血压,
1968
-			(SELECT mr.ultrafiltration_rate
1969
-			 FROM xt_monitoring_record mr
1970
-			 WHERE mr.patient_id = p.id AND mr.monitoring_date = b.assessment_date
1971
-			 ORDER BY mr.operate_time DESC
1972
-			 LIMIT 1) AS 超滤率,
1973
-			(SELECT mr.ultrafiltration_volume
1974
-			 FROM xt_monitoring_record mr
1975
-			 WHERE mr.patient_id = p.id AND mr.monitoring_date = b.assessment_date
1976
-			 ORDER BY mr.operate_time DESC
1977
-			 LIMIT 1) AS 超滤总量,
1978
-			CASE 
1979
-				WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
1980
-					CASE 
1981
-						WHEN b.systolic_blood_pressure < 140 OR b.diastolic_blood_pressure < 90 THEN '达标'
1982
-						ELSE '不达标'
1983
-					END
1984
-				WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
1985
-					CASE 
1986
-						WHEN b.systolic_blood_pressure < 160 OR b.diastolic_blood_pressure < 90 THEN '达标'
1987
-						ELSE '不达标'
1988
-					END
1989
-			END AS 血压达标状态
1990
-		FROM
1991
-			xt_patients p
1992
-		JOIN
1993
-			xt_assessment_before_dislysis b ON p.id = b.patient_id
1994
-		JOIN
1995
-			xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date
1996
-		JOIN
1997
-			xt_monitoring_record m ON p.id = m.patient_id AND m.monitoring_date = b.assessment_date
1998
-		WHERE
1999
-			b.user_org_id = ?
2000
-			AND b.assessment_date >= ?
2001
-			AND b.assessment_date <= ?
2002
-			AND (
2003
-				(? = 1 AND CASE 
2004
-					WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
2005
-						CASE 
2006
-							WHEN b.systolic_blood_pressure < 140 OR b.diastolic_blood_pressure < 90 THEN 1
2007
-							ELSE 0
2008
-						END
2009
-					WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
2010
-						CASE 
2011
-							WHEN b.systolic_blood_pressure < 160 OR b.diastolic_blood_pressure < 90 THEN 1
2012
-							ELSE 0
2013
-						END
2014
-				END = 1)
2015
-				OR
2016
-				(? = 2 AND CASE 
2017
-					WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
2018
-						CASE 
2019
-							WHEN b.systolic_blood_pressure >= 140 AND b.diastolic_blood_pressure >= 90 THEN 1
2020
-							ELSE 0
2021
-						END
2022
-					WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
2023
-						CASE 
2024
-							WHEN b.systolic_blood_pressure >= 160 AND b.diastolic_blood_pressure >= 90 THEN 1
2025
-							ELSE 0
2026
-						END
2027
-				END = 1)
2028
-			)
2029
-		GROUP BY
2030
-			p.id, b.assessment_date
2031
-		ORDER BY
2032
-			p.id, b.assessment_date
2033
-		LIMIT ? OFFSET ?;
2034
-	`
2225
+        SELECT
2226
+            p.dialysis_no AS DialysisNo,
2227
+            p.name AS PatientName,
2228
+            p.gender AS Gender,
2229
+            FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) AS Age,
2230
+            b.assessment_date AS AssessmentDate,
2231
+            b.dry_weight AS DryWeight,
2232
+            CONCAT(b.systolic_blood_pressure, '/', b.diastolic_blood_pressure) AS PreDialysisBP,
2233
+            CONCAT(a.systolic_blood_pressure, '/', a.diastolic_blood_pressure) AS PostDialysisBP,
2234
+            GROUP_CONCAT(CONCAT(m.systolic_blood_pressure, '/', m.diastolic_blood_pressure) ORDER BY m.monitoring_date ASC SEPARATOR ',') AS MonitoringBP,
2235
+            (SELECT mr.ultrafiltration_rate
2236
+             FROM xt_monitoring_record mr
2237
+             WHERE mr.patient_id = p.id AND mr.monitoring_date = b.assessment_date
2238
+             ORDER BY mr.operate_time DESC
2239
+             LIMIT 1) AS UltrafiltrationRate,
2240
+            (SELECT mr.ultrafiltration_volume
2241
+             FROM xt_monitoring_record mr
2242
+             WHERE mr.patient_id = p.id AND mr.monitoring_date = b.assessment_date
2243
+             ORDER BY mr.operate_time DESC
2244
+             LIMIT 1) AS UltrafiltrationVol,
2245
+            CASE 
2246
+                WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
2247
+                    CASE 
2248
+                        WHEN b.systolic_blood_pressure < 140 OR b.diastolic_blood_pressure < 90 THEN '达标'
2249
+                        ELSE '不达标'
2250
+                    END
2251
+                WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
2252
+                    CASE 
2253
+                        WHEN b.systolic_blood_pressure < 160 OR b.diastolic_blood_pressure < 90 THEN '达标'
2254
+                        ELSE '不达标'
2255
+                    END
2256
+            END AS BPStatus
2257
+        FROM
2258
+            xt_patients p
2259
+        JOIN
2260
+            xt_assessment_before_dislysis b ON p.id = b.patient_id
2261
+        JOIN
2262
+            xt_assessment_after_dislysis a ON p.id = a.patient_id AND b.assessment_date = a.assessment_date
2263
+        JOIN
2264
+            xt_monitoring_record m ON p.id = m.patient_id AND m.monitoring_date = b.assessment_date
2265
+        WHERE
2266
+            b.user_org_id = ?
2267
+            AND b.assessment_date >= ?
2268
+            AND b.assessment_date <= ?
2269
+            AND (
2270
+                (? = 1 AND CASE 
2271
+                    WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
2272
+                        CASE 
2273
+                            WHEN b.systolic_blood_pressure < 140 OR b.diastolic_blood_pressure < 90 THEN 1
2274
+                            ELSE 0
2275
+                        END
2276
+                    WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
2277
+                        CASE 
2278
+                            WHEN b.systolic_blood_pressure < 160 OR b.diastolic_blood_pressure < 90 THEN 1
2279
+                            ELSE 0
2280
+                        END
2281
+                END = 1)
2282
+                OR
2283
+                (? = 2 AND CASE 
2284
+                    WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) < 60 THEN
2285
+                        CASE 
2286
+                            WHEN b.systolic_blood_pressure >= 140 AND b.diastolic_blood_pressure >= 90 THEN 1
2287
+                            ELSE 0
2288
+                        END
2289
+                    WHEN FLOOR((YEAR(CURDATE()) - SUBSTRING(p.id_card_no, 7, 4))) >= 60 THEN
2290
+                        CASE 
2291
+                            WHEN b.systolic_blood_pressure >= 160 AND b.diastolic_blood_pressure >= 90 THEN 1
2292
+                            ELSE 0
2293
+                        END
2294
+                END = 1)
2295
+            )
2296
+        GROUP BY
2297
+            p.id, b.assessment_date
2298
+        ORDER BY
2299
+            p.id, b.assessment_date
2300
+        LIMIT ? OFFSET ?;
2301
+    `
2035 2302
 
2036 2303
 	// 计算总数
2037 2304
 	countQuery := `
2038
-		SELECT COUNT(*)
2039
-		FROM
2040
-			xt_patients p
2041
-		JOIN
2042
-			xt_assessment_before_dislysis b ON p.id = b.patient_id
2043
-		WHERE
2044
-			b.user_org_id = ?
2045
-			AND b.assessment_date >= ?
2046
-			AND b.assessment_date <= ?
2047
-	`
2305
+        SELECT COUNT(*)
2306
+        FROM
2307
+            xt_patients p
2308
+        JOIN
2309
+            xt_assessment_before_dislysis b ON p.id = b.patient_id
2310
+        WHERE
2311
+            b.user_org_id = ?
2312
+            AND b.assessment_date >= ?
2313
+            AND b.assessment_date <= ?
2314
+    `
2048 2315
 
2049 2316
 	// 执行统计查询
2050 2317
 	if err := readDb.Raw(countQuery, user_org_id, start_time, end_time).Scan(&total).Error; err != nil {