his_export_data_controller.go 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. package controllers
  2. import (
  3. "XT_New/enums"
  4. "XT_New/models"
  5. "XT_New/service"
  6. "XT_New/utils"
  7. "fmt"
  8. "github.com/astaxie/beego"
  9. "github.com/shopspring/decimal"
  10. "strconv"
  11. "strings"
  12. "time"
  13. )
  14. type HisExportDataController struct {
  15. BaseAuthAPIController
  16. }
  17. func HisExportDataApiRegistRouters() {
  18. beego.Router("/api/export", &HisExportDataController{}, "Get:GetExportData")
  19. beego.Router("/api/batchsettle/get", &HisExportDataController{}, "Get:GetExportSettleData")
  20. beego.Router("/api/export/10726/detail", &HisExportDataController{}, "Get:Get10726DetailExportData")
  21. beego.Router("/api/export/10726/summary", &HisExportDataController{}, "Get:Get10726SummaryExportData")
  22. beego.Router("/api/export/10697/summary", &HisExportDataController{}, "Get:Get10697SummaryExportData")
  23. beego.Router("/api/export/10697/summary", &HisExportDataController{}, "Get:Get10697SummaryExportData")
  24. beego.Router("/api/export/summary", &HisExportDataController{}, "Get:GetSummaryExport")
  25. beego.Router("/api/batch/orderlist", &HisExportDataController{}, "Get:GetBatchOrderDetail")
  26. }
  27. type Orders struct {
  28. Order models.HisOrder `json:"order"`
  29. OrderInfo []*service.HisOrderInfo `json:"order_info"`
  30. Patient *models.Patients `json:"patient"`
  31. AdminInfo models.UserAdminRole `json:"admin_info"`
  32. }
  33. func (c *HisExportDataController) GetBatchOrderDetail() {
  34. order_ids := c.GetString("id")
  35. ids := strings.Split(order_ids, ",")
  36. var oss []*Orders
  37. for _, item := range ids {
  38. var os Orders
  39. new_id, _ := strconv.ParseInt(item, 10, 64)
  40. order, _ := service.GetHisOrderByID(new_id)
  41. if order.ID == 0 {
  42. c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeOrderParamWrong)
  43. return
  44. }
  45. //record, _ := service.GetInHospitalRecordByNumber(order.MdtrtId)
  46. org_id := c.GetAdminUserInfo().CurrentOrgId
  47. adminInfo, _ := service.GetAdminUserInfoByID(org_id, order.Creator)
  48. patient, _ := service.GetFaPiaoPatientByID(org_id, order.PatientId)
  49. order_info, _ := service.GetHisOrderDetailByNumber(order.Number, org_id)
  50. os.Order = order
  51. os.OrderInfo = order_info
  52. os.Patient = patient
  53. os.AdminInfo = adminInfo
  54. oss = append(oss, &os)
  55. }
  56. fmt.Println(oss)
  57. c.ServeSuccessJSON(map[string]interface{}{
  58. "orders": oss,
  59. })
  60. return
  61. }
  62. func (c *HisExportDataController) Get10726DetailExportData() {
  63. start_time := c.GetString("start_time")
  64. end_time := c.GetString("end_time")
  65. result, _ := service.GetHisOrderBy10726Detail(start_time, end_time)
  66. c.ServeSuccessJSON(map[string]interface{}{
  67. "result": result,
  68. })
  69. }
  70. func (c *HisExportDataController) Get10726SummaryExportData() {
  71. start_time := c.GetString("start_time")
  72. end_time := c.GetString("end_time")
  73. result, _ := service.GetHisOrderBy10726Summary(start_time, end_time)
  74. c.ServeSuccessJSON(map[string]interface{}{
  75. "result": result,
  76. })
  77. }
  78. func (c *HisExportDataController) Get10697SummaryExportData() {
  79. start_time := c.GetString("start_time")
  80. end_time := c.GetString("end_time")
  81. ins := c.GetString("ins")
  82. timeLayout := "2006-01-02"
  83. loc, _ := time.LoadLocation("Local")
  84. var startTime int64
  85. if len(start_time) > 0 {
  86. theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
  87. if err != nil {
  88. fmt.Println(err)
  89. c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
  90. return
  91. }
  92. startTime = theTime.Unix()
  93. }
  94. var endTime int64
  95. if len(end_time) > 0 {
  96. theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", end_time+" 23:59:59", loc)
  97. if err != nil {
  98. utils.ErrorLog(err.Error())
  99. c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
  100. return
  101. }
  102. endTime = theTime.Unix()
  103. }
  104. result, _ := service.GetHisOrderBy10697SummaryTwo(start_time, end_time, ins, startTime, endTime)
  105. c.ServeSuccessJSON(map[string]interface{}{
  106. "result": result,
  107. })
  108. }
  109. func (c *HisExportDataController) GetSummaryExport() {
  110. start_time := c.GetString("start_time")
  111. end_time := c.GetString("end_time")
  112. //ins := c.GetString("ins")
  113. timeLayout := "2006-01-02"
  114. loc, _ := time.LoadLocation("Local")
  115. var startTime int64
  116. if len(start_time) > 0 {
  117. theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
  118. if err != nil {
  119. fmt.Println(err)
  120. c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
  121. return
  122. }
  123. startTime = theTime.Unix()
  124. }
  125. var endTime int64
  126. if len(end_time) > 0 {
  127. theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", end_time+" 23:59:59", loc)
  128. if err != nil {
  129. utils.ErrorLog(err.Error())
  130. c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
  131. return
  132. }
  133. endTime = theTime.Unix()
  134. }
  135. fmt.Println("111111")
  136. result, _ := service.GetHisOrderBy10697SummaryThree(start_time, end_time, startTime, endTime, c.GetAdminUserInfo().CurrentOrgId)
  137. c.ServeSuccessJSON(map[string]interface{}{
  138. "result": result,
  139. })
  140. }
  141. func (c *HisExportDataController) GetExportSettleData() {
  142. patient_id, _ := c.GetInt64("patient_id", 0)
  143. start_time := c.GetString("start_time")
  144. end_time := c.GetString("end_time")
  145. admin_user_id, _ := c.GetInt64("admin_user_id")
  146. var order models.HisOrder
  147. orders, _ := service.GetHisOrderByTime(patient_id, start_time, end_time)
  148. order = orders[len(orders)-1]
  149. order.MedfeeSumamt = 0
  150. order.FundPaySumamt = 0
  151. order.PsnCashPay = 0
  152. order.ActPayDedc = 0
  153. order.PreselfpayAmt = 0
  154. order.HifpPay = 0
  155. order.HifmiPay = 0
  156. order.HifesPay = 0
  157. order.MafPay = 0
  158. order.CvlservPay = 0
  159. order.OthPay = 0
  160. order.AcctPay = 0
  161. decimal.DivisionPrecision = 2
  162. var orderInfos []models.BatchHisOrderInfo
  163. for _, item := range orders {
  164. order.MedfeeSumamt, _ = decimal.NewFromFloat(order.MedfeeSumamt).Add(decimal.NewFromFloat(item.MedfeeSumamt)).Float64()
  165. order.FundPaySumamt, _ = decimal.NewFromFloat(order.FundPaySumamt).Add(decimal.NewFromFloat(item.FundPaySumamt)).Float64()
  166. order.PsnCashPay, _ = decimal.NewFromFloat(order.PsnCashPay).Add(decimal.NewFromFloat(item.PsnCashPay)).Float64()
  167. order.ActPayDedc, _ = decimal.NewFromFloat(order.ActPayDedc).Add(decimal.NewFromFloat(item.ActPayDedc)).Float64()
  168. order.PreselfpayAmt, _ = decimal.NewFromFloat(order.PreselfpayAmt).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  169. order.HifpPay, _ = decimal.NewFromFloat(order.HifpPay).Add(decimal.NewFromFloat(item.HifpPay)).Float64()
  170. order.HifmiPay, _ = decimal.NewFromFloat(order.HifmiPay).Add(decimal.NewFromFloat(item.HifmiPay)).Float64()
  171. order.HifesPay, _ = decimal.NewFromFloat(order.HifesPay).Add(decimal.NewFromFloat(item.HifesPay)).Float64()
  172. order.MafPay, _ = decimal.NewFromFloat(order.MafPay).Add(decimal.NewFromFloat(item.MafPay)).Float64()
  173. order.CvlservPay, _ = decimal.NewFromFloat(order.CvlservPay).Add(decimal.NewFromFloat(item.CvlservPay)).Float64()
  174. order.OthPay, _ = decimal.NewFromFloat(order.OthPay).Add(decimal.NewFromFloat(item.OthPay)).Float64()
  175. order.AcctPay, _ = decimal.NewFromFloat(order.AcctPay).Add(decimal.NewFromFloat(item.AcctPay)).Float64()
  176. orderInfo, _ := service.GetBatchHisOrderInfoByNumber(item.Number)
  177. orderInfos = append(orderInfos, orderInfo...)
  178. }
  179. //role, _ := service.GetAdminUserInfoByID(c.GetAdminUserInfo().CurrentOrgId, c.GetAdminUserInfo().AdminUser.Id)
  180. if order.ID == 0 {
  181. c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeOrderParamWrong)
  182. return
  183. }
  184. miConfig, _ := service.FindMedicalInsuranceInfo(c.GetAdminUserInfo().CurrentOrgId)
  185. org_id := c.GetAdminUserInfo().CurrentOrgId
  186. //adminInfo, _ := service.GetAdminUserInfoByID(org_id, order.Creator)
  187. patient, _ := service.GetFaPiaoPatientByID(org_id, order.PatientId)
  188. printor_admin, _ := service.GetAdminUserInfoByID(c.GetAdminUserInfo().CurrentOrgId, admin_user_id)
  189. charge_admin, _ := service.GetAdminUserInfoByID(c.GetAdminUserInfo().CurrentOrgId, order.Creator)
  190. var bedCostTotal float64 = 0 //床位总费
  191. var bedCostSelfTotal float64 = 0 //床位自费
  192. var bedCostPartSelfTotal float64 = 0 //床位部分项目自费
  193. var operationCostTotal float64 = 0 //手术费
  194. var operationCostSelfTotal float64 = 0 //手术费
  195. var operationCostPartSelfTotal float64 = 0 //手术费
  196. var otherCostTotal float64 = 0 //其他费用
  197. var otherCostSelfTotal float64 = 0 //其他费用
  198. var otherCostPartSelfTotal float64 = 0 //其他费用
  199. var materialCostTotal float64 = 0 //材料费
  200. var materialCostSelfTotal float64 = 0 //材料费
  201. var materialCostPartSelfTotal float64 = 0 //材料费
  202. var westernMedicineCostTotal float64 = 0 //西药费
  203. var westernMedicineCostSelfTotal float64 = 0 //西药费
  204. var westernMedicineCostPartSelfTotal float64 = 0 //西药费
  205. var chineseTraditionalMedicineCostTotal float64 = 0 //中成药
  206. var chineseTraditionalMedicineCostSelfTotal float64 = 0 //中成药
  207. var chineseTraditionalMedicineCostPartSelfTotal float64 = 0 //中成药
  208. var checkCostTotal float64 = 0 //检查费
  209. var checkCostSelfTotal float64 = 0 //检查费
  210. var checkCostPartSelfTotal float64 = 0 //检查费
  211. var laboratoryCostTotal float64 = 0 //化验费
  212. var laboratoryCostSelfTotal float64 = 0 //化验费
  213. var laboratoryCostPartSelfTotal float64 = 0 //化验费
  214. var treatCostTotal float64 = 0 //治疗费用
  215. var treatCostSelfTotal float64 = 0 //治疗费用
  216. var treatCostPartSelfTotal float64 = 0 //治疗费用
  217. var hiliCostTotal float64 = 0 //护理费
  218. var hiliCostSelfTotal float64 = 0 //护理费
  219. var hiliCostPartSelfTotal float64 = 0 //护理费
  220. decimal.DivisionPrecision = 2
  221. for _, item := range orderInfos {
  222. if item.MedChrgitmType == "01" { //床位费
  223. bedCostTotal, _ = decimal.NewFromFloat(bedCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  224. bedCostSelfTotal, _ = decimal.NewFromFloat(bedCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  225. bedCostPartSelfTotal, _ = decimal.NewFromFloat(bedCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  226. }
  227. if item.MedChrgitmType == "07" { //床位费
  228. hiliCostTotal, _ = decimal.NewFromFloat(hiliCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  229. hiliCostSelfTotal, _ = decimal.NewFromFloat(hiliCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  230. hiliCostPartSelfTotal, _ = decimal.NewFromFloat(hiliCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  231. //hiliCostSelfTotal = hiliCostTotal
  232. }
  233. if c.GetAdminUserInfo().CurrentOrgId == 10188 || c.GetAdminUserInfo().CurrentOrgId == 10217 {
  234. if item.MedChrgitmType == "03" { //检查费
  235. laboratoryCostTotal, _ = decimal.NewFromFloat(laboratoryCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  236. laboratoryCostSelfTotal, _ = decimal.NewFromFloat(laboratoryCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  237. laboratoryCostPartSelfTotal, _ = decimal.NewFromFloat(laboratoryCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  238. }
  239. } else {
  240. if item.MedChrgitmType == "03" { //检查费
  241. checkCostTotal, _ = decimal.NewFromFloat(checkCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  242. checkCostSelfTotal, _ = decimal.NewFromFloat(checkCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  243. checkCostPartSelfTotal, _ = decimal.NewFromFloat(checkCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  244. }
  245. }
  246. if item.MedChrgitmType == "04" { //化验费
  247. laboratoryCostTotal, _ = decimal.NewFromFloat(laboratoryCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  248. laboratoryCostSelfTotal, _ = decimal.NewFromFloat(laboratoryCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  249. laboratoryCostPartSelfTotal, _ = decimal.NewFromFloat(laboratoryCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  250. }
  251. if item.MedChrgitmType == "05" || item.MedChrgitmType == "1402" || item.MedChrgitmType == "1403" { //治疗费
  252. treatCostTotal, _ = decimal.NewFromFloat(treatCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  253. treatCostSelfTotal, _ = decimal.NewFromFloat(treatCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  254. treatCostPartSelfTotal, _ = decimal.NewFromFloat(treatCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  255. }
  256. if item.MedChrgitmType == "06" { //手术费
  257. operationCostTotal, _ = decimal.NewFromFloat(operationCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  258. operationCostSelfTotal, _ = decimal.NewFromFloat(operationCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  259. operationCostPartSelfTotal, _ = decimal.NewFromFloat(operationCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  260. }
  261. if item.MedChrgitmType == "08" { //材料费
  262. materialCostTotal, _ = decimal.NewFromFloat(materialCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  263. materialCostSelfTotal, _ = decimal.NewFromFloat(materialCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  264. materialCostPartSelfTotal, _ = decimal.NewFromFloat(materialCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  265. }
  266. if item.MedChrgitmType == "09" { //西药费
  267. westernMedicineCostTotal, _ = decimal.NewFromFloat(westernMedicineCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  268. westernMedicineCostSelfTotal, _ = decimal.NewFromFloat(westernMedicineCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  269. westernMedicineCostPartSelfTotal, _ = decimal.NewFromFloat(westernMedicineCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  270. }
  271. if item.MedChrgitmType == "11" { //中成费
  272. chineseTraditionalMedicineCostTotal, _ = decimal.NewFromFloat(chineseTraditionalMedicineCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  273. chineseTraditionalMedicineCostSelfTotal, _ = decimal.NewFromFloat(chineseTraditionalMedicineCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  274. chineseTraditionalMedicineCostPartSelfTotal, _ = decimal.NewFromFloat(chineseTraditionalMedicineCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  275. }
  276. if item.MedChrgitmType == "14" || item.MedChrgitmType == "0" || item.MedChrgitmType == "12" || item.MedChrgitmType == "02" { //其他费
  277. otherCostTotal, _ = decimal.NewFromFloat(otherCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  278. otherCostSelfTotal, _ = decimal.NewFromFloat(otherCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  279. otherCostPartSelfTotal, _ = decimal.NewFromFloat(otherCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  280. }
  281. }
  282. t := time.Unix(orders[0].SettleAccountsDate, 0)
  283. t2 := time.Unix(orders[len(orders)-1].SettleAccountsDate, 0)
  284. // 使用Format方法将时间转换为字符串
  285. // 这里以 "2006-01-02 15:04:05" 为例,它是Go的预定义常量格式
  286. f_time := t.Format("2006-01-02")
  287. l_time := t2.Format("2006-01-02")
  288. c.ServeSuccessJSON(map[string]interface{}{
  289. "order_infos": orderInfos,
  290. "number": order.MdtrtId,
  291. "date": order.SettleAccountsDate,
  292. "charge_admin": charge_admin,
  293. "printor_admin": printor_admin,
  294. "info": order,
  295. "bedCostTotal": bedCostTotal,
  296. "bedCostSelfTotal": bedCostSelfTotal,
  297. "bedCostPartSelfTotal": bedCostPartSelfTotal,
  298. "operationCostTotal": operationCostTotal,
  299. "operationCostSelfTotal": operationCostSelfTotal,
  300. "operationCostPartSelfTotal": operationCostPartSelfTotal,
  301. "otherCostTotal": otherCostTotal,
  302. "otherCostSelfTotal": otherCostSelfTotal,
  303. "otherCostPartSelfTotal": otherCostPartSelfTotal,
  304. "materialCostTotal": materialCostTotal,
  305. "materialCostSelfTotal": materialCostSelfTotal,
  306. "materialCostPartSelfTotal": materialCostPartSelfTotal,
  307. "westernMedicineCostTotal": westernMedicineCostTotal,
  308. "westernMedicineCostSelfTotal": westernMedicineCostSelfTotal,
  309. "westernMedicineCostPartSelfTotal": westernMedicineCostPartSelfTotal,
  310. "chineseTraditionalMedicineCostTotal": chineseTraditionalMedicineCostTotal,
  311. "chineseTraditionalMedicineCostSelfTotal": chineseTraditionalMedicineCostSelfTotal,
  312. "chineseTraditionalMedicineCostPartSelfTotal": chineseTraditionalMedicineCostPartSelfTotal,
  313. "checkCostTotal": checkCostTotal,
  314. "checkCostSelfTotal": checkCostSelfTotal,
  315. "checkCostPartSelfTotal": checkCostPartSelfTotal,
  316. "laboratoryCostTotal": laboratoryCostTotal,
  317. "laboratoryCostSelfTotal": laboratoryCostSelfTotal,
  318. "laboratoryCostPartSelfTotal": laboratoryCostPartSelfTotal,
  319. "treatCostTotal": treatCostTotal,
  320. "treatCostSelfTotal": treatCostSelfTotal,
  321. "treatCostPartSelfTotal": treatCostPartSelfTotal,
  322. "hiliCostTotal": hiliCostTotal,
  323. "hiliCostSelfTotal": hiliCostSelfTotal,
  324. "hiliCostPartSelfTotal": hiliCostPartSelfTotal,
  325. "patient": patient,
  326. "org_name": miConfig.OrgName,
  327. "org_code": miConfig.Code,
  328. "num": len(orders),
  329. "f_time": f_time,
  330. "l_time": l_time,
  331. })
  332. }
  333. func (this *HisExportDataController) GetExportData() {
  334. start_time := this.GetString("start_time")
  335. start_time = start_time + " 00:00:00"
  336. end_time := this.GetString("end_time")
  337. end_time = end_time + " 23:59:59"
  338. type_str := this.GetString("type")
  339. if type_str == "1" {
  340. ps, _ := service.GetHisOrderDetailFor310(start_time, end_time, this.GetAdminUserInfo().CurrentOrgId)
  341. this.ServeSuccessJSON(map[string]interface{}{
  342. "order": ps,
  343. })
  344. } else {
  345. ps, _ := service.GetHisOrderDetailFor390(start_time, end_time, this.GetAdminUserInfo().CurrentOrgId)
  346. this.ServeSuccessJSON(map[string]interface{}{
  347. "order": ps,
  348. })
  349. }
  350. }