project.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. package admin
  2. import (
  3. "archive/zip"
  4. "bytes"
  5. "encoding/json"
  6. "fmt"
  7. "github.com/gin-gonic/gin"
  8. "io"
  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) QueryWorkingHours(c *gin.Context) {
  96. code := c.Query("code")
  97. hours, err := projectService.QueryWorkingHours(code)
  98. if err != nil {
  99. response.FailWithMessage(err.Error(), c)
  100. return
  101. }
  102. response.OkWithData(hours, c)
  103. }
  104. func (pa *ProjectApi) QueryCollections(c *gin.Context) {
  105. code := c.Query("code")
  106. collections, err := projectService.QueryCollections(code)
  107. if err != nil {
  108. response.FailWithMessage("失败", c)
  109. global.GVA_LOG.Error("QueryCollections ====== " + err.Error())
  110. return
  111. }
  112. response.OkWithData(collections, c)
  113. }
  114. func (pa *ProjectApi) QueryReimbursementList(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("QueryReimbursementList ====== " + err.Error())
  120. return
  121. }
  122. list, total, err := projectService.QueryReimbursementList(info)
  123. if err != nil {
  124. response.FailWithMessage("失败", c)
  125. global.GVA_LOG.Error("QueryReimbursementList ====== " + 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) QueryReimbursement(c *gin.Context) {
  136. code := c.Query("code")
  137. reimbursement, err := projectService.QueryReimbursement(code)
  138. if err != nil {
  139. response.FailWithMessage("失败", c)
  140. global.GVA_LOG.Error("QueryReimbursement ====== " + err.Error())
  141. return
  142. }
  143. response.OkWithData(reimbursement, c)
  144. }
  145. func (pa *ProjectApi) CreateProject(c *gin.Context) {
  146. form, err := c.MultipartForm()
  147. files := form.File["file"]
  148. if err != nil {
  149. response.FailWithMessage("失败", c)
  150. return
  151. }
  152. projectJson := c.PostForm("project")
  153. var project dao.Project
  154. err = json.Unmarshal([]byte(projectJson), &project)
  155. if err != nil {
  156. response.FailWithMessage("JSON失败", c)
  157. return
  158. }
  159. fmt.Println(files)
  160. for _, file := range files {
  161. dst := file.Filename
  162. projectFile := dao.ProjectFile{
  163. ProjectCode: project.Code,
  164. Name: dst,
  165. Path: "./uploads/file/" + project.Code + "/立项" + "/" + dst,
  166. }
  167. project.Files = append(project.Files, projectFile)
  168. // gin 简单做了封装,拷贝了文件流
  169. if err := c.SaveUploadedFile(file, "./uploads/file/"+dst); err != nil {
  170. response.FailWithMessage("上传失败", c)
  171. return
  172. }
  173. }
  174. err = projectService.CreateProject(project)
  175. if err != nil {
  176. response.FailWithMessage(err.Error(), c)
  177. return
  178. }
  179. response.OkWithMessage("创建成功", c)
  180. }
  181. func (pa *ProjectApi) CreateProjectFile(c *gin.Context) {
  182. form, err := c.MultipartForm()
  183. if err != nil {
  184. response.FailWithMessage("失败", c)
  185. return
  186. }
  187. files := form.File["file"]
  188. genre := c.PostForm("genre")
  189. code := c.PostForm("code")
  190. genreId, err := strconv.Atoi(genre)
  191. if err != nil {
  192. response.FailWithMessage("错误", c)
  193. global.GVA_LOG.Error("CreateProjectFile ====== " + err.Error())
  194. return
  195. }
  196. fileGenre, err := fileService.QueryFileGenreById(genreId)
  197. if err != nil {
  198. response.FailWithMessage("错误", c)
  199. global.GVA_LOG.Error("CreateProjectFile ====== " + err.Error())
  200. return
  201. }
  202. for _, file := range files {
  203. dst := file.Filename
  204. projectFile := dao.ProjectFile{
  205. ProjectCode: code,
  206. Name: dst,
  207. Path: "./uploads/file/" + code + "/" + fileGenre.Name + "/" + dst,
  208. }
  209. // gin 简单做了封装,拷贝了文件流
  210. if err := c.SaveUploadedFile(file, "./uploads/file/"+dst); err != nil {
  211. response.FailWithMessage("上传失败", c)
  212. return
  213. }
  214. err = projectService.CreateProjectFile(projectFile)
  215. if err != nil {
  216. response.FailWithMessage("上传失败", c)
  217. return
  218. }
  219. }
  220. response.OkWithMessage("上传成功", c)
  221. }
  222. func (pa *ProjectApi) CreateWorkingHours(c *gin.Context) {
  223. var working dao.ProjectWorkingHours
  224. err := c.ShouldBindJSON(&working)
  225. if err != nil {
  226. response.FailWithMessage(err.Error(), c)
  227. return
  228. }
  229. err = projectService.CreateOrUpdateWorkingHours(working)
  230. if err != nil {
  231. response.FailWithMessage(err.Error(), c)
  232. return
  233. }
  234. response.OkWithMessage("更新成功", c)
  235. }
  236. func (pa *ProjectApi) CreateCollection(c *gin.Context) {
  237. var collection dao.Collection
  238. err := c.ShouldBindJSON(&collection)
  239. if err != nil {
  240. response.FailWithMessage("错误", c)
  241. global.GVA_LOG.Error("CreateCollection ====== " + err.Error())
  242. return
  243. }
  244. err = projectService.CreateCollection(collection)
  245. if err != nil {
  246. response.FailWithMessage("错误", c)
  247. global.GVA_LOG.Error("CreateCollection ====== " + err.Error())
  248. return
  249. }
  250. response.OkWithMessage("创建成功", c)
  251. }
  252. func (pa *ProjectApi) CreateReimbursement(c *gin.Context) {
  253. var reimbursement dao.Reimbursement
  254. err := c.ShouldBindJSON(&reimbursement)
  255. if err != nil {
  256. response.FailWithMessage("失败", c)
  257. global.GVA_LOG.Error("CreateReimbursement ====== " + err.Error())
  258. return
  259. }
  260. err = projectService.CreateReimbursement(reimbursement)
  261. if err != nil {
  262. response.FailWithMessage("失败", c)
  263. global.GVA_LOG.Error("CreateReimbursement ====== " + err.Error())
  264. return
  265. }
  266. response.OkWithMessage("新建成功", c)
  267. }
  268. func (pa *ProjectApi) UpdateProject(c *gin.Context) {
  269. var project dao.Project
  270. err := c.ShouldBindJSON(&project)
  271. if err != nil {
  272. response.FailWithMessage(err.Error(), c)
  273. return
  274. }
  275. err = projectService.UpdateProject(project)
  276. if err != nil {
  277. response.FailWithMessage(err.Error(), c)
  278. return
  279. }
  280. response.OkWithMessage("更新成功", c)
  281. }
  282. func (pa *ProjectApi) UpdateWorkingHours(c *gin.Context) {
  283. var working dao.ProjectWorkingHours
  284. err := c.ShouldBindJSON(&working)
  285. if err != nil {
  286. response.FailWithMessage(err.Error(), c)
  287. return
  288. }
  289. err = projectService.UpdateWorkingHours(working)
  290. if err != nil {
  291. response.FailWithMessage(err.Error(), c)
  292. return
  293. }
  294. response.OkWithMessage("更新成功", c)
  295. }
  296. func (pa *ProjectApi) UpdateCollection(c *gin.Context) {
  297. var collection dao.Collection
  298. err := c.ShouldBindJSON(&collection)
  299. if err != nil {
  300. response.FailWithMessage("错误", c)
  301. global.GVA_LOG.Error("UpdateCollection ====== " + err.Error())
  302. return
  303. }
  304. err = projectService.UpdateCollection(collection)
  305. if err != nil {
  306. response.FailWithMessage("错误", c)
  307. global.GVA_LOG.Error("UpdateCollection ====== " + err.Error())
  308. }
  309. response.OkWithMessage("修改成功", c)
  310. }
  311. func (pa *ProjectApi) UpdateReimbursement(c *gin.Context) {
  312. var reimbursement dao.Reimbursement
  313. err := c.ShouldBindJSON(&reimbursement)
  314. if err != nil {
  315. response.FailWithMessage("失败", c)
  316. global.GVA_LOG.Error("UpdateReimbursement ====== " + err.Error())
  317. return
  318. }
  319. err = projectService.UpdateReimbursement(reimbursement)
  320. if err != nil {
  321. response.FailWithMessage("失败", c)
  322. global.GVA_LOG.Error("UpdateReimbursement ====== " + err.Error())
  323. return
  324. }
  325. response.OkWithMessage("修改成功", c)
  326. }
  327. func (pa *ProjectApi) DeleteProject(c *gin.Context) {
  328. code := c.Query("code")
  329. if code == "" {
  330. response.FailWithMessage("编号不能为空", c)
  331. return
  332. }
  333. err := projectService.DeleteProject(code)
  334. if err != nil {
  335. response.FailWithMessage(err.Error(), c)
  336. return
  337. }
  338. response.OkWithMessage("删除成功", c)
  339. }
  340. func (pa *ProjectApi) DeleteProjectFile(c *gin.Context) {
  341. id := c.Query("id")
  342. i, err := strconv.Atoi(id)
  343. if err != nil {
  344. response.FailWithMessage(err.Error(), c)
  345. return
  346. }
  347. err = projectService.DeleteProjectFile(uint(i))
  348. if err != nil {
  349. response.FailWithMessage(err.Error(), c)
  350. return
  351. }
  352. response.OkWithMessage("删除成功", c)
  353. }
  354. func (pa *ProjectApi) DeleteWorkingHours(c *gin.Context) {
  355. var working dao.ProjectWorkingHours
  356. err := c.ShouldBindJSON(&working)
  357. if err != nil {
  358. response.FailWithMessage(err.Error(), c)
  359. return
  360. }
  361. err = projectService.DeleteWorkingHours(working)
  362. if err != nil {
  363. response.FailWithMessage(err.Error(), c)
  364. return
  365. }
  366. response.OkWithMessage("删除成功", c)
  367. }
  368. func (pa *ProjectApi) DeleteCollection(c *gin.Context) {
  369. var collection dao.Collection
  370. err := c.ShouldBindJSON(&collection)
  371. if err != nil {
  372. response.FailWithMessage("错误", c)
  373. global.GVA_LOG.Error("DeleteCollection ====== " + err.Error())
  374. return
  375. }
  376. err = projectService.DeleteCollection(collection)
  377. if err != nil {
  378. response.FailWithMessage("错误", c)
  379. global.GVA_LOG.Error("DeleteCollection ====== " + err.Error())
  380. return
  381. }
  382. response.OkWithMessage("删除成功", c)
  383. }
  384. func (pa *ProjectApi) DeleteReimbursement(c *gin.Context) {
  385. var reimbursement dao.Reimbursement
  386. err := c.ShouldBindJSON(&reimbursement)
  387. if err != nil {
  388. response.FailWithMessage("失败", c)
  389. global.GVA_LOG.Error("DeleteReimbursement ====== " + err.Error())
  390. return
  391. }
  392. err = projectService.DeleteReimbursement(reimbursement)
  393. if err != nil {
  394. response.FailWithMessage("失败", c)
  395. global.GVA_LOG.Error("DeleteReimbursement ====== " + err.Error())
  396. return
  397. }
  398. response.OkWithMessage("删除成功", c)
  399. }
  400. func (pa *ProjectApi) ProjectFilesDownload(c *gin.Context) {
  401. var info request.SearchProjectFileList
  402. err := c.ShouldBindJSON(&info)
  403. if err != nil {
  404. response.FailWithMessage("错误", c)
  405. global.GVA_LOG.Error("ProjectFilesDownload ====== " + err.Error())
  406. return
  407. }
  408. files, err := projectService.QueryFilesByNameOrGenre(info)
  409. if err != nil {
  410. response.FailWithMessage("错误", c)
  411. global.GVA_LOG.Error("ProjectFilesDownload ====== " + err.Error())
  412. return
  413. }
  414. zipBuffer := &bytes.Buffer{}
  415. zipWriter := zip.NewWriter(zipBuffer)
  416. for _, file := range files {
  417. err := addFileToZip(zipWriter, file.Path)
  418. if err != nil {
  419. response.FailWithMessage("错误", c)
  420. global.GVA_LOG.Error("ProjectFilesDownload ====== " + err.Error())
  421. return
  422. }
  423. }
  424. if err := zipWriter.Close(); err != nil {
  425. response.FailWithMessage("错误", c)
  426. global.GVA_LOG.Error("ProjectFilesDownload ====== " + err.Error())
  427. return
  428. }
  429. c.Header("Content-Type", "application/zip") // 表示是文件流,唤起浏览器下载,一般设置了这个,就要设置文件名
  430. c.Header("Content-Disposition", "attachment; filename="+info.Code+".zip") // 用来指定下载下来的文件名
  431. c.Header("Content-Transfer-Encoding", "binary") // 表示传输过程中的编码形式,乱码问题可能就是因为它
  432. c.Data(0, "application/zip", zipBuffer.Bytes())
  433. }
  434. // 添加文件道zip中
  435. func addFileToZip(w *zip.Writer, filename string) error {
  436. file, err := os.Open(filename)
  437. if err != nil {
  438. return err
  439. }
  440. defer file.Close()
  441. fileInfo, err := file.Stat()
  442. if err != nil {
  443. return err
  444. }
  445. header, err := zip.FileInfoHeader(fileInfo)
  446. if err != nil {
  447. return err
  448. }
  449. header.Name = filepath.Base(filename)
  450. writer, err := w.CreateHeader(header)
  451. if err != nil {
  452. return err
  453. }
  454. _, err = io.Copy(writer, file)
  455. return err
  456. }