fapiao_controller.go 107KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967
  1. package controllers
  2. import (
  3. "bytes"
  4. "crypto/md5"
  5. "crypto/sha1"
  6. "encoding/base64"
  7. "encoding/hex"
  8. "encoding/json"
  9. "errors"
  10. "fmt"
  11. "io/ioutil"
  12. "math"
  13. "net/http"
  14. "sort"
  15. "strconv"
  16. "strings"
  17. "time"
  18. "XT_New/common"
  19. "XT_New/enums"
  20. "XT_New/invoice"
  21. "XT_New/models"
  22. "XT_New/models/bwfapiao"
  23. "XT_New/service"
  24. "XT_New/service/fapiao"
  25. "XT_New/utils"
  26. "github.com/astaxie/beego"
  27. "github.com/shopspring/decimal"
  28. )
  29. func FaPiaoApiRegistRouters() {
  30. beego.Router("/api/bwfapiao/sms/code", &FapiaoApiController{}, "get:GetLoginUploadCode")
  31. beego.Router("/api/bwfapiao/sms/login", &FapiaoApiController{}, "get:Login")
  32. beego.Router("/api/bwfapiao/qrcode/get", &FapiaoApiController{}, "get:GetQRCode")
  33. //beego.Router("/api/bwfapiao/blue", &FapiaoApiController{}, "get:OpenFaPiao")
  34. //beego.Router("/api/bwfapiao/red", &FapiaoApiController{}, "get:RedFaPiao")
  35. beego.Router("/api/order/fapiao/list", &FapiaoApiController{}, "get:GetOrderFaPiaoList")
  36. beego.Router("/api/fapiao/list", &FapiaoApiController{}, "get:GetFaPiaoList")
  37. beego.Router("/api/newfapiao/get", &HisApiController{}, "get:GetNewFaPiaoData")
  38. beego.Router("/api/fapiao/query", &FapiaoApiController{}, "get:QueryFaPiao")
  39. //百望云
  40. //beego.Router("/api/bwfapiao/login", &FapiaoApiController{}, "get:GetBwFaPiaoLogin")
  41. //beego.Router("/api/bwfapiao/qrcode", &FapiaoApiController{}, "get:GetBwFaPiaoQRCode")
  42. beego.Router("/api/bwfapiao/blue", &FapiaoApiController{}, "get:BwOpenBlueFaPiao")
  43. beego.Router("/api/bwfapiao/query", &FapiaoApiController{}, "get:QueryBwFaPiao")
  44. beego.Router("/api/bwfapiao/red", &FapiaoApiController{}, "get:BwOpenRedFaPiao")
  45. }
  46. func signTopRequestTwo(params map[string]string, secret string, body map[string]interface{}) (string, error) {
  47. // 第一步:检查参数是否已经排序
  48. keys := make([]string, 0, len(params))
  49. for k := range params {
  50. keys = append(keys, k)
  51. }
  52. sort.Strings(keys)
  53. // 第二步:把所有参数名和参数值串在一起
  54. var query strings.Builder
  55. query.WriteString(secret) // 拼接 secret
  56. for _, k := range keys {
  57. v := params[k]
  58. if v != "" {
  59. query.WriteString(k)
  60. query.WriteString(v)
  61. }
  62. }
  63. // 将 body 序列化为 JSON
  64. bodyBytes, err := json.Marshal(body)
  65. if err != nil {
  66. return "", errors.New("failed to serialize request body: " + err.Error())
  67. }
  68. bodyString := string(bytes.TrimSpace(bodyBytes)) // 去掉多余的空格和换行
  69. query.WriteString(bodyString) // 拼接 body
  70. query.WriteString(secret) // 再次拼接 secret
  71. // 第三步:使用 MD5 计算哈希
  72. md5Hash := md5.New()
  73. md5Hash.Write([]byte(query.String()))
  74. hashBytes := md5Hash.Sum(nil)
  75. // 第四步:将结果转成大写十六进制字符串
  76. sign := strings.ToUpper(hex.EncodeToString(hashBytes))
  77. return sign, nil
  78. }
  79. func (c *FapiaoApiController) BwOpenBlueFaPiao() {
  80. //判断是否处于登录状态
  81. //开蓝票逻辑
  82. order_ids := c.GetString("order_ids")
  83. admin_user_id, _ := c.GetInt64("admin_user_id")
  84. ids := strings.Split(order_ids, ",")
  85. orders, _ := service.GetFaPiaoOrderByIDS(ids)
  86. var MedfeeSumamt float64 = 0 //治疗费用
  87. var PsnCashPay float64 = 0 //治疗费用
  88. var FundPaySumamt float64 = 0 //治疗费用
  89. var HifmiPay float64 = 0 //治疗费用
  90. var MafPay float64 = 0 //治疗费用
  91. var HifpPay float64 = 0 //治疗费用
  92. var AcctPay float64 = 0 //治疗费用
  93. var details []models.HisOrderInfo
  94. var numbers []string
  95. decimal.DivisionPrecision = 2
  96. var remark string
  97. for _, oss := range orders {
  98. MedfeeSumamt, _ = decimal.NewFromFloat(MedfeeSumamt).Add(decimal.NewFromFloat(oss.MedfeeSumamt)).Float64()
  99. PsnCashPay, _ = decimal.NewFromFloat(PsnCashPay).Add(decimal.NewFromFloat(oss.PsnCashPay)).Float64()
  100. FundPaySumamt, _ = decimal.NewFromFloat(FundPaySumamt).Add(decimal.NewFromFloat(oss.FundPaySumamt)).Float64()
  101. HifmiPay, _ = decimal.NewFromFloat(HifmiPay).Add(decimal.NewFromFloat(oss.HifmiPay)).Float64()
  102. MafPay, _ = decimal.NewFromFloat(MafPay).Add(decimal.NewFromFloat(oss.MafPay)).Float64()
  103. HifpPay, _ = decimal.NewFromFloat(HifpPay).Add(decimal.NewFromFloat(oss.HifpPay)).Float64()
  104. AcctPay, _ = decimal.NewFromFloat(AcctPay).Add(decimal.NewFromFloat(oss.AcctPay)).Float64()
  105. numbers = append(numbers, oss.Number)
  106. }
  107. if MedfeeSumamt > 0 {
  108. MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  109. if len(remark) == 0 {
  110. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  111. remark = "医疗总费用: " + MedfeeSumamt_str
  112. } else {
  113. remark = remark + " 医疗总费用:" + MedfeeSumamt_str
  114. }
  115. }
  116. if FundPaySumamt > 0 {
  117. MedfeeSumamt_str := fmt.Sprintf("%.2f", FundPaySumamt)
  118. if len(remark) == 0 {
  119. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  120. remark = "基金支付总金额: " + MedfeeSumamt_str
  121. } else {
  122. remark = remark + " 基金支付总金额:" + MedfeeSumamt_str
  123. }
  124. }
  125. if PsnCashPay > 0 {
  126. MedfeeSumamt_str := fmt.Sprintf("%.2f", PsnCashPay)
  127. if len(remark) == 0 {
  128. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  129. remark = "个人现金支付: " + MedfeeSumamt_str
  130. } else {
  131. remark = remark + " 个人现金支付:" + MedfeeSumamt_str
  132. }
  133. }
  134. if HifmiPay > 0 {
  135. MedfeeSumamt_str := fmt.Sprintf("%.2f", HifmiPay)
  136. if len(remark) == 0 {
  137. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  138. remark = "大病基金支付: " + MedfeeSumamt_str
  139. } else {
  140. remark = remark + " 大病基金支付:" + MedfeeSumamt_str
  141. }
  142. }
  143. if AcctPay > 0 {
  144. MedfeeSumamt_str := fmt.Sprintf("%.2f", AcctPay)
  145. if len(remark) == 0 {
  146. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  147. remark = "个账支付: " + MedfeeSumamt_str
  148. } else {
  149. remark = remark + " 个账支付:" + MedfeeSumamt_str
  150. }
  151. }
  152. if HifpPay > 0 {
  153. MedfeeSumamt_str := fmt.Sprintf("%.2f", HifpPay)
  154. if len(remark) == 0 {
  155. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  156. remark = "基本统筹基金支付: " + MedfeeSumamt_str
  157. } else {
  158. remark = remark + " 基本统筹基金支付:" + MedfeeSumamt_str
  159. }
  160. }
  161. if MafPay > 0 {
  162. MedfeeSumamt_str := fmt.Sprintf("%.2f", MafPay)
  163. if len(remark) == 0 {
  164. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  165. remark = "医疗救助基金支付: " + MedfeeSumamt_str
  166. } else {
  167. remark = remark + " 医疗救助基金支付:" + MedfeeSumamt_str
  168. }
  169. }
  170. details, _ = service.GetFaPiaoOrderInfoByNumbers(numbers)
  171. role, _ := service.GetAdminUserRole(admin_user_id, c.GetAdminUserInfo().CurrentOrgId)
  172. role.UserName = ""
  173. type CostType struct {
  174. name string
  175. price float64
  176. }
  177. var cts []CostType
  178. var ct CostType
  179. var bedCostTotal float64 = 0 //床位总费
  180. var operationCostTotal float64 = 0 //手术费
  181. var otherCostTotal float64 = 0 //其他费用
  182. var materialCostTotal float64 = 0 //材料费
  183. var westernMedicineCostTotal float64 = 0 //西药费
  184. var chineseTraditionalMedicineCostTotal float64 = 0 //中成药
  185. var checkCostTotal float64 = 0 //检查费
  186. var laboratoryCostTotal float64 = 0 //化验费
  187. var treatCostTotal float64 = 0 //治疗费用
  188. var huliCostTotal float64 = 0 //治疗费用
  189. var zhencaCostTotal float64 = 0 //治疗费用
  190. for _, item := range details {
  191. if item.MedChrgitmType == "01" { //床位费
  192. bedCostTotal, _ = decimal.NewFromFloat(bedCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  193. }
  194. if item.MedChrgitmType == "07" { //护理费
  195. huliCostTotal, _ = decimal.NewFromFloat(huliCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  196. }
  197. if c.GetAdminUserInfo().CurrentOrgId == 10188 || c.GetAdminUserInfo().CurrentOrgId == 10217 {
  198. if item.MedChrgitmType == "03" { //检查费
  199. laboratoryCostTotal, _ = decimal.NewFromFloat(laboratoryCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  200. }
  201. } else {
  202. if item.MedChrgitmType == "03" { //检查费
  203. checkCostTotal, _ = decimal.NewFromFloat(checkCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  204. }
  205. }
  206. if item.MedChrgitmType == "04" { //化验费
  207. laboratoryCostTotal, _ = decimal.NewFromFloat(laboratoryCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  208. }
  209. if item.MedChrgitmType == "05" || item.MedChrgitmType == "1402" || item.MedChrgitmType == "1403" { //治疗费
  210. treatCostTotal, _ = decimal.NewFromFloat(treatCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  211. }
  212. if item.MedChrgitmType == "06" { //手术费
  213. operationCostTotal, _ = decimal.NewFromFloat(operationCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  214. }
  215. if item.MedChrgitmType == "08" { //材料费
  216. materialCostTotal, _ = decimal.NewFromFloat(materialCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  217. }
  218. if item.MedChrgitmType == "09" { //西药费
  219. westernMedicineCostTotal, _ = decimal.NewFromFloat(westernMedicineCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  220. }
  221. if item.MedChrgitmType == "11" { //中成费
  222. chineseTraditionalMedicineCostTotal, _ = decimal.NewFromFloat(chineseTraditionalMedicineCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  223. }
  224. if item.MedChrgitmType == "14" || item.MedChrgitmType == "0" || item.MedChrgitmType == "12" { //其他费
  225. otherCostTotal, _ = decimal.NewFromFloat(otherCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  226. }
  227. if item.MedChrgitmType == "02" { //诊察
  228. zhencaCostTotal, _ = decimal.NewFromFloat(zhencaCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  229. }
  230. }
  231. if bedCostTotal > 0 {
  232. ct.name = "床位费"
  233. ct.price = bedCostTotal
  234. cts = append(cts, ct)
  235. }
  236. if operationCostTotal > 0 {
  237. ct.name = "手术费"
  238. ct.price = operationCostTotal
  239. cts = append(cts, ct)
  240. }
  241. if otherCostTotal > 0 {
  242. ct.name = "其他费"
  243. ct.price = otherCostTotal
  244. cts = append(cts, ct)
  245. }
  246. if materialCostTotal > 0 {
  247. ct.name = "材料费"
  248. ct.price = materialCostTotal
  249. cts = append(cts, ct)
  250. }
  251. if westernMedicineCostTotal > 0 {
  252. ct.name = "西药费"
  253. ct.price = westernMedicineCostTotal
  254. cts = append(cts, ct)
  255. }
  256. if chineseTraditionalMedicineCostTotal > 0 {
  257. ct.name = "中成药费"
  258. ct.price = chineseTraditionalMedicineCostTotal
  259. cts = append(cts, ct)
  260. }
  261. if checkCostTotal > 0 {
  262. ct.name = "检查费"
  263. ct.price = checkCostTotal
  264. cts = append(cts, ct)
  265. }
  266. if laboratoryCostTotal > 0 {
  267. ct.name = "化验费"
  268. ct.price = laboratoryCostTotal
  269. cts = append(cts, ct)
  270. }
  271. if treatCostTotal > 0 {
  272. ct.name = "治疗费"
  273. ct.price = treatCostTotal
  274. cts = append(cts, ct)
  275. }
  276. if huliCostTotal > 0 {
  277. ct.name = "护理费"
  278. ct.price = huliCostTotal
  279. cts = append(cts, ct)
  280. }
  281. if zhencaCostTotal > 0 {
  282. ct.name = "诊察费"
  283. ct.price = zhencaCostTotal
  284. cts = append(cts, ct)
  285. }
  286. //org_config, _ := service.FindMedicalInsuranceInfo(c.GetAdminUserInfo().CurrentOrgId)
  287. var config2 models.FapiaoConfig
  288. config2, _ = service.FindFaPiaoConfigInfo(c.GetAdminUserInfo().CurrentOrgId)
  289. number := strconv.FormatInt(time.Now().Unix(), 10) + "_" + strconv.FormatInt(orders[0].UserOrgId, 10) + "_" + strconv.FormatInt(orders[0].PatientId, 10)
  290. amountWithoutTax, _, taxAmount, _ := CalculatePriceDetails(MedfeeSumamt, 1, 0.00)
  291. patient, _ := service.GetXTPatientInfo(c.GetAdminUserInfo().CurrentOrgId, orders[0].PatientId)
  292. orders[0].PsnName = patient.Name
  293. requestBody2 := map[string]interface{}{
  294. "taxNo": config2.TerminalCode,
  295. "taxUserName": "",
  296. "invoiceTerminalCode": "",
  297. "isSplit": "",
  298. "orgCode": "",
  299. "taxDiskNo": "",
  300. "formatGenerate": "",
  301. "formatPushType": "",
  302. "completionCustom": "",
  303. "isAsync": "",
  304. "isReturnRedInfo": "",
  305. }
  306. //var subData map[string]interface{}
  307. subData := make(map[string]interface{})
  308. subData["invoiceTypeCode"] = "02"
  309. subData["paperInvoiceFlag"] = ""
  310. subData["paperInvoiceTypeCode"] = ""
  311. subData["paperInvoiceTypeCode"] = ""
  312. subData["invoiceType"] = "0"
  313. subData["invoiceSpecialMark"] = "00"
  314. subData["isConfirmIssue"] = ""
  315. subData["confirmIssue"] = ""
  316. subData["taxationMethod"] = ""
  317. subData["taxationLabel"] = ""
  318. subData["reducedTaxCode"] = ""
  319. subData["invoiceListMark"] = ""
  320. subData["priceTaxMark"] = ""
  321. subData["serialNo"] = number // todo
  322. subData["orderNo"] = "" //todo
  323. subData["buyerTaxNo"] = "" //todo
  324. subData["buyerName"] = orders[0].PsnName + "(个人)"
  325. subData["buyerAddressPhone"] = ""
  326. subData["buyerBankAccount"] = ""
  327. subData["drawer"] = ""
  328. subData["checker"] = ""
  329. subData["payee"] = ""
  330. subData["invoiceTotalPrice"] = MedfeeSumamt
  331. subData["invoiceTotalTax"] = taxAmount
  332. subData["invoiceTotalPriceTax"] = amountWithoutTax
  333. subData["remarks"] = remark
  334. subData["redInfoNo"] = ""
  335. subData["originalInvoiceCode"] = ""
  336. subData["originalInvoiceNo"] = ""
  337. subData["deductibleAmount"] = ""
  338. subData["sellerAddressPhone"] = ""
  339. subData["sellerBankAccount"] = ""
  340. //var subDetails []map[string]interface{}
  341. subDetails := make([]map[string]interface{}, 0)
  342. for index, item := range cts {
  343. subDetailData := make(map[string]interface{})
  344. amountWithoutTax_two, _, taxAmount_tow, _ := CalculatePriceDetails(item.price, 1, 0.00)
  345. subDetailData["goodsLineNo"] = index + 1
  346. subDetailData["originalInvoiceDetailNo"] = ""
  347. subDetailData["invoiceLineNature"] = "0"
  348. subDetailData["goodsCode"] = "3070202000000000000"
  349. subDetailData["goodsBarCode"] = ""
  350. subDetailData["goodsPersonalCode"] = ""
  351. subDetailData["goodsName"] = item.name
  352. subDetailData["goodsSpecification"] = ""
  353. subDetailData["goodsUnit"] = ""
  354. subDetailData["goodsQuantity"] = "1"
  355. subDetailData["goodsPrice"] = amountWithoutTax_two
  356. subDetailData["goodsTotalPrice"] = amountWithoutTax_two
  357. subDetailData["goodsTotalTax"] = taxAmount_tow
  358. subDetailData["goodsTaxRate"] = "0"
  359. subDetailData["vatSpecialManagement"] = ""
  360. subDetailData["freeTaxMark"] = "3"
  361. subDetailData["preferentialMarkFlag"] = ""
  362. subDetailData["goodsDiscountAmount"] = "0"
  363. subDetails = append(subDetails, subDetailData)
  364. }
  365. subData["invoiceDetailsList"] = subDetails
  366. requestBody2["data"] = subData
  367. status, reason, response, request_log, response_log := OpenBWBlue(requestBody2)
  368. if status == 0 { //失败
  369. c.ServeSuccessJSON(map[string]interface{}{
  370. "status": -10,
  371. "msg": reason,
  372. })
  373. } else { //成功
  374. var fapiaos models.HisFaPiaoOrder
  375. fapiaos.InvoiceId = response.Response.Success[0].SerialNo
  376. fapiaos.OrderSn = response.Response.Success[0].SerialNo
  377. fapiaos.OrderIds = order_ids
  378. fapiaos.UserOrgId = c.GetAdminUserInfo().CurrentOrgId
  379. fapiaos.Status = 1
  380. // 解析日期字符串的布局(对应输入的格式)
  381. layout := "20060102150405"
  382. // 将字符串解析为时间对象
  383. t, _ := time.Parse(layout, response.Response.Success[0].InvoiceDate)
  384. // 将时间对象格式化为所需的输出格式
  385. output := t.Format("2006-01-02 15:04:05")
  386. fapiaos.TicketDate = output
  387. fapiaos.PatientId = orders[0].PatientId
  388. fapiaos.Ctime = time.Now().Unix()
  389. fapiaos.Mtime = time.Now().Unix()
  390. fapiaos.Creator = role.UserName
  391. fapiaos.MedfeeSumamt = MedfeeSumamt
  392. fapiaos.FundPaySumamt = FundPaySumamt
  393. fapiaos.PsnCashPay = PsnCashPay
  394. fapiaos.TicketSn = response.Response.Success[0].InvoiceNo
  395. fapiaos.AmountWithTax = fmt.Sprintf("%.2f", response.Response.Success[0].InvoiceTotalPrice)
  396. fapiaos.AmountWithoutTax = fmt.Sprintf("%.2f", response.Response.Success[0].InvoiceTotalPrice)
  397. fapiaos.FapiaoStatus = "2"
  398. fapiaos.TaxAmount = fmt.Sprintf("%.2f", response.Response.Success[0].InvoiceTotalTax)
  399. fapiaos.IsRedWashed = "0"
  400. fapiaos.PdfUrl = response.Response.Success[0].EInvoiceUrl
  401. fapiaos.OfdUrl = ""
  402. fapiaos.XmlUrl = ""
  403. fapiaos.OfdUrl = ""
  404. fapiaos.XmlUrl = ""
  405. fapiaos.BlueRequestInfo = request_log
  406. fapiaos.BlueResponseInfo = response_log
  407. err := service.SaveFaPiaoOrder(&fapiaos)
  408. err = service.UpdateFaPiaoSN(response.Response.Success[0].SerialNo, ids) //同步发票号码
  409. err = service.UpdateFaPiaoNumber(response.Response.Success[0].InvoiceNo, ids) //同步发票号码
  410. fmt.Println(err)
  411. status2, msg, result := BWBanShi(config2, response.Response.Success[0].InvoiceNo)
  412. if status2 == 0 {
  413. c.ServeSuccessJSON(map[string]interface{}{
  414. "msg": msg,
  415. })
  416. return
  417. } else {
  418. fapiaos.PdfUrl = result.Response.UrlMap.PdfUrl
  419. fapiaos.OfdUrl = result.Response.UrlMap.OfdUrl
  420. fapiaos.XmlUrl = result.Response.UrlMap.XmlUrl
  421. err := service.SaveFaPiaoOrder(&fapiaos)
  422. if err == nil {
  423. c.ServeSuccessJSON(map[string]interface{}{
  424. "msg": "成功",
  425. })
  426. return
  427. } else {
  428. c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
  429. return
  430. }
  431. }
  432. }
  433. }
  434. func (c *FapiaoApiController) BwOpenRedFaPiao() {
  435. id, _ := c.GetInt64("id")
  436. admin_user_id, _ := c.GetInt64("admin_user_id")
  437. fapiao_config, _ := service.GetFaPiaoOrderById(id)
  438. role, _ := service.GetAdminUserRole(admin_user_id, c.GetAdminUserInfo().CurrentOrgId)
  439. var config models.FapiaoConfig
  440. config, _ = service.FindFaPiaoConfigInfo(c.GetAdminUserInfo().CurrentOrgId)
  441. status, reason, resp, request_log, resp_log := OpenBWRed(config, fapiao_config)
  442. if status == 1 {
  443. fapiao_config.IsRedWashed = "1"
  444. fapiao_config.Status = 0
  445. fapiao_config.RedInvoiceId = resp[0].RedInvoiceNo
  446. fapiao_config.RedInvoiceUUID = resp[0].RedConfirmUUID
  447. fapiao_config.RedInvoiceCreator = role.UserName
  448. fapiao_config.RedRequestInfo = request_log
  449. fapiao_config.RedResponseInfo = resp_log
  450. service.SaveFaPiaoOrder(&fapiao_config)
  451. //将结算表的发票号码清空
  452. service.UpdateFaPiaoNumberByNumber(fapiao_config.TicketSn)
  453. c.ServeSuccessJSON(map[string]interface{}{
  454. "msg": "红冲成功",
  455. })
  456. } else {
  457. c.ServeSuccessJSON(map[string]interface{}{
  458. "msg": reason,
  459. })
  460. }
  461. }
  462. func (c *FapiaoApiController) QueryBwFaPiao() {
  463. id, _ := c.GetInt64("id")
  464. oc, _ := service.GetFaPiaoOrderById(id)
  465. var config models.FapiaoConfig
  466. config, _ = service.FindFaPiaoConfigInfo(c.GetAdminUserInfo().CurrentOrgId)
  467. QueryBWInvoiceInfoTwo(config, oc)
  468. }
  469. // 百望云发票开票
  470. func OpenBWBlue(requestBody2 map[string]interface{}) (int64, string, bwfapiao.InvoiceIssueResponse, string, string) {
  471. // 解析 JSON 响应
  472. var result bwfapiao.InvoiceIssueResponse
  473. fmt.Println(requestBody2)
  474. redisClient := service.RedisClient()
  475. defer redisClient.Close()
  476. fapiao_access_token, _ := redisClient.Get("fapiao_access_token").Result()
  477. fmt.Println(fapiao_access_token)
  478. // 示例数据
  479. params := map[string]string{
  480. "method": "baiwang.output.invoice.issue",
  481. "version": "6.0",
  482. "appKey": "10059482",
  483. "format": "json",
  484. "timestamp": strconv.FormatInt(time.Now().Unix(), 10),
  485. "token": fapiao_access_token,
  486. "type": "sync",
  487. }
  488. secret := "bb481e0c-9895-44d8-b184-6b9707a60ec7"
  489. reques_log, _ := json.Marshal(requestBody2)
  490. // 生成签名
  491. sign, err := signTopRequestTwo(params, secret, requestBody2)
  492. if err != nil {
  493. fmt.Println("Error:", err)
  494. return 0, err.Error(), result, string(reques_log), ""
  495. }
  496. params["sign"] = sign
  497. if len(fapiao_access_token) > 0 { //token 存在则进行签名处理
  498. // 调用 API
  499. response, err := callApiTwo("https://openapi.baiwang.com/router/rest", params, requestBody2)
  500. if err != nil {
  501. fmt.Println("接口调用失败:", err)
  502. return 0, err.Error(), result, string(reques_log), response
  503. }
  504. err2 := json.Unmarshal([]byte(response), &result)
  505. if err2 != nil {
  506. fmt.Println("解析响应失败:", err2)
  507. return 0, err2.Error(), result, string(reques_log), response
  508. }
  509. // 判断接口是否成功调用
  510. if result.Success {
  511. return 1, "开具成功", result, string(reques_log), response
  512. } else {
  513. fmt.Println(result.ErrorResponse.Message)
  514. fmt.Println(result.ErrorResponse.SubMessage)
  515. return 0, result.ErrorResponse.Message + "\n" + result.ErrorResponse.SubMessage, result, string(reques_log), response
  516. }
  517. } else { //token 不存在,则进行获取token的操作
  518. fmt.Println("token 不存在")
  519. tokenResp, _ := GetAccessToken("https://openapi.baiwang.com/router/rest", "b033l65qAA", "cc73223bd14a4064bb0fe9ba642da58f", "10059482", "bb481e0c-9895-44d8-b184-6b9707a60ec7", "admin_ffzyx16zmybx4", "")
  520. fmt.Println(tokenResp)
  521. if len(tokenResp.Response.AccessToken) > 0 { //token请求成功,则将token和有效时间存储进redis,
  522. redisClient.Set("fapiao_access_token", tokenResp.Response.AccessToken, time.Duration(tokenResp.Response.ExpiresIn)*time.Second)
  523. params["token"] = tokenResp.Response.AccessToken
  524. // 生成签名
  525. sign, err = signTopRequestTwo(params, secret, requestBody2)
  526. if err != nil {
  527. fmt.Println("Error:", err)
  528. return 0, err.Error(), result, string(reques_log), ""
  529. }
  530. params["sign"] = sign
  531. // 调用 API
  532. response, err := callApiTwo("https://openapi.baiwang.com/router/rest", params, requestBody2)
  533. if err != nil {
  534. fmt.Println("接口调用失败:", err)
  535. return 0, err.Error(), result, string(reques_log), response
  536. }
  537. err2 := json.Unmarshal([]byte(response), &result)
  538. if err2 != nil {
  539. fmt.Println("解析响应失败:", err2)
  540. return 0, err2.Error(), result, string(reques_log), response
  541. }
  542. // 判断接口是否成功调用
  543. if result.Success {
  544. return 1, "开具成功", result, string(reques_log), response
  545. } else {
  546. fmt.Println(result.ErrorResponse.Message)
  547. fmt.Println(result.ErrorResponse.SubMessage)
  548. return 0, result.ErrorResponse.Message + "\n" + result.ErrorResponse.SubMessage, result, string(reques_log), response
  549. }
  550. } else {
  551. return 0, "获取token失败", result, string(reques_log), ""
  552. }
  553. }
  554. }
  555. // 百望云发票全电红字确认单申请
  556. func OpenBWRed(config models.FapiaoConfig, orders models.HisFaPiaoOrder) (int64, string, []bwfapiao.RedAddInvoiceData, string, string) {
  557. var result bwfapiao.RedAddResponse
  558. redisClient := service.RedisClient()
  559. defer redisClient.Close()
  560. patient, _ := service.GetPatientByID(orders.UserOrgId, orders.PatientId)
  561. fapiao_access_token, _ := redisClient.Get("fapiao_access_token").Result()
  562. // 示例数据
  563. params := map[string]string{
  564. "method": "baiwang.output.redinvoice.add",
  565. "version": "6.0",
  566. "appKey": "10059482",
  567. "format": "json",
  568. "timestamp": strconv.FormatInt(time.Now().Unix(), 10),
  569. "token": fapiao_access_token,
  570. "type": "sync",
  571. }
  572. secret := "bb481e0c-9895-44d8-b184-6b9707a60ec7"
  573. _, _, taxAmount, _ := CalculatePriceDetails(orders.MedfeeSumamt, 1, 0.00)
  574. number := strconv.FormatInt(time.Now().Unix(), 10)
  575. requestBody2 := map[string]interface{}{
  576. "taxNo": config.TerminalCode,
  577. "orgCode": "",
  578. "taxUserName": "",
  579. "drawer": "",
  580. "redConfirmSerialNo": number,
  581. "entryIdentity": "01",
  582. "sellerTaxNo": config.TerminalCode,
  583. "sellerTaxName": "广州从化意达血液透析有限责任公司",
  584. "deliverFlag": "",
  585. "buyerEmail": "",
  586. "buyerPhone": "",
  587. "buyerTaxNo": "",
  588. "buyerTaxName": patient.Name + "(个人)", //todo //购买方名称
  589. "redInvoiceIsPaper": "",
  590. "originInvoiceIsPaper": "N",
  591. "originalInvoiceNo": orders.TicketSn,
  592. "originalPaperInvoiceCode": "",
  593. "originalPaperInvoiceNo": "",
  594. "originInvoiceDate": orders.TicketDate, //todo 蓝字发票开票日期 yyyy-MM-dd HH:mm:ss
  595. "originInvoiceTotalPrice": orders.MedfeeSumamt, //todo 蓝字发票合计金额
  596. "originInvoiceTotalTax": taxAmount, //todo 蓝字发票合计税额
  597. "originInvoiceType": "02", //todo 蓝字发票票种代码 01:增值税专用发票 02:普通发票 03:机动车统一销售发票 04:二手车统一销售发票
  598. "originInvoiceSetCode": "",
  599. "autoIssueSwitch": "",
  600. "invoiceTotalPrice": -orders.MedfeeSumamt, //todo 红字冲销金额
  601. "invoiceTotalTax": taxAmount, //todo 红字冲销税额
  602. "redInvoiceLabel": "01", //todo
  603. "invoiceSource": "2",
  604. "priceTaxMark": "0",
  605. }
  606. ids := strings.Split(orders.OrderIds, ",")
  607. order, _ := service.GetFaPiaoOrderByIDS(ids)
  608. var MedfeeSumamt float64 = 0 //治疗费用
  609. var PsnCashPay float64 = 0 //治疗费用
  610. var FundPaySumamt float64 = 0 //治疗费用
  611. var HifmiPay float64 = 0 //治疗费用
  612. var MafPay float64 = 0 //治疗费用
  613. var HifpPay float64 = 0 //治疗费用
  614. var AcctPay float64 = 0 //治疗费用
  615. var details []models.HisOrderInfo
  616. var numbers []string
  617. decimal.DivisionPrecision = 2
  618. var remark string
  619. for _, oss := range order {
  620. MedfeeSumamt, _ = decimal.NewFromFloat(MedfeeSumamt).Add(decimal.NewFromFloat(oss.MedfeeSumamt)).Float64()
  621. PsnCashPay, _ = decimal.NewFromFloat(PsnCashPay).Add(decimal.NewFromFloat(oss.PsnCashPay)).Float64()
  622. FundPaySumamt, _ = decimal.NewFromFloat(FundPaySumamt).Add(decimal.NewFromFloat(oss.FundPaySumamt)).Float64()
  623. HifmiPay, _ = decimal.NewFromFloat(HifmiPay).Add(decimal.NewFromFloat(oss.HifmiPay)).Float64()
  624. MafPay, _ = decimal.NewFromFloat(MafPay).Add(decimal.NewFromFloat(oss.MafPay)).Float64()
  625. HifpPay, _ = decimal.NewFromFloat(HifpPay).Add(decimal.NewFromFloat(oss.HifpPay)).Float64()
  626. AcctPay, _ = decimal.NewFromFloat(AcctPay).Add(decimal.NewFromFloat(oss.AcctPay)).Float64()
  627. numbers = append(numbers, oss.Number)
  628. }
  629. if MedfeeSumamt > 0 {
  630. MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  631. if len(remark) == 0 {
  632. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  633. remark = "医疗总费用: " + MedfeeSumamt_str
  634. } else {
  635. remark = remark + " 医疗总费用:" + MedfeeSumamt_str
  636. }
  637. }
  638. if FundPaySumamt > 0 {
  639. MedfeeSumamt_str := fmt.Sprintf("%.2f", FundPaySumamt)
  640. if len(remark) == 0 {
  641. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  642. remark = "基金支付总金额: " + MedfeeSumamt_str
  643. } else {
  644. remark = remark + " 基金支付总金额:" + MedfeeSumamt_str
  645. }
  646. }
  647. if PsnCashPay > 0 {
  648. MedfeeSumamt_str := fmt.Sprintf("%.2f", PsnCashPay)
  649. if len(remark) == 0 {
  650. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  651. remark = "个人现金支付: " + MedfeeSumamt_str
  652. } else {
  653. remark = remark + " 个人现金支付:" + MedfeeSumamt_str
  654. }
  655. }
  656. if HifmiPay > 0 {
  657. MedfeeSumamt_str := fmt.Sprintf("%.2f", HifmiPay)
  658. if len(remark) == 0 {
  659. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  660. remark = "大病基金支付: " + MedfeeSumamt_str
  661. } else {
  662. remark = remark + " 大病基金支付:" + MedfeeSumamt_str
  663. }
  664. }
  665. if AcctPay > 0 {
  666. MedfeeSumamt_str := fmt.Sprintf("%.2f", AcctPay)
  667. if len(remark) == 0 {
  668. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  669. remark = "个账支付: " + MedfeeSumamt_str
  670. } else {
  671. remark = remark + " 个账支付:" + MedfeeSumamt_str
  672. }
  673. }
  674. if HifpPay > 0 {
  675. MedfeeSumamt_str := fmt.Sprintf("%.2f", HifpPay)
  676. if len(remark) == 0 {
  677. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  678. remark = "基本统筹基金支付: " + MedfeeSumamt_str
  679. } else {
  680. remark = remark + " 基本统筹基金支付:" + MedfeeSumamt_str
  681. }
  682. }
  683. if MafPay > 0 {
  684. MedfeeSumamt_str := fmt.Sprintf("%.2f", MafPay)
  685. if len(remark) == 0 {
  686. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  687. remark = "医疗救助基金支付: " + MedfeeSumamt_str
  688. } else {
  689. remark = remark + " 医疗救助基金支付:" + MedfeeSumamt_str
  690. }
  691. }
  692. details, _ = service.GetFaPiaoOrderInfoByNumbers(numbers)
  693. type CostType struct {
  694. name string
  695. price float64
  696. }
  697. var cts []CostType
  698. var ct CostType
  699. var bedCostTotal float64 = 0 //床位总费
  700. var operationCostTotal float64 = 0 //手术费
  701. var otherCostTotal float64 = 0 //其他费用
  702. var materialCostTotal float64 = 0 //材料费
  703. var westernMedicineCostTotal float64 = 0 //西药费
  704. var chineseTraditionalMedicineCostTotal float64 = 0 //中成药
  705. var checkCostTotal float64 = 0 //检查费
  706. var laboratoryCostTotal float64 = 0 //化验费
  707. var treatCostTotal float64 = 0 //治疗费用
  708. var huliCostTotal float64 = 0 //治疗费用
  709. var zhencaCostTotal float64 = 0 //治疗费用
  710. for _, item := range details {
  711. if item.MedChrgitmType == "01" { //床位费
  712. bedCostTotal, _ = decimal.NewFromFloat(bedCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  713. }
  714. if item.MedChrgitmType == "07" { //护理费
  715. huliCostTotal, _ = decimal.NewFromFloat(huliCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  716. }
  717. if item.MedChrgitmType == "03" { //检查费
  718. checkCostTotal, _ = decimal.NewFromFloat(checkCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  719. }
  720. if item.MedChrgitmType == "04" { //化验费
  721. laboratoryCostTotal, _ = decimal.NewFromFloat(laboratoryCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  722. }
  723. if item.MedChrgitmType == "05" || item.MedChrgitmType == "1402" || item.MedChrgitmType == "1403" { //治疗费
  724. treatCostTotal, _ = decimal.NewFromFloat(treatCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  725. }
  726. if item.MedChrgitmType == "06" { //手术费
  727. operationCostTotal, _ = decimal.NewFromFloat(operationCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  728. }
  729. if item.MedChrgitmType == "08" { //材料费
  730. materialCostTotal, _ = decimal.NewFromFloat(materialCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  731. }
  732. if item.MedChrgitmType == "09" { //西药费
  733. westernMedicineCostTotal, _ = decimal.NewFromFloat(westernMedicineCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  734. }
  735. if item.MedChrgitmType == "11" { //中成费
  736. chineseTraditionalMedicineCostTotal, _ = decimal.NewFromFloat(chineseTraditionalMedicineCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  737. }
  738. if item.MedChrgitmType == "14" || item.MedChrgitmType == "0" || item.MedChrgitmType == "12" { //其他费
  739. otherCostTotal, _ = decimal.NewFromFloat(otherCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  740. }
  741. if item.MedChrgitmType == "02" { //诊察
  742. zhencaCostTotal, _ = decimal.NewFromFloat(zhencaCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  743. }
  744. }
  745. if bedCostTotal > 0 {
  746. ct.name = "床位费"
  747. ct.price = bedCostTotal
  748. cts = append(cts, ct)
  749. }
  750. if operationCostTotal > 0 {
  751. ct.name = "手术费"
  752. ct.price = operationCostTotal
  753. cts = append(cts, ct)
  754. }
  755. if otherCostTotal > 0 {
  756. ct.name = "其他费"
  757. ct.price = otherCostTotal
  758. cts = append(cts, ct)
  759. }
  760. if materialCostTotal > 0 {
  761. ct.name = "材料费"
  762. ct.price = materialCostTotal
  763. cts = append(cts, ct)
  764. }
  765. if westernMedicineCostTotal > 0 {
  766. ct.name = "西药费"
  767. ct.price = westernMedicineCostTotal
  768. cts = append(cts, ct)
  769. }
  770. if chineseTraditionalMedicineCostTotal > 0 {
  771. ct.name = "中成药费"
  772. ct.price = chineseTraditionalMedicineCostTotal
  773. cts = append(cts, ct)
  774. }
  775. if checkCostTotal > 0 {
  776. ct.name = "检查费"
  777. ct.price = checkCostTotal
  778. cts = append(cts, ct)
  779. }
  780. if laboratoryCostTotal > 0 {
  781. ct.name = "化验费"
  782. ct.price = laboratoryCostTotal
  783. cts = append(cts, ct)
  784. }
  785. if treatCostTotal > 0 {
  786. ct.name = "治疗费"
  787. ct.price = treatCostTotal
  788. cts = append(cts, ct)
  789. }
  790. if huliCostTotal > 0 {
  791. ct.name = "护理费"
  792. ct.price = huliCostTotal
  793. cts = append(cts, ct)
  794. }
  795. if zhencaCostTotal > 0 {
  796. ct.name = "诊察费"
  797. ct.price = zhencaCostTotal
  798. cts = append(cts, ct)
  799. }
  800. subDetails := make([]map[string]interface{}, 0)
  801. for index, item := range cts {
  802. _, _, taxAmount_tow, _ := CalculatePriceDetails(item.price, 1, 0.00)
  803. subDetailData := make(map[string]interface{})
  804. subDetailData["originalInvoiceDetailNo"] = index + 1
  805. subDetailData["goodsLineNo"] = index + 1
  806. subDetailData["invoiceLineNature"] = ""
  807. subDetailData["goodsCode"] = "3070202000000000000"
  808. subDetailData["goodsName"] = item.name
  809. subDetailData["goodsSimpleName"] = ""
  810. subDetailData["projectName"] = item.name
  811. subDetailData["goodsSpecification"] = ""
  812. subDetailData["goodsUnit"] = ""
  813. subDetailData["goodsQuantity"] = ""
  814. subDetailData["goodsPrice"] = -item.price
  815. subDetailData["goodsTaxRate"] = "0"
  816. subDetailData["goodsTotalPrice"] = -item.price
  817. subDetailData["goodsTotalTax"] = taxAmount_tow
  818. subDetailData["goodsPriceTax"] = -item.price
  819. subDetailData["goodsTotalPriceTax"] = -item.price
  820. subDetails = append(subDetails, subDetailData)
  821. }
  822. requestBody2["redConfirmDetailReqEntityList"] = subDetails
  823. request, _ := json.Marshal(requestBody2)
  824. // 生成签名
  825. sign, err := signTopRequestTwo(params, secret, requestBody2)
  826. if err != nil {
  827. fmt.Println("Error:", err)
  828. return 0, err.Error(), result.Response, string(request), ""
  829. }
  830. params["sign"] = sign
  831. if len(fapiao_access_token) > 0 {
  832. //token 存在则进行签名处理
  833. // 调用 API
  834. response, err := callApiTwo("https://openapi.baiwang.com/router/rest", params, requestBody2)
  835. if err != nil {
  836. fmt.Println("接口调用失败:", err)
  837. return 0, err.Error(), result.Response, string(request), ""
  838. }
  839. // 解析 JSON 响应
  840. var result bwfapiao.RedAddResponse
  841. err2 := json.Unmarshal([]byte(response), &result)
  842. if err2 != nil {
  843. fmt.Println("解析响应失败:", err2)
  844. return 0, err.Error(), result.Response, string(request), response
  845. }
  846. // 判断接口是否成功调用
  847. if result.Success {
  848. return 1, "红冲成功", result.Response, string(request), response
  849. } else {
  850. return 0, result.ErrorResponse.Message + "\n" + result.ErrorResponse.SubMessage, result.Response, string(request), response
  851. }
  852. } else { //token 不存在,则进行获取token的操作
  853. tokenResp, _ := GetAccessToken("https://openapi.baiwang.com/router/rest", "b033l65qAA", "cc73223bd14a4064bb0fe9ba642da58f", "10059482", "bb481e0c-9895-44d8-b184-6b9707a60ec7", "admin_ffzyx16zmybx4", "")
  854. if len(tokenResp.Response.AccessToken) > 0 { //token请求成功,则将token和有效时间存储进redis,
  855. redisClient.Set("fapiao_access_token", tokenResp.Response.AccessToken, time.Duration(tokenResp.Response.ExpiresIn)*time.Second)
  856. params["token"] = tokenResp.Response.AccessToken
  857. // 生成签名
  858. sign, err = signTopRequestTwo(params, secret, requestBody2)
  859. if err != nil {
  860. fmt.Println("Error:", err)
  861. return 0, err.Error(), result.Response, string(request), ""
  862. }
  863. params["sign"] = sign
  864. // 调用 API
  865. response, err := callApiTwo("https://openapi.baiwang.com/router/rest", params, requestBody2)
  866. if err != nil {
  867. fmt.Println("接口调用失败:", err)
  868. return 0, err.Error(), result.Response, string(request), ""
  869. }
  870. // 解析 JSON 响应
  871. err2 := json.Unmarshal([]byte(response), &result)
  872. if err2 != nil {
  873. fmt.Println("解析响应失败:", err2)
  874. return 0, err.Error(), result.Response, string(request), ""
  875. }
  876. // 判断接口是否成功调用
  877. if result.Success {
  878. return 1, "红冲成功", result.Response, string(request), response
  879. } else {
  880. return 0, result.ErrorResponse.Message + "\n" + result.ErrorResponse.SubMessage, result.Response, string(request), response
  881. }
  882. } else { //获取token失败
  883. return 0, "获取token失败", result.Response, string(request), ""
  884. }
  885. }
  886. }
  887. func BWBanShi(config models.FapiaoConfig, invoiceNo string) (int64, string, bwfapiao.BanShiResponse) {
  888. var result bwfapiao.BanShiResponse
  889. redisClient := service.RedisClient()
  890. defer redisClient.Close()
  891. fapiao_access_token, _ := redisClient.Get("fapiao_access_token").Result()
  892. // 示例数据
  893. params := map[string]string{
  894. "method": "baiwang.output.format.create",
  895. "version": "6.0",
  896. "appKey": "10059482",
  897. "format": "json",
  898. "timestamp": strconv.FormatInt(time.Now().Unix(), 10),
  899. "token": fapiao_access_token,
  900. "type": "sync",
  901. }
  902. secret := "bb481e0c-9895-44d8-b184-6b9707a60ec7"
  903. data := make(map[string]interface{})
  904. data["pushType"] = ""
  905. data["invoiceIssueMode"] = "1"
  906. data["invoiceCode"] = ""
  907. data["invoiceNo"] = invoiceNo
  908. data["einvoiceNo"] = invoiceNo
  909. data["serialNo"] = ""
  910. data["phone"] = ""
  911. data["email"] = ""
  912. data["emailCarbonCopy"] = ""
  913. requestBody2 := map[string]interface{}{
  914. "taxNo": config.TerminalCode,
  915. "data": data,
  916. }
  917. // 生成签名
  918. sign, err := signTopRequestTwo(params, secret, requestBody2)
  919. if err != nil {
  920. fmt.Println("Error:", err)
  921. return 0, err.Error(), result
  922. }
  923. params["sign"] = sign
  924. if len(fapiao_access_token) > 0 { //token 存在则进行签名处理
  925. // 调用 API
  926. response, err := callApiTwo("https://openapi.baiwang.com/router/rest", params, requestBody2)
  927. if err != nil {
  928. fmt.Println("接口调用失败:", err)
  929. return 0, err.Error(), result
  930. }
  931. // 解析 JSON 响应
  932. err2 := json.Unmarshal([]byte(response), &result)
  933. if err2 != nil {
  934. fmt.Println("解析响应失败:", err2)
  935. return 0, err2.Error(), result
  936. }
  937. // 判断接口是否成功调用
  938. if result.Success {
  939. return 1, "", result
  940. } else {
  941. return 0, "", result
  942. }
  943. } else { //token 不存在,则进行获取token的操作
  944. tokenResp, _ := GetAccessToken("https://openapi.baiwang.com/router/rest", "b033l65qAA", "cc73223bd14a4064bb0fe9ba642da58f", "10059482", "bb481e0c-9895-44d8-b184-6b9707a60ec7", "admin_ffzyx16zmybx4", "")
  945. if len(tokenResp.Response.AccessToken) > 0 { //token请求成功,则将token和有效时间存储进redis,
  946. redisClient.Set("fapiao_access_token", tokenResp.Response.AccessToken, time.Duration(tokenResp.Response.ExpiresIn)*time.Second)
  947. params["token"] = tokenResp.Response.AccessToken
  948. // 生成签名
  949. sign, err = signTopRequestTwo(params, secret, requestBody2)
  950. if err != nil {
  951. fmt.Println("Error:", err)
  952. return 0, err.Error(), result
  953. }
  954. params["sign"] = sign
  955. // 调用 API
  956. response, err := callApiTwo("https://openapi.baiwang.com/router/rest", params, requestBody2)
  957. if err != nil {
  958. fmt.Println("接口调用失败:", err)
  959. return 0, err.Error(), result
  960. }
  961. // 解析 JSON 响应
  962. var result bwfapiao.BanShiResponse
  963. err2 := json.Unmarshal([]byte(response), &result)
  964. if err2 != nil {
  965. fmt.Println("解析响应失败:", err2)
  966. return 0, err2.Error(), result
  967. }
  968. // 判断接口是否成功调用
  969. if result.Success {
  970. return 1, "", result
  971. } else {
  972. return 0, result.ErrorResponse.Message + "\n" + result.ErrorResponse.SubMessage, result
  973. }
  974. } else { //获取token失败
  975. return 0, "获取token失败", result
  976. }
  977. }
  978. }
  979. // 百望云发票红字确认单操作
  980. func BWRedOperate(config models.FapiaoConfig, uuid string, no string) (int64, string) {
  981. redisClient := service.RedisClient()
  982. defer redisClient.Close()
  983. fapiao_access_token, _ := redisClient.Get("fapiao_access_token").Result()
  984. // 示例数据
  985. params := map[string]string{
  986. "method": "baiwang.output.redinvoice.operate",
  987. "version": "6.0",
  988. "appKey": "10059482",
  989. "format": "json",
  990. "timestamp": strconv.FormatInt(time.Now().Unix(), 10),
  991. "token": fapiao_access_token,
  992. "type": "sync",
  993. }
  994. secret := "bb481e0c-9895-44d8-b184-6b9707a60ec7"
  995. requestBody2 := map[string]interface{}{
  996. "taxNo": config.TerminalCode,
  997. "taxUserName": "",
  998. "sellerTaxNo": config.TerminalCode,
  999. "redConfirmUuid": uuid,
  1000. "redConfirmNo": no,
  1001. "confirmType": "01",
  1002. }
  1003. // 生成签名
  1004. sign, err := signTopRequestTwo(params, secret, requestBody2)
  1005. if err != nil {
  1006. fmt.Println("Error:", err)
  1007. return 0, err.Error()
  1008. }
  1009. params["sign"] = sign
  1010. if len(fapiao_access_token) > 0 { //token 存在则进行签名处理
  1011. // 调用 API
  1012. response, err := callApiTwo("https://openapi.baiwang.com/router/rest", params, requestBody2)
  1013. if err != nil {
  1014. fmt.Println("接口调用失败:", err)
  1015. return 0, err.Error()
  1016. }
  1017. // 解析 JSON 响应
  1018. var result bwfapiao.RedOperaResponse
  1019. err2 := json.Unmarshal([]byte(response), &result)
  1020. if err2 != nil {
  1021. fmt.Println("解析响应失败:", err2)
  1022. return 0, err2.Error()
  1023. }
  1024. // 判断接口是否成功调用
  1025. if result.Success {
  1026. return 1, ""
  1027. } else {
  1028. return 0, ""
  1029. }
  1030. } else { //token 不存在,则进行获取token的操作
  1031. tokenResp, _ := GetAccessToken("https://openapi.baiwang.com/router/rest", "b033l65qAA", "cc73223bd14a4064bb0fe9ba642da58f", "10059482", "bb481e0c-9895-44d8-b184-6b9707a60ec7", "admin_ffzyx16zmybx4", "")
  1032. if len(tokenResp.Response.AccessToken) > 0 { //token请求成功,则将token和有效时间存储进redis,
  1033. redisClient.Set("fapiao_access_token", tokenResp.Response.AccessToken, time.Duration(tokenResp.Response.ExpiresIn)*time.Second)
  1034. params["token"] = tokenResp.Response.AccessToken
  1035. // 生成签名
  1036. sign, err = signTopRequestTwo(params, secret, requestBody2)
  1037. if err != nil {
  1038. fmt.Println("Error:", err)
  1039. return 0, err.Error()
  1040. }
  1041. params["sign"] = sign
  1042. // 调用 API
  1043. response, err := callApiTwo("https://openapi.baiwang.com/router/rest", params, requestBody2)
  1044. if err != nil {
  1045. fmt.Println("接口调用失败:", err)
  1046. return 0, err.Error()
  1047. }
  1048. // 解析 JSON 响应
  1049. var result bwfapiao.RedOperaResponse
  1050. err2 := json.Unmarshal([]byte(response), &result)
  1051. if err2 != nil {
  1052. fmt.Println("解析响应失败:", err2)
  1053. return 0, err2.Error()
  1054. }
  1055. // 判断接口是否成功调用
  1056. if result.Success {
  1057. return 1, ""
  1058. } else {
  1059. return 0, result.ErrorResponse.Message + "\n" + result.ErrorResponse.SubMessage
  1060. }
  1061. } else { //获取token失败
  1062. return 0, "获取token失败"
  1063. }
  1064. }
  1065. }
  1066. // 百望云发票查询开票信息版本
  1067. func QueryBWInvoiceInfoTwo(config models.FapiaoConfig, orders models.HisFaPiaoOrder) {
  1068. redisClient := service.RedisClient()
  1069. defer redisClient.Close()
  1070. fapiao_access_token, _ := redisClient.Get("fapiao_access_token").Result()
  1071. // 示例数据
  1072. params := map[string]string{
  1073. "method": "baiwang.output.einvoice.query",
  1074. "version": "6.0",
  1075. "appKey": "10059482",
  1076. "format": "json",
  1077. "timestamp": strconv.FormatInt(time.Now().Unix(), 10),
  1078. "token": fapiao_access_token,
  1079. "type": "sync",
  1080. }
  1081. secret := "bb481e0c-9895-44d8-b184-6b9707a60ec7"
  1082. requestBody2 := map[string]interface{}{
  1083. "taxNo": config.TerminalCode,
  1084. "queryAll": false,
  1085. }
  1086. subData := make(map[string]interface{})
  1087. subData["queryAll"] = "true"
  1088. subData["serialNo"] = orders.OrderSn
  1089. subData["invoiceCode"] = ""
  1090. subData["invoiceNo"] = orders.TicketSn
  1091. subData["invoiceTypeCode"] = ""
  1092. subData["invoiceTerminalCode"] = ""
  1093. subData["sourceMark"] = ""
  1094. subData["invoiceSpecialMark"] = ""
  1095. subData["buyerTaxNo"] = ""
  1096. subData["buyerName"] = ""
  1097. subData["printStatus"] = ""
  1098. subData["invoiceStatus"] = "00"
  1099. subData["invoiceType"] = ""
  1100. subData["invoiceStartDate"] = ""
  1101. subData["expressNo"] = ""
  1102. subData["expressNo"] = ""
  1103. subData["contractNo"] = ""
  1104. subData["orderNo"] = ""
  1105. requestBody2["data"] = subData
  1106. // 生成签名
  1107. sign, err := signTopRequestTwo(params, secret, requestBody2)
  1108. if err != nil {
  1109. fmt.Println("Error:", err)
  1110. return
  1111. }
  1112. params["sign"] = sign
  1113. if len(fapiao_access_token) > 0 { //token 存在则进行签名处理
  1114. // 调用 API
  1115. response, err := callApiTwo("https://openapi.baiwang.com/router/rest", params, requestBody2)
  1116. if err != nil {
  1117. fmt.Println("接口调用失败:", err)
  1118. return
  1119. }
  1120. // 解析 JSON 响应
  1121. var result bwfapiao.UnifiedLoginResponse
  1122. err2 := json.Unmarshal([]byte(response), &result)
  1123. if err2 != nil {
  1124. fmt.Println("解析响应失败:", err2)
  1125. return
  1126. }
  1127. // 判断接口是否成功调用
  1128. if result.Success {
  1129. } else {
  1130. }
  1131. } else { //token 不存在,则进行获取token的操作
  1132. tokenResp, _ := GetAccessToken("https://openapi.baiwang.com/router/rest", "b033l65qAA", "cc73223bd14a4064bb0fe9ba642da58f", "10059482", "bb481e0c-9895-44d8-b184-6b9707a60ec7", "admin_ffzyx16zmybx4", "")
  1133. if len(tokenResp.Response.AccessToken) > 0 { //token请求成功,则将token和有效时间存储进redis,
  1134. redisClient.Set("fapiao_access_token", tokenResp.Response.AccessToken, time.Duration(tokenResp.Response.ExpiresIn)*time.Second)
  1135. params["token"] = tokenResp.Response.AccessToken
  1136. // 生成签名
  1137. sign, err = signTopRequestTwo(params, secret, requestBody2)
  1138. if err != nil {
  1139. fmt.Println("Error:", err)
  1140. return
  1141. }
  1142. params["sign"] = sign
  1143. // 调用 API
  1144. response, err := callApiTwo("https://openapi.baiwang.com/router/rest", params, requestBody2)
  1145. if err != nil {
  1146. fmt.Println("接口调用失败:", err)
  1147. return
  1148. }
  1149. // 解析 JSON 响应
  1150. var result bwfapiao.UnifiedLoginResponse
  1151. err2 := json.Unmarshal([]byte(response), &result)
  1152. if err2 != nil {
  1153. fmt.Println("解析响应失败:", err2)
  1154. return
  1155. }
  1156. // 判断接口是否成功调用
  1157. if result.Success {
  1158. } else {
  1159. }
  1160. } else { //获取token失败
  1161. }
  1162. }
  1163. }
  1164. func callApiTwo(url string, params map[string]string, body map[string]interface{}) (string, error) {
  1165. // 拼接 URL 查询参数
  1166. queryParams := make([]string, 0, len(params))
  1167. for k, v := range params {
  1168. queryParams = append(queryParams, fmt.Sprintf("%s=%s", k, v))
  1169. }
  1170. fullUrl := fmt.Sprintf("%s?%s", url, strings.Join(queryParams, "&"))
  1171. // 序列化请求体
  1172. bodyBytes, err := json.Marshal(body)
  1173. if err != nil {
  1174. return "", errors.New("请求体序列化失败: " + err.Error())
  1175. }
  1176. // 创建 HTTP 请求
  1177. req, err := http.NewRequest("POST", fullUrl, bytes.NewBuffer(bodyBytes))
  1178. if err != nil {
  1179. return "", errors.New("创建请求失败: " + err.Error())
  1180. }
  1181. req.Header.Set("Content-Type", "application/json")
  1182. // 发送请求
  1183. client := &http.Client{}
  1184. resp, err := client.Do(req)
  1185. if err != nil {
  1186. return "", errors.New("发送请求失败: " + err.Error())
  1187. }
  1188. defer resp.Body.Close()
  1189. // 读取响应
  1190. respBytes, err := ioutil.ReadAll(resp.Body)
  1191. if err != nil {
  1192. return "", errors.New("读取响应失败: " + err.Error())
  1193. }
  1194. fmt.Println(string(respBytes))
  1195. saveLog(string(respBytes), string(bodyBytes), "开票日志", "开票日志", "百望云")
  1196. return string(respBytes), nil
  1197. }
  1198. // AuthResponse 结构体,用于解析返回的 JSON 数据
  1199. type AuthResponse struct {
  1200. Response struct {
  1201. AccessToken string `json:"access_token"`
  1202. TokenType string `json:"token_type"`
  1203. ExpiresIn int `json:"expires_in"`
  1204. Scope string `json:"scope"`
  1205. } `json:"response"`
  1206. }
  1207. // GetAccessToken 获取登录授权的 access_token
  1208. func GetAccessToken(apiURL, plainPassword, salt, clientID, clientSecret, username, orgAuthCode string) (AuthResponse, error) {
  1209. // 当前时间戳(毫秒级)
  1210. timestamp := ""
  1211. // 密码加密:MD5 + SHA1
  1212. encryptedPassword := md5AndSha1(plainPassword + salt)
  1213. //"version": "6.0",
  1214. // "timestamp": timestamp,
  1215. //"method": "baiwang.oauth.token",
  1216. // "grant_type": "password",
  1217. //"client_id": clientID,
  1218. // 构造请求体
  1219. authReq := map[string]interface{}{
  1220. "client_secret": clientSecret,
  1221. "username": username,
  1222. "password": encryptedPassword,
  1223. "orgAuthCode": orgAuthCode,
  1224. }
  1225. var aa AuthResponse
  1226. // 转换为 JSON
  1227. reqBody, err := json.Marshal(authReq)
  1228. if err != nil {
  1229. return aa, fmt.Errorf("failed to marshal request: %v", err)
  1230. }
  1231. // 发送 POST 请求
  1232. resp, err := http.Post(apiURL+"?"+"version="+"6.0"+"&method="+"baiwang.oauth.token"+"&grant_type="+"password"+"&client_id="+clientID+"&timestamp="+timestamp, "application/json", bytes.NewBuffer(reqBody))
  1233. if err != nil {
  1234. return aa, fmt.Errorf("failed to make request: %v", err)
  1235. }
  1236. defer resp.Body.Close()
  1237. // 读取响应
  1238. body, err := ioutil.ReadAll(resp.Body)
  1239. if err != nil {
  1240. return aa, fmt.Errorf("failed to read response: %v", err)
  1241. }
  1242. // 检查响应状态码
  1243. if resp.StatusCode != http.StatusOK {
  1244. return aa, fmt.Errorf("request failed with status: %d, response: %s", resp.StatusCode, string(body))
  1245. }
  1246. // 解析响应 JSON
  1247. var authResp AuthResponse
  1248. err = json.Unmarshal(body, &authResp)
  1249. if err != nil {
  1250. return aa, fmt.Errorf("failed to parse response: %v", err)
  1251. }
  1252. fmt.Println(authReq)
  1253. fmt.Println(apiURL + "?" + "version=" + "6.0" + "&method=" + "baiwang.oauth.token" + "&grant_type=" + "password" + "&client_id=" + clientID + "&timestamp=" + timestamp)
  1254. fmt.Println(string(body))
  1255. fmt.Println(authResp)
  1256. aa = authResp
  1257. fmt.Println(aa)
  1258. // 返回 Access Token
  1259. return aa, nil
  1260. }
  1261. // md5AndSha1: MD5 + SHA-1 加密函数
  1262. func md5AndSha1(input string) string {
  1263. return sha1Hash(md5Hash(input))
  1264. }
  1265. // md5Hash: MD5 加密
  1266. func md5Hash(input string) string {
  1267. hash := md5.New()
  1268. hash.Write([]byte(input))
  1269. return hex.EncodeToString(hash.Sum(nil))
  1270. }
  1271. // sha1Hash: SHA-1 加密
  1272. func sha1Hash(input string) string {
  1273. hash := sha1.New()
  1274. hash.Write([]byte(input))
  1275. return hex.EncodeToString(hash.Sum(nil))
  1276. }
  1277. func (c *FapiaoApiController) QueryFaPiao() {
  1278. id, _ := c.GetInt64("id")
  1279. oc, _ := service.GetFaPiaoOrderById(id)
  1280. sdk := invoice.NewSdk(common.HMAC_SHA256, "5058f0defd12047ee2a7", "51440fbee667ea9a53aaa68c9c408367", "", "")
  1281. var config models.FapiaoConfig
  1282. config, _ = service.FindFaPiaoConfigInfo(c.GetAdminUserInfo().CurrentOrgId)
  1283. routerAddress2, postData2 := fapiao.Query(config.SellerTaxpayerNum, oc.OrderSn, "")
  1284. r3, err2 := sdk.HttpPost("https://apigw.goldentec.com", routerAddress2, postData2)
  1285. fmt.Println("query")
  1286. fmt.Println(string(r3))
  1287. if err2 != nil {
  1288. fmt.Println(err2)
  1289. } else {
  1290. var resp3 QueryFaPiaoResultResponse
  1291. // 将 byte 切片转换为结构体
  1292. json.Unmarshal(r3, &resp3)
  1293. if resp3.Code == 0 {
  1294. //var fapiaos models.HisFaPiaoOrder
  1295. if resp3.Data.Status == 3 {
  1296. // 异步调用查询操作,不阻塞主程序
  1297. oc.TicketSn = resp3.Data.TicketSn
  1298. oc.TicketDate = resp3.Data.TicketDate
  1299. oc.AmountWithTax = resp3.Data.AmountWithoutTax
  1300. oc.AmountWithoutTax = resp3.Data.AmountWithoutTax
  1301. oc.FapiaoStatus = "2"
  1302. oc.TaxAmount = resp3.Data.TaxAmount
  1303. oc.IsRedWashed = strconv.FormatInt(int64(resp3.Data.IsRedWashed), 10)
  1304. oc.PdfUrl = resp3.Data.PdfUrl
  1305. oc.OfdUrl = resp3.Data.OfdUrl
  1306. oc.XmlUrl = resp3.Data.XmlUrl
  1307. service.SaveFaPiaoOrder(&oc)
  1308. ids := strings.Split(oc.OrderIds, ",")
  1309. service.UpdateFaPiaoNumber(resp3.Data.TicketSn, ids) //同步发票号码
  1310. c.ServeSuccessJSON(map[string]interface{}{
  1311. "msg": "同步成功",
  1312. })
  1313. } else if resp3.Data.Status == 1 {
  1314. oc.FapiaoStatus = "1"
  1315. oc.TicketSn = ""
  1316. service.SaveFaPiaoOrder(&oc)
  1317. c.ServeSuccessJSON(map[string]interface{}{
  1318. "msg": "同步成功",
  1319. })
  1320. //service.UpdateFaPiaoNumber(resp3.Data.TicketSn, ids) //同步发票号码
  1321. } else if resp3.Data.Status == 2 {
  1322. oc.FapiaoStatus = "3"
  1323. oc.TicketSn = ""
  1324. oc.Message = resp3.Data.Message
  1325. service.SaveFaPiaoOrder(&oc)
  1326. c.ServeSuccessJSON(map[string]interface{}{
  1327. "msg": "同步成功",
  1328. })
  1329. } else {
  1330. oc.FapiaoStatus = "3"
  1331. oc.TicketSn = ""
  1332. oc.Message = resp3.Data.Message
  1333. service.SaveFaPiaoOrder(&oc)
  1334. c.ServeSuccessJSON(map[string]interface{}{
  1335. "msg": "同步成功",
  1336. })
  1337. }
  1338. } else {
  1339. //错误处理
  1340. c.ServeSuccessJSON(map[string]interface{}{
  1341. "msg": "查询失败" + resp3.Message,
  1342. })
  1343. }
  1344. //if resp3.Code == 0 {
  1345. // // 异步调用查询操作,不阻塞主程序
  1346. // oc.TicketSn = resp3.Data.TicketSn
  1347. // oc.TicketDate = resp3.Data.TicketDate
  1348. // oc.AmountWithTax = resp3.Data.AmountWithoutTax
  1349. // oc.AmountWithoutTax = resp3.Data.AmountWithoutTax
  1350. // oc.FapiaoStatus = "2"
  1351. // oc.TaxAmount = resp3.Data.TaxAmount
  1352. // oc.IsRedWashed = strconv.FormatInt(int64(resp3.Data.IsRedWashed), 10)
  1353. // oc.PdfUrl = resp3.Data.PdfUrl
  1354. // oc.OfdUrl = resp3.Data.OfdUrl
  1355. // oc.XmlUrl = resp3.Data.XmlUrl
  1356. // service.SaveFaPiaoOrder(oc)
  1357. // ids := strings.Split(oc.OrderIds, ",")
  1358. // service.UpdateFaPiaoNumber(resp3.Data.TicketSn, ids) //同步发票号码
  1359. // c.ServeSuccessJSON(map[string]interface{}{
  1360. // "msg": "查询成功",
  1361. // })
  1362. //} else {
  1363. // //错误处理
  1364. // c.ServeSuccessJSON(map[string]interface{}{
  1365. // "msg": "查询失败" + resp3.Message,
  1366. // })
  1367. //}
  1368. }
  1369. }
  1370. func (c *HisApiController) GetNewFaPiaoData() {
  1371. order_ids := c.GetString("order_ids")
  1372. patient_id, _ := c.GetInt64("patient_id")
  1373. //number := c.GetString("number")
  1374. adminUser := c.GetAdminUserInfo()
  1375. orders := strings.Split(order_ids, ",")
  1376. patient, _ := service.GetFaPiaoPatientByID(adminUser.CurrentOrgId, patient_id)
  1377. var bedCostTotal float64 = 0 //床位总费
  1378. var bedCostSelfTotal float64 = 0 //床位自费
  1379. var bedCostPartSelfTotal float64 = 0 //床位部分项目自费
  1380. var operationCostTotal float64 = 0 //手术费
  1381. var operationCostSelfTotal float64 = 0 //手术费
  1382. var operationCostPartSelfTotal float64 = 0 //手术费
  1383. var otherCostTotal float64 = 0 //其他费用
  1384. var otherCostSelfTotal float64 = 0 //其他费用
  1385. var otherCostPartSelfTotal float64 = 0 //其他费用
  1386. var materialCostTotal float64 = 0 //材料费
  1387. var materialCostSelfTotal float64 = 0 //材料费
  1388. var materialCostPartSelfTotal float64 = 0 //材料费
  1389. var westernMedicineCostTotal float64 = 0 //西药费
  1390. var westernMedicineCostSelfTotal float64 = 0 //西药费
  1391. var westernMedicineCostPartSelfTotal float64 = 0 //西药费
  1392. var chineseTraditionalMedicineCostTotal float64 = 0 //中成药
  1393. var chineseTraditionalMedicineCostSelfTotal float64 = 0 //中成药
  1394. var chineseTraditionalMedicineCostPartSelfTotal float64 = 0 //中成药
  1395. var checkCostTotal float64 = 0 //检查费
  1396. var checkCostSelfTotal float64 = 0 //检查费
  1397. var checkCostPartSelfTotal float64 = 0 //检查费
  1398. var hiliCostTotal float64 = 0 //护理费
  1399. var hiliCostSelfTotal float64 = 0 //护理费
  1400. //var hiliCostPartSelfTotal float64 = 0 //护理费
  1401. var laboratoryCostTotal float64 = 0 //化验费
  1402. var laboratoryCostSelfTotal float64 = 0 //化验费
  1403. var laboratoryCostPartSelfTotal float64 = 0 //化验费
  1404. var treatCostTotal float64 = 0 //治疗费用
  1405. var treatCostSelfTotal float64 = 0 //治疗费用
  1406. var treatCostPartSelfTotal float64 = 0 //治疗费用
  1407. var zhenChaCostTotal float64 = 0 //其他费用
  1408. var zhenChaCostSelfTotal float64 = 0 //其他费用
  1409. var zhenChaCostPartSelfTotal float64 = 0 //其他费用
  1410. decimal.DivisionPrecision = 2
  1411. var MedfeeSumamt float64 = 0 //治疗费用
  1412. var PsnCashPay float64 = 0 //治疗费用
  1413. var FundPaySumamt float64 = 0 //治疗费用
  1414. var HifpPay float64 = 0 //治疗费用
  1415. var MafPay float64 = 0 //治疗费用
  1416. var AcctPay float64 = 0 //治疗费用
  1417. for _, item := range orders {
  1418. var new_order models.HisOrder
  1419. order_id_num, _ := strconv.ParseInt(item, 10, 64)
  1420. new_order, _ = service.GetHisOrderByID(order_id_num)
  1421. MedfeeSumamt, _ = decimal.NewFromFloat(MedfeeSumamt).Add(decimal.NewFromFloat(new_order.MedfeeSumamt)).Float64()
  1422. PsnCashPay, _ = decimal.NewFromFloat(PsnCashPay).Add(decimal.NewFromFloat(new_order.PsnCashPay)).Float64()
  1423. FundPaySumamt, _ = decimal.NewFromFloat(FundPaySumamt).Add(decimal.NewFromFloat(new_order.FundPaySumamt)).Float64()
  1424. HifpPay, _ = decimal.NewFromFloat(HifpPay).Add(decimal.NewFromFloat(new_order.HifpPay)).Float64()
  1425. MafPay, _ = decimal.NewFromFloat(MafPay).Add(decimal.NewFromFloat(new_order.MafPay)).Float64()
  1426. AcctPay, _ = decimal.NewFromFloat(AcctPay).Add(decimal.NewFromFloat(new_order.AcctPay)).Float64()
  1427. orderInfos_two, _ := service.GetHisOrderDetailByNumber(new_order.Number, adminUser.CurrentOrgId)
  1428. var balanceAccountsType int64
  1429. if new_order.IsMedicineInsurance == 1 {
  1430. balanceAccountsType = 1
  1431. } else {
  1432. balanceAccountsType = 2
  1433. }
  1434. if balanceAccountsType == 2 {
  1435. //orderInfos_two, _ := service.GetHisOrderDetailByNumber(order.Number, adminUser.CurrentOrgId)
  1436. for _, item := range orderInfos_two {
  1437. item.FulamtOwnpayAmt = item.DetItemFeeSumamt
  1438. if item.HisDoctorAdviceInfo.ID > 0 && item.HisPrescriptionProject.ID == 0 { //药品
  1439. item.MedChrgitmType = "09"
  1440. }
  1441. if item.HisPrescriptionProject.ID > 0 && item.HisDoctorAdviceInfo.ID == 0 {
  1442. if item.HisPrescriptionProject.Type == 2 {
  1443. switch item.HisPrescriptionProject.VMHisProject.CostClassify {
  1444. case 1:
  1445. item.MedChrgitmType = "14"
  1446. break
  1447. case 2:
  1448. item.MedChrgitmType = "05"
  1449. break
  1450. case 3:
  1451. item.MedChrgitmType = "04"
  1452. break
  1453. case 4:
  1454. item.MedChrgitmType = "03"
  1455. break
  1456. case 5:
  1457. item.MedChrgitmType = "08"
  1458. break
  1459. case 6:
  1460. item.MedChrgitmType = "14"
  1461. break
  1462. case 7:
  1463. item.MedChrgitmType = "14"
  1464. break
  1465. case 8:
  1466. item.MedChrgitmType = "03"
  1467. break
  1468. case 9:
  1469. item.MedChrgitmType = "14"
  1470. break
  1471. }
  1472. } else if item.HisPrescriptionProject.Type == 3 {
  1473. item.MedChrgitmType = "08"
  1474. }
  1475. }
  1476. }
  1477. for _, item := range orderInfos_two {
  1478. fmt.Println(item.MedChrgitmType)
  1479. if item.MedChrgitmType == "07" { //床位费
  1480. hiliCostTotal, _ = decimal.NewFromFloat(hiliCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1481. hiliCostSelfTotal = hiliCostTotal
  1482. }
  1483. if item.MedChrgitmType == "01" { //床位费
  1484. bedCostTotal, _ = decimal.NewFromFloat(bedCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1485. bedCostSelfTotal = bedCostTotal
  1486. }
  1487. if item.MedChrgitmType == "02" { //诊察费
  1488. zhenChaCostTotal, _ = decimal.NewFromFloat(zhenChaCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1489. zhenChaCostSelfTotal = zhenChaCostTotal
  1490. }
  1491. if item.MedChrgitmType == "03" { //检查费
  1492. checkCostTotal, _ = decimal.NewFromFloat(checkCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1493. checkCostSelfTotal = checkCostTotal
  1494. }
  1495. if item.MedChrgitmType == "04" { //化验费
  1496. laboratoryCostTotal, _ = decimal.NewFromFloat(laboratoryCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1497. laboratoryCostSelfTotal = laboratoryCostTotal
  1498. }
  1499. if item.MedChrgitmType == "05" || item.MedChrgitmType == "14" || item.MedChrgitmType == "201" { //治疗费
  1500. treatCostTotal, _ = decimal.NewFromFloat(treatCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1501. treatCostSelfTotal = treatCostTotal
  1502. }
  1503. if item.MedChrgitmType == "06" { //手术费
  1504. treatCostTotal, _ = decimal.NewFromFloat(operationCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1505. operationCostSelfTotal = treatCostTotal
  1506. }
  1507. if item.MedChrgitmType == "08" || item.MedChrgitmType == "1402" || item.MedChrgitmType == "1403" || item.MedChrgitmType == "1401" || item.MedChrgitmType == "301" { //材料费
  1508. materialCostTotal, _ = decimal.NewFromFloat(materialCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1509. materialCostSelfTotal = materialCostTotal
  1510. }
  1511. if item.MedChrgitmType == "09" || item.MedChrgitmType == "101" { //西药费
  1512. westernMedicineCostTotal, _ = decimal.NewFromFloat(westernMedicineCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1513. westernMedicineCostSelfTotal = westernMedicineCostTotal
  1514. }
  1515. if item.MedChrgitmType == "11" { //中成费
  1516. chineseTraditionalMedicineCostTotal, _ = decimal.NewFromFloat(chineseTraditionalMedicineCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1517. chineseTraditionalMedicineCostSelfTotal = chineseTraditionalMedicineCostTotal
  1518. }
  1519. if c.GetAdminUserInfo().CurrentOrgId == 10106 {
  1520. if item.MedChrgitmType == "0" || item.MedChrgitmType == "12" || item.MedChrgitmType == "02" { //其他费
  1521. otherCostTotal, _ = decimal.NewFromFloat(otherCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1522. otherCostSelfTotal = otherCostTotal
  1523. }
  1524. } else {
  1525. if item.MedChrgitmType == "0" || item.MedChrgitmType == "12" { //其他费
  1526. otherCostTotal, _ = decimal.NewFromFloat(otherCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1527. otherCostSelfTotal = otherCostTotal
  1528. }
  1529. }
  1530. }
  1531. } else {
  1532. for _, item := range orderInfos_two {
  1533. if item.MedChrgitmType == "01" { //床位费
  1534. bedCostTotal, _ = decimal.NewFromFloat(bedCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1535. //bedCostSelfTotal, _ = decimal.NewFromFloat(bedCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  1536. //bedCostPartSelfTotal, _ = decimal.NewFromFloat(bedCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  1537. }
  1538. if item.MedChrgitmType == "02" { //诊察费
  1539. zhenChaCostTotal, _ = decimal.NewFromFloat(zhenChaCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1540. //zhenChaCostSelfTotal, _ = decimal.NewFromFloat(zhenChaCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  1541. //zhenChaCostPartSelfTotal, _ = decimal.NewFromFloat(zhenChaCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  1542. }
  1543. if c.GetAdminUserInfo().CurrentOrgId == 10188 || c.GetAdminUserInfo().CurrentOrgId == 10217 {
  1544. if item.MedChrgitmType == "03" { //检查费
  1545. laboratoryCostTotal, _ = decimal.NewFromFloat(laboratoryCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1546. //laboratoryCostSelfTotal, _ = decimal.NewFromFloat(laboratoryCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  1547. //laboratoryCostPartSelfTotal, _ = decimal.NewFromFloat(laboratoryCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  1548. }
  1549. } else {
  1550. if item.MedChrgitmType == "03" { //检查费
  1551. checkCostTotal, _ = decimal.NewFromFloat(checkCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1552. //checkCostSelfTotal, _ = decimal.NewFromFloat(checkCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  1553. //checkCostPartSelfTotal, _ = decimal.NewFromFloat(checkCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  1554. }
  1555. }
  1556. if item.MedChrgitmType == "04" { //化验费
  1557. laboratoryCostTotal, _ = decimal.NewFromFloat(laboratoryCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1558. //laboratoryCostSelfTotal, _ = decimal.NewFromFloat(laboratoryCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  1559. //laboratoryCostPartSelfTotal, _ = decimal.NewFromFloat(laboratoryCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  1560. }
  1561. if item.MedChrgitmType == "05" || item.MedChrgitmType == "14" || item.MedChrgitmType == "201" { //治疗费
  1562. treatCostTotal, _ = decimal.NewFromFloat(treatCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1563. //treatCostSelfTotal, _ = decimal.NewFromFloat(treatCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  1564. //treatCostPartSelfTotal, _ = decimal.NewFromFloat(treatCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  1565. }
  1566. if item.MedChrgitmType == "06" { //手术费
  1567. operationCostTotal, _ = decimal.NewFromFloat(operationCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1568. //operationCostSelfTotal, _ = decimal.NewFromFloat(operationCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  1569. //operationCostPartSelfTotal, _ = decimal.NewFromFloat(operationCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  1570. }
  1571. if item.MedChrgitmType == "08" || item.MedChrgitmType == "1401" || item.MedChrgitmType == "1402" || item.MedChrgitmType == "1403" || item.MedChrgitmType == "301" { //材料费
  1572. materialCostTotal, _ = decimal.NewFromFloat(materialCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1573. //materialCostSelfTotal, _ = decimal.NewFromFloat(materialCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  1574. //materialCostPartSelfTotal, _ = decimal.NewFromFloat(materialCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  1575. }
  1576. if item.MedChrgitmType == "07" { //护理
  1577. hiliCostTotal, _ = decimal.NewFromFloat(hiliCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1578. //hiliCostSelfTotal, _ = decimal.NewFromFloat(hiliCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  1579. //hiliCostPartSelfTotal, _ = decimal.NewFromFloat(hiliCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  1580. }
  1581. if item.MedChrgitmType == "09" || item.MedChrgitmType == "101" { //西药费
  1582. westernMedicineCostTotal, _ = decimal.NewFromFloat(westernMedicineCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1583. //westernMedicineCostSelfTotal, _ = decimal.NewFromFloat(westernMedicineCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  1584. //westernMedicineCostPartSelfTotal, _ = decimal.NewFromFloat(westernMedicineCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  1585. }
  1586. if item.MedChrgitmType == "11" { //中成费
  1587. chineseTraditionalMedicineCostTotal, _ = decimal.NewFromFloat(chineseTraditionalMedicineCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1588. //chineseTraditionalMedicineCostSelfTotal, _ = decimal.NewFromFloat(chineseTraditionalMedicineCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  1589. //chineseTraditionalMedicineCostPartSelfTotal, _ = decimal.NewFromFloat(chineseTraditionalMedicineCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  1590. }
  1591. if item.MedChrgitmType == "0" || item.MedChrgitmType == "12" { //其他费
  1592. otherCostTotal, _ = decimal.NewFromFloat(otherCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  1593. //otherCostSelfTotal, _ = decimal.NewFromFloat(otherCostSelfTotal).Add(decimal.NewFromFloat(item.OverlmtAmt)).Float64()
  1594. //otherCostPartSelfTotal, _ = decimal.NewFromFloat(otherCostPartSelfTotal).Add(decimal.NewFromFloat(item.PreselfpayAmt)).Float64()
  1595. }
  1596. }
  1597. }
  1598. }
  1599. //pre_pay_money := service.GetUserMoney(order.PatientId, adminUser.CurrentOrgId)
  1600. //sum, _ := service.RefundListSum(adminUser.CurrentOrgId, startRecordDateTime, endRecordDateTime, order.PatientId)
  1601. admin, _ := service.GetAdminUserInfoByID(adminUser.CurrentOrgId, adminUser.AdminUser.Id)
  1602. charge_admin, _ := service.GetAdminUserInfoByID(adminUser.CurrentOrgId, adminUser.AdminUser.Id)
  1603. c.ServeSuccessJSON(map[string]interface{}{
  1604. "charge_admin_name": charge_admin.UserName,
  1605. "patient": patient,
  1606. "admin_user_name": admin.UserName, //收款员
  1607. "bedCostTotal": bedCostTotal,
  1608. "bedCostSelfTotal": bedCostSelfTotal,
  1609. "bedCostPartSelfTotal": bedCostPartSelfTotal,
  1610. "operationCostTotal": operationCostTotal,
  1611. "operationCostSelfTotal": operationCostSelfTotal,
  1612. "operationCostPartSelfTotal": operationCostPartSelfTotal,
  1613. "otherCostTotal": otherCostTotal,
  1614. "otherCostSelfTotal": otherCostSelfTotal,
  1615. "otherCostPartSelfTotal": otherCostPartSelfTotal,
  1616. "materialCostTotal": materialCostTotal,
  1617. "materialCostSelfTotal": materialCostSelfTotal,
  1618. "materialCostPartSelfTotal": materialCostPartSelfTotal,
  1619. "westernMedicineCostTotal": westernMedicineCostTotal,
  1620. "westernMedicineCostSelfTotal": westernMedicineCostSelfTotal,
  1621. "westernMedicineCostPartSelfTotal": westernMedicineCostPartSelfTotal,
  1622. "chineseTraditionalMedicineCostTotal": chineseTraditionalMedicineCostTotal,
  1623. "chineseTraditionalMedicineCostSelfTotal": chineseTraditionalMedicineCostSelfTotal,
  1624. "chineseTraditionalMedicineCostPartSelfTotal": chineseTraditionalMedicineCostPartSelfTotal,
  1625. "checkCostTotal": checkCostTotal,
  1626. "checkCostSelfTotal": checkCostSelfTotal,
  1627. "checkCostPartSelfTotal": checkCostPartSelfTotal,
  1628. "laboratoryCostTotal": laboratoryCostTotal,
  1629. "laboratoryCostSelfTotal": laboratoryCostSelfTotal,
  1630. "laboratoryCostPartSelfTotal": laboratoryCostPartSelfTotal,
  1631. "treatCostTotal": treatCostTotal,
  1632. "treatCostSelfTotal": treatCostSelfTotal,
  1633. "treatCostPartSelfTotal": treatCostPartSelfTotal,
  1634. "zhenChaCostTotal": zhenChaCostTotal,
  1635. "zhenChaCostSelfTotal": zhenChaCostSelfTotal,
  1636. "zhenChaCostPartSelfTotal": zhenChaCostPartSelfTotal,
  1637. "hiliCostTotal": hiliCostTotal,
  1638. "hiliCostSelfTotal": hiliCostSelfTotal,
  1639. "medfee_sumamt": MedfeeSumamt,
  1640. "fund_pay_sumamt": FundPaySumamt,
  1641. "hifp_pay": HifpPay,
  1642. "maf_pay": MafPay,
  1643. "acct_pay": AcctPay,
  1644. "psn_cash_pay": PsnCashPay,
  1645. })
  1646. }
  1647. type FapiaoApiController struct {
  1648. BaseAuthAPIController
  1649. }
  1650. type InvoiceRequest struct {
  1651. SellerName string `json:"seller_name,omitempty"` // 销方名称
  1652. SellerTaxpayerNum string `json:"seller_taxpayer_num"` // 销方纳税人识别号
  1653. SellerAddress string `json:"seller_address"` // 销方地址
  1654. SellerTel string `json:"seller_tel"` // 销方电话
  1655. SellerBankName string `json:"seller_bank_name"` // 销方银行名称
  1656. SellerBankAccount string `json:"seller_bank_account"` // 销方银行账号
  1657. TitleType int `json:"title_type"` // 抬头类型:1 个人、政府事业单位;2 企业
  1658. BuyerTitle string `json:"buyer_title"` // 购方名称
  1659. BuyerTaxpayerNum string `json:"buyer_taxpayer_num,omitempty"` // 购方纳税人识别号
  1660. BuyerAddress string `json:"buyer_address,omitempty"` // 购方地址
  1661. BuyerPhone string `json:"buyer_phone,omitempty"` // 购方电话
  1662. BuyerBankName string `json:"buyer_bank_name,omitempty"` // 购方银行名称
  1663. BuyerBankAccount string `json:"buyer_bank_account,omitempty"` // 购方银行账号
  1664. BuyerEmail string `json:"buyer_email,omitempty"` // 收票人邮箱
  1665. OrderID string `json:"order_id"` // 商户订单号
  1666. InvoiceTypeCode string `json:"invoice_type_code,omitempty"` // 开具发票类型
  1667. CallbackURL string `json:"callback_url"` // 发票结果回传地址
  1668. Drawer string `json:"drawer"` // 开票人姓名
  1669. Payee string `json:"payee,omitempty"` // 收款人姓名
  1670. Checker string `json:"checker,omitempty"` // 复核人姓名
  1671. TerminalCode string `json:"terminal_code"` // 税盘号
  1672. UserOpenID string `json:"user_openid,omitempty"` // 商家用户标识
  1673. SpecialInvoiceKind string `json:"special_invoice_kind,omitempty"` // 特殊票种标识
  1674. AmountHasTax string `json:"amount_has_tax"` // 含税总金额
  1675. TaxAmount string `json:"tax_amount"` // 总税额
  1676. AmountWithoutTax string `json:"amount_without_tax"` // 不含税总金额
  1677. Remark string `json:"remark,omitempty"` // 备注
  1678. StoreNo string `json:"store_no,omitempty"` // 门店编码
  1679. Template int `json:"template"` // 发票模板
  1680. Info *InvoiceInfo `json:"info,omitempty"` // 冠名票信息
  1681. TaxpayerConfirmation *TaxpayerConfirmation `json:"taxpayer_confirmation,omitempty"` // 纳税人确认信息
  1682. SpecificBusinessCode string `json:"specific_business_code,omitempty"` // 特定业务代码
  1683. RealStaticRent *RealStaticRent `json:"real_static_rent,omitempty"` // 不动产经营租赁信息
  1684. PassengerTransport []PassengerTransport `json:"passenger_transport,omitempty"` // 旅客运输信息
  1685. GoodsTransport []GoodsTransport `json:"goods_transport,omitempty"` // 货物运输信息
  1686. AgriculturalPurchase *AgriculturalPurchase `json:"agricultural_purchase,omitempty"` // 农产品收购信息
  1687. BuildingService *BuildingService `json:"building_service,omitempty"` // 建筑服务信息
  1688. RealStaticSales *RealStaticSales `json:"real_static_sales,omitempty"` // 不动产销售信息
  1689. TractorCombine *TractorCombine `json:"tractor_combine,omitempty"` // 拖拉机与联合收割机信息
  1690. UsedCarService *UsedCarService `json:"used_car_service,omitempty"` // 二手车服务信息
  1691. UsedCarSell *UsedCarSell `json:"used_car_sell,omitempty"` // 二手车销售信息
  1692. DeductionService *DeductionService `json:"deduction_service,omitempty"` // 差额征税信息
  1693. Items []Item `json:"items"` // 项目商品明细
  1694. }
  1695. type InvoiceInfo struct {
  1696. UseDate string `json:"use_date,omitempty"` // 入园日期
  1697. TicketName string `json:"ticket_name,omitempty"` // 票据名称
  1698. }
  1699. type TaxpayerConfirmation struct {
  1700. RenewableResourceRecyclingFlag int `json:"renewable_resource_recycling_flag,omitempty"` // 再生资源回收单位标志
  1701. DrawWithNoBuyerFlag int `json:"draw_with_nobuyer_flag,omitempty"` // 无购买方纳税人信息继续开票标志
  1702. NotDutyFreeReason string `json:"not_dutyfree_reason,omitempty"` // 放弃享受减按1%征收率原因
  1703. }
  1704. type RealStaticRent struct {
  1705. PropertyNum string `json:"property_num"` // 房屋产权证号
  1706. Location string `json:"location"` // 不动产地址 (省市区县)
  1707. AddressDetail string `json:"address_detail"` // 不动产详细地址
  1708. RentBeginDate string `json:"rent_begin_date"` // 租赁期起
  1709. RentEndDate string `json:"rent_end_date"` // 租赁期止
  1710. IntercityFlag string `json:"intercity_flag"` // 跨地市标志
  1711. UnitOfArea int `json:"unit_of_area"` // 面积单位
  1712. }
  1713. type PassengerTransport struct {
  1714. Traveler string `json:"traveler,omitempty"` // 出行人
  1715. IDType int `json:"id_type,omitempty"` // 证件类型
  1716. IDNumber string `json:"id_number,omitempty"` // 证件号码
  1717. TravelDate string `json:"travel_date,omitempty"` // 出行日期
  1718. DeparturePlace string `json:"departure_place,omitempty"` // 出发地
  1719. DestinationPlace string `json:"destination_palce,omitempty"` // 到达地
  1720. VehicleType int `json:"vehicle_type,omitempty"` // 交通工具类型
  1721. Level string `json:"level,omitempty"` // 等级
  1722. }
  1723. type GoodsTransport struct {
  1724. TransportNumber string `json:"transport_number,omitempty"` // 运输工具号牌
  1725. TransportKind string `json:"transport_kind,omitempty"` // 运输工具种类
  1726. GoodsName string `json:"goods_name,omitempty"` // 货物名称
  1727. DeparturePlace string `json:"departure_place,omitempty"` // 出发地
  1728. DestinationPlace string `json:"destination_place,omitempty"` // 到达地
  1729. }
  1730. type AgriculturalPurchase struct {
  1731. IDType string `json:"id_type,omitempty"` // 证件类型
  1732. }
  1733. type BuildingService struct {
  1734. Site string `json:"site"` // 建筑服务发生地
  1735. DetailSite string `json:"detail_site,omitempty"` // 详细地址
  1736. BuildingProject string `json:"building_project"` // 建筑项目名称
  1737. CrossSign string `json:"cross_sign"` // 跨地市标志
  1738. }
  1739. type RealStaticSales struct {
  1740. PropertyNum string `json:"property_num,omitempty"` // 房屋产权证书号
  1741. Location string `json:"location"` // 不动产地址
  1742. AddressDetail string `json:"address_detail,omitempty"` // 不动产详细地址
  1743. CrossSign string `json:"cross_sign"` // 跨市标志
  1744. UnitOfArea int `json:"unit_of_area"` // 面积单位
  1745. OnlineContractCode string `json:"online_contract_code,omitempty"` // 不动产单元代码/网签合同编码
  1746. }
  1747. type TractorCombine struct {
  1748. ChassisNumber string `json:"chassis_number,omitempty"` // 底盘号或机架号
  1749. EngineNumber string `json:"engine_number"` // 发动机号
  1750. IsRegister string `json:"is_register,omitempty"` // 是否用于拖拉机和联合收割机登记
  1751. }
  1752. type UsedCarService struct {
  1753. TicketSN string `json:"ticket_sn"` // 发票号码
  1754. PaperTicketCode string `json:"paper_ticket_code"` // 纸票发票代码
  1755. PaperTicketSN string `json:"paper_ticket_sn"` // 纸票发票号码
  1756. }
  1757. type UsedCarSell struct {
  1758. FrameNumber string `json:"frame_number"` // 车架号码
  1759. LicensePlateNumber string `json:"license_plate_number"` // 车牌号
  1760. BrandModel string `json:"brand_model"` // 厂牌型号
  1761. RegistrationCertificate string `json:"registration_certificate"` // 登记证号
  1762. TransferOfficeName string `json:"transfer_office_name"` // 转入地车辆管理所名称
  1763. NatureOfEnterprise string `json:"nature_of_enterprise"` // 企业性质
  1764. }
  1765. type DeductionService struct {
  1766. TaxDiffServiceFlag int `json:"tax_diff_service_flag,omitempty"` // 差额征税标识
  1767. TaxableServiceName string `json:"taxable_service_name,omitempty"` // 差额征税项目名称
  1768. }
  1769. type Item struct {
  1770. ItemName string `json:"item_name"` // 商品名称
  1771. ItemSpec string `json:"item_spec,omitempty"` // 商品规格
  1772. ItemUnit string `json:"item_unit"` // 商品单位
  1773. ItemQuantity float64 `json:"item_quantity"` // 商品数量
  1774. ItemPrice float64 `json:"item_price"` // 商品单价
  1775. ItemAmount float64 `json:"item_amount"` // 商品金额
  1776. ItemTaxRate float64 `json:"item_tax_rate"` // 商品税率
  1777. ItemTaxAmount float64 `json:"item_tax_amount"` // 商品税额
  1778. RowType int `json:"row_type"` // 行性质标志
  1779. }
  1780. func (c *FapiaoApiController) GetFaPiaoList() {
  1781. page, _ := c.GetInt64("page", -1)
  1782. limit, _ := c.GetInt64("limit", -1)
  1783. start_time := c.GetString("start_time")
  1784. end_time := c.GetString("end_time")
  1785. keywords := c.GetString("keywords")
  1786. timeLayout := "2006-01-02"
  1787. loc, _ := time.LoadLocation("Local")
  1788. var startTime int64
  1789. if len(start_time) > 0 {
  1790. theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
  1791. if err != nil {
  1792. //fmt.Println(err)
  1793. c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
  1794. return
  1795. }
  1796. startTime = theTime.Unix()
  1797. }
  1798. var endTime int64
  1799. if len(end_time) > 0 {
  1800. theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", end_time+" 23:59:59", loc)
  1801. if err != nil {
  1802. utils.ErrorLog(err.Error())
  1803. c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
  1804. return
  1805. }
  1806. endTime = theTime.Unix()
  1807. }
  1808. adminUser := c.GetAdminUserInfo()
  1809. org_id := adminUser.CurrentOrgId
  1810. order, err, total := service.GetFaPiaoList(org_id, page, limit, startTime, endTime, keywords)
  1811. if err == nil {
  1812. c.ServeSuccessJSON(map[string]interface{}{
  1813. "fapiao_record": order,
  1814. "total": total,
  1815. })
  1816. } else {
  1817. c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
  1818. return
  1819. }
  1820. }
  1821. func (c *FapiaoApiController) GetOrderFaPiaoList() {
  1822. page, _ := c.GetInt64("page", -1)
  1823. limit, _ := c.GetInt64("limit", -1)
  1824. start_time := c.GetString("start_time")
  1825. end_time := c.GetString("end_time")
  1826. is_open_fapiao, _ := c.GetInt64("is_open_fapiao", 0)
  1827. sort_type, _ := c.GetInt64("sort_type", 0)
  1828. keywords := c.GetString("keywords")
  1829. patient_id, _ := c.GetInt64("patient_id", 0)
  1830. timeLayout := "2006-01-02"
  1831. loc, _ := time.LoadLocation("Local")
  1832. var startTime int64
  1833. if len(start_time) > 0 {
  1834. theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", start_time+" 00:00:00", loc)
  1835. if err != nil {
  1836. //fmt.Println(err)
  1837. c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
  1838. return
  1839. }
  1840. startTime = theTime.Unix()
  1841. }
  1842. var endTime int64
  1843. if len(end_time) > 0 {
  1844. theTime, err := time.ParseInLocation(timeLayout+" 15:04:05", end_time+" 23:59:59", loc)
  1845. if err != nil {
  1846. utils.ErrorLog(err.Error())
  1847. c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeParamWrong)
  1848. return
  1849. }
  1850. endTime = theTime.Unix()
  1851. }
  1852. adminUser := c.GetAdminUserInfo()
  1853. org_id := adminUser.CurrentOrgId
  1854. order, err, total := service.GetFaPiaoSettleList(org_id, page, limit, startTime, endTime, sort_type, start_time, end_time, is_open_fapiao, patient_id, keywords)
  1855. if err == nil {
  1856. c.ServeSuccessJSON(map[string]interface{}{
  1857. "order": order,
  1858. "total": total,
  1859. })
  1860. } else {
  1861. c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeDataException)
  1862. return
  1863. }
  1864. }
  1865. func (c *FapiaoApiController) GetLoginUploadCode() {
  1866. sdk := invoice.NewSdk(common.HMAC_SHA256, "5058f0defd12047ee2a7", "51440fbee667ea9a53aaa68c9c408367", "", "test")
  1867. var config models.FapiaoConfig
  1868. config, _ = service.FindFaPiaoConfigInfo(c.GetAdminUserInfo().CurrentOrgId)
  1869. routerAddress, postData := fapiao.GetSMSCode(config) //发票开具
  1870. fmt.Println(routerAddress)
  1871. fmt.Println(postData)
  1872. r, err := sdk.HttpPost("https://apigw.goldentec.com", routerAddress, postData)
  1873. if err != nil {
  1874. fmt.Println(err)
  1875. } else {
  1876. var resp SmsCode
  1877. // 将 byte 切片转换为结构体
  1878. json.Unmarshal(r, &resp)
  1879. if resp.Code == 0 {
  1880. c.ServeSuccessJSON(map[string]interface{}{
  1881. "msg": resp.Message,
  1882. })
  1883. }
  1884. }
  1885. }
  1886. type SmsCode struct {
  1887. Code int `json:"code"`
  1888. Message string `json:"message"`
  1889. }
  1890. func (c *FapiaoApiController) Login() {
  1891. code := c.GetString("code")
  1892. var config models.FapiaoConfig
  1893. config, _ = service.FindFaPiaoConfigInfo(c.GetAdminUserInfo().CurrentOrgId)
  1894. sdk := invoice.NewSdk(common.HMAC_SHA256, "5058f0defd12047ee2a7", "51440fbee667ea9a53aaa68c9c408367", "", "test")
  1895. routerAddress, postData := fapiao.Login(code, config) //发票开具
  1896. r, err := sdk.HttpPost("https://apigw.goldentec.com", routerAddress, postData)
  1897. if err != nil {
  1898. fmt.Println(err)
  1899. } else {
  1900. var resp SmsCode
  1901. // 将 byte 切片转换为结构体
  1902. json.Unmarshal(r, &resp)
  1903. if resp.Code == 0 {
  1904. c.ServeSuccessJSON(map[string]interface{}{
  1905. "msg": resp.Message,
  1906. })
  1907. }
  1908. }
  1909. }
  1910. func (c *FapiaoApiController) GetQRCode() {
  1911. sdk := invoice.NewSdk(common.HMAC_SHA256, "5058f0defd12047ee2a7", "51440fbee667ea9a53aaa68c9c408367", "", "test")
  1912. var config models.FapiaoConfig
  1913. config, _ = service.FindFaPiaoConfigInfo(c.GetAdminUserInfo().CurrentOrgId)
  1914. routerAddress, postData := fapiao.GetQRCode(config) //发票开具
  1915. r, err := sdk.HttpPost("https://apigw.goldentec.com", routerAddress, postData)
  1916. if err != nil {
  1917. fmt.Println(err)
  1918. } else {
  1919. var resp QRAuth
  1920. // 将 byte 切片转换为结构体
  1921. err := json.Unmarshal(r, &resp)
  1922. fmt.Println(resp)
  1923. if err != nil {
  1924. fmt.Println("Error unmarshalling:", err)
  1925. } else {
  1926. if resp.Code == 0 {
  1927. decodedBytes, _ := base64.StdEncoding.DecodeString(resp.Data.QrCode)
  1928. if len(resp.Data.AuthId) == 0 { //还没进行授权,则获取二维码信息
  1929. c.ServeSuccessJSON(map[string]interface{}{
  1930. "cus_status": 1,
  1931. "qr_code": string(decodedBytes),
  1932. })
  1933. } else {
  1934. status := GetQRStatus(c.GetAdminUserInfo().CurrentOrgId, resp.Data.AuthId)
  1935. if status == "UNDEFINE" {
  1936. c.ServeSuccessJSON(map[string]interface{}{
  1937. "cus_status": -1,
  1938. "msg": "未定义",
  1939. })
  1940. } else if status == "UNHANDLED" {
  1941. c.ServeSuccessJSON(map[string]interface{}{
  1942. "cus_status": 1,
  1943. "qr_code": string(decodedBytes),
  1944. })
  1945. } else if status == "REAL_AUTH_SUCCESS" {
  1946. c.ServeSuccessJSON(map[string]interface{}{
  1947. "cus_status": 2,
  1948. "msg": "已经实名认证成功",
  1949. })
  1950. } else if status == "REFRESH" {
  1951. c.ServeSuccessJSON(map[string]interface{}{
  1952. "cus_status": 1,
  1953. "qr_code": string(decodedBytes),
  1954. })
  1955. } else if status == "NEED_RELOGIN_BUREAU" {
  1956. c.ServeSuccessJSON(map[string]interface{}{
  1957. "cus_status": -3,
  1958. "msg": "登录失效,请重新短信登录税局",
  1959. })
  1960. }
  1961. }
  1962. } else {
  1963. c.ServeSuccessJSON(map[string]interface{}{
  1964. "cus_status": -4,
  1965. "msg": resp.Message,
  1966. })
  1967. }
  1968. }
  1969. //fmt.Println(string(r))
  1970. }
  1971. }
  1972. func (c *FapiaoApiController) OpenFaPiao() {
  1973. //var config models.FapiaoConfig
  1974. //config, _ = service.FindFaPiaoConfigInfo(c.GetAdminUserInfo().CurrentOrgId)
  1975. //认证接口
  1976. sdk := invoice.NewSdk(common.HMAC_SHA256, "5058f0defd12047ee2a7", "51440fbee667ea9a53aaa68c9c408367", "", "")
  1977. //status := GetQRStatusTwo(c.GetAdminUserInfo().CurrentOrgId)
  1978. //fmt.Println("11112222")
  1979. //
  1980. //fmt.Println(status)
  1981. //if status == 0 {
  1982. // c.ServeFailJSONWithSGJErrorCode(enums.ErrorCodeAuthWrong)
  1983. // return
  1984. //}
  1985. //查询余量接口
  1986. //routerAddress, postData := bwfapiao.QueryStock(config)
  1987. //r, err := sdk.HttpPost("https://apigw.goldentec.com", routerAddress, postData)
  1988. //fmt.Println(string(r))
  1989. //if err != nil {
  1990. // fmt.Println(err)
  1991. //} else {
  1992. // var resp2 FapiaoStock
  1993. // // 将 byte 切片转换为结构体
  1994. // err2 := json.Unmarshal(r, &resp2)
  1995. // if err2 != nil {
  1996. // fmt.Println(err2)
  1997. //
  1998. // } else {
  1999. // if resp2.Code == 0 {
  2000. // if resp2.Data.LeftQuantity <= 0 {
  2001. // c.ServeSuccessJSON(map[string]interface{}{
  2002. // "msg": "发票余量不足,请登录高灯平台申领发票",
  2003. // "status": -1,
  2004. // })
  2005. // return
  2006. // }
  2007. // }
  2008. // }
  2009. //}
  2010. //return
  2011. //开蓝票逻辑
  2012. order_ids := c.GetString("order_ids")
  2013. admin_user_id, _ := c.GetInt64("admin_user_id")
  2014. ids := strings.Split(order_ids, ",")
  2015. orders, _ := service.GetFaPiaoOrderByIDS(ids)
  2016. var MedfeeSumamt float64 = 0 //治疗费用
  2017. var PsnCashPay float64 = 0 //治疗费用
  2018. var FundPaySumamt float64 = 0 //治疗费用
  2019. var HifmiPay float64 = 0 //治疗费用
  2020. var MafPay float64 = 0 //治疗费用
  2021. var HifpPay float64 = 0 //治疗费用
  2022. var AcctPay float64 = 0 //治疗费用
  2023. var details []models.HisOrderInfo
  2024. var numbers []string
  2025. decimal.DivisionPrecision = 2
  2026. var remark string
  2027. for _, oss := range orders {
  2028. MedfeeSumamt, _ = decimal.NewFromFloat(MedfeeSumamt).Add(decimal.NewFromFloat(oss.MedfeeSumamt)).Float64()
  2029. PsnCashPay, _ = decimal.NewFromFloat(PsnCashPay).Add(decimal.NewFromFloat(oss.PsnCashPay)).Float64()
  2030. FundPaySumamt, _ = decimal.NewFromFloat(FundPaySumamt).Add(decimal.NewFromFloat(oss.FundPaySumamt)).Float64()
  2031. HifmiPay, _ = decimal.NewFromFloat(HifmiPay).Add(decimal.NewFromFloat(oss.HifmiPay)).Float64()
  2032. MafPay, _ = decimal.NewFromFloat(MafPay).Add(decimal.NewFromFloat(oss.MafPay)).Float64()
  2033. HifpPay, _ = decimal.NewFromFloat(HifpPay).Add(decimal.NewFromFloat(oss.HifpPay)).Float64()
  2034. AcctPay, _ = decimal.NewFromFloat(AcctPay).Add(decimal.NewFromFloat(oss.AcctPay)).Float64()
  2035. numbers = append(numbers, oss.Number)
  2036. }
  2037. if MedfeeSumamt > 0 {
  2038. MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  2039. if len(remark) == 0 {
  2040. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  2041. remark = "医疗总费用: " + MedfeeSumamt_str
  2042. } else {
  2043. remark = remark + " 医疗总费用:" + MedfeeSumamt_str
  2044. }
  2045. }
  2046. if FundPaySumamt > 0 {
  2047. MedfeeSumamt_str := fmt.Sprintf("%.2f", FundPaySumamt)
  2048. if len(remark) == 0 {
  2049. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  2050. remark = "基金支付总金额: " + MedfeeSumamt_str
  2051. } else {
  2052. remark = remark + " 基金支付总金额:" + MedfeeSumamt_str
  2053. }
  2054. }
  2055. if PsnCashPay > 0 {
  2056. MedfeeSumamt_str := fmt.Sprintf("%.2f", PsnCashPay)
  2057. if len(remark) == 0 {
  2058. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  2059. remark = "个人现金支付: " + MedfeeSumamt_str
  2060. } else {
  2061. remark = remark + " 个人现金支付:" + MedfeeSumamt_str
  2062. }
  2063. }
  2064. if HifmiPay > 0 {
  2065. MedfeeSumamt_str := fmt.Sprintf("%.2f", HifmiPay)
  2066. if len(remark) == 0 {
  2067. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  2068. remark = "大病基金支付: " + MedfeeSumamt_str
  2069. } else {
  2070. remark = remark + " 大病基金支付:" + MedfeeSumamt_str
  2071. }
  2072. }
  2073. if AcctPay > 0 {
  2074. MedfeeSumamt_str := fmt.Sprintf("%.2f", AcctPay)
  2075. if len(remark) == 0 {
  2076. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  2077. remark = "个账支付: " + MedfeeSumamt_str
  2078. } else {
  2079. remark = remark + " 个账支付:" + MedfeeSumamt_str
  2080. }
  2081. }
  2082. if HifpPay > 0 {
  2083. MedfeeSumamt_str := fmt.Sprintf("%.2f", HifpPay)
  2084. if len(remark) == 0 {
  2085. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  2086. remark = "基本统筹基金支付: " + MedfeeSumamt_str
  2087. } else {
  2088. remark = remark + " 基本统筹基金支付:" + MedfeeSumamt_str
  2089. }
  2090. }
  2091. if MafPay > 0 {
  2092. MedfeeSumamt_str := fmt.Sprintf("%.2f", MafPay)
  2093. if len(remark) == 0 {
  2094. //MedfeeSumamt_str := fmt.Sprintf("%.2f", MedfeeSumamt)
  2095. remark = "医疗救助基金支付: " + MedfeeSumamt_str
  2096. } else {
  2097. remark = remark + " 医疗救助基金支付:" + MedfeeSumamt_str
  2098. }
  2099. }
  2100. details, _ = service.GetFaPiaoOrderInfoByNumbers(numbers)
  2101. role, _ := service.GetAdminUserRole(admin_user_id, c.GetAdminUserInfo().CurrentOrgId)
  2102. //role.UserName = ""
  2103. type CostType struct {
  2104. name string
  2105. price float64
  2106. }
  2107. var cts []CostType
  2108. var ct CostType
  2109. var bedCostTotal float64 = 0 //床位总费
  2110. var operationCostTotal float64 = 0 //手术费
  2111. var otherCostTotal float64 = 0 //其他费用
  2112. var materialCostTotal float64 = 0 //材料费
  2113. var westernMedicineCostTotal float64 = 0 //西药费
  2114. var chineseTraditionalMedicineCostTotal float64 = 0 //中成药
  2115. var checkCostTotal float64 = 0 //检查费
  2116. var laboratoryCostTotal float64 = 0 //化验费
  2117. var treatCostTotal float64 = 0 //治疗费用
  2118. var huliCostTotal float64 = 0 //治疗费用
  2119. var zhencaCostTotal float64 = 0 //治疗费用
  2120. for _, item := range details {
  2121. if item.MedChrgitmType == "01" { //床位费
  2122. bedCostTotal, _ = decimal.NewFromFloat(bedCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  2123. }
  2124. if item.MedChrgitmType == "07" { //护理费
  2125. huliCostTotal, _ = decimal.NewFromFloat(huliCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  2126. }
  2127. if c.GetAdminUserInfo().CurrentOrgId == 10188 || c.GetAdminUserInfo().CurrentOrgId == 10217 {
  2128. if item.MedChrgitmType == "03" { //检查费
  2129. laboratoryCostTotal, _ = decimal.NewFromFloat(laboratoryCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  2130. }
  2131. } else {
  2132. if item.MedChrgitmType == "03" { //检查费
  2133. checkCostTotal, _ = decimal.NewFromFloat(checkCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  2134. }
  2135. }
  2136. if item.MedChrgitmType == "04" { //化验费
  2137. laboratoryCostTotal, _ = decimal.NewFromFloat(laboratoryCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  2138. }
  2139. if item.MedChrgitmType == "05" || item.MedChrgitmType == "1402" || item.MedChrgitmType == "1403" { //治疗费
  2140. treatCostTotal, _ = decimal.NewFromFloat(treatCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  2141. }
  2142. if item.MedChrgitmType == "06" { //手术费
  2143. operationCostTotal, _ = decimal.NewFromFloat(operationCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  2144. }
  2145. if item.MedChrgitmType == "08" { //材料费
  2146. materialCostTotal, _ = decimal.NewFromFloat(materialCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  2147. }
  2148. if item.MedChrgitmType == "09" { //西药费
  2149. westernMedicineCostTotal, _ = decimal.NewFromFloat(westernMedicineCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  2150. }
  2151. if item.MedChrgitmType == "11" { //中成费
  2152. chineseTraditionalMedicineCostTotal, _ = decimal.NewFromFloat(chineseTraditionalMedicineCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  2153. }
  2154. if item.MedChrgitmType == "14" || item.MedChrgitmType == "0" || item.MedChrgitmType == "12" { //其他费
  2155. otherCostTotal, _ = decimal.NewFromFloat(otherCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  2156. }
  2157. if item.MedChrgitmType == "02" { //诊察
  2158. zhencaCostTotal, _ = decimal.NewFromFloat(zhencaCostTotal).Add(decimal.NewFromFloat(item.DetItemFeeSumamt)).Float64()
  2159. }
  2160. }
  2161. if bedCostTotal > 0 {
  2162. ct.name = "床位费"
  2163. ct.price = bedCostTotal
  2164. cts = append(cts, ct)
  2165. }
  2166. if operationCostTotal > 0 {
  2167. ct.name = "手术费"
  2168. ct.price = operationCostTotal
  2169. cts = append(cts, ct)
  2170. }
  2171. if otherCostTotal > 0 {
  2172. ct.name = "其他费"
  2173. ct.price = otherCostTotal
  2174. cts = append(cts, ct)
  2175. }
  2176. if materialCostTotal > 0 {
  2177. ct.name = "材料费"
  2178. ct.price = materialCostTotal
  2179. cts = append(cts, ct)
  2180. }
  2181. if westernMedicineCostTotal > 0 {
  2182. ct.name = "西药费"
  2183. ct.price = westernMedicineCostTotal
  2184. cts = append(cts, ct)
  2185. }
  2186. if chineseTraditionalMedicineCostTotal > 0 {
  2187. ct.name = "中成药费"
  2188. ct.price = chineseTraditionalMedicineCostTotal
  2189. cts = append(cts, ct)
  2190. }
  2191. if checkCostTotal > 0 {
  2192. ct.name = "检查费"
  2193. ct.price = checkCostTotal
  2194. cts = append(cts, ct)
  2195. }
  2196. if laboratoryCostTotal > 0 {
  2197. ct.name = "化验费"
  2198. ct.price = laboratoryCostTotal
  2199. cts = append(cts, ct)
  2200. }
  2201. if treatCostTotal > 0 {
  2202. ct.name = "治疗费"
  2203. ct.price = treatCostTotal
  2204. cts = append(cts, ct)
  2205. }
  2206. if huliCostTotal > 0 {
  2207. ct.name = "护理费"
  2208. ct.price = huliCostTotal
  2209. cts = append(cts, ct)
  2210. }
  2211. if zhencaCostTotal > 0 {
  2212. ct.name = "诊察费"
  2213. ct.price = zhencaCostTotal
  2214. cts = append(cts, ct)
  2215. }
  2216. fmt.Println(cts)
  2217. org_config, _ := service.FindMedicalInsuranceInfo(c.GetAdminUserInfo().CurrentOrgId)
  2218. var config2 models.FapiaoConfig
  2219. config2, _ = service.FindFaPiaoConfigInfo(c.GetAdminUserInfo().CurrentOrgId)
  2220. number := strconv.FormatInt(time.Now().Unix(), 10) + "_" + strconv.FormatInt(orders[0].UserOrgId, 10) + "_" + strconv.FormatInt(orders[0].PatientId, 10)
  2221. amountWithoutTax, _, taxAmount, amountHasTax := CalculatePriceDetails(MedfeeSumamt, 1, 0.00)
  2222. patient, _ := service.GetXTPatientInfo(c.GetAdminUserInfo().CurrentOrgId, orders[0].PatientId)
  2223. orders[0].PsnName = patient.Name
  2224. role.UserName = "陈金娣"
  2225. postData3 := map[string]interface{}{
  2226. "seller_name": org_config.OrgName,
  2227. "seller_taxpayer_num": config2.SellerTaxpayerNum,
  2228. "seller_address": config2.SellerAddress,
  2229. "seller_tel": config2.SellerTel,
  2230. "seller_bank_name": config2.SellerBankName,
  2231. "seller_bank_account": config2.SellerBankAccount,
  2232. "title_type": 1,
  2233. "buyer_title": orders[0].PsnName + "(个人)",
  2234. "buyer_taxpayer_num": "",
  2235. "buyer_address": "",
  2236. "buyer_phone": "",
  2237. "buyer_bank_name": "",
  2238. "buyer_bank_account": "",
  2239. "buyer_email": "",
  2240. "order_id": number,
  2241. "invoice_type_code": "082",
  2242. "callback_url": "http://www.goldentec.com/callback",
  2243. "drawer": role.UserName,
  2244. "payee": "",
  2245. "checker": "",
  2246. "terminal_code": config2.TerminalCode,
  2247. "user_openid": "",
  2248. "special_invoice_kind": "",
  2249. "zsfs": "",
  2250. "deduction": "",
  2251. "amount_has_tax": amountHasTax,
  2252. "tax_amount": taxAmount,
  2253. "amount_without_tax": amountWithoutTax,
  2254. "remark": remark,
  2255. }
  2256. ////项目商品明细
  2257. items := make([]map[string]interface{}, 0)
  2258. for _, ct := range cts {
  2259. item := make(map[string]interface{})
  2260. amountWithoutTax, _, taxAmount, _ := CalculatePriceDetails(ct.price, 1, 0.00)
  2261. item["name"] = ct.name
  2262. item["tax_code"] = "3070202000000000000"
  2263. item["models"] = ""
  2264. item["unit"] = ""
  2265. item["total_price"] = amountWithoutTax
  2266. item["total"] = "1"
  2267. item["price"] = amountWithoutTax
  2268. item["tax_rate"] = "0.00"
  2269. item["tax_amount"] = taxAmount
  2270. item["discount"] = "0"
  2271. item["preferential_policy_flag"] = "1"
  2272. item["zero_tax_flag"] = "1"
  2273. item["vat_special_management"] = "免税"
  2274. items = append(items, item)
  2275. }
  2276. postData3["items"] = items
  2277. routerAddress, postData4 := fapiao.Blue(postData3) //发票开具
  2278. fmt.Println(postData4)
  2279. return
  2280. r, err4 := sdk.HttpPost("https://apigw.goldentec.com", routerAddress, postData4)
  2281. fmt.Println("blue")
  2282. fmt.Println(err4)
  2283. fmt.Println(string(r))
  2284. if err4 != nil {
  2285. fmt.Println(err4)
  2286. } else {
  2287. var resp OpenFaPiaoResultResponse
  2288. // 将 byte 切片转换为结构体
  2289. err := json.Unmarshal(r, &resp)
  2290. fmt.Println(resp)
  2291. if err != nil {
  2292. fmt.Println("Error unmarshalling:", err)
  2293. } else {
  2294. fmt.Println(resp)
  2295. if resp.Code == 0 {
  2296. var fapiaos models.HisFaPiaoOrder
  2297. fapiaos.InvoiceId = resp.Data.InvoiceId
  2298. fapiaos.OrderSn = resp.Data.OrderSn
  2299. fapiaos.FapiaoStatus = "1"
  2300. fapiaos.OrderIds = order_ids
  2301. fapiaos.UserOrgId = c.GetAdminUserInfo().CurrentOrgId
  2302. fapiaos.Status = 1
  2303. fapiaos.PatientId = orders[0].PatientId
  2304. fapiaos.Ctime = time.Now().Unix()
  2305. fapiaos.Mtime = time.Now().Unix()
  2306. fapiaos.Creator = role.UserName
  2307. fapiaos.MedfeeSumamt = MedfeeSumamt
  2308. fapiaos.FundPaySumamt = FundPaySumamt
  2309. fapiaos.PsnCashPay = PsnCashPay
  2310. fmt.Println(ids)
  2311. service.UpdateFaPiaoSN(resp.Data.OrderSn, ids) //同步发票号码
  2312. err5 := service.SaveFaPiaoOrder(&fapiaos)
  2313. // 异步调用查询操作,通过闭包传递参数
  2314. // 异步调用查询操作,通过闭包传递多个参数
  2315. go func(num string, sn string, number string, fapiaos models.HisFaPiaoOrder, ids []string) {
  2316. // 延迟等待一定时间再查询
  2317. time.Sleep(30 * time.Second)
  2318. // 调用查询发票的函数
  2319. //queryInvoice(id, user, retries)
  2320. routerAddress2, postData2 := fapiao.Query(num, sn, number)
  2321. r3, err2 := sdk.HttpPost("https://apigw.goldentec.com", routerAddress2, postData2)
  2322. fmt.Println("query")
  2323. fmt.Println(string(r3))
  2324. if err2 != nil {
  2325. fmt.Println(err2)
  2326. } else {
  2327. var resp3 QueryFaPiaoResultResponse
  2328. // 将 byte 切片转换为结构体
  2329. json.Unmarshal(r3, &resp3)
  2330. if resp3.Code == 0 {
  2331. if resp3.Data.Status == 3 {
  2332. // 异步调用查询操作,不阻塞主程序
  2333. fapiaos.TicketSn = resp3.Data.TicketSn
  2334. fapiaos.TicketDate = resp3.Data.TicketDate
  2335. fapiaos.AmountWithTax = resp3.Data.AmountWithoutTax
  2336. fapiaos.AmountWithoutTax = resp3.Data.AmountWithoutTax
  2337. fapiaos.FapiaoStatus = "2"
  2338. fapiaos.TaxAmount = resp3.Data.TaxAmount
  2339. fapiaos.IsRedWashed = strconv.FormatInt(int64(resp3.Data.IsRedWashed), 10)
  2340. fapiaos.PdfUrl = resp3.Data.PdfUrl
  2341. fapiaos.OfdUrl = resp3.Data.OfdUrl
  2342. fapiaos.XmlUrl = resp3.Data.XmlUrl
  2343. service.SaveFaPiaoOrder(&fapiaos)
  2344. service.UpdateFaPiaoNumber(resp3.Data.TicketSn, ids) //同步发票号码
  2345. } else if resp3.Data.Status == 1 {
  2346. fapiaos.FapiaoStatus = "1"
  2347. fapiaos.TicketSn = ""
  2348. service.SaveFaPiaoOrder(&fapiaos)
  2349. //service.UpdateFaPiaoNumber(resp3.Data.TicketSn, ids) //同步发票号码
  2350. } else if resp3.Data.Status == 2 {
  2351. fapiaos.FapiaoStatus = "3"
  2352. fapiaos.TicketSn = ""
  2353. fapiaos.Message = resp3.Data.Message
  2354. service.SaveFaPiaoOrder(&fapiaos)
  2355. } else {
  2356. fapiaos.FapiaoStatus = "3"
  2357. fapiaos.TicketSn = ""
  2358. fapiaos.Message = resp3.Data.Message
  2359. service.SaveFaPiaoOrder(&fapiaos)
  2360. }
  2361. } else {
  2362. //错误处理
  2363. c.ServeSuccessJSON(map[string]interface{}{
  2364. "msg": "查询失败" + resp3.Message,
  2365. })
  2366. }
  2367. }
  2368. }(config2.SellerTaxpayerNum, resp.Data.OrderSn, number, fapiaos, ids) // 这里将多个参数传递给闭包
  2369. if err5 == nil {
  2370. c.ServeSuccessJSON(map[string]interface{}{
  2371. "msg": "开具成功,审核中。",
  2372. })
  2373. }
  2374. } else {
  2375. //错误处理
  2376. c.ServeSuccessJSON(map[string]interface{}{
  2377. "msg": "开具失败" + resp.Message,
  2378. })
  2379. }
  2380. }
  2381. }
  2382. }
  2383. func (c *FapiaoApiController) RedFaPiao() {
  2384. id, _ := c.GetInt64("id")
  2385. admin_user_id, _ := c.GetInt64("admin_user_id")
  2386. role2, _ := service.GetAdminUserRole(admin_user_id, c.GetAdminUserInfo().CurrentOrgId)
  2387. fapiao_config, _ := service.GetFaPiaoOrderById(id)
  2388. var config models.FapiaoConfig
  2389. config, _ = service.FindFaPiaoConfigInfo(c.GetAdminUserInfo().CurrentOrgId)
  2390. sdk := invoice.NewSdk(common.HMAC_SHA256, "5058f0defd12047ee2a7", "51440fbee667ea9a53aaa68c9c408367", "", "test")
  2391. routerAddress, postData := fapiao.Red(config.SellerTaxpayerNum, "", fapiao_config.OrderSn) //发票开具
  2392. fmt.Println("postData")
  2393. fmt.Println(postData)
  2394. fmt.Println("postData")
  2395. red, err := sdk.HttpPost("https://apigw.goldentec.com", routerAddress, postData)
  2396. fmt.Println("red")
  2397. fmt.Println(red)
  2398. fmt.Println("red")
  2399. if err != nil {
  2400. fmt.Println(err)
  2401. } else {
  2402. var resp RedResult
  2403. // 将 byte 切片转换为结构体
  2404. json.Unmarshal(red, &resp)
  2405. fmt.Println("resp")
  2406. fmt.Println(resp)
  2407. fmt.Println("resp")
  2408. if resp.Code == 0 {
  2409. if resp.Data[0].State == 1 {
  2410. //查询红票开具情况
  2411. routerAddress2, postData2 := fapiao.Query(config.SellerTaxpayerNum, fapiao_config.OrderSn, "")
  2412. r3, _ := sdk.HttpPost("https://apigw.goldentec.com", routerAddress2, postData2)
  2413. var resp3 QueryFaPiaoResultResponse
  2414. // 将 byte 切片转换为结构体
  2415. json.Unmarshal(r3, &resp3)
  2416. fmt.Println("resp")
  2417. fmt.Println(string(r3))
  2418. fmt.Println(resp3)
  2419. fmt.Println("resp")
  2420. if resp3.Code == 0 {
  2421. if resp3.Data.IsRedWashed == 1 {
  2422. fapiao_config.IsRedWashed = "1"
  2423. fapiao_config.Status = 0
  2424. fapiao_config.RedInvoiceId = resp.Data[0].InvoiceId
  2425. fapiao_config.RedInvoiceCreator = role2.UserName
  2426. service.SaveFaPiaoOrder(&fapiao_config)
  2427. //将结算表的发票号码清空
  2428. service.UpdateFaPiaoNumberByNumber(fapiao_config.TicketSn)
  2429. c.ServeSuccessJSON(map[string]interface{}{
  2430. "msg": "红冲成功",
  2431. })
  2432. } else {
  2433. c.ServeSuccessJSON(map[string]interface{}{
  2434. "msg": "系统错误,红冲失败",
  2435. })
  2436. }
  2437. } else {
  2438. c.ServeSuccessJSON(map[string]interface{}{
  2439. "msg": resp3.Message,
  2440. })
  2441. }
  2442. } else {
  2443. c.ServeSuccessJSON(map[string]interface{}{
  2444. "msg": resp.Message,
  2445. })
  2446. }
  2447. } else {
  2448. c.ServeSuccessJSON(map[string]interface{}{
  2449. "msg": resp.Message,
  2450. })
  2451. }
  2452. }
  2453. }
  2454. func GetQRStatusTwo(org_id int64) (status int64) {
  2455. sdk := invoice.NewSdk(common.HMAC_SHA256, "5058f0defd12047ee2a7", "51440fbee667ea9a53aaa68c9c408367", "", "test")
  2456. var config models.FapiaoConfig
  2457. config, _ = service.FindFaPiaoConfigInfo(org_id)
  2458. routerAddress, postData := fapiao.GetQRCode(config) //发票开具
  2459. r, err := sdk.HttpPost("https://apigw.goldentec.com", routerAddress, postData)
  2460. if err != nil {
  2461. fmt.Println(err)
  2462. } else {
  2463. var resp QRAuth
  2464. // 将 byte 切片转换为结构体
  2465. err := json.Unmarshal(r, &resp)
  2466. fmt.Println(resp)
  2467. if err != nil {
  2468. fmt.Println("Error unmarshalling:", err)
  2469. } else {
  2470. if len(resp.Data.AuthId) == 0 { //还没实名认证
  2471. } else {
  2472. status = 1
  2473. status_str := GetQRStatus(org_id, resp.Data.AuthId)
  2474. if status_str == "UNDEFINE" {
  2475. status = 0
  2476. } else if status_str == "UNHANDLED" {
  2477. status = 0
  2478. } else if status_str == "REAL_AUTH_SUCCESS" {
  2479. status = 1
  2480. } else if status_str == "REFRESH" {
  2481. status = 0
  2482. } else if status_str == "NEED_RELOGIN_BUREAU" {
  2483. status = 0
  2484. }
  2485. }
  2486. }
  2487. }
  2488. return
  2489. }
  2490. type RedResult struct {
  2491. Code int `json:"code"`
  2492. Data []struct {
  2493. State int `json:"state"`
  2494. Message string `json:"message"`
  2495. OrderSn string `json:"order_sn"`
  2496. InvoiceId string `json:"invoice_id"`
  2497. } `json:"data"`
  2498. Message string `json:"message"`
  2499. }
  2500. type QueryFaPiaoResultResponse struct {
  2501. Code int `json:"code"`
  2502. Data struct {
  2503. OrderSn string `json:"order_sn"`
  2504. Status int `json:"status"`
  2505. Message string `json:"message"`
  2506. TicketDate string `json:"ticket_date"`
  2507. TicketSn string `json:"ticket_sn"`
  2508. TicketCode string `json:"ticket_code"`
  2509. CheckCode string `json:"check_code"`
  2510. AmountWithTax string `json:"amount_with_tax"`
  2511. AmountWithoutTax string `json:"amount_without_tax"`
  2512. TaxAmount string `json:"tax_amount"`
  2513. IsRedWashed int `json:"is_red_washed"`
  2514. PdfUrl string `json:"pdf_url"`
  2515. OfdUrl string `json:"ofd_url"`
  2516. XmlUrl string `json:"xml_url"`
  2517. } `json:"data"`
  2518. Message string `json:"message"`
  2519. }
  2520. type OpenFaPiaoResultResponse struct {
  2521. Code int `json:"code"`
  2522. Message string `json:"message"`
  2523. Data struct {
  2524. State int `json:"state"`
  2525. OrderSn string `json:"order_sn"`
  2526. InvoiceId string `json:"invoice_id"`
  2527. } `json:"data"`
  2528. }
  2529. type SurplusStockResponse struct {
  2530. Code int `json:"code"`
  2531. Message string `json:"message"`
  2532. Data struct {
  2533. LeftQuantity int `json:"left_quantity"`
  2534. } `json:"data"`
  2535. }
  2536. func GetFaPiaoStock(org_id int64) (left_quantity int) {
  2537. sdk := invoice.NewSdk(common.HMAC_SHA256, "8ca4ee7b152c0abceff9", "17402aff152dbeedf7a7b30be553f4c4", "", "test")
  2538. var config models.FapiaoConfig
  2539. config, _ = service.FindFaPiaoConfigInfo(org_id)
  2540. routerAddress, postData := fapiao.QueryStock(config)
  2541. r, err := sdk.HttpPost("https://apigw-test.goldentec.com", routerAddress, postData)
  2542. if err != nil {
  2543. fmt.Println(err)
  2544. } else {
  2545. var resp SurplusStockResponse
  2546. // 将 byte 切片转换为结构体
  2547. err := json.Unmarshal(r, &resp)
  2548. if err != nil {
  2549. fmt.Println("Error unmarshalling:", err)
  2550. } else {
  2551. if resp.Code == 0 {
  2552. left_quantity = resp.Data.LeftQuantity
  2553. }
  2554. }
  2555. }
  2556. return
  2557. }
  2558. type Response struct {
  2559. Code int `json:"code"`
  2560. Message string `json:"message"`
  2561. Data struct {
  2562. Status string `json:"status"`
  2563. } `json:"data"`
  2564. }
  2565. func GetQRStatus(org_id int64, auth_id string) (status string) {
  2566. sdk := invoice.NewSdk(common.HMAC_SHA256, "5058f0defd12047ee2a7", "51440fbee667ea9a53aaa68c9c408367", "", "test")
  2567. fmt.Println(sdk)
  2568. var config models.FapiaoConfig
  2569. config, _ = service.FindFaPiaoConfigInfo(org_id)
  2570. fmt.Println(config)
  2571. routerAddress, postData := fapiao.GetQRStatus(auth_id, config) //发票开具
  2572. fmt.Println(routerAddress)
  2573. fmt.Println(postData)
  2574. r, err := sdk.HttpPost("https://apigw.goldentec.com", routerAddress, postData)
  2575. if err != nil {
  2576. status = "FAILD"
  2577. fmt.Println(err)
  2578. } else {
  2579. fmt.Println(r)
  2580. var resp Response
  2581. // 将 byte 切片转换为结构体
  2582. err := json.Unmarshal(r, &resp)
  2583. fmt.Println(string(r))
  2584. if err != nil {
  2585. status = "FAILD"
  2586. fmt.Println("Error unmarshalling:", err)
  2587. } else {
  2588. status = resp.Data.Status
  2589. fmt.Printf("Parsed struct: %+v\n", resp)
  2590. }
  2591. }
  2592. return status
  2593. //return
  2594. }
  2595. // 计算商品价格、税额等函数
  2596. func CalculatePriceDetails(totalCost float64, itemCount int, taxRate float64) (string, string, string, string) {
  2597. // 商品不含税总金额,保留两位小数
  2598. amountWithoutTax := roundTo(totalCost/(1+taxRate), 2)
  2599. // 商品不含税单价,保留八位小数
  2600. pricePerItem := roundTo(amountWithoutTax/float64(itemCount), 8)
  2601. // 税额,保留两位小数
  2602. taxAmount := roundTo(amountWithoutTax*taxRate, 2)
  2603. // 含税总金额
  2604. amountHasTax := amountWithoutTax + taxAmount
  2605. return fmt.Sprintf("%f", amountWithoutTax), fmt.Sprintf("%f", pricePerItem), fmt.Sprintf("%f", taxAmount), fmt.Sprintf("%f", amountHasTax)
  2606. }
  2607. // 保留指定小数位数的函数
  2608. func roundTo(value float64, places int) float64 {
  2609. scale := math.Pow(10, float64(places))
  2610. return math.Round(value*scale) / scale
  2611. }
  2612. type QRAuth struct {
  2613. Code int `json:"code"`
  2614. Message string `json:"message"`
  2615. Data struct {
  2616. AuthId string `json:"auth_id"`
  2617. QrCode string `json:"qr_code"`
  2618. } `json:"data"`
  2619. }
  2620. type FapiaoStock struct {
  2621. Code int `json:"code"`
  2622. Data struct {
  2623. LeftQuantity int `json:"left_quantity"`
  2624. } `json:"data"`
  2625. Message string `json:"message"`
  2626. }