medicine.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. package controllers
  2. import (
  3. "Medical_ERP/common/global"
  4. "Medical_ERP/common/redis"
  5. _ "Medical_ERP/common/response"
  6. "Medical_ERP/conf"
  7. "Medical_ERP/dto"
  8. "Medical_ERP/services"
  9. "Medical_ERP/utils"
  10. "encoding/json"
  11. "errors"
  12. "fmt"
  13. beego "github.com/beego/beego/v2/server/web"
  14. "github.com/go-resty/resty/v2"
  15. "gogs.baozhida.cn/zoie/OAuth-core/pkg/jwtauth/beegouser"
  16. "strings"
  17. "time"
  18. )
  19. type MedicineController struct {
  20. BaseController
  21. }
  22. // BatchNumber 批号列表
  23. // @Summary 批号列表
  24. // @Description 批号列表
  25. // @Tags 药品
  26. // @Param data body dto.MedicineBatchNumberReq true "body"
  27. // @Success 200 {object} response.Page "{"code": 200, "data": [...]}"
  28. // @Router /medicine/batch-number [post]
  29. // @Security Bearer
  30. func (c MedicineController) BatchNumber() {
  31. s := services.Medicine{}
  32. reqData := dto.MedicineBatchNumberReq{}
  33. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  34. err = errors.New("解析表单数据异常")
  35. c.Error(global.ParseFormErr, err, err.Error())
  36. return
  37. }
  38. list := make([]string, 0)
  39. err := s.GetBatchNumber(&reqData, &list, beegouser.GetDeptId(c.Ctx))
  40. if err != nil {
  41. c.Error(global.BadRequest, err, err.Error())
  42. return
  43. }
  44. c.OK(list, "查询成功")
  45. }
  46. // BasicDataStat 基本数据统计
  47. // @Summary 基本数据统计
  48. // @Description 基本数据统计
  49. // @Tags 药品
  50. // @Success 200 {object} response.Page "{"code": 200, "data": [...]}"
  51. // @Router /medicine/basic-data-stat [post]
  52. // @Security Bearer
  53. func (c MedicineController) BasicDataStat() {
  54. s := services.Medicine{}
  55. list, err := s.BasicDataStat(beegouser.GetDeptId(c.Ctx))
  56. if err != nil {
  57. c.Error(global.BadRequest, err, err.Error())
  58. return
  59. }
  60. c.OK(list, "查询成功")
  61. }
  62. // 码上放心药品查询
  63. func (c MedicineController) MSFXQuery() {
  64. code := c.GetString("code")
  65. if len(code) == 0 {
  66. err := errors.New("码上放心追溯码不能为空")
  67. c.Error(400, err, err.Error())
  68. return
  69. }
  70. if strings.HasPrefix(code, "9") {
  71. // 宝智达溯码平台
  72. type Res struct {
  73. Code int
  74. Msg string
  75. Data struct {
  76. CodeNum string
  77. CreateTime string
  78. Data map[string]interface{}
  79. }
  80. }
  81. var res Res
  82. client := resty.New()
  83. resp, err := client.R().Get(conf.BZD_pcodeUrl + code)
  84. if err != nil {
  85. c.Error(400, err, err.Error())
  86. return
  87. }
  88. if err = json.Unmarshal(resp.Body(), &res); err != nil {
  89. c.Error(400, err, err.Error())
  90. return
  91. }
  92. if res.Code != 200 {
  93. err = errors.New(res.Msg)
  94. c.Error(400, err, err.Error())
  95. return
  96. }
  97. info_ := make([]map[string]interface{}, 0)
  98. info_ = append(info_, res.Data.Data)
  99. c.OK(info_, "查询成功")
  100. return
  101. }
  102. MSFX_baseUrl, _ := beego.AppConfig.String("MSFX_baseUrl")
  103. MSFX_user, _ := beego.AppConfig.String("MSFX_user")
  104. MSFX_mock := beego.AppConfig.DefaultBool("MSFX_mock", true)
  105. info := make([]map[string]interface{}, 0)
  106. if MSFX_mock {
  107. mock := map[string]interface{}{
  108. "名称": "替硝唑片" + strings.ToUpper(utils.GenerateAppKey(2)),
  109. "批号": strings.ToUpper(utils.GenerateAppKey(4)),
  110. "有效期至": "20250619",
  111. "包装数量": "1",
  112. "生产日期": "2023-06-20",
  113. "批准文号": "国药准字H20033090",
  114. "效期": "24月",
  115. "药品类别": "普通药品",
  116. "规格": "8片/盒",
  117. "规格摘要": "0.5g",
  118. "类型": "片剂",
  119. "厂家": "山东鲁抗医药集团赛特有限责任公司",
  120. }
  121. mock_ := make(map[string]interface{})
  122. mock_["product_name"] = mock["名称"]
  123. mock_["enterprise_name"] = mock["厂家"]
  124. mock_["quantity"] = mock["包装数量"]
  125. mock_["spec_name"] = fmt.Sprintf("%s×%s", mock["规格摘要"], mock["规格"])
  126. mock_["dosage_form_name"] = mock["类型"]
  127. mock_["batch_number"] = mock["批号"]
  128. date := mock["有效期至"].(string)
  129. mock_["expiry_date"] = fmt.Sprintf("%s-%s-%s", date[0:4], date[4:6], date[6:8])
  130. mock_["produced_date"] = mock["生产日期"]
  131. mock_["approval_number"] = mock["批准文号"]
  132. info = append(info, mock_)
  133. c.OK(info, "查询成功")
  134. return
  135. }
  136. err := redis.GetJson(global.RedisMSFXMedicineInfo+code, &info)
  137. if err == nil {
  138. c.OK(info, "查询成功")
  139. return
  140. }
  141. client := resty.New()
  142. resp, err := client.R().
  143. SetQueryParams(map[string]string{
  144. "user": MSFX_user,
  145. "code": code,
  146. }).
  147. Get(MSFX_baseUrl)
  148. if err != nil {
  149. c.Error(400, err, "获取药品扫码信息失败")
  150. return
  151. }
  152. if err = json.Unmarshal(resp.Body(), &info); err != nil {
  153. c.Error(400, err, "获取药品扫码信息失败")
  154. return
  155. }
  156. info_ := make([]map[string]interface{}, len(info))
  157. for i := 0; i < len(info); i++ {
  158. info_[i] = make(map[string]interface{})
  159. if len(info[i]["名称"].(string)) == 0 {
  160. c.Error(400, err, "药品信息不存在")
  161. }
  162. info_[i]["product_name"] = info[i]["名称"]
  163. info_[i]["enterprise_name"] = info[i]["厂家"]
  164. info_[i]["quantity"] = info[i]["包装数量"]
  165. info_[i]["spec_name"] = fmt.Sprintf("%s×%s", info[i]["规格摘要"], info[i]["规格"])
  166. info_[i]["dosage_form_name"] = info[i]["类型"]
  167. info_[i]["batch_number"] = info[i]["批号"]
  168. date := info[i]["有效期至"].(string)
  169. info_[i]["expiry_date"] = fmt.Sprintf("%s-%s-%s", date[0:4], date[4:6], date[6:8])
  170. info_[i]["produced_date"] = info[i]["生产日期"]
  171. info_[i]["approval_number"] = info[i]["批准文号"]
  172. }
  173. redis.SetJson(global.RedisMSFXMedicineInfo+code, info_, 7*24*time.Hour)
  174. c.OK(info_, "查询成功")
  175. }