stock_template.go 77 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406
  1. package controllers
  2. import (
  3. "Medical_ERP/common/actions"
  4. "Medical_ERP/common/global"
  5. _ "Medical_ERP/common/response"
  6. "Medical_ERP/dto"
  7. "Medical_ERP/models"
  8. "Medical_ERP/services"
  9. "Medical_ERP/utils"
  10. "baliance.com/gooxml/color"
  11. "baliance.com/gooxml/document"
  12. "baliance.com/gooxml/measurement"
  13. "baliance.com/gooxml/schema/soo/wml"
  14. "errors"
  15. "fmt"
  16. context2 "github.com/beego/beego/v2/adapter/context"
  17. "github.com/boombuler/barcode"
  18. "github.com/boombuler/barcode/code128"
  19. "github.com/ser163/png2j"
  20. "github.com/signintech/gopdf"
  21. "github.com/xuri/excelize/v2"
  22. "gogs.baozhida.cn/zoie/OAuth-core/pkg/jwtauth/beegouser"
  23. "image/jpeg"
  24. "path"
  25. "strings"
  26. _ "image/jpeg"
  27. "image/png"
  28. "os"
  29. "time"
  30. )
  31. type StockTemplateController struct {
  32. BaseController
  33. }
  34. // StockTemplateIn 入库
  35. // @Summary 入库
  36. // @Description 入库
  37. // @Tags 库存
  38. // @Param body body dto.StockTemplateInInsertReq true "body"
  39. // @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
  40. // @Router /stock-template/in [post]
  41. // @Security Bearer
  42. func (c StockTemplateController) StockTemplateIn() {
  43. s := services.StockTemplate{}
  44. reqData := dto.StockTemplateInInsertReq{}
  45. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  46. c.Error(global.ParseFormErr, err, err.Error())
  47. return
  48. }
  49. reqData.SetCreateBy(beegouser.GetUserId(c.Ctx))
  50. reqData.SetDeptId(beegouser.GetDeptId(c.Ctx))
  51. err := s.StockTemplateIn(&reqData)
  52. if err != nil {
  53. c.Error(500, err, err.Error())
  54. return
  55. }
  56. c.OK(reqData.GetId(), "入库成功")
  57. }
  58. // StockTemplateInScanCode 扫码入库
  59. // @Summary 扫码入库
  60. // @Description 扫码入库
  61. // @Tags 库存
  62. // @Param body body dto.StockTemplateInInsertReq true "body"
  63. // @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
  64. // @Router /stock-template/in [post]
  65. // @Security Bearer
  66. func (c StockTemplateController) StockTemplateInScanCode() {
  67. s := services.StockTemplate{}
  68. reqData := dto.BatchStockTemplateInInsertReq{}
  69. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  70. c.Error(global.ParseFormErr, err, err.Error())
  71. return
  72. }
  73. reqData.SetCreateBy(beegouser.GetUserId(c.Ctx))
  74. reqData.SetDeptId(beegouser.GetDeptId(c.Ctx))
  75. err := s.StockTemplateInScanCode(&reqData)
  76. if err != nil {
  77. c.Error(500, err, err.Error())
  78. return
  79. }
  80. c.OK(nil, "扫码入库成功")
  81. }
  82. // StockTemplateInEdit 修改入库
  83. // @Summary 修改入库
  84. // @Description 修改入库
  85. // @Tags 库存
  86. // @Param body body dto.StockTemplateInEditReq true "body"
  87. // @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
  88. // @Router /stock-template/in [post]
  89. // @Security Bearer
  90. func (c StockTemplateController) StockTemplateInEdit() {
  91. s := services.StockTemplate{}
  92. reqData := dto.StockTemplateInEditReq{}
  93. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  94. c.Error(global.ParseFormErr, err, err.Error())
  95. return
  96. }
  97. reqData.SetUpdateBy(beegouser.GetUserId(c.Ctx))
  98. reqData.SetDeptId(beegouser.GetDeptId(c.Ctx))
  99. err := s.StockTemplateInEdit(&reqData)
  100. if err != nil {
  101. c.Error(500, err, err.Error())
  102. return
  103. }
  104. c.OK(reqData.GetId(), "修改入库信息成功")
  105. }
  106. // StockTemplateInDelete 删除入库
  107. // @Summary 删除入库
  108. // @Description 删除入库
  109. // @Tags 库存
  110. // @Param body body dto.StockTemplateInDeleteReq true "body"
  111. // @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
  112. // @Router /stock-template/in [post]
  113. // @Security Bearer
  114. func (c StockTemplateController) StockTemplateInDelete() {
  115. s := services.StockTemplate{}
  116. reqData := dto.StockTemplateInDeleteReq{}
  117. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  118. c.Error(global.ParseFormErr, err, err.Error())
  119. return
  120. }
  121. reqData.SetUpdateBy(beegouser.GetUserId(c.Ctx))
  122. reqData.SetDeptId(beegouser.GetDeptId(c.Ctx))
  123. err := s.StockTemplateInDelete(&reqData)
  124. if err != nil {
  125. c.Error(500, err, err.Error())
  126. return
  127. }
  128. c.OK(reqData.GetId(), "删除入库信息成功")
  129. }
  130. // BatchStockTemplateIn 批量入库
  131. // @Summary 批量入库
  132. // @Description 批量入库
  133. // @Tags 库存
  134. // @Param body body dto.BatchStockTemplateInInsertReq true "body"
  135. // @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
  136. // @Router /stock-template/in [post]
  137. // @Security Bearer
  138. func (c StockTemplateController) BatchStockTemplateIn() {
  139. s := services.StockTemplate{}
  140. reqData := dto.BatchStockTemplateInInsertReq{}
  141. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  142. c.Error(global.ParseFormErr, err, err.Error())
  143. return
  144. }
  145. reqData.SetCreateBy(beegouser.GetUserId(c.Ctx))
  146. reqData.SetDeptId(beegouser.GetDeptId(c.Ctx))
  147. err := s.BatchStockTemplateIn(&reqData)
  148. if err != nil {
  149. c.Error(500, err, err.Error())
  150. return
  151. }
  152. c.OK(nil, "入库成功")
  153. }
  154. // StockTemplateOut 出库
  155. // @Summary 出库
  156. // @Description 出库
  157. // @Tags 库存
  158. // @Param body body dto.StockTemplateOutInsertReq true "body"
  159. // @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
  160. // @Router /stock-template/out [post]
  161. // @Security Bearer
  162. func (c StockTemplateController) StockTemplateOut() {
  163. s := services.StockTemplate{}
  164. reqData := dto.StockTemplateOutInsertReq{}
  165. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  166. c.Error(global.ParseFormErr, err, err.Error())
  167. return
  168. }
  169. reqData.SetCreateBy(beegouser.GetUserId(c.Ctx))
  170. reqData.SetDeptId(beegouser.GetDeptId(c.Ctx))
  171. err := s.StockTemplateOut(&reqData)
  172. if err != nil {
  173. c.Error(500, err, err.Error())
  174. return
  175. }
  176. c.OK(reqData.GetId(), "出库成功")
  177. }
  178. // StockTemplateOutScanCode 扫码出库
  179. // @Summary 扫码出库
  180. // @Description 扫码出库
  181. // @Tags 库存
  182. // @Param body body dto.StockTemplateOutInsertReq true "body"
  183. // @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
  184. // @Router /stock-template/out [post]
  185. // @Security Bearer
  186. func (c StockTemplateController) StockTemplateOutScanCode() {
  187. s := services.StockTemplate{}
  188. reqData := dto.BatchStockTemplateOutInsertReq{}
  189. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  190. c.Error(global.ParseFormErr, err, err.Error())
  191. return
  192. }
  193. reqData.SetCreateBy(beegouser.GetUserId(c.Ctx))
  194. reqData.SetDeptId(beegouser.GetDeptId(c.Ctx))
  195. err := s.StockTemplateOutScanCode(&reqData)
  196. if err != nil {
  197. c.Error(500, err, err.Error())
  198. return
  199. }
  200. c.OK(nil, "扫码出库成功")
  201. }
  202. // StockTemplateOutEdit 修改入库
  203. // @Summary 修改入库
  204. // @Description 修改入库
  205. // @Tags 库存
  206. // @Param body body dto.StockTemplateOutEditReq true "body"
  207. // @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
  208. // @Router /stock-template/in [post]
  209. // @Security Bearer
  210. func (c StockTemplateController) StockTemplateOutEdit() {
  211. s := services.StockTemplate{}
  212. reqData := dto.StockTemplateOutEditReq{}
  213. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  214. c.Error(global.ParseFormErr, err, err.Error())
  215. return
  216. }
  217. reqData.SetUpdateBy(beegouser.GetUserId(c.Ctx))
  218. reqData.SetDeptId(beegouser.GetDeptId(c.Ctx))
  219. err := s.StockTemplateOutEdit(&reqData)
  220. if err != nil {
  221. c.Error(500, err, err.Error())
  222. return
  223. }
  224. c.OK(reqData.GetId(), "修改出库信息成功")
  225. }
  226. // StockTemplateOutDelete 删除入库
  227. // @Summary 删除入库
  228. // @Description 删除入库
  229. // @Tags 库存
  230. // @Param body body dto.StockTemplateOutDeleteReq true "body"
  231. // @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
  232. // @Router /stock-template/in [post]
  233. // @Security Bearer
  234. func (c StockTemplateController) StockTemplateOutDelete() {
  235. s := services.StockTemplate{}
  236. reqData := dto.StockTemplateOutDeleteReq{}
  237. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  238. c.Error(global.ParseFormErr, err, err.Error())
  239. return
  240. }
  241. reqData.SetUpdateBy(beegouser.GetUserId(c.Ctx))
  242. reqData.SetDeptId(beegouser.GetDeptId(c.Ctx))
  243. err := s.StockTemplateOutDelete(&reqData)
  244. if err != nil {
  245. c.Error(500, err, err.Error())
  246. return
  247. }
  248. c.OK(reqData.GetId(), "删除出库信息成功")
  249. }
  250. // BatchStockTemplateOut 批量出库
  251. // @Summary 批量出库
  252. // @Description 批量出库
  253. // @Tags 库存
  254. // @Param body body dto.StockTemplateOutInsertReq true "body"
  255. // @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
  256. // @Router /stock-template/out [post]
  257. // @Security Bearer
  258. func (c StockTemplateController) BatchStockTemplateOut() {
  259. s := services.StockTemplate{}
  260. reqData := dto.BatchStockTemplateOutInsertReq{}
  261. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  262. c.Error(global.ParseFormErr, err, err.Error())
  263. return
  264. }
  265. reqData.SetCreateBy(beegouser.GetUserId(c.Ctx))
  266. reqData.SetDeptId(beegouser.GetDeptId(c.Ctx))
  267. err := s.BatchStockTemplateOut(&reqData)
  268. if err != nil {
  269. c.Error(500, err, err.Error())
  270. return
  271. }
  272. c.OK(nil, "出库成功")
  273. }
  274. // StockTemplateInList 入库列表
  275. // @Summary 入库列表
  276. // @Description 入库列表
  277. // @Tags 库存
  278. // @Param body body dto.StockTemplateInPageReq true "body"
  279. // @Success 200 {object} response.Page "{"code": 200, "data": [...]}"
  280. // @Router /stock-template/in/list [post]
  281. // @Security Bearer
  282. func (c StockTemplateController) StockTemplateInList() {
  283. s := services.StockTemplate{}
  284. reqData := dto.StockTemplateInPageReq{}
  285. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  286. c.Error(global.ParseFormErr, err, err.Error())
  287. return
  288. }
  289. deptId := beegouser.GetDeptId(c.Ctx)
  290. list, count, err := s.StockTemplateInList(&reqData, deptId)
  291. if err != nil {
  292. c.Error(500, err, err.Error())
  293. return
  294. }
  295. c.PageOK(list, int(count), reqData.GetPageIndex(), reqData.GetPageSize(), "查询成功")
  296. }
  297. // StockTemplateOutList 出库列表
  298. // @Summary 出库列表
  299. // @Description 出库列表
  300. // @Tags 库存
  301. // @Param body body dto.StockTemplateOutPageReq true "body"
  302. // @Success 200 {object} response.Page "{"code": 200, "data": [...]}"
  303. // @Router /stock-template/out/list [post]
  304. // @Security Bearer
  305. func (c StockTemplateController) StockTemplateOutList() {
  306. s := services.StockTemplate{}
  307. reqData := dto.StockTemplateOutPageReq{}
  308. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  309. c.Error(global.ParseFormErr, err, err.Error())
  310. return
  311. }
  312. deptId := beegouser.GetDeptId(c.Ctx)
  313. list, count, err := s.StockTemplateOutList(&reqData, deptId)
  314. if err != nil {
  315. c.Error(500, err, err.Error())
  316. return
  317. }
  318. c.PageOK(list, int(count), reqData.GetPageIndex(), reqData.GetPageSize(), "查询成功")
  319. }
  320. // StockTemplateInventoryList 收发记录
  321. // @Summary 收发记录
  322. // @Description 收发记录
  323. // @Tags 库存
  324. // @Param body body dto.StockTemplateInventoryPageReq true "body"
  325. // @Success 200 {object} response.Page "{"code": 200, "data": [...]}"
  326. // @Router /stock/inventory/list [post]
  327. // @Security Bearer
  328. func (c StockTemplateController) StockTemplateInventoryList() {
  329. s := services.StockTemplate{}
  330. reqData := dto.StockTemplateInventoryPageReq{}
  331. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  332. c.Error(global.ParseFormErr, err, err.Error())
  333. return
  334. }
  335. deptId := beegouser.GetDeptId(c.Ctx)
  336. list, count, err := s.StockTemplateInventoryList(&reqData, deptId)
  337. if err != nil {
  338. c.Error(500, err, err.Error())
  339. return
  340. }
  341. c.PageOK(list, int(count), reqData.GetPageIndex(), reqData.GetPageSize(), "查询成功")
  342. }
  343. // StockTemplateInventoryExcel 收发登记表
  344. // @Summary 收发登记表
  345. // @Description 收发登记表
  346. // @Tags 库存
  347. // @Param body body dto.StockTemplateInventoryExcelReq true "body"
  348. // @Success 200 {object} response.Page "{"code": 200, "data": [...]}"
  349. // @Router /stock-template/inventory/list [post]
  350. // @Security Bearer
  351. func (c StockTemplateController) StockTemplateInventoryExcel(reqData dto.StockTemplateInventoryExcelReq) {
  352. s := services.StockTemplate{}
  353. deptId := beegouser.GetDeptId(c.Ctx)
  354. models.InitBasicData(deptId)
  355. medicineInfo, err := s.GetMedicineInfo(deptId, map[string]interface{}{
  356. "product_id": reqData.ProductID,
  357. "enterprise_id": reqData.EnterpriseID,
  358. "spec_id": reqData.SpecId,
  359. "batch_number": reqData.BatchNumber,
  360. })
  361. if err != nil {
  362. c.Error(global.BadRequest, err, "药品信息不存在")
  363. return
  364. }
  365. var productName, specName, unitName, dosageFormName string
  366. if id, ok := medicineInfo[models.FieldProductID]; ok {
  367. productName = models.Read_Product_Get(utils.ToInt(id))
  368. }
  369. if id, ok := medicineInfo[models.FieldSpecID]; ok {
  370. specName = models.Read_Spec_Get(utils.ToInt(id))
  371. }
  372. if id, ok := medicineInfo[models.FieldUnitID]; ok {
  373. unitName = models.Read_Unit_Get(utils.ToInt(id))
  374. }
  375. if id, ok := medicineInfo[models.FieldDosageFormID]; ok {
  376. dosageFormName = models.Read_DosageForm_Get(utils.ToInt(id))
  377. }
  378. list, err := s.StockTemplateInventoryExcel(&reqData, deptId)
  379. if err != nil {
  380. c.Error(500, err, err.Error())
  381. return
  382. }
  383. f := excelize.NewFile() // 设置单元格的值
  384. StyleTitle, _ := f.NewStyle(
  385. &excelize.Style{
  386. Font: &excelize.Font{Bold: true, Size: 20, Family: "宋体"},
  387. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"},
  388. })
  389. f.MergeCell("Sheet1", "A1", "O1")
  390. f.SetRowStyle("Sheet1", 1, 1, StyleTitle)
  391. f.SetRowHeight("Sheet1", 1, 50)
  392. var interval string
  393. if len(reqData.StartDate) > 0 && len(reqData.EndDate) > 0 {
  394. interval = fmt.Sprintf("%s至%s", reqData.StartDate, reqData.EndDate)
  395. }
  396. f.SetCellValue("Sheet1", "A1", fmt.Sprintf("%s收发登记表", interval))
  397. StyleLittleTitle, _ := f.NewStyle(
  398. &excelize.Style{
  399. Font: &excelize.Font{Size: 12, Family: "宋体"},
  400. })
  401. f.SetCellValue("Sheet1", "K2", fmt.Sprintf("制品名称:%s", productName))
  402. f.SetCellValue("Sheet1", "K3", fmt.Sprintf("剂型:%s 规格:%s 单位:%s", dosageFormName, specName, unitName))
  403. f.SetRowStyle("Sheet1", 2, 3, StyleLittleTitle)
  404. // 这里设置表头
  405. f.MergeCell("Sheet1", "A4", "A5")
  406. f.SetCellValue("Sheet1", "A4", "日期")
  407. f.MergeCell("Sheet1", "B4", "B5")
  408. f.SetCellValue("Sheet1", "B4", "购货/发货单位")
  409. f.MergeCell("Sheet1", "C4", "C5")
  410. f.SetCellValue("Sheet1", "C4", "生产企业")
  411. f.MergeCell("Sheet1", "D4", "D5")
  412. f.SetCellValue("Sheet1", "D4", "批准文号")
  413. f.MergeCell("Sheet1", "E4", "E5")
  414. f.SetCellValue("Sheet1", "E4", "批签发合格证编号")
  415. f.MergeCell("Sheet1", "F4", "H4")
  416. f.SetCellValue("Sheet1", "F4", "收入")
  417. f.SetCellValue("Sheet1", "F5", "数量")
  418. f.SetCellValue("Sheet1", "G5", "批号")
  419. f.SetCellValue("Sheet1", "H5", "失效日期")
  420. f.MergeCell("Sheet1", "I4", "K4")
  421. f.SetCellValue("Sheet1", "I4", "支出")
  422. f.SetCellValue("Sheet1", "I5", "数量")
  423. f.SetCellValue("Sheet1", "J5", "批号")
  424. f.SetCellValue("Sheet1", "K5", "失效日期")
  425. f.MergeCell("Sheet1", "L4", "N4")
  426. f.SetCellValue("Sheet1", "L4", "结余")
  427. f.SetCellValue("Sheet1", "L5", "数量")
  428. f.SetCellValue("Sheet1", "M5", "批号")
  429. f.SetCellValue("Sheet1", "N5", "失效日期")
  430. f.MergeCell("Sheet1", "O4", "O5")
  431. f.SetCellValue("Sheet1", "O4", "经办人签字")
  432. // 设置列宽
  433. f.SetColWidth("Sheet1", "A", "B", 10)
  434. f.SetColWidth("Sheet1", "B", "C", 14)
  435. f.SetColWidth("Sheet1", "C", "F", 12)
  436. f.SetColWidth("Sheet1", "F", "G", 8)
  437. f.SetColWidth("Sheet1", "G", "I", 12)
  438. f.SetColWidth("Sheet1", "I", "J", 8)
  439. f.SetColWidth("Sheet1", "J", "L", 12)
  440. f.SetColWidth("Sheet1", "L", "M", 8)
  441. f.SetColWidth("Sheet1", "M", "O", 12)
  442. f.SetColWidth("Sheet1", "O", "P", 12)
  443. line := 5
  444. // 循环写入数据
  445. for _, v := range list {
  446. line++
  447. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), v["date"])
  448. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v[models.FieldEnterpriseName])
  449. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v[models.FieldApprovalNumber])
  450. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v[models.FieldQualificationNumber])
  451. if utils.ToInt(v["stock_in_id"]) > 0 {
  452. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v["forwarding_unit"])
  453. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), utils.ToInt(v["total_in"]))
  454. f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), v[models.FieldApprovalNumber])
  455. f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), utils.ToDate(v[models.FieldExpiryDate]))
  456. }
  457. if utils.ToInt(v["stock_out_id"]) > 0 {
  458. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v["receiving_unit"])
  459. f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), utils.ToInt(v["total_out"]))
  460. f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), v[models.FieldApprovalNumber])
  461. f.SetCellValue("Sheet1", fmt.Sprintf("K%d", line), utils.ToDate(v[models.FieldExpiryDate]))
  462. }
  463. f.SetCellValue("Sheet1", fmt.Sprintf("L%d", line), utils.ToInt(v["balance"]))
  464. f.SetCellValue("Sheet1", fmt.Sprintf("M%d", line), v[models.FieldApprovalNumber])
  465. f.SetCellValue("Sheet1", fmt.Sprintf("N%d", line), utils.ToDate(v[models.FieldExpiryDate]))
  466. f.SetCellValue("Sheet1", fmt.Sprintf("O%d", line), v["operator"])
  467. }
  468. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line+1), "保管单位:"+beegouser.GetDeptName(c.Ctx))
  469. f.SetRowStyle("Sheet1", line+1, line+1, StyleLittleTitle)
  470. Style1, _ := f.NewStyle(
  471. &excelize.Style{
  472. Font: &excelize.Font{Size: 13, Family: "宋体", Bold: true},
  473. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  474. Border: []excelize.Border{
  475. {Type: "left", Color: "000000", Style: 1},
  476. {Type: "top", Color: "000000", Style: 1},
  477. {Type: "bottom", Color: "000000", Style: 1},
  478. {Type: "right", Color: "000000", Style: 1},
  479. },
  480. })
  481. f.SetCellStyle("Sheet1", "A4", "O5", Style1)
  482. Style2, _ := f.NewStyle(
  483. &excelize.Style{
  484. Font: &excelize.Font{Size: 12, Family: "宋体"},
  485. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  486. Border: []excelize.Border{
  487. {Type: "left", Color: "000000", Style: 1},
  488. {Type: "top", Color: "000000", Style: 1},
  489. {Type: "bottom", Color: "000000", Style: 1},
  490. {Type: "right", Color: "000000", Style: 1},
  491. },
  492. })
  493. f.SetCellStyle("Sheet1", "A6", fmt.Sprintf("O%d", line), Style2)
  494. filename := "收发登记表" + time.Now().Format("20060102150405") + ".xlsx"
  495. // 保存文件
  496. if err := f.SaveAs("ofile/" + filename); err != nil {
  497. fmt.Println(err)
  498. }
  499. defer func() {
  500. os.Remove("ofile/" + filename)
  501. }()
  502. // 返回生成的 Excel 文件
  503. c.Ctx.Output.Download("ofile/" + filename)
  504. }
  505. func (c StockTemplateController) StockTemplateInventoryPdf(reqData dto.StockTemplateInventoryExcelReq) {
  506. s := services.StockTemplate{}
  507. deptId := beegouser.GetDeptId(c.Ctx)
  508. models.InitBasicData(deptId)
  509. medicineInfo, err := s.GetMedicineInfo(deptId, map[string]interface{}{
  510. "product_id": reqData.ProductID,
  511. "enterprise_id": reqData.EnterpriseID,
  512. "spec_id": reqData.SpecId,
  513. "batch_number": reqData.BatchNumber,
  514. })
  515. if err != nil {
  516. c.Error(global.BadRequest, err, "药品信息不存在")
  517. return
  518. }
  519. var productName, specName, unitName, dosageFormName string
  520. if id, ok := medicineInfo[models.FieldProductID]; ok {
  521. productName = models.Read_Product_Get(utils.ToInt(id))
  522. }
  523. if id, ok := medicineInfo[models.FieldSpecID]; ok {
  524. specName = models.Read_Spec_Get(utils.ToInt(id))
  525. }
  526. if id, ok := medicineInfo[models.FieldUnitID]; ok {
  527. unitName = models.Read_Unit_Get(utils.ToInt(id))
  528. }
  529. if id, ok := medicineInfo[models.FieldDosageFormID]; ok {
  530. dosageFormName = models.Read_DosageForm_Get(utils.ToInt(id))
  531. }
  532. list, err := s.StockTemplateInventoryExcel(&reqData, deptId)
  533. if err != nil {
  534. c.Error(500, err, err.Error())
  535. return
  536. }
  537. //cols := []float64{20, 24, 20, 18, 20, 12, 22, 20, 12, 22, 20, 12, 22, 20, 15}
  538. cols := []float64{58, 73, 59, 53, 53, 35, 65, 59, 40}
  539. cols1 := []float64{58, 73, 59, 53, 53, 35, 65, 59, 35, 65, 59, 35, 65, 59, 40}
  540. rows := [][]string{}
  541. for _, row := range list {
  542. temp := []string{}
  543. temp = append(temp, fmt.Sprintf("%v", row["date"]))
  544. if utils.ToInt(row["stock_in_id"]) > 0 {
  545. temp = append(temp, fmt.Sprintf("%s", row["forwarding_unit"]))
  546. } else if utils.ToInt(row["stock_out_id"]) > 0 {
  547. temp = append(temp, fmt.Sprintf("%s", row["receiving_unit"]))
  548. }
  549. temp = append(temp, fmt.Sprintf("%s", row[models.FieldEnterpriseName]))
  550. if row[models.FieldApprovalNumber] != nil {
  551. temp = append(temp, fmt.Sprintf("%s", row[models.FieldApprovalNumber]))
  552. } else {
  553. temp = append(temp, "")
  554. }
  555. if row[models.FieldQualificationNumber] != nil {
  556. temp = append(temp, fmt.Sprintf("%s", row[models.FieldQualificationNumber]))
  557. } else {
  558. temp = append(temp, "")
  559. }
  560. if utils.ToInt(row["stock_in_id"]) > 0 {
  561. temp = append(temp, fmt.Sprintf("%d", row["total_in"]))
  562. temp = append(temp, fmt.Sprintf("%s", row[models.FieldBatchNumber]))
  563. temp = append(temp, fmt.Sprintf("%s", utils.ToDate(row[models.FieldExpiryDate])))
  564. } else {
  565. temp = append(temp, "")
  566. temp = append(temp, "")
  567. temp = append(temp, "")
  568. }
  569. if utils.ToInt(row["stock_out_id"]) > 0 {
  570. temp = append(temp, fmt.Sprintf("%d", row["total_out"]))
  571. temp = append(temp, fmt.Sprintf("%s", row[models.FieldBatchNumber]))
  572. temp = append(temp, fmt.Sprintf("%s", utils.ToDate(row[models.FieldExpiryDate])))
  573. } else {
  574. temp = append(temp, "")
  575. temp = append(temp, "")
  576. temp = append(temp, "")
  577. }
  578. temp = append(temp, fmt.Sprintf("%d", row["balance"]))
  579. temp = append(temp, fmt.Sprintf("%s", row[models.FieldBatchNumber]))
  580. temp = append(temp, fmt.Sprintf("%s", utils.ToDate(row[models.FieldExpiryDate])))
  581. temp = append(temp, fmt.Sprintf("%s", row["operator"]))
  582. rows = append(rows, temp)
  583. }
  584. pdf := &gopdf.GoPdf{}
  585. pdf.Start(gopdf.Config{PageSize: gopdf.Rect{W: 841.89, H: 595.28}})
  586. pdf.SetMarginTop(20)
  587. pdf.SetMarginBottom(40)
  588. pdf.AddPage()
  589. pdf.AddTTFFont("simsun", "static/fonts/MiSans-Medium.ttf")
  590. pdf.SetFont("simsun", "", 22)
  591. titleStr := "收发登记表"
  592. titleWd, _ := pdf.MeasureTextWidth(titleStr)
  593. pdf.SetX((842 / 2) - (titleWd / 2))
  594. pdf.SetY(70)
  595. pdf.Text(titleStr)
  596. pdf.SetFont("simsun", "", 10)
  597. x := 20.
  598. for i := 0; i < 9; i++ {
  599. x += cols1[i]
  600. }
  601. pdf.SetXY(x, 90)
  602. pdf.Text(fmt.Sprintf("制品名称:%s 编号", productName))
  603. pdf.SetXY(x, 110)
  604. pdf.Text(fmt.Sprintf("剂型:%s 规格:%s 单位:%s", dosageFormName, specName, unitName))
  605. curx := 16.
  606. header := []string{"日期", "购货/发货单位", "生产企业", "批准文号", "批签发合格证编号", "收入", "支出", "结余", "经办人签字"}
  607. h := 50.0
  608. pdf.SetFont("simsun", "", 11)
  609. x = curx
  610. y := 116.
  611. pdf.SetXY(curx, y)
  612. for i := 0; i < len(header); i++ {
  613. utils.RectFillColorMultiCell(pdf, header[i], 11, x, y, cols[i], h, 0, 0, 0, gopdf.Center, gopdf.Middle)
  614. if header[i] == "收入" || header[i] == "支出" || header[i] == "结余" {
  615. utils.RectFillColorMultiCell(pdf, header[i], 11, x, y, cols[5]+cols[6]+cols[7], h/2, 0, 0, 0, gopdf.Center, gopdf.Middle)
  616. utils.RectFillColorMultiCell(pdf, "数量", 11, x, y+h/2, cols[5], h/2, 0, 0, 0, gopdf.Center, gopdf.Middle)
  617. utils.RectFillColorMultiCell(pdf, "批号", 11, x+cols[5], y+h/2, cols[6], h/2, 0, 0, 0, gopdf.Center, gopdf.Middle)
  618. utils.RectFillColorMultiCell(pdf, "效期", 11, x+cols[5]+cols[6], y+h/2, cols[7], h/2, 0, 0, 0, gopdf.Center, gopdf.Middle)
  619. x += cols[5] + cols[6] + cols[7]
  620. } else {
  621. x += cols[i]
  622. }
  623. }
  624. pdf.SetFont("simsun", "", 10)
  625. y += h
  626. pdf.SetXY(curx, y)
  627. h = 20.0
  628. for _, row := range rows {
  629. y = pdf.GetY()
  630. x = curx
  631. height := h
  632. for j, txt := range row {
  633. lineTexts, _ := pdf.SplitText(txt, cols1[j])
  634. if len(lineTexts) > 1 {
  635. lineTexts, _ = pdf.SplitText(txt, cols1[j]-4)
  636. lineHt := h * float64(len(lineTexts)) * 0.8
  637. if lineHt > height {
  638. height = lineHt
  639. }
  640. }
  641. }
  642. for i, txt := range row {
  643. width := cols1[i]
  644. utils.RectFillColorMultiCell(pdf, txt, 9, x, y, width, height, 0, 0, 0, gopdf.Center, gopdf.Middle)
  645. x += width
  646. }
  647. pdf.SetNewY(y+height, height)
  648. }
  649. filename := "收发登记表" + time.Now().Format("20060102150405") + ".pdf"
  650. // 保存文件
  651. if err := pdf.WritePdf("ofile/" + filename); err != nil {
  652. fmt.Println(err)
  653. }
  654. defer func() {
  655. os.Remove("ofile/" + filename)
  656. }()
  657. // 返回生成的 Excel 文件
  658. c.Ctx.Output.Download("ofile/" + filename)
  659. }
  660. func (c StockTemplateController) StockTemplateInventoryExport() {
  661. reqData := dto.StockTemplateInventoryExcelReq{}
  662. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  663. c.Error(global.ParseFormErr, err, err.Error())
  664. return
  665. }
  666. if reqData.Type == "excel" {
  667. c.StockTemplateInventoryExcel(reqData)
  668. }
  669. if reqData.Type == "pdf" {
  670. c.StockTemplateInventoryPdf(reqData)
  671. }
  672. }
  673. func (c StockTemplateController) TransportRecordWord(reqData models.TransportRecord) {
  674. s := services.StockTemplate{}
  675. deptId := beegouser.GetDeptId(c.Ctx)
  676. list, err := s.StockTemplateTransportRecordWord(&reqData, deptId)
  677. if err != nil {
  678. c.Error(500, err, err.Error())
  679. return
  680. }
  681. doc := document.New()
  682. // 获取文档的默认页面设置
  683. doc.BodySection().SetPageMargins(
  684. 0.3*measurement.Inch,
  685. 0.4*measurement.Inch,
  686. 0.5*measurement.Inch,
  687. 0.3*measurement.Inch,
  688. 1*measurement.Inch,
  689. 0.4*measurement.Inch,
  690. 0.1*measurement.Inch)
  691. ftr := doc.AddFooter()
  692. para := ftr.AddParagraph()
  693. //para.Properties().AddTabStop(0.1*measurement.Inch, wml.ST_TabJcCenter, wml.ST_TabTlcNone)
  694. para.Properties().SetAlignment(wml.ST_JcCenter)
  695. run := para.AddRun()
  696. run.Properties().SetFontFamily("宋体")
  697. run.Properties().SetSize(10)
  698. run.AddTab()
  699. run.AddText("第 ")
  700. run.AddFieldWithFormatting(document.FieldCurrentPage, "", false)
  701. run.AddText(" 页 / 共 ")
  702. run.AddFieldWithFormatting(document.FieldNumberOfPages, "", false)
  703. run.AddText(" 页")
  704. //doc.BodySection().SetFooter(ftr, wml.ST_HdrFtrDefault)
  705. para = doc.AddParagraph()
  706. para.Properties().SetAlignment(wml.ST_JcCenter)
  707. run = para.AddRun()
  708. run.Properties().SetBold(true)
  709. run.Properties().SetFontFamily("宋体")
  710. run.Properties().SetSize(14)
  711. para.Properties().Spacing().SetLineSpacing(18*measurement.Point, wml.ST_LineSpacingRuleAuto)
  712. run.AddText("表3-4 运输记录表")
  713. para = doc.AddParagraph()
  714. run = para.AddRun()
  715. run.Properties().SetFontFamily("宋体")
  716. run.Properties().SetSize(12)
  717. para.Properties().SetAlignment(wml.ST_JcCenter)
  718. para.Properties().Spacing().SetLineSpacing(30*measurement.Point, wml.ST_LineSpacingRuleAuto)
  719. run.AddText("(各级通用)")
  720. para = doc.AddParagraph()
  721. run = para.AddRun()
  722. run.Properties().SetFontFamily("宋体")
  723. run.Properties().SetSize(10)
  724. para.Properties().SetAlignment(wml.ST_JcLeft)
  725. para.Properties().Spacing().SetLineSpacing(20*measurement.Point, wml.ST_LineSpacingRuleAuto)
  726. run.AddText("运输工具: □冷藏车 □运输车 □普通车辆 □无 □其他")
  727. run = para.AddRun()
  728. run.AddText(" ")
  729. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  730. para = doc.AddParagraph()
  731. run = para.AddRun()
  732. run.Properties().SetFontFamily("宋体")
  733. run.Properties().SetSize(10)
  734. para.Properties().SetAlignment(wml.ST_JcLeft)
  735. para.Properties().Spacing().SetLineSpacing(20*measurement.Point, wml.ST_LineSpacingRuleAuto)
  736. run.AddText("冷藏工具: □冷藏车 □车载冷藏箱 □冷藏箱或冷藏包 □其他")
  737. run = para.AddRun()
  738. run.AddText(" ")
  739. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  740. para = doc.AddParagraph()
  741. run = para.AddRun()
  742. run.Properties().SetFontFamily("宋体")
  743. run.Properties().SetSize(10)
  744. para.Properties().SetAlignment(wml.ST_JcLeft)
  745. para.Properties().Spacing().SetLineSpacing(20*measurement.Point, wml.ST_LineSpacingRuleAuto)
  746. run.AddText("配送方式: □本级配送(车牌号:")
  747. run = para.AddRun()
  748. run.AddText(" ")
  749. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  750. run = para.AddRun()
  751. run.Properties().SetFontFamily("宋体")
  752. run.Properties().SetSize(10)
  753. run.AddText(") □下级自运(车牌号:")
  754. run = para.AddRun()
  755. run.AddText(" ")
  756. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  757. run = para.AddRun()
  758. run.Properties().SetFontFamily("宋体")
  759. run.Properties().SetSize(10)
  760. run.AddText(")")
  761. // --------------------运输情况
  762. para = doc.AddParagraph()
  763. para.Properties().SetAlignment(wml.ST_JcLeft)
  764. run = para.AddRun()
  765. run.Properties().SetBold(true)
  766. run.Properties().SetFontFamily("宋体")
  767. run.Properties().SetSize(10)
  768. run.AddText("运输情况:")
  769. table := doc.AddTable()
  770. table.Properties().SetLayout(wml.ST_TblLayoutTypeFixed)
  771. table.Properties().SetWidthPercent(100)
  772. look := table.Properties().TableLook()
  773. look.SetFirstColumn(true)
  774. look.SetFirstRow(true)
  775. look.SetHorizontalBanding(true)
  776. // width of the page
  777. // with thick borers
  778. borders := table.Properties().Borders()
  779. //borders.SetBottom(wml.ST_BorderSingle, color.Auto, 1*measurement.Point)
  780. //borders.SetLeft(wml.ST_BorderSingle, color.Auto, 1*measurement.Point)
  781. //borders.SetRight(wml.ST_BorderSingle, color.Auto, 1*measurement.Point)
  782. //borders.SetTop(wml.ST_BorderSingle, color.Auto, 1*measurement.Point)
  783. borders.SetAll(wml.ST_BorderSingle, color.Auto, measurement.Zero)
  784. //borders.SetInsideVertical(wml.ST_BorderSingle, color.Auto, measurement.Zero)
  785. row := table.AddRow()
  786. row.Properties().SetHeight(0.35*measurement.Inch, wml.ST_HeightRuleExact)
  787. cell := row.AddCell()
  788. cell.Properties().SetWidthPercent(15)
  789. para = cell.AddParagraph()
  790. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  791. para.Properties().SetAlignment(wml.ST_JcCenter)
  792. run = para.AddRun()
  793. run.Properties().SetFontFamily("宋体")
  794. run.Properties().SetSize(9)
  795. run.AddText("品名")
  796. cell = row.AddCell()
  797. cell.Properties().SetWidthPercent(12)
  798. para = cell.AddParagraph()
  799. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  800. para.Properties().SetAlignment(wml.ST_JcCenter)
  801. run = para.AddRun()
  802. run.Properties().SetFontFamily("宋体")
  803. run.Properties().SetSize(9)
  804. run.AddText("生产企业")
  805. cell = row.AddCell()
  806. cell.Properties().SetWidthPercent(10)
  807. para = cell.AddParagraph()
  808. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  809. para.Properties().SetAlignment(wml.ST_JcCenter)
  810. run = para.AddRun()
  811. run.Properties().SetFontFamily("宋体")
  812. run.Properties().SetSize(9)
  813. run.AddText("批准文号")
  814. cell = row.AddCell()
  815. cell.Properties().SetWidthPercent(15)
  816. para = cell.AddParagraph()
  817. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  818. para.Properties().SetAlignment(wml.ST_JcCenter)
  819. run = para.AddRun()
  820. run.Properties().SetFontFamily("宋体")
  821. run.Properties().SetSize(9)
  822. run.AddText("批签发合格编号")
  823. cell = row.AddCell()
  824. cell.Properties().SetWidthPercent(13)
  825. para = cell.AddParagraph()
  826. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  827. para.Properties().SetAlignment(wml.ST_JcCenter)
  828. run = para.AddRun()
  829. run.Properties().SetFontFamily("宋体")
  830. run.Properties().SetSize(9)
  831. run.AddText("规格(剂/支或粒)")
  832. //cell = row.AddCell()
  833. //cell.Properties().SetWidth(0.5 * measurement.Inch)
  834. //para = cell.AddParagraph()
  835. //cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  836. //para.Properties().SetAlignment(wml.ST_JcCenter)
  837. //run = para.AddRun()
  838. //run.Properties().SetFontFamily("宋体")
  839. //run.Properties().SetSize(8)
  840. //run.AddText("生产日期")
  841. cell = row.AddCell()
  842. cell.Properties().SetWidthPercent(12)
  843. para = cell.AddParagraph()
  844. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  845. para.Properties().SetAlignment(wml.ST_JcCenter)
  846. run = para.AddRun()
  847. run.Properties().SetFontFamily("宋体")
  848. run.Properties().SetSize(9)
  849. run.AddText("批号")
  850. cell = row.AddCell()
  851. cell.Properties().SetWidthPercent(10)
  852. para = cell.AddParagraph()
  853. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  854. para.Properties().SetAlignment(wml.ST_JcCenter)
  855. run = para.AddRun()
  856. run.Properties().SetFontFamily("宋体")
  857. run.Properties().SetSize(9)
  858. run.AddText("失效日期")
  859. cell = row.AddCell()
  860. cell.Properties().SetWidthPercent(6)
  861. para = cell.AddParagraph()
  862. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  863. para.Properties().SetAlignment(wml.ST_JcCenter)
  864. run = para.AddRun()
  865. run.Properties().SetFontFamily("宋体")
  866. run.Properties().SetSize(9)
  867. run.AddText("数量")
  868. cell = row.AddCell()
  869. cell.Properties().SetWidthPercent(6)
  870. para = cell.AddParagraph()
  871. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  872. para.Properties().SetAlignment(wml.ST_JcCenter)
  873. run = para.AddRun()
  874. run.Properties().SetFontFamily("宋体")
  875. run.Properties().SetSize(9)
  876. run.AddText("单位")
  877. models.InitBasicData(deptId)
  878. for _, medicineInfo := range list {
  879. row = table.AddRow()
  880. row.Properties().SetHeight(0.3*measurement.Inch, wml.ST_HeightRuleAtLeast)
  881. cell = row.AddCell()
  882. cell.Properties().SetWidthPercent(15)
  883. para = cell.AddParagraph()
  884. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  885. para.Properties().SetAlignment(wml.ST_JcCenter)
  886. run = para.AddRun()
  887. run.Properties().SetFontFamily("宋体")
  888. run.Properties().SetSize(8)
  889. productName := models.Read_Product_Get(utils.ToInt(medicineInfo[models.FieldProductID]))
  890. run.AddText(productName)
  891. cell = row.AddCell()
  892. cell.Properties().SetWidthPercent(12)
  893. para = cell.AddParagraph()
  894. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  895. para.Properties().SetAlignment(wml.ST_JcCenter)
  896. run = para.AddRun()
  897. run.Properties().SetFontFamily("宋体")
  898. run.Properties().SetSize(8)
  899. enterpriseName := models.Read_Enterprise_Get(utils.ToInt(medicineInfo[models.FieldEnterpriseID]))
  900. run.AddText(enterpriseName)
  901. cell = row.AddCell()
  902. cell.Properties().SetWidthPercent(10)
  903. para = cell.AddParagraph()
  904. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  905. para.Properties().SetAlignment(wml.ST_JcCenter)
  906. run = para.AddRun()
  907. run.Properties().SetFontFamily("宋体")
  908. run.Properties().SetSize(8)
  909. run.AddText(medicineInfo[models.FieldApprovalNumber].(string))
  910. cell = row.AddCell()
  911. cell.Properties().SetWidthPercent(15)
  912. para = cell.AddParagraph()
  913. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  914. para.Properties().SetAlignment(wml.ST_JcCenter)
  915. run = para.AddRun()
  916. run.Properties().SetFontFamily("宋体")
  917. run.Properties().SetSize(8)
  918. if medicineInfo[models.FieldQualificationNumber] != nil {
  919. run.AddText(medicineInfo[models.FieldQualificationNumber].(string))
  920. }
  921. cell = row.AddCell()
  922. cell.Properties().SetWidthPercent(13)
  923. para = cell.AddParagraph()
  924. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  925. para.Properties().SetAlignment(wml.ST_JcCenter)
  926. run = para.AddRun()
  927. run.Properties().SetFontFamily("宋体")
  928. run.Properties().SetSize(8)
  929. specName := models.Read_Spec_Get(utils.ToInt(medicineInfo[models.FieldSpecID]))
  930. run.AddText(specName)
  931. //cell = row.AddCell()
  932. //cell.Properties().SetWidth(0.5 * measurement.Inch)
  933. //para = cell.AddParagraph()
  934. //cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  935. //para.Properties().SetAlignment(wml.ST_JcCenter)
  936. //run = para.AddRun()
  937. //run.Properties().SetFontFamily("宋体")
  938. //run.Properties().SetSize(8)
  939. //run.AddText("生产日期")
  940. cell = row.AddCell()
  941. cell.Properties().SetWidthPercent(12)
  942. para = cell.AddParagraph()
  943. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  944. para.Properties().SetAlignment(wml.ST_JcCenter)
  945. run = para.AddRun()
  946. run.Properties().SetFontFamily("宋体")
  947. run.Properties().SetSize(8)
  948. run.AddText(medicineInfo[models.FieldBatchNumber].(string))
  949. cell = row.AddCell()
  950. cell.Properties().SetWidthPercent(10)
  951. para = cell.AddParagraph()
  952. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  953. para.Properties().SetAlignment(wml.ST_JcCenter)
  954. run = para.AddRun()
  955. run.Properties().SetFontFamily("宋体")
  956. run.Properties().SetSize(8)
  957. run.AddText(utils.ToDate(medicineInfo[models.FieldExpiryDate]))
  958. cell = row.AddCell()
  959. cell.Properties().SetWidthPercent(6)
  960. para = cell.AddParagraph()
  961. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  962. para.Properties().SetAlignment(wml.ST_JcCenter)
  963. run = para.AddRun()
  964. run.Properties().SetFontFamily("宋体")
  965. run.Properties().SetSize(8)
  966. run.AddText(fmt.Sprintf("%d", utils.ToInt(medicineInfo["quantity"])))
  967. cell = row.AddCell()
  968. cell.Properties().SetWidthPercent(6)
  969. para = cell.AddParagraph()
  970. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  971. para.Properties().SetAlignment(wml.ST_JcCenter)
  972. run = para.AddRun()
  973. run.Properties().SetFontFamily("宋体")
  974. run.Properties().SetSize(8)
  975. unitName := models.Read_Unit_Get(utils.ToInt(medicineInfo[models.FieldUnitID]))
  976. run.AddText(unitName)
  977. }
  978. if len(list) < 11 {
  979. for i := 0; i < 11-len(list); i++ {
  980. row = table.AddRow()
  981. row.Properties().SetHeight(0.3*measurement.Inch, wml.ST_HeightRuleAtLeast)
  982. cell = row.AddCell()
  983. cell.Properties().SetWidthPercent(15)
  984. cell = row.AddCell()
  985. cell.Properties().SetWidthPercent(12)
  986. cell = row.AddCell()
  987. cell.Properties().SetWidthPercent(10)
  988. cell = row.AddCell()
  989. cell.Properties().SetWidthPercent(15)
  990. cell = row.AddCell()
  991. cell.Properties().SetWidthPercent(13)
  992. //cell = row.AddCell()
  993. //cell.Properties().SetWidth(0.5 * measurement.Inch)
  994. //para = cell.AddParagraph()
  995. //cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  996. //para.Properties().SetAlignment(wml.ST_JcCenter)
  997. //run = para.AddRun()
  998. //run.Properties().SetFontFamily("宋体")
  999. //run.Properties().SetSize(8)
  1000. //run.AddText("生产日期")
  1001. cell = row.AddCell()
  1002. cell.Properties().SetWidthPercent(12)
  1003. cell = row.AddCell()
  1004. cell.Properties().SetWidthPercent(10)
  1005. cell = row.AddCell()
  1006. cell.Properties().SetWidthPercent(6)
  1007. cell = row.AddCell()
  1008. cell.Properties().SetWidthPercent(6)
  1009. }
  1010. }
  1011. // --------------------运输温度记录
  1012. para = doc.AddParagraph()
  1013. para.Properties().Spacing().SetLineSpacing(25*measurement.Point, wml.ST_LineSpacingRuleAtLeast)
  1014. para.Properties().SetAlignment(wml.ST_JcLeft)
  1015. run = para.AddRun()
  1016. run.Properties().SetBold(true)
  1017. run.Properties().SetFontFamily("宋体")
  1018. run.Properties().SetSize(10)
  1019. run.AddText("运输温度记录:")
  1020. table = doc.InsertTableAfter(para)
  1021. table.Properties().SetWidthPercent(100)
  1022. table.Properties().SetAlignment(wml.ST_JcTableCenter)
  1023. table.Properties().SetLayout(wml.ST_TblLayoutTypeAutofit)
  1024. look = table.Properties().TableLook()
  1025. look.SetFirstColumn(true)
  1026. look.SetFirstRow(true)
  1027. look.SetHorizontalBanding(true)
  1028. borders = table.Properties().Borders()
  1029. borders.SetBottom(wml.ST_BorderSingle, color.Auto, 1*measurement.Point)
  1030. borders.SetLeft(wml.ST_BorderSingle, color.Auto, 1*measurement.Point)
  1031. borders.SetRight(wml.ST_BorderSingle, color.Auto, 1*measurement.Point)
  1032. borders.SetTop(wml.ST_BorderSingle, color.Auto, 1*measurement.Point)
  1033. borders.SetInsideHorizontal(wml.ST_BorderSingle, color.Auto, measurement.Zero)
  1034. borders.SetInsideVertical(wml.ST_BorderSingle, color.Auto, measurement.Zero)
  1035. //-----------------项目名称
  1036. row = table.AddRow()
  1037. cell = row.AddCell()
  1038. cell.Properties().SetWidthPercent(10)
  1039. para = cell.AddParagraph()
  1040. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1041. para.Properties().SetAlignment(wml.ST_JcCenter)
  1042. run = para.AddRun()
  1043. run.Properties().SetFontFamily("宋体")
  1044. run.AddText("")
  1045. cell = row.AddCell()
  1046. cell.Properties().SetWidthPercent(38)
  1047. para = cell.AddParagraph()
  1048. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1049. para.Properties().SetAlignment(wml.ST_JcCenter)
  1050. run = para.AddRun()
  1051. run.Properties().SetFontFamily("宋体")
  1052. run.Properties().SetSize(10)
  1053. run.AddText("日期/时间")
  1054. cell = row.AddCell()
  1055. cell.Properties().SetWidthPercent(19)
  1056. para = cell.AddParagraph()
  1057. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1058. para.Properties().SetAlignment(wml.ST_JcCenter)
  1059. run = para.AddRun()
  1060. run.Properties().SetFontFamily("宋体")
  1061. run.Properties().SetSize(8)
  1062. run.AddText("储存温度")
  1063. cell = row.AddCell()
  1064. cell.Properties().SetWidthPercent(17)
  1065. para = cell.AddParagraph()
  1066. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1067. para.Properties().SetAlignment(wml.ST_JcCenter)
  1068. run = para.AddRun()
  1069. run.Properties().SetFontFamily("宋体")
  1070. run.Properties().SetSize(10)
  1071. run.AddText("冰排状态")
  1072. cell = row.AddCell()
  1073. cell.Properties().SetWidthPercent(16)
  1074. para = cell.AddParagraph()
  1075. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1076. para.Properties().SetAlignment(wml.ST_JcCenter)
  1077. run = para.AddRun()
  1078. run.Properties().SetFontFamily("宋体")
  1079. run.Properties().SetSize(10)
  1080. run.AddText("环境温度")
  1081. //------------------启运
  1082. row = table.AddRow()
  1083. row.Properties().SetHeight(0.4*measurement.Inch, wml.ST_HeightRuleAtLeast)
  1084. cell = row.AddCell()
  1085. cell.Properties().SetWidthPercent(10)
  1086. para = cell.AddParagraph()
  1087. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1088. para.Properties().SetAlignment(wml.ST_JcCenter)
  1089. run = para.AddRun()
  1090. run.Properties().SetFontFamily("宋体")
  1091. run.Properties().SetSize(10)
  1092. run.AddText("启运")
  1093. cell = row.AddCell()
  1094. cell.Properties().SetWidthPercent(38)
  1095. para = cell.AddParagraph()
  1096. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1097. para.Properties().SetAlignment(wml.ST_JcCenter)
  1098. run = para.AddRun()
  1099. run.Properties().SetFontFamily("宋体")
  1100. run.Properties().SetSize(10)
  1101. run = para.AddRun()
  1102. run.AddText(" ")
  1103. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1104. run = para.AddRun()
  1105. run.Properties().SetFontFamily("宋体")
  1106. run.Properties().SetSize(10)
  1107. run.AddText("年")
  1108. run = para.AddRun()
  1109. run.Properties().SetFontFamily("宋体")
  1110. run.Properties().SetSize(10)
  1111. run = para.AddRun()
  1112. run.AddText(" ")
  1113. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1114. run = para.AddRun()
  1115. run.Properties().SetFontFamily("宋体")
  1116. run.Properties().SetSize(10)
  1117. run.AddText("月")
  1118. run = para.AddRun()
  1119. run.AddText(" ")
  1120. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1121. run = para.AddRun()
  1122. run.Properties().SetFontFamily("宋体")
  1123. run.Properties().SetSize(10)
  1124. run = para.AddRun()
  1125. run.Properties().SetFontFamily("宋体")
  1126. run.Properties().SetSize(10)
  1127. run.AddText("日")
  1128. run = para.AddRun()
  1129. run.AddText(" ")
  1130. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1131. run = para.AddRun()
  1132. run.Properties().SetFontFamily("宋体")
  1133. run.Properties().SetSize(10)
  1134. run.AddText("时")
  1135. run = para.AddRun()
  1136. run.AddText(" ")
  1137. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1138. run = para.AddRun()
  1139. run.Properties().SetFontFamily("宋体")
  1140. run.Properties().SetSize(10)
  1141. run.AddText("分")
  1142. cell = row.AddCell()
  1143. cell.Properties().SetWidthPercent(19)
  1144. para = cell.AddParagraph()
  1145. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1146. para.Properties().SetAlignment(wml.ST_JcCenter)
  1147. run = para.AddRun()
  1148. run.Properties().SetFontFamily("宋体")
  1149. run.Properties().SetSize(10)
  1150. run.AddText(" ")
  1151. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1152. run = para.AddRun()
  1153. run.Properties().SetFontFamily("宋体")
  1154. run.Properties().SetSize(10)
  1155. run.AddText("℃")
  1156. cell = row.AddCell()
  1157. cell.Properties().SetWidthPercent(17)
  1158. para = cell.AddParagraph()
  1159. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1160. para.Properties().SetAlignment(wml.ST_JcCenter)
  1161. run.AddText("")
  1162. cell = row.AddCell()
  1163. cell.Properties().SetWidthPercent(16)
  1164. para = cell.AddParagraph()
  1165. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1166. para.Properties().SetAlignment(wml.ST_JcCenter)
  1167. run = para.AddRun()
  1168. run.Properties().SetFontFamily("宋体")
  1169. run.Properties().SetSize(10)
  1170. run.AddText(" ")
  1171. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1172. run = para.AddRun()
  1173. run.Properties().SetFontFamily("宋体")
  1174. run.Properties().SetSize(10)
  1175. run.AddText("℃")
  1176. //------------------途中
  1177. row = table.AddRow()
  1178. row.Properties().SetHeight(0.8*measurement.Inch, wml.ST_HeightRuleAtLeast)
  1179. cell = row.AddCell()
  1180. cell.Properties().SetWidthPercent(10)
  1181. para = cell.AddParagraph()
  1182. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1183. para.Properties().SetAlignment(wml.ST_JcCenter)
  1184. run = para.AddRun()
  1185. run.Properties().SetFontFamily("宋体")
  1186. run.Properties().SetSize(10)
  1187. run.AddText("途中")
  1188. cell = row.AddCell()
  1189. cell.Properties().SetWidthPercent(38)
  1190. para = cell.AddParagraph()
  1191. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1192. para.Properties().SetAlignment(wml.ST_JcCenter)
  1193. para.Properties().Spacing().SetLineSpacing(20*measurement.Point, wml.ST_LineSpacingRuleAuto)
  1194. run = para.AddRun()
  1195. run.Properties().SetFontFamily("宋体")
  1196. run.Properties().SetSize(10)
  1197. run = para.AddRun()
  1198. run.AddText(" ")
  1199. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1200. run = para.AddRun()
  1201. run.Properties().SetFontFamily("宋体")
  1202. run.Properties().SetSize(10)
  1203. run.AddText("年")
  1204. run = para.AddRun()
  1205. run.Properties().SetFontFamily("宋体")
  1206. run.Properties().SetSize(10)
  1207. run = para.AddRun()
  1208. run.AddText(" ")
  1209. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1210. run = para.AddRun()
  1211. run.Properties().SetFontFamily("宋体")
  1212. run.Properties().SetSize(10)
  1213. run.AddText("月")
  1214. run = para.AddRun()
  1215. run.AddText(" ")
  1216. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1217. run = para.AddRun()
  1218. run.Properties().SetFontFamily("宋体")
  1219. run.Properties().SetSize(10)
  1220. run = para.AddRun()
  1221. run.Properties().SetFontFamily("宋体")
  1222. run.Properties().SetSize(10)
  1223. run.AddText("日")
  1224. run = para.AddRun()
  1225. run.AddText(" ")
  1226. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1227. run = para.AddRun()
  1228. run.Properties().SetFontFamily("宋体")
  1229. run.Properties().SetSize(10)
  1230. run.AddText("时")
  1231. run = para.AddRun()
  1232. run.AddText(" ")
  1233. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1234. run = para.AddRun()
  1235. run.Properties().SetFontFamily("宋体")
  1236. run.Properties().SetSize(10)
  1237. run.AddText("分")
  1238. para = cell.AddParagraph()
  1239. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1240. para.Properties().SetAlignment(wml.ST_JcCenter)
  1241. run = para.AddRun()
  1242. run.Properties().SetFontFamily("宋体")
  1243. run.Properties().SetSize(10)
  1244. run = para.AddRun()
  1245. run.AddText(" ")
  1246. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1247. run = para.AddRun()
  1248. run.Properties().SetFontFamily("宋体")
  1249. run.Properties().SetSize(10)
  1250. run.AddText("年")
  1251. run = para.AddRun()
  1252. run.Properties().SetFontFamily("宋体")
  1253. run.Properties().SetSize(10)
  1254. run = para.AddRun()
  1255. run.AddText(" ")
  1256. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1257. run = para.AddRun()
  1258. run.Properties().SetFontFamily("宋体")
  1259. run.Properties().SetSize(10)
  1260. run.AddText("月")
  1261. run = para.AddRun()
  1262. run.AddText(" ")
  1263. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1264. run = para.AddRun()
  1265. run.Properties().SetFontFamily("宋体")
  1266. run.Properties().SetSize(10)
  1267. run = para.AddRun()
  1268. run.Properties().SetFontFamily("宋体")
  1269. run.Properties().SetSize(10)
  1270. run.AddText("日")
  1271. run = para.AddRun()
  1272. run.AddText(" ")
  1273. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1274. run = para.AddRun()
  1275. run.Properties().SetFontFamily("宋体")
  1276. run.Properties().SetSize(10)
  1277. run.AddText("时")
  1278. run = para.AddRun()
  1279. run.AddText(" ")
  1280. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1281. run = para.AddRun()
  1282. run.Properties().SetFontFamily("宋体")
  1283. run.Properties().SetSize(10)
  1284. run.AddText("分")
  1285. cell = row.AddCell()
  1286. cell.Properties().SetWidthPercent(19)
  1287. para = cell.AddParagraph()
  1288. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1289. para.Properties().SetAlignment(wml.ST_JcCenter)
  1290. para.Properties().Spacing().SetLineSpacing(20*measurement.Point, wml.ST_LineSpacingRuleAuto)
  1291. run = para.AddRun()
  1292. run.Properties().SetFontFamily("宋体")
  1293. run.Properties().SetSize(10)
  1294. run.AddText(" ")
  1295. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1296. run = para.AddRun()
  1297. run.Properties().SetFontFamily("宋体")
  1298. run.Properties().SetSize(10)
  1299. run.AddText("℃")
  1300. para = cell.AddParagraph()
  1301. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1302. para.Properties().SetAlignment(wml.ST_JcCenter)
  1303. run = para.AddRun()
  1304. run.Properties().SetFontFamily("宋体")
  1305. run.Properties().SetSize(10)
  1306. run.AddText(" ")
  1307. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1308. run = para.AddRun()
  1309. run.Properties().SetFontFamily("宋体")
  1310. run.Properties().SetSize(10)
  1311. run.AddText("℃")
  1312. cell = row.AddCell()
  1313. cell.Properties().SetWidthPercent(17)
  1314. para = cell.AddParagraph()
  1315. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1316. para.Properties().SetAlignment(wml.ST_JcCenter)
  1317. run = para.AddRun()
  1318. run.Properties().SetSize(5)
  1319. run.AddText("————————")
  1320. cell = row.AddCell()
  1321. cell.Properties().SetWidthPercent(16)
  1322. para = cell.AddParagraph()
  1323. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1324. para.Properties().SetAlignment(wml.ST_JcCenter)
  1325. para.Properties().Spacing().SetLineSpacing(20*measurement.Point, wml.ST_LineSpacingRuleAuto)
  1326. run = para.AddRun()
  1327. run.Properties().SetFontFamily("宋体")
  1328. run.Properties().SetSize(10)
  1329. run.AddText(" ")
  1330. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1331. run = para.AddRun()
  1332. run.Properties().SetFontFamily("宋体")
  1333. run.Properties().SetSize(10)
  1334. run.AddText("℃")
  1335. para = cell.AddParagraph()
  1336. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1337. para.Properties().SetAlignment(wml.ST_JcCenter)
  1338. run = para.AddRun()
  1339. run.Properties().SetFontFamily("宋体")
  1340. run.Properties().SetSize(10)
  1341. run.AddText(" ")
  1342. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1343. run = para.AddRun()
  1344. run.Properties().SetFontFamily("宋体")
  1345. run.Properties().SetSize(10)
  1346. run.AddText("℃")
  1347. //------------------到达
  1348. row = table.AddRow()
  1349. row.Properties().SetHeight(0.4*measurement.Inch, wml.ST_HeightRuleAtLeast)
  1350. cell = row.AddCell()
  1351. cell.Properties().SetWidthPercent(10)
  1352. para = cell.AddParagraph()
  1353. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1354. para.Properties().SetAlignment(wml.ST_JcCenter)
  1355. run = para.AddRun()
  1356. run.Properties().SetFontFamily("宋体")
  1357. run.Properties().SetSize(10)
  1358. run.AddText("到达")
  1359. cell = row.AddCell()
  1360. cell.Properties().SetWidthPercent(38)
  1361. para = cell.AddParagraph()
  1362. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1363. para.Properties().SetAlignment(wml.ST_JcCenter)
  1364. run = para.AddRun()
  1365. run.Properties().SetFontFamily("宋体")
  1366. run.Properties().SetSize(10)
  1367. run = para.AddRun()
  1368. run.AddText(" ")
  1369. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1370. run = para.AddRun()
  1371. run.Properties().SetFontFamily("宋体")
  1372. run.Properties().SetSize(10)
  1373. run.AddText("年")
  1374. run = para.AddRun()
  1375. run.Properties().SetFontFamily("宋体")
  1376. run.Properties().SetSize(10)
  1377. run = para.AddRun()
  1378. run.AddText(" ")
  1379. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1380. run = para.AddRun()
  1381. run.Properties().SetFontFamily("宋体")
  1382. run.Properties().SetSize(10)
  1383. run.AddText("月")
  1384. run = para.AddRun()
  1385. run.AddText(" ")
  1386. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1387. run = para.AddRun()
  1388. run.Properties().SetFontFamily("宋体")
  1389. run.Properties().SetSize(10)
  1390. run = para.AddRun()
  1391. run.Properties().SetFontFamily("宋体")
  1392. run.Properties().SetSize(10)
  1393. run.AddText("日")
  1394. run = para.AddRun()
  1395. run.AddText(" ")
  1396. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1397. run = para.AddRun()
  1398. run.Properties().SetFontFamily("宋体")
  1399. run.Properties().SetSize(10)
  1400. run.AddText("时")
  1401. run = para.AddRun()
  1402. run.AddText(" ")
  1403. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1404. run = para.AddRun()
  1405. run.Properties().SetFontFamily("宋体")
  1406. run.Properties().SetSize(10)
  1407. run.AddText("分")
  1408. cell = row.AddCell()
  1409. cell.Properties().SetWidthPercent(19)
  1410. para = cell.AddParagraph()
  1411. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1412. para.Properties().SetAlignment(wml.ST_JcCenter)
  1413. run = para.AddRun()
  1414. run.Properties().SetFontFamily("宋体")
  1415. run.Properties().SetSize(10)
  1416. run.AddText(" ")
  1417. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1418. run = para.AddRun()
  1419. run.Properties().SetFontFamily("宋体")
  1420. run.Properties().SetSize(10)
  1421. run.AddText("℃")
  1422. cell = row.AddCell()
  1423. cell.Properties().SetWidthPercent(17)
  1424. para = cell.AddParagraph()
  1425. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1426. para.Properties().SetAlignment(wml.ST_JcCenter)
  1427. run.AddText("")
  1428. cell = row.AddCell()
  1429. cell.Properties().SetWidthPercent(16)
  1430. para = cell.AddParagraph()
  1431. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1432. para.Properties().SetAlignment(wml.ST_JcCenter)
  1433. run = para.AddRun()
  1434. run.Properties().SetFontFamily("宋体")
  1435. run.Properties().SetSize(10)
  1436. run.AddText(" ")
  1437. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1438. run = para.AddRun()
  1439. run.Properties().SetFontFamily("宋体")
  1440. run.Properties().SetSize(10)
  1441. run.AddText("℃")
  1442. para = doc.AddParagraph()
  1443. para.Properties().Spacing().SetLineSpacing(25*measurement.Point, wml.ST_LineSpacingRuleExact)
  1444. para.Properties().SetAlignment(wml.ST_JcLeft)
  1445. run = para.AddRun()
  1446. run.Properties().SetFontFamily("宋体")
  1447. run.Properties().SetSize(10)
  1448. run.AddText("启运至到达行驶里程数:")
  1449. run = para.AddRun()
  1450. run.Properties().SetFontFamily("宋体")
  1451. run.Properties().SetSize(10)
  1452. run.AddText(" ")
  1453. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1454. run = para.AddRun()
  1455. run.Properties().SetFontFamily("宋体")
  1456. run.Properties().SetSize(10)
  1457. run.AddText("千米。")
  1458. table3 := doc.AddTable()
  1459. table3.Properties().SetLayout(wml.ST_TblLayoutTypeFixed)
  1460. table3.Properties().SetWidthPercent(100)
  1461. look.SetFirstColumn(true)
  1462. look.SetFirstRow(true)
  1463. look.SetHorizontalBanding(true)
  1464. look = table3.Properties().TableLook()
  1465. borders3 := table3.Properties().Borders()
  1466. borders3.SetAll(wml.ST_BorderUnset, color.Auto, measurement.Zero)
  1467. row = table3.AddRow()
  1468. row.Properties().SetHeight(0.36*measurement.Inch, wml.ST_HeightRuleExact)
  1469. cell = row.AddCell()
  1470. cell.Properties().SetWidthPercent(50)
  1471. para = cell.AddParagraph()
  1472. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1473. para.Properties().SetAlignment(wml.ST_JcLeft)
  1474. run = para.AddRun()
  1475. run.Properties().SetFontFamily("宋体")
  1476. run.Properties().SetSize(10)
  1477. run.AddText("发货单位:")
  1478. run = para.AddRun()
  1479. run.Properties().SetFontFamily("宋体")
  1480. run.Properties().SetSize(10)
  1481. run.AddText(beegouser.GetDeptName(c.Ctx))
  1482. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1483. cell = row.AddCell()
  1484. cell.Properties().SetWidthPercent(50)
  1485. para = cell.AddParagraph()
  1486. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1487. para.Properties().SetAlignment(wml.ST_JcLeft)
  1488. run = para.AddRun()
  1489. run.Properties().SetFontFamily("宋体")
  1490. run.Properties().SetSize(10)
  1491. run.AddText("发货人签名:")
  1492. run = para.AddRun()
  1493. run.Properties().SetSize(5)
  1494. run.AddText("________________________________________________________________")
  1495. row = table3.AddRow()
  1496. row.Properties().SetHeight(0.36*measurement.Inch, wml.ST_HeightRuleExact)
  1497. cell = row.AddCell()
  1498. cell.Properties().SetWidthPercent(50)
  1499. para = cell.AddParagraph()
  1500. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1501. para.Properties().SetAlignment(wml.ST_JcLeft)
  1502. run = para.AddRun()
  1503. run.Properties().SetFontFamily("宋体")
  1504. run.Properties().SetSize(10)
  1505. run.AddText("收货单位:")
  1506. run = para.AddRun()
  1507. run.Properties().SetFontFamily("宋体")
  1508. run.Properties().SetSize(10)
  1509. run.AddText(reqData.ReceivingUnit)
  1510. run.Properties().SetUnderline(wml.ST_UnderlineSingle, color.Black)
  1511. cell = row.AddCell()
  1512. cell.Properties().SetWidthPercent(50)
  1513. para = cell.AddParagraph()
  1514. cell.Properties().SetVerticalAlignment(wml.ST_VerticalJcCenter)
  1515. para.Properties().SetAlignment(wml.ST_JcLeft)
  1516. run = para.AddRun()
  1517. run.Properties().SetFontFamily("宋体")
  1518. run.Properties().SetSize(10)
  1519. run.AddText("收货人签名:")
  1520. run = para.AddRun()
  1521. run.Properties().SetSize(5)
  1522. run.AddText("________________________________________________________________")
  1523. para = doc.AddParagraph()
  1524. para.Properties().SetAlignment(wml.ST_JcLeft)
  1525. run = para.AddRun()
  1526. run.Properties().SetFontFamily("宋体")
  1527. run.Properties().SetSize(10)
  1528. run.AddText("填表说明:本表供疫苗配送企业、疾病预防控制机构、接种单位疫苗运输时填写;出入库单号为单位编码+年月日+2位流水号;运输超过6小时需记录途中温度,间隔不超过6小时;使用无自动温度显示的冰排保冷设备时,只在启运和达到时填写冰排状态(冻结、冰水混合物、完全融化)。")
  1529. doc.BodySection().SetFooter(ftr, wml.ST_HdrFtrDefault)
  1530. filename := "运输记录表" + time.Now().Format("20060102150405") + ".docx"
  1531. // 保存文件
  1532. if err := doc.SaveToFile("ofile/" + filename); err != nil {
  1533. fmt.Println(err)
  1534. }
  1535. // 保存为PDF文件
  1536. defer func() {
  1537. os.Remove("ofile/" + filename)
  1538. }()
  1539. // 返回生成的 Excel 文件
  1540. c.Ctx.Output.Download("ofile/" + filename)
  1541. }
  1542. func getImageBytes(filePath string) []byte {
  1543. b, err := os.ReadFile(filePath)
  1544. if err != nil {
  1545. panic(err)
  1546. }
  1547. return b
  1548. }
  1549. func (c StockTemplateController) TransportRecordPdf(reqData models.TransportRecord) {
  1550. s := services.StockTemplate{}
  1551. imgSvc := services.MedicineImg{}
  1552. barcodeServ := services.Barcode{}
  1553. deptId := beegouser.GetDeptId(c.Ctx)
  1554. p := actions.GetPermissionFromContext(c.Ctx)
  1555. rootId, err := imgSvc.GetRootID((*context2.Context)(c.Ctx), p.DeptId)
  1556. if err != nil {
  1557. c.Error(global.BadRequest, err, err.Error())
  1558. return
  1559. }
  1560. list, err := s.StockTemplateTransportRecordWord(&reqData, deptId)
  1561. if err != nil {
  1562. c.Error(500, err, err.Error())
  1563. return
  1564. }
  1565. reqData.DeptID = deptId
  1566. reqData.DeptName = beegouser.GetDeptName(c.Ctx)
  1567. reqData.SetCreateBy(beegouser.GetUserId(c.Ctx))
  1568. reqData.SetDeptId(deptId)
  1569. code, err := barcodeServ.Insert(reqData)
  1570. if err != nil {
  1571. err = errors.New("生成条码失败")
  1572. c.Error(500, err, err.Error())
  1573. return
  1574. }
  1575. cs, _ := code128.Encode(code)
  1576. // 创建一个要输出数据的文件
  1577. imgPath := "ofile/img/" + code + ".png"
  1578. file, _ := os.Create(imgPath)
  1579. defer file.Close()
  1580. // 设置图片像素大小
  1581. qrCode, _ := barcode.Scale(cs, 205, 50)
  1582. // 将code128的条形码编码为png图片
  1583. png.Encode(file, qrCode)
  1584. cols := []float64{83, 50, 55, 72, 72, 50, 66, 50, 27, 30}
  1585. header := []string{"品种", "生产企业", "批准文号", "批签发合格编号", "规格(剂/支或粒)", "生产日期", "批号", "失效日期", "数量", "单位"}
  1586. rows := [][]string{}
  1587. imgList := []string{}
  1588. for _, row := range list {
  1589. temp := []string{}
  1590. product := utils.ToString(row[models.FieldProductName])
  1591. enterprise := utils.ToString(row[models.FieldEnterpriseName])
  1592. spec := utils.ToString(row[models.FieldSpecName])
  1593. batchNumber := utils.ToString(row[models.FieldBatchNumber])
  1594. temp = append(temp, product)
  1595. temp = append(temp, fmt.Sprintf("%s", enterprise))
  1596. temp = append(temp, utils.ToString(row[models.FieldApprovalNumber]))
  1597. temp = append(temp, utils.ToString(row[models.FieldQualificationNumber]))
  1598. temp = append(temp, spec)
  1599. temp = append(temp, utils.ToDate(row[models.FieldProducedDate]))
  1600. temp = append(temp, batchNumber)
  1601. temp = append(temp, utils.ToDate(row[models.FieldExpiryDate]))
  1602. temp = append(temp, fmt.Sprintf("%d", utils.ToInt(row["quantity"])))
  1603. temp = append(temp, utils.ToString(row[models.FieldUnitName]))
  1604. rows = append(rows, temp)
  1605. // 获取药品信息图片
  1606. img, err := imgSvc.Get(deptId, rootId, product, enterprise, spec, batchNumber)
  1607. if err == nil && img.Img != "" {
  1608. fmt.Println("==============", img.Img)
  1609. imgList = append(imgList, img.Img)
  1610. }
  1611. }
  1612. if len(list) < 11 {
  1613. for i := 0; i < 11-len(list); i++ {
  1614. rows = append(rows, []string{"", "", "", "", "", "", "", "", "", ""})
  1615. }
  1616. }
  1617. pdf := &gopdf.GoPdf{}
  1618. pdf.Start(gopdf.Config{PageSize: gopdf.Rect{W: 595.28, H: 841.89}})
  1619. pdf.SetMarginTop(40)
  1620. pdf.SetMarginBottom(40)
  1621. pdf.AddPage()
  1622. pdf.AddTTFFont("simsun", "static/fonts/MiSans-Medium.ttf")
  1623. pdf.SetMargins(2, 5, 5, 5)
  1624. pdf.SetFont("simsun", "", 10)
  1625. pdf.SetX(20)
  1626. pdf.SetY(20)
  1627. pdf.Text("[扫码入库]")
  1628. pdf.SetX(20)
  1629. pdf.SetY(32)
  1630. pdf.Text("NO:" + code)
  1631. imgPath2 := "ofile/img/" + code + ".jpg"
  1632. png2j.Con2jpg(imgPath, imgPath2)
  1633. pdf.Image(imgPath2, 20, 35, nil)
  1634. titleStr := "表3-4 运输记录表"
  1635. pdf.SetFont("simsun", "", 22)
  1636. textw, _ := pdf.MeasureTextWidth(titleStr)
  1637. pdf.SetX((595 / 2) - (textw / 2))
  1638. pdf.SetY(40)
  1639. pdf.Text(titleStr)
  1640. pdf.SetFont("simsun", "", 16)
  1641. titleStr = "(各级通用)"
  1642. textw, _ = pdf.MeasureTextWidth(titleStr)
  1643. pdf.SetX((595 / 2) - (textw / 2))
  1644. pdf.SetY(60)
  1645. pdf.Text(titleStr)
  1646. pdf.SetFont("simsun", "", 10)
  1647. curx, y := 20., pdf.GetY()
  1648. y += 35
  1649. pdf.SetXY(curx, y)
  1650. pdf.Text("运输工具: □冷藏车 □运输车 □普通车辆 □无 □其他")
  1651. y += 16
  1652. pdf.SetXY(curx, y)
  1653. pdf.Text("冷藏工具: □冷藏车 □车载冷藏箱 □冷藏箱或冷藏包 □其他")
  1654. y += 16
  1655. pdf.SetXY(curx, y)
  1656. pdf.Text("配送方式: □本级配送(车牌号:_______) □下级自运(车牌号:_______)")
  1657. y += 20
  1658. pdf.SetXY(curx, y)
  1659. pdf.Text("运输情况:")
  1660. y += 6
  1661. pdf.SetXY(curx, y)
  1662. h := 20.0
  1663. x := curx
  1664. pdf.SetFont("simsun", "", 9)
  1665. for i := 0; i < len(header); i++ {
  1666. utils.RectFillColorMultiCell(pdf, header[i], 9, x, y, cols[i], h, 0, 0, 0, gopdf.Center, gopdf.Middle)
  1667. x += cols[i]
  1668. }
  1669. y += h
  1670. pdf.SetXY(curx, y)
  1671. pdf.SetFont("simsun", "", 8)
  1672. for _, row := range rows {
  1673. curx, y = pdf.GetX(), pdf.GetY()
  1674. x = curx
  1675. height := h
  1676. for i, txt := range row {
  1677. lineTexts, _ := pdf.SplitText(txt, cols[i])
  1678. //lineHt := h * float64(len(lineTexts))
  1679. if len(lineTexts) > 1 {
  1680. lineTexts, _ = pdf.SplitText(txt, cols[i]-4)
  1681. lineHt := h * float64(len(lineTexts)) * 0.6
  1682. if lineHt > height {
  1683. height = lineHt
  1684. }
  1685. }
  1686. }
  1687. for i, txt := range row {
  1688. width := cols[i]
  1689. utils.RectFillColorMultiCell(pdf, txt, 9, x, y, width, height, 0, 0, 0, gopdf.Center, gopdf.Middle)
  1690. x += width
  1691. }
  1692. pdf.SetNewY(y+height, height)
  1693. pdf.SetX(curx)
  1694. }
  1695. pdf.SetFont("simsun", "", 9)
  1696. y = pdf.GetY()
  1697. y += 20
  1698. pdf.SetNewY(y, 20)
  1699. if pdf.GetY() < 30 {
  1700. pdf.SetY(30)
  1701. }
  1702. pdf.SetX(curx)
  1703. pdf.Text("运输温度记录:")
  1704. header2 := []string{"", "日期/时间", "储存温度", "冰排状态", "环境温度"}
  1705. cols2 := []float64{55, 210, 105, 94, 91}
  1706. y = pdf.GetY()
  1707. y += 5
  1708. h = 35.0
  1709. pdf.SetNewY(y, h)
  1710. if pdf.GetY() < 30 {
  1711. pdf.SetY(30)
  1712. }
  1713. y = pdf.GetY()
  1714. pdf.SetX(curx)
  1715. x = curx
  1716. for i := 0; i < len(header2); i++ {
  1717. utils.RectFillColorMultiCell(pdf, header2[i], 9, x, y, cols2[i], h, 0, 0, 0, gopdf.Center, gopdf.Middle)
  1718. x += cols2[i]
  1719. }
  1720. y = pdf.GetY()
  1721. y += h
  1722. pdf.SetNewY(y, h)
  1723. if pdf.GetY() < 30 {
  1724. pdf.SetY(30)
  1725. }
  1726. pdf.SetX(curx)
  1727. row2 := [][]string{
  1728. {"启运", "______年___月___日___时___分", "________℃", "", "________℃"},
  1729. {"途中", "______年___月___日___时___分", "________℃", "————", "________℃"},
  1730. {"到达", "______年___月___日___时___分", "________℃", "", "________℃"},
  1731. }
  1732. for j, row := range row2 {
  1733. curx, y = pdf.GetX(), pdf.GetY()
  1734. x = curx
  1735. pdf.SetTextColor(0, 0, 0)
  1736. height := h
  1737. if j == 1 {
  1738. height = height * 2
  1739. }
  1740. for i, txt := range row {
  1741. width := cols2[i]
  1742. txtWd, _ := pdf.MeasureTextWidth(txt)
  1743. txtX := x + (width-txtWd)/2
  1744. pdf.SetLineWidth(0.8)
  1745. pdf.SetFillColor(255, 255, 255) //setup fill color
  1746. pdf.SetLineType("") // 线条样式
  1747. pdf.RectFromUpperLeftWithStyle(x, y, width, height, "FD")
  1748. if j == 1 {
  1749. if i == 1 || i == 2 || i == 4 {
  1750. txtY := y + height/5*2
  1751. pdf.SetXY(txtX, txtY)
  1752. pdf.Text(txt)
  1753. txtY = y + height/5*4
  1754. pdf.SetXY(txtX, txtY)
  1755. pdf.Text(txt)
  1756. } else {
  1757. txtY := y + height/5*3
  1758. pdf.SetXY(txtX, txtY)
  1759. pdf.Text(txt)
  1760. }
  1761. } else {
  1762. txtY := y + height/3*2
  1763. pdf.SetXY(txtX, txtY)
  1764. pdf.Text(txt)
  1765. }
  1766. x += width
  1767. }
  1768. pdf.SetNewY(y+height, height)
  1769. if pdf.GetY() < 30 || pdf.GetY() > 810 {
  1770. pdf.SetY(30)
  1771. }
  1772. pdf.SetX(curx)
  1773. }
  1774. y = pdf.GetY()
  1775. y += 20
  1776. pdf.SetNewY(y, 20)
  1777. if pdf.GetY() < 30 {
  1778. pdf.SetY(30)
  1779. }
  1780. pdf.SetX(curx)
  1781. pdf.Text("启运至到达行驶里程数:_________千米")
  1782. y = pdf.GetY()
  1783. y += 25
  1784. pdf.SetNewY(y, 25)
  1785. if pdf.GetY() < 30 {
  1786. pdf.SetY(30)
  1787. }
  1788. pdf.SetX(curx)
  1789. y = pdf.GetY()
  1790. pdf.Text("发货单位:")
  1791. txtWd, _ := pdf.MeasureTextWidth("发货单位:")
  1792. pdf.SetLineWidth(0.8)
  1793. pdf.SetXY(curx+txtWd, y)
  1794. pdf.Text(beegouser.GetDeptName(c.Ctx))
  1795. pdf.Line(57, y+3, 207, y+3)
  1796. pdf.SetXY(300, y)
  1797. pdf.Text("发货人签名:")
  1798. txtWd, _ = pdf.MeasureTextWidth("发货人签名:")
  1799. pdf.Line(345, y+3, 495, y+3)
  1800. y = pdf.GetY()
  1801. y += 25
  1802. pdf.SetNewY(y, 25)
  1803. if pdf.GetY() < 30 {
  1804. pdf.SetY(30)
  1805. }
  1806. pdf.SetX(curx)
  1807. y = pdf.GetY()
  1808. pdf.Text("收货单位:")
  1809. txtWd, _ = pdf.MeasureTextWidth("收货单位:")
  1810. pdf.SetXY(curx+txtWd, y)
  1811. pdf.Text(beegouser.GetDeptName(c.Ctx))
  1812. pdf.Line(57, y+3, 207, y+3)
  1813. pdf.SetXY(300, y)
  1814. pdf.Text("收货人签名:")
  1815. txtWd, _ = pdf.MeasureTextWidth("收货人签名:")
  1816. pdf.Line(345, y+3, 495, y+3)
  1817. y = pdf.GetY()
  1818. y += 20
  1819. pdf.SetNewY(y, 20)
  1820. if pdf.GetY() < 30 {
  1821. pdf.SetY(30)
  1822. }
  1823. pdf.SetX(curx)
  1824. pdf.SetCharSpacing(0.5)
  1825. txt := "填表说明:本表供疫苗配送企业、疾病预防控制机构、接种单位疫苗运输时填写;出入库单号为单位编码+年月日+2位流水号;运输超过6小时需记录途中温度,间隔不超过6小时;使用无自动温度显示的冰排保冷设备时,只在启运和达到时填写冰排状态(冻结、冰水混合物、完全融化)。"
  1826. pdf.MultiCell(&gopdf.Rect{W: 555, H: 50}, txt)
  1827. //imgList = append(imgList,
  1828. // "https://godownoss.coldbaozhida.com/UpImage/17115067977062dc7f-0354-4e70-aefe-3423338b44be.jpg",
  1829. // "https://godownoss.coldbaozhida.com/UpImage/17115068019adbd486-993e-48c5-8155-c2c30265638a.jpg",
  1830. //)
  1831. for _, v := range imgList {
  1832. urlList := strings.Split(strings.Trim(v, ","), ",")
  1833. for _, url := range urlList {
  1834. pdf.AddPage()
  1835. imgH, errImg := utils.GetImage(url)
  1836. if errImg != nil {
  1837. err = errors.New("获取图片失败")
  1838. c.Error(500, err, err.Error())
  1839. return
  1840. }
  1841. imgWidth := float64(imgH.Bounds().Dx())
  1842. imgHeight := float64(imgH.Bounds().Dy())
  1843. W, H := imgWidth, imgHeight
  1844. if imgWidth >= imgHeight && imgWidth > 555 {
  1845. W = 555
  1846. H = 555 * float64(imgHeight) / float64(imgWidth)
  1847. }
  1848. if imgWidth < imgHeight && imgWidth > 760 {
  1849. W = 760 * float64(imgWidth) / float64(imgHeight)
  1850. H = 760
  1851. if W > 555 {
  1852. H = 555 * 760 / W
  1853. W = 555
  1854. }
  1855. }
  1856. if strings.Contains(url, ".png") {
  1857. err = pdf.ImageFrom(imgH, (595-W)/2, (840-H)/2, &gopdf.Rect{W: W, H: H})
  1858. if err != nil {
  1859. err = errors.New("写入图片失败")
  1860. c.Error(500, err, err.Error())
  1861. return
  1862. }
  1863. } else {
  1864. fileName := "./ofile/" + path.Base(url)
  1865. f, _ := os.Create(fileName)
  1866. defer f.Close()
  1867. defer func() {
  1868. os.Remove(fileName)
  1869. }()
  1870. jpeg.Encode(f, imgH, &jpeg.Options{100})
  1871. err = pdf.Image(fileName, (595-W)/2, (840-H)/2, &gopdf.Rect{W: W, H: H})
  1872. if err != nil {
  1873. err = errors.New("写入图片失败")
  1874. c.Error(500, err, err.Error())
  1875. return
  1876. }
  1877. }
  1878. }
  1879. }
  1880. for i := 0; i < pdf.GetNumberOfPages(); i++ {
  1881. }
  1882. filename := "运输记录表" + time.Now().Format("20060102150405") + ".pdf"
  1883. // 保存文件
  1884. if err = pdf.WritePdf("ofile/" + filename); err != nil {
  1885. fmt.Println(err)
  1886. }
  1887. defer func() {
  1888. os.Remove("ofile/" + filename)
  1889. os.Remove(imgPath)
  1890. os.Remove(imgPath2)
  1891. }()
  1892. // 返回生成的 Excel 文件
  1893. c.Ctx.Output.Download("ofile/" + filename)
  1894. }
  1895. // TransportRecordExport 运输记录表
  1896. // @Summary 收发登记表word
  1897. // @Description 收发登记表word
  1898. // @Tags 库存
  1899. // @Param body body dto.TransportRecordWordReq true "body"
  1900. // @Success 200 {object} response.Page "{"code": 200, "data": [...]}"
  1901. // @Router /stock-template/inventory/list [post]
  1902. // @Security Bearer
  1903. func (c StockTemplateController) TransportRecordExport() {
  1904. reqData := models.TransportRecord{}
  1905. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  1906. c.Error(global.ParseFormErr, err, err.Error())
  1907. return
  1908. }
  1909. deptId := beegouser.GetDeptId(c.Ctx)
  1910. models.InitBasicData(deptId)
  1911. if reqData.Type == "pdf" {
  1912. c.TransportRecordPdf(reqData)
  1913. }
  1914. if reqData.Type == "word" {
  1915. c.TransportRecordWord(reqData)
  1916. }
  1917. }
  1918. // StockUnitList 获取收货单位,发货单位,收发单位
  1919. // @Summary 获取收货单位,发货单位,收发单位
  1920. // @Description 获取收货单位,发货单位,收发单位
  1921. // @Tags 库存
  1922. // @Param body body dto.StockUnitListReq true "body"
  1923. // @Success 200 {object} response.Page "{"code": 200, "data": [...]}"
  1924. // @Router /stock/unit/list [post]
  1925. // @Security Bearer
  1926. func (c StockTemplateController) StockUnitList() {
  1927. s := services.StockTemplate{}
  1928. reqData := dto.StockUnitListReq{}
  1929. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  1930. c.Error(global.ParseFormErr, err, err.Error())
  1931. return
  1932. }
  1933. deptId := beegouser.GetDeptId(c.Ctx)
  1934. list, err := s.StockUnitList(&reqData, deptId)
  1935. if err != nil {
  1936. c.Error(500, err, err.Error())
  1937. return
  1938. }
  1939. c.PageOK(list, 0, 0, 0, "查询成功")
  1940. }
  1941. // StockOperatorList 获取收货单位,发货单位,收发单位
  1942. // @Summary 获取收货单位,发货单位,收发单位
  1943. // @Description 获取收货单位,发货单位,收发单位
  1944. // @Tags 库存
  1945. // @Param body body dto.StockOperatorListReq true "body"
  1946. // @Success 200 {object} response.Page "{"code": 200, "data": [...]}"
  1947. // @Router /stock/unit/list [post]
  1948. // @Security Bearer
  1949. func (c StockTemplateController) StockOperatorList() {
  1950. s := services.StockTemplate{}
  1951. reqData := dto.StockOperatorListReq{}
  1952. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  1953. c.Error(global.ParseFormErr, err, err.Error())
  1954. return
  1955. }
  1956. deptId := beegouser.GetDeptId(c.Ctx)
  1957. list, err := s.StockOperatorList(&reqData, deptId)
  1958. if err != nil {
  1959. c.Error(500, err, err.Error())
  1960. return
  1961. }
  1962. c.PageOK(list, 0, 0, 0, "查询成功")
  1963. }
  1964. // StockInquiryList 库存查询
  1965. // @Summary 库存查询-每个商品、生产企业、规格、批号数量
  1966. // @Description 库存查询
  1967. // @Tags 库存
  1968. // @Param body body dto.StockStatListReq true "body"
  1969. // @Success 200 {object} response.Page "{"code": 200, "data": [...]}"
  1970. // @Router /stock/inquiry/list [post]
  1971. // @Security Bearer
  1972. func (c StockTemplateController) StockInquiryList() {
  1973. s := services.StockTemplate{}
  1974. reqData := dto.StockStatListReq{}
  1975. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  1976. c.Error(global.ParseFormErr, err, err.Error())
  1977. return
  1978. }
  1979. deptId := beegouser.GetDeptId(c.Ctx)
  1980. list, cnt, err := s.StockInquiryList(&reqData, deptId)
  1981. if err != nil {
  1982. c.Error(500, err, err.Error())
  1983. return
  1984. }
  1985. c.PageOK(list, int(cnt), reqData.GetPageIndex(), reqData.GetPageSize(), "查询成功")
  1986. }
  1987. // StockInquiryExcel 导出库存信息表
  1988. // @Summary 库存信息表-每个商品、生产企业、规格、批号数量
  1989. // @Description 库存信息表
  1990. // @Tags 库存
  1991. // @Param body body dto.StockStatListReq true "body"
  1992. // @Success 200 {object} response.Page "{"code": 200, "data": [...]}"
  1993. // @Router /stock/stat/excel [post]
  1994. // @Security Bearer
  1995. func (c StockTemplateController) StockInquiryExcel() {
  1996. s := services.StockTemplate{}
  1997. reqData := dto.StockStatListReq{}
  1998. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  1999. c.Error(global.ParseFormErr, err, err.Error())
  2000. return
  2001. }
  2002. deptId := beegouser.GetDeptId(c.Ctx)
  2003. list, err := s.StockInquiryExcel(&reqData, deptId)
  2004. if err != nil {
  2005. c.Error(500, err, err.Error())
  2006. return
  2007. }
  2008. f := excelize.NewFile() // 设置单元格的值
  2009. StyleTitle, _ := f.NewStyle(
  2010. &excelize.Style{
  2011. Font: &excelize.Font{Bold: true, Size: 20, Family: "宋体"},
  2012. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"},
  2013. })
  2014. f.MergeCell("Sheet1", "A1", "K1")
  2015. f.SetRowStyle("Sheet1", 1, 1, StyleTitle)
  2016. f.SetRowHeight("Sheet1", 1, 50)
  2017. f.SetCellValue("Sheet1", "A1", fmt.Sprintf("库存信息表(%s)", time.Now().Format("2006-01-02 15:04:05")))
  2018. // 这里设置表头
  2019. f.SetCellValue("Sheet1", "A2", "品名")
  2020. f.SetCellValue("Sheet1", "B2", "生产企业")
  2021. f.SetCellValue("Sheet1", "C2", "规格")
  2022. f.SetCellValue("Sheet1", "D2", "剂型")
  2023. f.SetCellValue("Sheet1", "E2", "单位")
  2024. f.SetCellValue("Sheet1", "F2", "数量")
  2025. f.SetCellValue("Sheet1", "G2", "单价")
  2026. //f.SetCellValue("Sheet1", "H2", "销售单价")
  2027. f.SetCellValue("Sheet1", "H2", "批号")
  2028. f.SetCellValue("Sheet1", "I2", "失效日期")
  2029. f.SetCellValue("Sheet1", "J2", "批准文号")
  2030. f.SetCellValue("Sheet1", "K2", "批签发编号")
  2031. // 设置列宽
  2032. f.SetColWidth("Sheet1", "A", "A", 20)
  2033. f.SetColWidth("Sheet1", "B", "C", 15)
  2034. f.SetColWidth("Sheet1", "D", "F", 12)
  2035. f.SetColWidth("Sheet1", "F", "G", 10)
  2036. f.SetColWidth("Sheet1", "G", "I", 15)
  2037. f.SetColWidth("Sheet1", "I", "J", 12)
  2038. f.SetColWidth("Sheet1", "J", "K", 15)
  2039. line := 2
  2040. // 循环写入数据
  2041. for _, v := range list {
  2042. line++
  2043. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), v[models.FieldProductName])
  2044. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v[models.FieldEnterpriseName])
  2045. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v[models.FieldSpecName])
  2046. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v[models.FieldDosageFormName])
  2047. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v[models.FieldUnitName])
  2048. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), v["balance"])
  2049. f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), utils.ToFloat64(v["unit_price"]))
  2050. //f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), utils.ToFloat64(v["sales_unit_price"]))
  2051. f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), v["batch_number"])
  2052. f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), v[models.FieldExpiryDate])
  2053. f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), v["approval_number"])
  2054. f.SetCellValue("Sheet1", fmt.Sprintf("K%d", line), v["qualification_number"])
  2055. }
  2056. Style1, _ := f.NewStyle(
  2057. &excelize.Style{
  2058. Font: &excelize.Font{Size: 12, Family: "宋体", Bold: true},
  2059. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  2060. Border: []excelize.Border{
  2061. {Type: "left", Color: "000000", Style: 1},
  2062. {Type: "top", Color: "000000", Style: 1},
  2063. {Type: "bottom", Color: "000000", Style: 1},
  2064. {Type: "right", Color: "000000", Style: 1},
  2065. },
  2066. })
  2067. f.SetCellStyle("Sheet1", "A2", "K2", Style1)
  2068. Style2, _ := f.NewStyle(
  2069. &excelize.Style{
  2070. Font: &excelize.Font{Size: 12, Family: "宋体"},
  2071. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  2072. Border: []excelize.Border{
  2073. {Type: "left", Color: "000000", Style: 1},
  2074. {Type: "top", Color: "000000", Style: 1},
  2075. {Type: "bottom", Color: "000000", Style: 1},
  2076. {Type: "right", Color: "000000", Style: 1},
  2077. },
  2078. })
  2079. f.SetCellStyle("Sheet1", "A3", fmt.Sprintf("K%d", line), Style2)
  2080. filename := "库存信息表" + time.Now().Format("20060102150405") + ".xlsx"
  2081. // 保存文件
  2082. if err := f.SaveAs("ofile/" + filename); err != nil {
  2083. fmt.Println(err)
  2084. }
  2085. defer func() {
  2086. os.Remove("ofile/" + filename)
  2087. }()
  2088. // 返回生成的 Excel 文件
  2089. c.Ctx.Output.Download("ofile/" + filename)
  2090. }
  2091. // StockStat 库存统计
  2092. // @Summary 库存查询-每个商品数量(不区别生产企业)
  2093. // @Description 库存查询
  2094. // @Tags 库存
  2095. // @Param body body dto.StockStatListReq true "body"
  2096. // @Success 200 {object} response.Page "{"code": 200, "data": [...]}"
  2097. // @Router /stock/stat [post]
  2098. // @Security Bearer
  2099. func (c StockTemplateController) StockStat() {
  2100. s := services.StockTemplate{}
  2101. reqData := dto.StockStatReq{}
  2102. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  2103. c.Error(global.ParseFormErr, err, err.Error())
  2104. return
  2105. }
  2106. deptId := beegouser.GetDeptId(c.Ctx)
  2107. list, cnt, err := s.StockStat(&reqData, deptId)
  2108. if err != nil {
  2109. c.Error(500, err, err.Error())
  2110. return
  2111. }
  2112. c.PageOK(list, int(cnt), 0, 0, "查询成功")
  2113. }
  2114. // StockHomeStat 首页出入库信息统计
  2115. // @Summary 首页出入库信息统计
  2116. // @Description 首页出入库信息统计
  2117. // @Tags 库存
  2118. // @Param body body dto.StockStatListReq true "body"
  2119. // @Success 200 {object} response.Page "{"code": 200, "data": [...]}"
  2120. // @Router /stock/stat [post]
  2121. // @Security Bearer
  2122. func (c StockTemplateController) StockHomeStat() {
  2123. s := services.StockTemplate{}
  2124. deptId := beegouser.GetDeptId(c.Ctx)
  2125. list, cnt, err := s.StockHomeStat(deptId)
  2126. if err != nil {
  2127. c.Error(500, err, err.Error())
  2128. return
  2129. }
  2130. c.PageOK(list, int(cnt), 0, 0, "查询成功")
  2131. }
  2132. // StockTemplateInScanBarCode 扫条码入库
  2133. // @Summary 扫条码入库
  2134. // @Description 扫条码入库
  2135. // @Tags 库存
  2136. // @Param body body dto.StockTemplateOutInsertReq true "body"
  2137. // @Success 200 {object} response.Response "{"code": 200, "data": [...]}"
  2138. // @Router /stock-template/out [post]
  2139. // @Security Bearer
  2140. func (c StockTemplateController) StockTemplateInScanBarCode() {
  2141. s := services.StockTemplate{}
  2142. reqData := dto.BatchStockTemplateOutInsertReq{}
  2143. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  2144. c.Error(global.ParseFormErr, err, err.Error())
  2145. return
  2146. }
  2147. reqData.SetCreateBy(beegouser.GetUserId(c.Ctx))
  2148. reqData.SetDeptId(beegouser.GetDeptId(c.Ctx))
  2149. err := s.StockTemplateOutScanCode(&reqData)
  2150. if err != nil {
  2151. c.Error(500, err, err.Error())
  2152. return
  2153. }
  2154. c.OK(nil, "扫码出库成功")
  2155. }
  2156. func (c StockTemplateController) GetBarCodeInfo() {
  2157. barcodeSvc := services.Barcode{}
  2158. s := services.StockTemplate{}
  2159. //if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  2160. // c.Error(global.ParseFormErr, err, err.Error())
  2161. // return
  2162. //}
  2163. codeStr := c.GetString("code")
  2164. reqData := dto.GetBarCodeInfoReq{Code: codeStr}
  2165. var code models.Barcode
  2166. //数据权限检查
  2167. err := barcodeSvc.Get(&reqData, &code)
  2168. if err != nil {
  2169. c.Error(500, err, err.Error())
  2170. return
  2171. }
  2172. list, err := s.StockTemplateTransportRecordWord(&code.Data, code.Data.DeptID)
  2173. if err != nil {
  2174. c.Error(500, err, err.Error())
  2175. return
  2176. }
  2177. for _, v := range list {
  2178. v["forwardingUnit"] = code.Data.DeptName
  2179. }
  2180. c.OK(list, "查询成功")
  2181. }