project.go 15 KB

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