fapiao_controller.go 107KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966
  1. package controllers
  2. import (
  3. "XT_New/common"
  4. "XT_New/enums"
  5. "XT_New/invoice"
  6. "XT_New/models"
  7. "XT_New/models/bwfapiao"
  8. "XT_New/service"
  9. "XT_New/service/fapiao"
  10. "XT_New/utils"
  11. "bytes"
  12. "crypto/md5"
  13. "crypto/sha1"
  14. "encoding/base64"
  15. "encoding/hex"
  16. "encoding/json"
  17. "errors"
  18. "fmt"
  19. "github.com/astaxie/beego"
  20. "github.com/shopspring/decimal"
  21. "io/ioutil"
  22. "math"
  23. "net/http"
  24. "sort"
  25. "strconv"
  26. "strings"
  27. "time"
  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 := fmt.Sprintf("%d", time.Now().UnixMilli())
  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. }