StatisticalAnalysisController.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. package com.ozs.web.controller.statisticalAnalysis;
  2. import com.ozs.base.domain.BaseSupplier;
  3. import com.ozs.common.annotation.Log;
  4. import com.ozs.common.constant.ModularConstans;
  5. import com.ozs.common.core.controller.BaseController;
  6. import com.ozs.common.core.domain.AjaxResult;
  7. import com.ozs.common.enums.BusinessType;
  8. import com.ozs.common.utils.StringUtils;
  9. import com.ozs.plan.service.PlanYearsService;
  10. import com.ozs.pm.doman.vo.requestVo.PmDemandReqVo;
  11. import com.ozs.pm.doman.vo.responseVo.StatisticalChartsResVo;
  12. import com.ozs.pm.service.IPmDemandService;
  13. import com.ozs.system.domain.SysFileInfo;
  14. import io.swagger.annotations.ApiOperation;
  15. import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
  16. import org.apache.poi.util.Units;
  17. import org.apache.poi.xwpf.usermodel.XWPFDocument;
  18. import org.apache.poi.xwpf.usermodel.XWPFParagraph;
  19. import org.apache.poi.xwpf.usermodel.XWPFRun;
  20. import org.springframework.security.access.prepost.PreAuthorize;
  21. import org.springframework.web.bind.annotation.*;
  22. import org.springframework.web.multipart.MultipartFile;
  23. import javax.annotation.Resource;
  24. import java.io.File;
  25. import java.io.FileInputStream;
  26. import java.io.FileOutputStream;
  27. import java.io.IOException;
  28. import java.io.OutputStream;
  29. import java.util.List;
  30. import java.util.Map;
  31. /**
  32. * 统计分析页面控制层
  33. *
  34. * @author buzhanyi
  35. */
  36. @RestController
  37. @RequestMapping("/statistical")
  38. public class StatisticalAnalysisController extends BaseController {
  39. @Resource
  40. private IPmDemandService pmDemandService;
  41. @ApiOperation(value = "项目属性分布")
  42. @PostMapping("/countByProjectAttr")
  43. @PreAuthorize("@ss.hasPermi('statistical:countByProjectAttr')")
  44. @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
  45. public AjaxResult countByProjectAttr(@RequestBody PmDemandReqVo pmDemandReqVo) {
  46. //按照项目属性统计所有的项目
  47. if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
  48. return error("登录账号的单位 不能为空!");
  49. }
  50. List<StatisticalChartsResVo> resVos = pmDemandService.countByProjectAttr();
  51. return AjaxResult.success(resVos);
  52. }
  53. @ApiOperation(value = "采购方式分布")
  54. @PostMapping("/countByPurchaseMouth")
  55. @PreAuthorize("@ss.hasPermi('statistical:countByPurchaseMouth')")
  56. @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
  57. public AjaxResult countByPurchaseMouth(@RequestBody PmDemandReqVo pmDemandReqVo) {
  58. //按照项目属性统计所有的项目
  59. if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
  60. return error("登录账号的单位 不能为空!");
  61. }
  62. List<StatisticalChartsResVo> resVos = pmDemandService.countByPurchaseMode();
  63. return AjaxResult.success(resVos);
  64. }
  65. @ApiOperation(value = "项目金额分布")
  66. @PostMapping("/countByEvaluation")
  67. @PreAuthorize("@ss.hasPermi('statistical:countByEvaluation')")
  68. @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
  69. public AjaxResult countByEvaluation(@RequestBody PmDemandReqVo pmDemandReqVo) {
  70. //按照概算金额统计所有的项目
  71. //概算金额包括:100万以下采购任务、100至500万元采购任务、500至1000万元采购任务、1000至5000万元采购任务、5000至1亿元采购任务、1亿元及以上采购任务
  72. if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
  73. return error("登录账号的单位 不能为空!");
  74. }
  75. List<StatisticalChartsResVo> resVos = pmDemandService.countByEvaluation(pmDemandReqVo);
  76. return AjaxResult.success(resVos);
  77. }
  78. @ApiOperation(value = "执行滞后采购项目情况")
  79. @PostMapping("/countProjectExceed")
  80. @PreAuthorize("@ss.hasPermi('statistical:countProjectExceed')")
  81. @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
  82. public AjaxResult countProjectExceed(@RequestBody PmDemandReqVo pmDemandReqVo) {
  83. //执行滞后采购项目:本年度所有的逾期项目数
  84. //预算金额:本年度所有逾期项目累加的预算金额
  85. //滞后项目数量占比:指本年度逾期项目数量/本年度所有项目数量
  86. if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
  87. return error("登录账号的单位 不能为空!");
  88. }
  89. return pmDemandService.countProjectExceed(pmDemandReqVo);
  90. }
  91. @ApiOperation(value = "滞后项目数量分析")
  92. @PostMapping("/exceedAnalysis")
  93. @PreAuthorize("@ss.hasPermi('statistical:exceedAnalysis')")
  94. @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
  95. public AjaxResult exceedAnalysis(@RequestBody PmDemandReqVo pmDemandReqVo) {
  96. //统计不同时间维度的逾期项目
  97. // 需求单位可查看本单位及其下属单位的统计数据
  98. if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
  99. return error("登录账号的单位 不能为空!");
  100. }
  101. if (StringUtils.isNull(pmDemandReqVo.getTimeType())) {
  102. return error("统计时间类型不能为空, 1:年度,2:季度,3:月份!");
  103. }
  104. return pmDemandService.exceedAnalysis(pmDemandReqVo);
  105. }
  106. @ApiOperation(value = "滞后项目时长分析")
  107. @PostMapping("/exceedMarketAnalysis")
  108. @PreAuthorize("@ss.hasPermi('statistical:exceedMarketAnalysis')")
  109. @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
  110. public AjaxResult exceedMarketAnalysis(@RequestBody PmDemandReqVo pmDemandReqVo) {
  111. //按照滞后时长统计项目数量
  112. //滞后时长包括:滞后1个月以内的采购任务、滞后1至3个月采购任务、滞后3至6个月采购任务、滞后6个月至1年采购任务、滞后1年以上采购任务
  113. if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
  114. return error("登录账号的单位 不能为空!");
  115. }
  116. return pmDemandService.exceedMarketAnalysis(pmDemandReqVo);
  117. }
  118. @ApiOperation(value = "采购项目信息统计")
  119. @PostMapping("/purchaseProjectStatistical")
  120. @PreAuthorize("@ss.hasPermi('statistical:purchaseProjectStatistical')")
  121. @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
  122. public AjaxResult purchaseProjectStatistical(@RequestBody PmDemandReqVo pmDemandReqVo) {
  123. // 需求单位可查看本单位及其下属单位的统计数据
  124. if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
  125. return error("登录账号的单位 不能为空!");
  126. }
  127. Map<String, Integer> map = pmDemandService.purchaseProjectStatistical(pmDemandReqVo);
  128. return success(map);
  129. }
  130. @ApiOperation(value = "重大规划采购任务专项计划管理情况")
  131. @PostMapping("/countMajorProject")
  132. @PreAuthorize("@ss.hasPermi('statistical:countMajorProject')")
  133. @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
  134. public AjaxResult countMajorProject(@RequestBody PmDemandReqVo pmDemandReqVo) {
  135. if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
  136. return error("登录账号的单位 不能为空!");
  137. }
  138. return pmDemandService.countMajorProject(pmDemandReqVo);
  139. }
  140. @ApiOperation(value = "任务数量趋势分析")
  141. @PostMapping("/taskQuantityAnalysis")
  142. @PreAuthorize("@ss.hasPermi('statistical:taskQuantityAnalysis')")
  143. @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
  144. public AjaxResult taskQuantityAnalysis(@RequestBody PmDemandReqVo pmDemandReqVo) {
  145. //任务数量趋势分析:按照月、季度、年统计“项目属性”字段中“重大规划”属性的项目
  146. // 需求单位可查看本单位及其下属单位的统计数据
  147. if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
  148. return error("登录账号的单位 不能为空!");
  149. }
  150. if (StringUtils.isNull(pmDemandReqVo.getTimeType())) {
  151. return error("统计时间类型不能为空, 1:年度,2:季度,3:月份!");
  152. }
  153. return pmDemandService.taskQuantityAnalysis(pmDemandReqVo);
  154. }
  155. @ApiOperation(value = "各阶段采购任务数量分布")
  156. @PostMapping("/countEveryStatusNum")
  157. @PreAuthorize("@ss.hasPermi('statistical:countEveryStatusNum')")
  158. @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
  159. public AjaxResult countEveryStatusNum(@RequestBody PmDemandReqVo pmDemandReqVo) {
  160. //指项目进行到各个阶段的数量
  161. //阶段包括:待选取代理、待上传招标文件、待发布公告、待开标、待发布中标公告、中标公式中
  162. //展示信息包括:鼠标上到图表时,展示项目数量和平均消耗时长(平均消耗时长,指所有项目在该阶段完成的平均时间)
  163. if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
  164. return error("登录账号的单位 不能为空!");
  165. }
  166. return pmDemandService.countEveryStatusNum(pmDemandReqVo);
  167. }
  168. @ApiOperation(value = "采购项目--项目数量分析")
  169. @PostMapping("/purchaseProjectNumber")
  170. @PreAuthorize("@ss.hasPermi('statistical:purchaseProjectNumber')")
  171. @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
  172. public AjaxResult purchaseProjectNumber(@RequestBody PmDemandReqVo pmDemandReqVo) {
  173. // 需求单位可查看本单位及其下属单位的统计数据
  174. if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
  175. return error("登录账号的单位 不能为空!");
  176. }
  177. Map<String, Integer> map = pmDemandService.purchaseProjectNumber(pmDemandReqVo);
  178. return success(map);
  179. }
  180. @ApiOperation(value = "项目执行进度统计")
  181. @PostMapping("/purchaseProjectExecute")
  182. @PreAuthorize("@ss.hasPermi('statistical:purchaseProjectExecute')")
  183. @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
  184. public AjaxResult purchaseProjectExecute(@RequestBody PmDemandReqVo pmDemandReqVo) {
  185. // 需求单位可查看本单位及其下属单位的统计数据
  186. if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
  187. return error("登录账号的单位 不能为空!");
  188. }
  189. Map<String, Integer> map = pmDemandService.purchaseProjectExecute(pmDemandReqVo);
  190. return success(map);
  191. }
  192. @ApiOperation(value = "已完成项目数量统计")
  193. @PostMapping("/purchaseProjectCompleteNumber")
  194. @PreAuthorize("@ss.hasPermi('statistical:purchaseProjectCompleteNumber')")
  195. @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
  196. public AjaxResult purchaseProjectCompleteNumber(@RequestBody PmDemandReqVo pmDemandReqVo) {
  197. // 需求单位可查看本单位及其下属单位的统计数据
  198. if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
  199. return error("登录账号的单位 不能为空!");
  200. }
  201. if (StringUtils.isNull(pmDemandReqVo.getTimeType())) {
  202. return error("统计时间类型不能为空, 1:年度,2:季度,3:月份!");
  203. }
  204. List<Map<String, Integer>> map = pmDemandService.purchaseProjectCompleteNumber(pmDemandReqVo);
  205. return success(map);
  206. }
  207. @ApiOperation(value = "已完成采购任务数量")
  208. @PostMapping("/purchaseTaskFinish")
  209. @PreAuthorize("@ss.hasPermi('statistical:purchaseTaskFinish')")
  210. @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
  211. public AjaxResult purchaseTaskFinish(@RequestBody PmDemandReqVo pmDemandReqVo) {
  212. // 需求单位可查看本单位及其下属单位的统计数据
  213. if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
  214. return error("登录账号的单位 不能为空!");
  215. }
  216. if (StringUtils.isNull(pmDemandReqVo.getTimeType())) {
  217. return error("统计时间类型不能为空, 1:年度,2:季度,3:月份!");
  218. }
  219. List<Map<String, Integer>> map = pmDemandService.purchaseTaskFinish(pmDemandReqVo);
  220. return success(map);
  221. }
  222. @ApiOperation(value = "各阶段项目数量分布")
  223. @PostMapping("/purchaseProjectDistribution")
  224. @PreAuthorize("@ss.hasPermi('statistical:purchaseProjectDistribution')")
  225. @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
  226. public AjaxResult purchaseProjectDistribution(@RequestBody PmDemandReqVo pmDemandReqVo) {
  227. // 需求单位可查看本单位及其下属单位的统计数据
  228. if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
  229. return error("登录账号的单位 不能为空!");
  230. }
  231. List<Map<String, String>> map = pmDemandService.purchaseProjectDistribution(pmDemandReqVo);
  232. return success(map);
  233. }
  234. @ApiOperation(value = "项目数量分析")
  235. @PostMapping("/purchaseProjectNumberAnalysis")
  236. @PreAuthorize("@ss.hasPermi('statistical:purchaseProjectNumberAnalysis')")
  237. @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
  238. public AjaxResult purchaseProjectNumberAnalysis(@RequestBody PmDemandReqVo pmDemandReqVo) {
  239. // 需求单位可查看本单位及其下属单位的统计数据
  240. if (StringUtils.isNull(pmDemandReqVo.getPurchaseDeptId())) {
  241. return error("登录账号的单位 不能为空!");
  242. }
  243. if (StringUtils.isNull(pmDemandReqVo.getTimeType())) {
  244. return error("统计时间类型不能为空, 1:年度,2:季度,3:月份!");
  245. }
  246. List<Map<String, String>> map = pmDemandService.purchaseProjectNumberAnalysis(pmDemandReqVo);
  247. return success(map);
  248. }
  249. @ApiOperation(value = "生成分析报告")
  250. @PostMapping("/generateAnalysisReport")
  251. @PreAuthorize("@ss.hasPermi('statistical:generateAnalysisReport')")
  252. @Log(title = ModularConstans.statisticalAnalysis, businessType = BusinessType.QUERY)
  253. public AjaxResult generateAnalysisReport(@RequestBody SysFileInfo file) {
  254. // 创建一个document对象,相当于新建一个word文档(后缀名为.docx)。
  255. XWPFDocument document = new XWPFDocument();
  256. // 创建一个段落对象。
  257. XWPFParagraph paragraph = document.createParagraph();
  258. // 创建一个run。run具体是什么,我也不知道。但是run是这里面的最小单元了。
  259. XWPFRun run = paragraph.createRun();
  260. // 插入图片
  261. // 创建一个输出流 即是该文档的保存位置
  262. try {
  263. //文件路径位置和文件名称
  264. run.addPicture(new FileInputStream(file.getFileUrl()),
  265. XWPFDocument.PICTURE_TYPE_PNG,
  266. file.getFileName(),
  267. Units.toEMU(400),
  268. Units.toEMU(200));
  269. //文件保存地址
  270. OutputStream outputStream = new FileOutputStream(file.getFileMappingPath());
  271. document.write(outputStream);
  272. outputStream.close();
  273. return AjaxResult.success("分析文档已生成");
  274. } catch (IOException e) {
  275. e.printStackTrace();
  276. } catch (InvalidFormatException e) {
  277. e.printStackTrace();
  278. }
  279. return AjaxResult.success("分析文档已生成");
  280. }
  281. }