project.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673
  1. package admin
  2. import (
  3. "archive/zip"
  4. "bytes"
  5. "encoding/json"
  6. "fmt"
  7. "github.com/gin-gonic/gin"
  8. "io"
  9. "net/http"
  10. "os"
  11. "path/filepath"
  12. "server/dao"
  13. "server/global"
  14. "server/model/common/request"
  15. "server/model/common/response"
  16. "strconv"
  17. )
  18. type ProjectApi struct{}
  19. func (pa *ProjectApi) QueryProjectList(c *gin.Context) {
  20. var search request.SearchProject
  21. err := c.ShouldBindJSON(&search)
  22. if err != nil {
  23. response.FailWithMessage("失败", c)
  24. global.GVA_LOG.Error("QueryProjectList ====== " + err.Error())
  25. return
  26. }
  27. list, total, err := projectService.QueryProjectList(search)
  28. if err != nil {
  29. response.FailWithMessage("失败", c)
  30. global.GVA_LOG.Error("QueryProjectList ====== " + err.Error())
  31. return
  32. }
  33. response.OkWithDetailed(response.PageResult{
  34. List: list,
  35. Total: total,
  36. Page: search.PageInfo.Page,
  37. PageSize: search.PageInfo.PageSize,
  38. }, "获取成功", c)
  39. }
  40. func (pa *ProjectApi) QueryProjectByCode(c *gin.Context) {
  41. code := c.Query("code")
  42. if code == "" {
  43. response.FailWithMessage("编号不能为空", c)
  44. return
  45. }
  46. project, err := projectService.QueryProjectByCode(code)
  47. if err != nil {
  48. response.FailWithMessage("失败", c)
  49. global.GVA_LOG.Error("QueryProjectByCode ====== " + err.Error())
  50. return
  51. }
  52. response.OkWithData(project, c)
  53. }
  54. func (pa *ProjectApi) QueryFileList(c *gin.Context) {
  55. var info request.SearchProjectFileList
  56. err := c.ShouldBindJSON(&info)
  57. if err != nil {
  58. response.FailWithMessage("错误", c)
  59. global.GVA_LOG.Error("QueryFileList ====== " + err.Error())
  60. return
  61. }
  62. list, total, err := projectService.QueryFileList(info)
  63. if err != nil {
  64. response.FailWithMessage("失败", c)
  65. global.GVA_LOG.Error("QueryFileList ====== " + err.Error())
  66. return
  67. }
  68. response.OkWithDetailed(response.PageResult{
  69. List: list,
  70. Total: total,
  71. Page: info.PageInfo.Page,
  72. PageSize: info.PageInfo.PageSize,
  73. }, "获取成功", c)
  74. }
  75. func (pa *ProjectApi) QueryAllProject(c *gin.Context) {
  76. projects, err := projectService.QueryAllProject()
  77. if err != nil {
  78. response.FailWithMessage(err.Error(), c)
  79. return
  80. }
  81. response.OkWithData(projects, c)
  82. }
  83. func (pa *ProjectApi) QueryProjectsInfo(c *gin.Context) {
  84. sum, totalProject, completeProject, unCompleteProject, err := projectService.QueryProjectsInfo()
  85. if err != nil {
  86. response.FailWithMessage(err.Error(), c)
  87. return
  88. }
  89. response.OkWithData(gin.H{
  90. "sum": sum,
  91. "totalProject": totalProject,
  92. "completeProject": completeProject,
  93. "unCompleteProject": unCompleteProject,
  94. }, c)
  95. }
  96. func (pa *ProjectApi) QueryProjectState(c *gin.Context) {
  97. states, err := projectService.QueryProjectState()
  98. if err != nil {
  99. response.FailWithMessage("失败", c)
  100. global.GVA_LOG.Error("QueryProjectState ====== " + err.Error())
  101. return
  102. }
  103. response.OkWithData(states, c)
  104. }
  105. func (pa *ProjectApi) QueryWorkingHours(c *gin.Context) {
  106. code := c.Query("code")
  107. hours, err := projectService.QueryWorkingHours(code)
  108. if err != nil {
  109. response.FailWithMessage(err.Error(), c)
  110. return
  111. }
  112. response.OkWithData(hours, c)
  113. }
  114. func (pa *ProjectApi) QueryWorkingHoursList(c *gin.Context) {
  115. var info request.SearchProjectList
  116. err := c.ShouldBindJSON(&info)
  117. if err != nil {
  118. response.FailWithMessage("失败", c)
  119. global.GVA_LOG.Error("QueryWorkingHoursList ====== " + err.Error())
  120. return
  121. }
  122. list, total, err := projectService.QueryWorkingHoursList(info)
  123. if err != nil {
  124. response.FailWithMessage("失败", c)
  125. global.GVA_LOG.Error("QueryWorkingHoursList ====== " + err.Error())
  126. return
  127. }
  128. response.OkWithDetailed(response.PageResult{
  129. List: list,
  130. Total: total,
  131. Page: info.PageInfo.Page,
  132. PageSize: info.PageInfo.PageSize,
  133. }, "获取成功", c)
  134. }
  135. func (pa *ProjectApi) QueryCollections(c *gin.Context) {
  136. code := c.Query("code")
  137. collections, err := projectService.QueryCollections(code)
  138. if err != nil {
  139. response.FailWithMessage("失败", c)
  140. global.GVA_LOG.Error("QueryCollections ====== " + err.Error())
  141. return
  142. }
  143. response.OkWithData(collections, c)
  144. }
  145. func (pa *ProjectApi) QueryCollectionList(c *gin.Context) {
  146. var info request.SearchProjectList
  147. err := c.ShouldBindJSON(&info)
  148. if err != nil {
  149. response.FailWithMessage("失败", c)
  150. global.GVA_LOG.Error("QueryCollectionList ====== " + err.Error())
  151. return
  152. }
  153. list, total, err := projectService.QueryCollectionList(info)
  154. if err != nil {
  155. response.FailWithMessage("失败", c)
  156. global.GVA_LOG.Error("QueryCollectionList ====== " + err.Error())
  157. return
  158. }
  159. response.OkWithDetailed(response.PageResult{
  160. List: list,
  161. Total: total,
  162. Page: info.PageInfo.Page,
  163. PageSize: info.PageInfo.PageSize,
  164. }, "获取成功", c)
  165. }
  166. func (pa *ProjectApi) QueryReimbursementList(c *gin.Context) {
  167. var info request.SearchProjectList
  168. err := c.ShouldBindJSON(&info)
  169. if err != nil {
  170. response.FailWithMessage("失败", c)
  171. global.GVA_LOG.Error("QueryReimbursementList ====== " + err.Error())
  172. return
  173. }
  174. list, total, err := projectService.QueryReimbursementList(info)
  175. if err != nil {
  176. response.FailWithMessage("失败", c)
  177. global.GVA_LOG.Error("QueryReimbursementList ====== " + err.Error())
  178. return
  179. }
  180. response.OkWithDetailed(response.PageResult{
  181. List: list,
  182. Total: total,
  183. Page: info.PageInfo.Page,
  184. PageSize: info.PageInfo.PageSize,
  185. }, "获取成功", c)
  186. }
  187. func (pa *ProjectApi) QueryReimbursement(c *gin.Context) {
  188. code := c.Query("code")
  189. reimbursement, err := projectService.QueryReimbursement(code)
  190. if err != nil {
  191. response.FailWithMessage("失败", c)
  192. global.GVA_LOG.Error("QueryReimbursement ====== " + err.Error())
  193. return
  194. }
  195. response.OkWithData(reimbursement, c)
  196. }
  197. func (pa *ProjectApi) CreateProject(c *gin.Context) {
  198. form, err := c.MultipartForm()
  199. files := form.File["file"]
  200. if err != nil {
  201. response.FailWithMessage("失败", c)
  202. return
  203. }
  204. projectJson := c.PostForm("project")
  205. var project dao.Project
  206. err = json.Unmarshal([]byte(projectJson), &project)
  207. if err != nil {
  208. response.FailWithMessage("JSON失败", c)
  209. return
  210. }
  211. for _, file := range files {
  212. dst := file.Filename
  213. var path = "./uploads/file/" + project.Code + "/立项" + "/" + dst
  214. projectFile := dao.ProjectFile{
  215. ProjectCode: project.Code,
  216. Name: dst,
  217. Path: path,
  218. Genre: 1,
  219. }
  220. project.Files = append(project.Files, projectFile)
  221. // gin 简单做了封装,拷贝了文件流
  222. if err := c.SaveUploadedFile(file, path); err != nil {
  223. response.FailWithMessage("上传失败", c)
  224. return
  225. }
  226. }
  227. err = projectService.CreateProject(project)
  228. if err != nil {
  229. response.FailWithMessage(err.Error(), c)
  230. return
  231. }
  232. response.OkWithMessage("创建成功", c)
  233. }
  234. func (pa *ProjectApi) CreateProjectFile(c *gin.Context) {
  235. form, err := c.MultipartForm()
  236. if err != nil {
  237. response.FailWithMessage("失败", c)
  238. return
  239. }
  240. files := form.File["file"]
  241. genre := c.PostForm("genre")
  242. if len(genre) <= 0 {
  243. response.FailWithMessage("类型为空", c)
  244. return
  245. }
  246. code := c.PostForm("code")
  247. genreId, err := strconv.Atoi(genre)
  248. if err != nil {
  249. response.FailWithMessage("错误", c)
  250. global.GVA_LOG.Error("CreateProjectFile ====== " + err.Error())
  251. return
  252. }
  253. fileGenre, err := fileService.QueryFileGenreById(genreId)
  254. if err != nil {
  255. response.FailWithMessage("错误", c)
  256. global.GVA_LOG.Error("CreateProjectFile ====== " + err.Error())
  257. return
  258. }
  259. for _, file := range files {
  260. dst := file.Filename
  261. var path = "./uploads/file/" + code + "/" + fileGenre.Name + "/" + dst
  262. projectFile := dao.ProjectFile{
  263. ProjectCode: code,
  264. Name: dst,
  265. Path: path,
  266. Genre: genreId,
  267. }
  268. // gin 简单做了封装,拷贝了文件流
  269. if err := c.SaveUploadedFile(file, path); err != nil {
  270. response.FailWithMessage("上传失败", c)
  271. return
  272. }
  273. err = projectService.CreateProjectFile(projectFile)
  274. if err != nil {
  275. response.FailWithMessage("上传失败", c)
  276. return
  277. }
  278. }
  279. response.OkWithMessage("上传成功", c)
  280. }
  281. func (pa *ProjectApi) CreateProjectState(c *gin.Context) {
  282. var projectState dao.ProjectState
  283. err := c.ShouldBindJSON(&projectState)
  284. if err != nil {
  285. response.FailWithMessage("失败", c)
  286. global.GVA_LOG.Error("CreateProjectState ====== " + err.Error())
  287. return
  288. }
  289. err = projectService.CreateProjectState(projectState)
  290. if err != nil {
  291. response.FailWithMessage("失败", c)
  292. global.GVA_LOG.Error("CreateProjectState ====== " + err.Error())
  293. return
  294. }
  295. response.OkWithMessage("新增成功", c)
  296. }
  297. func (pa *ProjectApi) CreateWorkingHours(c *gin.Context) {
  298. var working dao.ProjectWorkingHours
  299. err := c.ShouldBindJSON(&working)
  300. if err != nil {
  301. response.FailWithMessage(err.Error(), c)
  302. return
  303. }
  304. err = projectService.CreateOrUpdateWorkingHours(working)
  305. if err != nil {
  306. response.FailWithMessage(err.Error(), c)
  307. return
  308. }
  309. response.OkWithMessage("更新成功", c)
  310. }
  311. func (pa *ProjectApi) CreateCollection(c *gin.Context) {
  312. var collection dao.Collection
  313. err := c.ShouldBindJSON(&collection)
  314. if err != nil {
  315. response.FailWithMessage("错误", c)
  316. global.GVA_LOG.Error("CreateCollection ====== " + err.Error())
  317. return
  318. }
  319. err = projectService.CreateCollection(collection)
  320. if err != nil {
  321. response.FailWithMessage("错误", c)
  322. global.GVA_LOG.Error("CreateCollection ====== " + err.Error())
  323. return
  324. }
  325. response.OkWithMessage("创建成功", c)
  326. }
  327. func (pa *ProjectApi) CreateReimbursement(c *gin.Context) {
  328. var reimbursement dao.Reimbursement
  329. err := c.ShouldBindJSON(&reimbursement)
  330. if err != nil {
  331. response.FailWithMessage("失败", c)
  332. global.GVA_LOG.Error("CreateReimbursement ====== " + err.Error())
  333. return
  334. }
  335. err = projectService.CreateReimbursement(reimbursement)
  336. if err != nil {
  337. response.FailWithMessage("失败", c)
  338. global.GVA_LOG.Error("CreateReimbursement ====== " + err.Error())
  339. return
  340. }
  341. response.OkWithMessage("新建成功", c)
  342. }
  343. func (pa *ProjectApi) UpdateProject(c *gin.Context) {
  344. var project dao.Project
  345. err := c.ShouldBindJSON(&project)
  346. if err != nil {
  347. response.FailWithMessage(err.Error(), c)
  348. return
  349. }
  350. err = projectService.UpdateProject(project)
  351. if err != nil {
  352. response.FailWithMessage(err.Error(), c)
  353. return
  354. }
  355. response.OkWithMessage("更新成功", c)
  356. }
  357. func (pa *ProjectApi) UpdateProjectState(c *gin.Context) {
  358. var projectState dao.ProjectState
  359. err := c.ShouldBindJSON(&projectState)
  360. if err != nil {
  361. response.FailWithMessage("失败", c)
  362. global.GVA_LOG.Error("UpdateProjectState ====== " + err.Error())
  363. return
  364. }
  365. err = projectService.UpdateProjectState(projectState)
  366. if err != nil {
  367. response.FailWithMessage("失败", c)
  368. global.GVA_LOG.Error("UpdateProjectState ====== " + err.Error())
  369. return
  370. }
  371. response.OkWithMessage("更新成功", c)
  372. }
  373. func (pa *ProjectApi) UpdateWorkingHours(c *gin.Context) {
  374. var working dao.ProjectWorkingHours
  375. err := c.ShouldBindJSON(&working)
  376. if err != nil {
  377. response.FailWithMessage(err.Error(), c)
  378. return
  379. }
  380. err = projectService.UpdateWorkingHours(working)
  381. if err != nil {
  382. response.FailWithMessage(err.Error(), c)
  383. return
  384. }
  385. response.OkWithMessage("更新成功", c)
  386. }
  387. func (pa *ProjectApi) UpdateCollection(c *gin.Context) {
  388. var collection dao.Collection
  389. err := c.ShouldBindJSON(&collection)
  390. if err != nil {
  391. response.FailWithMessage("错误", c)
  392. global.GVA_LOG.Error("UpdateCollection ====== " + err.Error())
  393. return
  394. }
  395. err = projectService.UpdateCollection(collection)
  396. if err != nil {
  397. response.FailWithMessage("错误", c)
  398. global.GVA_LOG.Error("UpdateCollection ====== " + err.Error())
  399. }
  400. response.OkWithMessage("修改成功", c)
  401. }
  402. func (pa *ProjectApi) UpdateReimbursement(c *gin.Context) {
  403. var reimbursement dao.Reimbursement
  404. err := c.ShouldBindJSON(&reimbursement)
  405. if err != nil {
  406. response.FailWithMessage("失败", c)
  407. global.GVA_LOG.Error("UpdateReimbursement ====== " + err.Error())
  408. return
  409. }
  410. err = projectService.UpdateReimbursement(reimbursement)
  411. if err != nil {
  412. response.FailWithMessage("失败", c)
  413. global.GVA_LOG.Error("UpdateReimbursement ====== " + err.Error())
  414. return
  415. }
  416. response.OkWithMessage("修改成功", c)
  417. }
  418. func (pa *ProjectApi) DeleteProject(c *gin.Context) {
  419. code := c.Query("code")
  420. if code == "" {
  421. response.FailWithMessage("编号不能为空", c)
  422. return
  423. }
  424. err := projectService.DeleteProject(code)
  425. if err != nil {
  426. response.FailWithMessage(err.Error(), c)
  427. return
  428. }
  429. response.OkWithMessage("删除成功", c)
  430. }
  431. func (pa *ProjectApi) DeleteProjectFile(c *gin.Context) {
  432. id := c.Query("id")
  433. path := c.Query("path")
  434. i, err := strconv.Atoi(id)
  435. if err != nil {
  436. response.FailWithMessage(err.Error(), c)
  437. return
  438. }
  439. err = os.Remove(path)
  440. if err != nil {
  441. // 如果发生错误,打印错误信息
  442. response.FailWithMessage("删除文件时发生错误", c)
  443. global.GVA_LOG.Error("删除文件时发生错误: " + err.Error())
  444. return
  445. }
  446. err = projectService.DeleteProjectFile(uint(i))
  447. if err != nil {
  448. response.FailWithMessage(err.Error(), c)
  449. return
  450. }
  451. response.OkWithMessage("删除成功", c)
  452. }
  453. func (pa *ProjectApi) DeleteProjectFiles(c *gin.Context) {
  454. var info request.SearchProjectFileList
  455. err := c.ShouldBindJSON(&info)
  456. fmt.Println(info)
  457. if err != nil {
  458. response.FailWithMessage(err.Error(), c)
  459. return
  460. }
  461. files, err := projectService.QueryFilesByNameOrGenre(info)
  462. if err != nil {
  463. response.FailWithMessage("错误", c)
  464. global.GVA_LOG.Error("ProjectFilesDownload ====== " + err.Error())
  465. return
  466. }
  467. fmt.Println(files)
  468. for _, file := range files {
  469. err = os.Remove(file.Path)
  470. if err != nil {
  471. // 如果发生错误,打印错误信息
  472. response.FailWithMessage("删除文件时发生错误", c)
  473. global.GVA_LOG.Error("删除文件时发生错误: " + err.Error())
  474. return
  475. }
  476. err = projectService.DeleteProjectFile(file.ID)
  477. if err != nil {
  478. response.FailWithMessage(err.Error(), c)
  479. return
  480. }
  481. }
  482. response.OkWithMessage("删除成功", c)
  483. }
  484. func (pa *ProjectApi) DeleteProjectState(c *gin.Context) {
  485. var projectState dao.ProjectState
  486. err := c.ShouldBindJSON(&projectState)
  487. if err != nil {
  488. response.FailWithMessage("失败", c)
  489. global.GVA_LOG.Error("DeleteProjectState ====== " + err.Error())
  490. return
  491. }
  492. err = projectService.DeleteProjectState(projectState)
  493. if err != nil {
  494. response.FailWithMessage("失败", c)
  495. global.GVA_LOG.Error("DeleteProjectState ====== " + err.Error())
  496. return
  497. }
  498. response.OkWithMessage("删除成功", c)
  499. }
  500. func (pa *ProjectApi) DeleteWorkingHours(c *gin.Context) {
  501. var working dao.ProjectWorkingHours
  502. err := c.ShouldBindJSON(&working)
  503. if err != nil {
  504. response.FailWithMessage(err.Error(), c)
  505. return
  506. }
  507. err = projectService.DeleteWorkingHours(working)
  508. if err != nil {
  509. response.FailWithMessage(err.Error(), c)
  510. return
  511. }
  512. response.OkWithMessage("删除成功", c)
  513. }
  514. func (pa *ProjectApi) DeleteCollection(c *gin.Context) {
  515. var collection dao.Collection
  516. err := c.ShouldBindJSON(&collection)
  517. if err != nil {
  518. response.FailWithMessage("错误", c)
  519. global.GVA_LOG.Error("DeleteCollection ====== " + err.Error())
  520. return
  521. }
  522. err = projectService.DeleteCollection(collection)
  523. if err != nil {
  524. response.FailWithMessage("错误", c)
  525. global.GVA_LOG.Error("DeleteCollection ====== " + err.Error())
  526. return
  527. }
  528. response.OkWithMessage("删除成功", c)
  529. }
  530. func (pa *ProjectApi) DeleteReimbursement(c *gin.Context) {
  531. var reimbursement dao.Reimbursement
  532. err := c.ShouldBindJSON(&reimbursement)
  533. if err != nil {
  534. response.FailWithMessage("失败", c)
  535. global.GVA_LOG.Error("DeleteReimbursement ====== " + err.Error())
  536. return
  537. }
  538. err = projectService.DeleteReimbursement(reimbursement)
  539. if err != nil {
  540. response.FailWithMessage("失败", c)
  541. global.GVA_LOG.Error("DeleteReimbursement ====== " + err.Error())
  542. return
  543. }
  544. response.OkWithMessage("删除成功", c)
  545. }
  546. func (pa *ProjectApi) ProjectFilesDownload(c *gin.Context) {
  547. var info request.SearchProjectFileList
  548. err := c.ShouldBindJSON(&info)
  549. if err != nil {
  550. response.FailWithMessage("错误", c)
  551. global.GVA_LOG.Error("ProjectFilesDownload ====== " + err.Error())
  552. return
  553. }
  554. files, err := projectService.QueryFilesByNameOrGenre(info)
  555. if err != nil {
  556. response.FailWithMessage("错误", c)
  557. global.GVA_LOG.Error("ProjectFilesDownload ====== " + err.Error())
  558. return
  559. }
  560. zipBuffer := &bytes.Buffer{}
  561. zipWriter := zip.NewWriter(zipBuffer)
  562. for _, file := range files {
  563. err := addFileToZip(zipWriter, file.Path)
  564. if err != nil {
  565. response.FailWithMessage("错误", c)
  566. global.GVA_LOG.Error("ProjectFilesDownload ====== " + err.Error())
  567. return
  568. }
  569. }
  570. // 确保所有文件都被写入
  571. if err := zipWriter.Close(); err != nil {
  572. response.FailWithMessage("错误", c)
  573. global.GVA_LOG.Error("ProjectFilesDownload ====== " + err.Error())
  574. return
  575. }
  576. // 设置响应头
  577. c.Header("Content-Description", "File Transfer")
  578. c.Header("Content-Type", "application/zip")
  579. c.Header("Content-Transfer-Encoding", "binary")
  580. c.Header("Content-Disposition", "filename=files.zip")
  581. c.Header("Cache-Control", "must-revalidate")
  582. c.Header("Pragma", "public")
  583. // 发送文件
  584. c.Data(http.StatusOK, "application/zip", zipBuffer.Bytes())
  585. }
  586. // 添加文件道zip中
  587. func addFileToZip(w *zip.Writer, filename string) error {
  588. // 打开文件
  589. f, err := os.Open(filename)
  590. if err != nil {
  591. return err
  592. }
  593. defer f.Close()
  594. // 获取文件信息
  595. fileInfo, err := f.Stat()
  596. if err != nil {
  597. return err
  598. }
  599. header, err := zip.FileInfoHeader(fileInfo)
  600. if err != nil {
  601. return err
  602. }
  603. // 使用文件的实际文件名
  604. header.Name = filepath.Base(filename)
  605. // 写入文件到zip
  606. writer, err := w.CreateHeader(header)
  607. if err != nil {
  608. return err
  609. }
  610. _, err = io.Copy(writer, f)
  611. if err != nil {
  612. return err
  613. }
  614. return err
  615. }