sales.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605
  1. package controllers
  2. import (
  3. "Medical_ERP/common/global"
  4. _ "Medical_ERP/common/response"
  5. "Medical_ERP/dto"
  6. "Medical_ERP/models"
  7. "Medical_ERP/services"
  8. "Medical_ERP/utils"
  9. "fmt"
  10. "github.com/signintech/gopdf"
  11. "github.com/xuri/excelize/v2"
  12. "gogs.baozhida.cn/zoie/OAuth-core/pkg/jwtauth/beegouser"
  13. "os"
  14. "time"
  15. )
  16. type SalesController struct {
  17. BaseController
  18. }
  19. // SalesList 销售管理
  20. // @Summary 销售管理
  21. // @Description 销售管理
  22. // @Tags 销售管理
  23. // @Param body body dto.SalesPageReq true "body"
  24. // @Success 200 {object} response.Page "{"code": 200, "data": [...]}"
  25. // @Router /sales/list [post]
  26. // @Security Bearer
  27. func (c SalesController) SalesList() {
  28. s := services.Sales{}
  29. reqData := dto.SalesPageReq{}
  30. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  31. c.Error(global.ParseFormErr, err, err.Error())
  32. return
  33. }
  34. deptId := beegouser.GetDeptId(c.Ctx)
  35. list, count, err := s.SalesList(&reqData, deptId)
  36. if err != nil {
  37. c.Error(500, err, err.Error())
  38. return
  39. }
  40. c.PageOK(list, int(count), reqData.GetPageIndex(), reqData.GetPageSize(), "查询成功")
  41. }
  42. // SalesExcel 二类销售清单
  43. // @Summary 二类销售清单
  44. // @Description 二类销售清单
  45. // @Tags 销售管理
  46. // @Param body body dto.SalesPageReq true "body"
  47. // @Success 200 {object} response.Page "{"code": 200, "data": [...]}"
  48. // @Router /sales/excel [post]
  49. // @Security Bearer
  50. func (c SalesController) SalesExcel() {
  51. s := services.Sales{}
  52. reqData := dto.SalesPageReq{}
  53. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  54. c.Error(global.ParseFormErr, err, err.Error())
  55. return
  56. }
  57. deptId := beegouser.GetDeptId(c.Ctx)
  58. deptName := beegouser.GetDeptName(c.Ctx)
  59. list, _, err := s.SalesListExcel(&reqData, deptId)
  60. if err != nil {
  61. c.Error(500, err, err.Error())
  62. return
  63. }
  64. f := excelize.NewFile() // 设置单元格的值
  65. StyleTitle, _ := f.NewStyle(
  66. &excelize.Style{
  67. Font: &excelize.Font{Bold: true, Size: 20, Family: "宋体"},
  68. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"},
  69. })
  70. f.MergeCell("Sheet1", "A1", "N1")
  71. f.SetRowStyle("Sheet1", 1, 1, StyleTitle)
  72. f.SetRowHeight("Sheet1", 1, 50)
  73. var interval string
  74. if len(reqData.StartDate) > 0 && len(reqData.EndDate) > 0 {
  75. interval = fmt.Sprintf("%s至%s", reqData.StartDate, reqData.EndDate)
  76. }
  77. f.SetCellValue("Sheet1", "A1", fmt.Sprintf("%s%s销售清单", deptName, interval))
  78. // 这里设置表头
  79. f.SetCellValue("Sheet1", "A2", "日期")
  80. f.SetCellValue("Sheet1", "B2", "购货单位")
  81. f.SetCellValue("Sheet1", "C2", "品种")
  82. f.SetCellValue("Sheet1", "D2", "生产企业")
  83. f.SetCellValue("Sheet1", "E2", "规格")
  84. f.SetCellValue("Sheet1", "F2", "剂型")
  85. f.SetCellValue("Sheet1", "G2", "批号")
  86. f.SetCellValue("Sheet1", "H2", "数量")
  87. f.SetCellValue("Sheet1", "I2", "单位")
  88. f.SetCellValue("Sheet1", "J2", "单价")
  89. f.SetCellValue("Sheet1", "K2", "金额")
  90. //f.SetCellValue("Sheet1", "L2", "销售单价")
  91. //f.SetCellValue("Sheet1", "M2", "销售金额")
  92. f.SetCellValue("Sheet1", "L2", "批准文号")
  93. // 设置列宽
  94. f.SetColWidth("Sheet1", "A", "A", 12)
  95. f.SetColWidth("Sheet1", "B", "C", 15)
  96. f.SetColWidth("Sheet1", "C", "E", 23)
  97. f.SetColWidth("Sheet1", "E", "F", 15)
  98. f.SetColWidth("Sheet1", "F", "G", 12)
  99. f.SetColWidth("Sheet1", "H", "I", 10)
  100. f.SetColWidth("Sheet1", "J", "L", 12)
  101. line := 2
  102. // 循环写入数据
  103. for _, v := range list {
  104. line++
  105. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), v["date"])
  106. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v["receiving_unit"])
  107. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v[models.FieldProductName])
  108. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v[models.FieldEnterpriseName])
  109. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v[models.FieldSpecName])
  110. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), v[models.FieldDosageFormName])
  111. f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), v[models.FieldBatchNumber])
  112. f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), v["quantity"])
  113. f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), v[models.FieldUnitName])
  114. f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), utils.ToFloat64(v["unit_price"]))
  115. f.SetCellValue("Sheet1", fmt.Sprintf("K%d", line), utils.ToFloat64(v["money"]))
  116. f.SetCellValue("Sheet1", fmt.Sprintf("L%d", line), v[models.FieldApprovalNumber])
  117. }
  118. Style1, _ := f.NewStyle(
  119. &excelize.Style{
  120. Font: &excelize.Font{Size: 12, Family: "宋体", Bold: true},
  121. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  122. Border: []excelize.Border{
  123. {Type: "left", Color: "000000", Style: 1},
  124. {Type: "top", Color: "000000", Style: 1},
  125. {Type: "bottom", Color: "000000", Style: 1},
  126. {Type: "right", Color: "000000", Style: 1},
  127. },
  128. })
  129. f.SetCellStyle("Sheet1", "A2", "N2", Style1)
  130. Style2, _ := f.NewStyle(
  131. &excelize.Style{
  132. Font: &excelize.Font{Size: 12, Family: "宋体"},
  133. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  134. Border: []excelize.Border{
  135. {Type: "left", Color: "000000", Style: 1},
  136. {Type: "top", Color: "000000", Style: 1},
  137. {Type: "bottom", Color: "000000", Style: 1},
  138. {Type: "right", Color: "000000", Style: 1},
  139. },
  140. })
  141. f.SetCellStyle("Sheet1", "A3", fmt.Sprintf("N%d", line), Style2)
  142. filename := "二类销售清单" + time.Now().Format("20060102150405") + ".xlsx"
  143. // 保存文件
  144. if err := f.SaveAs("ofile/" + filename); err != nil {
  145. fmt.Println(err)
  146. }
  147. defer func() {
  148. os.Remove("ofile/" + filename)
  149. }()
  150. // 返回生成的 Excel 文件
  151. c.Ctx.Output.Download("ofile/" + filename)
  152. }
  153. // SalesReportExcel 销售报表
  154. // @Summary 销售报表
  155. // @Description 销售报表
  156. // @Tags 销售管理
  157. // @Param body body dto.SalesPageReq true "body"
  158. // @Success 200 {object} response.Page "{"code": 200, "data": [...]}"
  159. // @Router /sales/excel [post]
  160. // @Security Bearer
  161. func (c SalesController) SalesReportExcel() {
  162. s := services.Sales{}
  163. reqData := dto.SalesPageReq{}
  164. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  165. c.Error(global.ParseFormErr, err, err.Error())
  166. return
  167. }
  168. deptId := beegouser.GetDeptId(c.Ctx)
  169. deptName := beegouser.GetDeptName(c.Ctx)
  170. list, err := s.SalesReportList(&reqData, deptId)
  171. if err != nil {
  172. c.Error(500, err, err.Error())
  173. return
  174. }
  175. f := excelize.NewFile() // 设置单元格的值
  176. StyleTitle, _ := f.NewStyle(
  177. &excelize.Style{
  178. Font: &excelize.Font{Bold: true, Size: 20, Family: "宋体"},
  179. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"},
  180. })
  181. f.MergeCell("Sheet1", "A1", "J1")
  182. f.SetRowStyle("Sheet1", 1, 1, StyleTitle)
  183. f.SetRowHeight("Sheet1", 1, 50)
  184. var interval string
  185. if len(reqData.StartDate) > 0 && len(reqData.EndDate) > 0 {
  186. interval = fmt.Sprintf("%s至%s", reqData.StartDate, reqData.EndDate)
  187. }
  188. f.SetCellValue("Sheet1", "A1", fmt.Sprintf("%s%s销售报表", deptName, interval))
  189. // 这里设置表头
  190. f.SetRowHeight("Sheet1", 2, 25)
  191. f.SetCellValue("Sheet1", "A2", "品种")
  192. f.SetCellValue("Sheet1", "B2", "生产企业")
  193. f.SetCellValue("Sheet1", "C2", "规格")
  194. f.SetCellValue("Sheet1", "D2", "数量")
  195. f.SetCellValue("Sheet1", "E2", "单位")
  196. f.SetCellValue("Sheet1", "F2", "单价")
  197. f.SetCellValue("Sheet1", "G2", "金额")
  198. //f.SetCellValue("Sheet1", "H2", "销售单价")
  199. //f.SetCellValue("Sheet1", "I2", "销售金额")
  200. //f.SetCellValue("Sheet1", "J2", "利润金额")
  201. // 设置列宽
  202. f.SetColWidth("Sheet1", "A", "C", 27)
  203. f.SetColWidth("Sheet1", "D", "E", 10)
  204. f.SetColWidth("Sheet1", "F", "G", 12)
  205. line := 2
  206. // 循环写入数据
  207. for _, v := range list {
  208. line++
  209. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), v[models.FieldProductName])
  210. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v[models.FieldEnterpriseName])
  211. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v[models.FieldSpecName])
  212. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), utils.ToInt(v["total"]))
  213. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v[models.FieldUnitName])
  214. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), utils.ToFloat64(v["unit_price"]))
  215. f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), utils.ToFloat64(v["money"]))
  216. //f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), utils.ToFloat64(v["sales_unit_price"]))
  217. //f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), utils.ToFloat64(v["sales_money"]))
  218. //f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), utils.ToFloat64(v["profit_money"]))
  219. }
  220. line += 1
  221. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), "合计")
  222. f.SetCellFormula("Sheet1", fmt.Sprintf("D%d", line), fmt.Sprintf("SUM(D3:D%d)", line-1))
  223. f.SetCellFormula("Sheet1", fmt.Sprintf("G%d", line), fmt.Sprintf("SUM(G3:G%d)", line-1))
  224. //f.SetCellFormula("Sheet1", fmt.Sprintf("I%d", line), fmt.Sprintf("SUM(I3:I%d)", line-1))
  225. //f.SetCellFormula("Sheet1", fmt.Sprintf("J%d", line), fmt.Sprintf("SUM(J3:J%d)", line-1))
  226. Style1, _ := f.NewStyle(
  227. &excelize.Style{
  228. Font: &excelize.Font{Size: 14, Family: "宋体", Bold: true},
  229. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  230. Border: []excelize.Border{
  231. {Type: "left", Color: "000000", Style: 1},
  232. {Type: "top", Color: "000000", Style: 1},
  233. {Type: "bottom", Color: "000000", Style: 1},
  234. {Type: "right", Color: "000000", Style: 1},
  235. },
  236. })
  237. f.SetCellStyle("Sheet1", "A2", "J2", Style1)
  238. Style2, _ := f.NewStyle(
  239. &excelize.Style{
  240. Font: &excelize.Font{Size: 12, Family: "宋体"},
  241. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  242. Border: []excelize.Border{
  243. {Type: "left", Color: "000000", Style: 1},
  244. {Type: "top", Color: "000000", Style: 1},
  245. {Type: "bottom", Color: "000000", Style: 1},
  246. {Type: "right", Color: "000000", Style: 1},
  247. },
  248. })
  249. f.SetCellStyle("Sheet1", "A3", fmt.Sprintf("J%d", line), Style2)
  250. filename := "销售报表" + time.Now().Format("20060102150405") + ".xlsx"
  251. // 保存文件
  252. if err := f.SaveAs("ofile/" + filename); err != nil {
  253. fmt.Println(err)
  254. }
  255. defer func() {
  256. os.Remove("ofile/" + filename)
  257. }()
  258. // 返回生成的 Excel 文件
  259. c.Ctx.Output.Download("ofile/" + filename)
  260. }
  261. // SalesOrderList 销售订单
  262. // @Summary 销售订单
  263. // @Description 销售订单
  264. // @Tags 销售管理
  265. // @Param body body dto.SalesOrderPageReq true "body"
  266. // @Success 200 {object} response.Page "{"code": 200, "data": [...]}"
  267. // @Router /sales/order_list [post]
  268. // @Security Bearer
  269. func (c SalesController) SalesOrderList() {
  270. s := services.Sales{}
  271. reqData := dto.SalesOrderPageReq{}
  272. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  273. c.Error(global.ParseFormErr, err, err.Error())
  274. return
  275. }
  276. deptId := beegouser.GetDeptId(c.Ctx)
  277. list, count, err := s.SalesOrderList(&reqData, deptId)
  278. if err != nil {
  279. c.Error(500, err, err.Error())
  280. return
  281. }
  282. c.PageOK(list, int(count), reqData.GetPageIndex(), reqData.GetPageSize(), "查询成功")
  283. }
  284. func (c SalesController) SalesStockOutExcel(reqData dto.SalesStockOutExcelReq) {
  285. s := services.Sales{}
  286. deptId := beegouser.GetDeptId(c.Ctx)
  287. list, err := s.SalesStockOutExcel(&reqData, deptId)
  288. if err != nil {
  289. c.Error(500, err, err.Error())
  290. return
  291. }
  292. f := excelize.NewFile() // 设置单元格的值
  293. StyleTitle, _ := f.NewStyle(
  294. &excelize.Style{
  295. Font: &excelize.Font{Bold: true, Size: 20, Family: "宋体"},
  296. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"},
  297. })
  298. f.MergeCell("Sheet1", "A1", "K1")
  299. f.SetRowStyle("Sheet1", 1, 1, StyleTitle)
  300. f.SetRowHeight("Sheet1", 1, 40)
  301. f.SetCellValue("Sheet1", "A1", fmt.Sprintf("%s二类出库单", beegouser.GetDeptName(c.Ctx)))
  302. // 这里设置表头
  303. f.SetRowHeight("Sheet1", 2, 25)
  304. f.MergeCell("Sheet1", "A2", "C2")
  305. f.MergeCell("Sheet1", "D2", "F2")
  306. f.MergeCell("Sheet1", "G2", "G2")
  307. f.MergeCell("Sheet1", "H2", "K2")
  308. f.SetRowHeight("Sheet1", 3, 40)
  309. f.SetCellValue("Sheet1", "A2", "购货单位:"+reqData.ReceivingUnit)
  310. f.SetCellValue("Sheet1", "D2", "下单日期:"+reqData.Date)
  311. //f.SetCellValue("Sheet1", "G2", "编号:")
  312. //f.SetCellValue("Sheet1", "I2", "第1联,共3联(第1联,库房处留存)")
  313. f.SetCellValue("Sheet1", "A3", "品种")
  314. f.SetCellValue("Sheet1", "B3", "剂型")
  315. f.SetCellValue("Sheet1", "C3", "规格")
  316. f.SetCellValue("Sheet1", "D3", "生产企业")
  317. f.SetCellValue("Sheet1", "E3", "批号")
  318. f.SetCellValue("Sheet1", "F3", "失效日期")
  319. f.SetCellValue("Sheet1", "G3", "批准文号")
  320. f.SetCellValue("Sheet1", "H3", "数量")
  321. f.SetCellValue("Sheet1", "I3", "单位")
  322. f.SetCellValue("Sheet1", "J3", "销售单价")
  323. f.SetCellValue("Sheet1", "K3", "销售金额")
  324. // 设置列宽
  325. f.SetColWidth("Sheet1", "A", "B", 15)
  326. f.SetColWidth("Sheet1", "B", "B", 6)
  327. f.SetColWidth("Sheet1", "C", "C", 15)
  328. f.SetColWidth("Sheet1", "D", "D", 10)
  329. f.SetColWidth("Sheet1", "E", "G", 12)
  330. f.SetColWidth("Sheet1", "H", "I", 6)
  331. f.SetColWidth("Sheet1", "J", "K", 10)
  332. line := 3
  333. var money float64
  334. // 循环写入数据
  335. for _, v := range list {
  336. line++
  337. //f.SetRowHeight("Sheet1", line, 25)
  338. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), v[models.FieldProductName])
  339. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", line), v[models.FieldDosageFormName])
  340. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", line), v[models.FieldSpecName])
  341. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), v[models.FieldEnterpriseName])
  342. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), v[models.FieldBatchNumber])
  343. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), v[models.FieldExpiryDate])
  344. f.SetCellValue("Sheet1", fmt.Sprintf("G%d", line), v[models.FieldApprovalNumber])
  345. f.SetCellValue("Sheet1", fmt.Sprintf("H%d", line), utils.ToInt(v["quantity"]))
  346. f.SetCellValue("Sheet1", fmt.Sprintf("I%d", line), v[models.FieldUnitName])
  347. f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), utils.ToFloat64(v["sales_unit_price"]))
  348. f.SetCellValue("Sheet1", fmt.Sprintf("K%d", line), utils.ToFloat64(v["sales_money"]))
  349. money += utils.ToFloat64(v["sales_money"])
  350. }
  351. line += 1
  352. f.SetRowHeight("Sheet1", line, 25)
  353. line += 1
  354. f.SetRowHeight("Sheet1", line, 25)
  355. f.MergeCell("Sheet1", fmt.Sprintf("A%d", line), fmt.Sprintf("D%d", line))
  356. f.MergeCell("Sheet1", fmt.Sprintf("E%d", line), fmt.Sprintf("K%d", line))
  357. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), fmt.Sprintf("整单合计金额(小写):¥%.2f元", money))
  358. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", line), fmt.Sprintf("整单合计金额(大写):%s", utils.AmountConvert(money, true)))
  359. line += 1
  360. f.SetRowHeight("Sheet1", line, 25)
  361. f.MergeCell("Sheet1", fmt.Sprintf("A%d", line), fmt.Sprintf("C%d", line))
  362. f.MergeCell("Sheet1", fmt.Sprintf("D%d", line), fmt.Sprintf("E%d", line))
  363. f.MergeCell("Sheet1", fmt.Sprintf("F%d", line), fmt.Sprintf("I%d", line))
  364. f.MergeCell("Sheet1", fmt.Sprintf("J%d", line), fmt.Sprintf("K%d", line))
  365. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", line), fmt.Sprintf("开票日期:%s", time.Now().Format("2006年01月02日")))
  366. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", line), fmt.Sprintf("开票员:%s", reqData.Drawer))
  367. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", line), fmt.Sprintf("发货人:%s 财务:%s", reqData.Consigner, reqData.Finance))
  368. f.SetCellValue("Sheet1", fmt.Sprintf("J%d", line), fmt.Sprintf("收货人:%s", reqData.Consignee))
  369. Style0, _ := f.NewStyle(
  370. &excelize.Style{
  371. Font: &excelize.Font{Size: 10, Family: "宋体", Bold: true},
  372. Alignment: &excelize.Alignment{Horizontal: "left", Vertical: "center", WrapText: true},
  373. })
  374. f.SetCellStyle("Sheet1", "A2", "K2", Style0)
  375. Style1, _ := f.NewStyle(
  376. &excelize.Style{
  377. Font: &excelize.Font{Size: 12, Family: "宋体", Bold: true},
  378. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  379. Border: []excelize.Border{
  380. {Type: "left", Color: "000000", Style: 1},
  381. {Type: "top", Color: "000000", Style: 1},
  382. {Type: "bottom", Color: "000000", Style: 1},
  383. {Type: "right", Color: "000000", Style: 1},
  384. },
  385. })
  386. f.SetCellStyle("Sheet1", "A3", "K3", Style1)
  387. Style2, _ := f.NewStyle(
  388. &excelize.Style{
  389. Font: &excelize.Font{Size: 11, Family: "宋体"},
  390. Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center", WrapText: true},
  391. Border: []excelize.Border{
  392. {Type: "left", Color: "000000", Style: 1},
  393. {Type: "top", Color: "000000", Style: 1},
  394. {Type: "bottom", Color: "000000", Style: 1},
  395. {Type: "right", Color: "000000", Style: 1},
  396. },
  397. })
  398. f.SetCellStyle("Sheet1", "A4", fmt.Sprintf("k%d", line-1), Style2)
  399. f.SetCellStyle("Sheet1", fmt.Sprintf("A%d", line), fmt.Sprintf("k%d", line), Style0)
  400. filename := "二类出库单" + time.Now().Format("20060102150405") + ".xlsx"
  401. // 保存文件
  402. if err := f.SaveAs("ofile/" + filename); err != nil {
  403. fmt.Println(err)
  404. }
  405. defer func() {
  406. os.Remove("ofile/" + filename)
  407. }()
  408. // 返回生成的 Excel 文件
  409. c.Ctx.Output.Download("ofile/" + filename)
  410. }
  411. func (c SalesController) SalesStockOutPdf(reqData dto.SalesStockOutExcelReq) {
  412. s := services.Sales{}
  413. deptId := beegouser.GetDeptId(c.Ctx)
  414. list, err := s.SalesStockOutExcel(&reqData, deptId)
  415. if err != nil {
  416. c.Error(500, err, err.Error())
  417. return
  418. }
  419. cols := []float64{65, 29.5, 65, 53, 59, 59, 59, 29.5, 29.5, 53, 53}
  420. header := []string{"品种", "剂型", "规格", "生产企业", "批号", "失效日期", "批准文号", "数量", "单位", "销售单价", "销售金额"}
  421. rows := [][]string{}
  422. money := 0.0
  423. for _, row := range list {
  424. temp := []string{}
  425. temp = append(temp, fmt.Sprintf("%s", row[models.FieldProductName]))
  426. temp = append(temp, fmt.Sprintf("%s", row[models.FieldDosageFormName]))
  427. temp = append(temp, fmt.Sprintf("%s", row[models.FieldSpecName]))
  428. temp = append(temp, fmt.Sprintf("%s", row[models.FieldEnterpriseName]))
  429. temp = append(temp, fmt.Sprintf("%s", row[models.FieldBatchNumber]))
  430. temp = append(temp, fmt.Sprintf("%s", utils.ToDate(row[models.FieldExpiryDate])))
  431. if row[models.FieldApprovalNumber] == nil {
  432. temp = append(temp, "")
  433. } else {
  434. temp = append(temp, fmt.Sprintf("%s", row[models.FieldApprovalNumber]))
  435. }
  436. temp = append(temp, fmt.Sprintf("%d", utils.ToInt(row["quantity"])))
  437. temp = append(temp, fmt.Sprintf("%s", row[models.FieldUnitName]))
  438. temp = append(temp, fmt.Sprintf("%.2f", utils.ToFloat64(row["sales_unit_price"])))
  439. temp = append(temp, fmt.Sprintf("%.2f", utils.ToFloat64(row["sales_money"])))
  440. rows = append(rows, temp)
  441. money += utils.ToFloat64(row["sales_money"])
  442. }
  443. rows = append(rows, []string{"", "", "", "", "", "", "", "", "", "", ""})
  444. pdf := &gopdf.GoPdf{}
  445. pdf.Start(gopdf.Config{PageSize: gopdf.Rect{W: 595.28, H: 841.89}})
  446. pdf.SetMarginTop(20)
  447. pdf.SetMarginBottom(40)
  448. pdf.AddPage()
  449. pdf.AddTTFFont("simsun", "static/fonts/MiSans-Medium.ttf")
  450. pdf.SetFont("simsun", "", 22)
  451. titleStr := fmt.Sprintf("%s二类出库单", beegouser.GetDeptName(c.Ctx))
  452. titleWd, _ := pdf.MeasureTextWidth(titleStr)
  453. pdf.SetX((595 / 2) - (titleWd / 2))
  454. pdf.SetY(40)
  455. pdf.Text(titleStr)
  456. curx, y := 20., 70.
  457. pdf.SetXY(curx, y)
  458. pdf.SetFont("simsun", "", 11)
  459. pdf.Text(fmt.Sprintf("购货单位:%s", reqData.ReceivingUnit))
  460. pdf.SetXY(curx+cols[0]+cols[1]+cols[2], y)
  461. pdf.Text(fmt.Sprintf("下单日期:%s", reqData.Date))
  462. //pdf.Text(titleX*2+20, y, fmt.Sprintf("编号:"))
  463. //pdf.Text(titleX*3, y, "第1联,共3联(第1联,库房处留存)")
  464. h := 25.0
  465. pdf.SetFont("simsun", "", 12)
  466. x := curx
  467. y += 10
  468. pdf.SetXY(curx, y)
  469. for i := 0; i < len(header); i++ {
  470. utils.RectFillColorMultiCell(pdf, header[i], 11, x, y, cols[i], h, 0, 0, 0, gopdf.Center, gopdf.Middle)
  471. x += cols[i]
  472. }
  473. pdf.SetFont("simsun", "", 10)
  474. y += h
  475. pdf.SetXY(curx, y)
  476. h = 20.0
  477. for _, row := range rows {
  478. y = pdf.GetY()
  479. x = curx
  480. height := h
  481. for j, txt := range row {
  482. lineTexts, _ := pdf.SplitText(txt, cols[j])
  483. //lineHt := h * float64(len(lineTexts))
  484. if len(lineTexts) > 1 {
  485. lineTexts, _ = pdf.SplitText(txt, cols[j]-4)
  486. lineHt := h * float64(len(lineTexts)) * 0.8
  487. if lineHt > height {
  488. height = lineHt
  489. }
  490. }
  491. }
  492. for i, txt := range row {
  493. width := cols[i]
  494. utils.RectFillColorMultiCell(pdf, txt, 9, x, y, width, height, 0, 0, 0, gopdf.Center, gopdf.Middle)
  495. x += width
  496. }
  497. pdf.SetNewY(y+height, height)
  498. }
  499. y = pdf.GetY()
  500. pdf.SetXY(curx, y)
  501. width1 := cols[0] + cols[1] + cols[2] + cols[3]
  502. utils.RectFillColor(pdf, fmt.Sprintf("整单合计金额(小写):¥%.2f元", money), 9, curx, y, width1, h, 0, 0, 0, gopdf.Center, gopdf.Middle)
  503. width2 := cols[4] + cols[5] + cols[6] + cols[7] + cols[8] + cols[9] + cols[10]
  504. utils.RectFillColor(pdf, fmt.Sprintf("整单合计金额(大写):%s", utils.AmountConvert(money, true)), 9, curx+width1, y, width2, h, 0, 0, 0, gopdf.Center, gopdf.Middle)
  505. y += h
  506. y += 15
  507. pdf.SetNewY(y, h+15)
  508. pdf.SetX(curx)
  509. pdf.Text(fmt.Sprintf("开票日期:%s", time.Now().Format("2006年01月02日")))
  510. width := cols[0] + cols[1] + cols[2]
  511. curx += width
  512. pdf.SetX(curx)
  513. pdf.Text(fmt.Sprintf("开票员:%s", reqData.Drawer))
  514. width = cols[3] + cols[4]
  515. curx += width
  516. pdf.SetX(curx)
  517. pdf.Text(fmt.Sprintf("发货人:%s 财务:%s", reqData.Consigner, reqData.Finance))
  518. width = cols[5] + cols[6] + cols[7] + cols[8]
  519. curx += width
  520. pdf.SetX(curx)
  521. pdf.Text(fmt.Sprintf("收货人:%s", reqData.Consignee))
  522. filename := "二类出库单" + time.Now().Format("20060102150405") + ".pdf"
  523. // 保存文件
  524. if err = pdf.WritePdf("ofile/" + filename); err != nil {
  525. fmt.Println(err)
  526. }
  527. defer func() {
  528. os.Remove("ofile/" + filename)
  529. }()
  530. // 返回生成的 Excel 文件
  531. c.Ctx.Output.Download("ofile/" + filename)
  532. }
  533. // SalesStockOutExport 二类出库单
  534. // @Summary 二类出库单
  535. // @Description 二类出库单
  536. // @Tags 销售管理
  537. // @Param body body dto.SalesStockOutExcelReq true "body"
  538. // @Success 200 {object} response.Page "{"code": 200, "data": [...]}"
  539. // @Router /sales/order_list [post]
  540. // @Security Bearer
  541. func (c SalesController) SalesStockOutExport() {
  542. reqData := dto.SalesStockOutExcelReq{}
  543. if err := c.ParseAndValidate(&c.Ctx.Input.RequestBody, &reqData); err != nil {
  544. c.Error(global.ParseFormErr, err, err.Error())
  545. return
  546. }
  547. if reqData.Type == "excel" {
  548. c.SalesStockOutExcel(reqData)
  549. }
  550. if reqData.Type == "pdf" {
  551. c.SalesStockOutPdf(reqData)
  552. }
  553. }