CostVerifyTemplateController.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. package com.hotent.surveyinfo.controller;
  2. import com.hotent.base.annotation.ApiGroup;
  3. import com.hotent.base.constants.ApiGroupConsts;
  4. import com.hotent.base.controller.BaseController;
  5. import com.hotent.base.model.CommonResult;
  6. import com.hotent.base.query.PageList;
  7. import com.hotent.base.util.StringUtil;
  8. import com.hotent.common.CrudService;
  9. import com.hotent.resp.PageResp;
  10. import com.hotent.surveyinfo.dao.*;
  11. import com.hotent.surveyinfo.manager.CostSurveyTemplateManager;
  12. import com.hotent.surveyinfo.manager.CostSurveyTemplateVersionManager;
  13. import com.hotent.surveyinfo.manager.CostVerifyTemplateManager;
  14. import com.hotent.surveyinfo.model.*;
  15. import com.hotent.surveyinfo.req.ConstSurveyFdPageParam;
  16. import com.hotent.surveyinfo.req.ConstSurveyPageReq;
  17. import com.hotent.surveyinfo.req.ConstVerifyPageParam;
  18. import com.hotent.surveyinfo.req.ConstVerifyPageReq;
  19. import com.hotent.uc.api.model.IUser;
  20. import com.hotent.uc.util.ContextUtil;
  21. import io.swagger.annotations.Api;
  22. import io.swagger.annotations.ApiOperation;
  23. import io.swagger.annotations.ApiParam;
  24. import org.apache.poi.ss.usermodel.Cell;
  25. import org.apache.poi.ss.usermodel.Row;
  26. import org.apache.poi.ss.usermodel.Sheet;
  27. import org.apache.poi.ss.usermodel.Workbook;
  28. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  29. import org.springframework.beans.factory.annotation.Autowired;
  30. import org.springframework.web.bind.annotation.*;
  31. import javax.servlet.http.HttpServletResponse;
  32. import java.net.URLEncoder;
  33. import java.time.LocalDateTime;
  34. import java.util.*;
  35. import java.util.stream.Collectors;
  36. /**
  37. * 成本核定表模板表 前端控制器
  38. *
  39. * @company 山西清众科技股份有限公司
  40. * @author 超级管理员
  41. * @since 2025-09-19
  42. */
  43. @RestController
  44. @RequestMapping("/costVerifyTemplate/v1/")
  45. @Api(tags = "成本核定")
  46. @ApiGroup(group = {ApiGroupConsts.GROUP_COST})
  47. public class CostVerifyTemplateController extends BaseController<CostVerifyTemplateManager, CostVerifyTemplate> {
  48. @Autowired
  49. CostVerifyTemplateManager constbaseService;
  50. @Autowired
  51. CostVerifyTemplateDao costSurveyTemplateDao;
  52. @Autowired
  53. CostVerifyTemplateItemsDao costVerifyTemplateItemsDao;
  54. @Autowired
  55. CostVerifyTemplateHeadersDao costVerifyTemplateHeadersDao;
  56. @Autowired
  57. CostSurveyTemplateVersionManager costSurveyTemplateVersionMapper;
  58. // 创建通用服务实例
  59. private final CrudService crudService = new CrudService();
  60. /**
  61. * 获取所有成本核定表模板数据
  62. * @return
  63. * @throws Exception
  64. */
  65. @GetMapping(value="/listAll")
  66. @ApiOperation(value="获取所有成本核定表模板数据", httpMethod = "GET", notes = "获取所有成本核定表模板数据集合")
  67. public PageResp<CostVerifyTemplate> listAll(ConstVerifyPageReq req) throws Exception{
  68. return crudService.pageQuery(req, constbaseService::getCostSurveyList);
  69. }
  70. @PostMapping(value="/listPage")
  71. @ApiOperation(value="获取所有成本核定表模板数据", httpMethod = "POST", notes = "获取所有成本核定表模板数据")
  72. public PageList<CostVerifyTemplate> listPage(@RequestBody ConstVerifyPageParam param) throws Exception{
  73. return constbaseService.listPage(param);
  74. }
  75. /**
  76. * 获取所有状态为启用的成本核定表模板数据
  77. * @return 启用状态的成本核定表模板列表
  78. * @throws Exception
  79. */
  80. @GetMapping(value="/listEnabled")
  81. @ApiOperation(value="获取所有状态为启用的成本核定表模板数据", httpMethod = "GET", notes = "获取所有状态为启用的成本核定表模板数据")
  82. public CommonResult<List<CostVerifyTemplate>> listEnabled() throws Exception {
  83. CostVerifyTemplate queryCondition = new CostVerifyTemplate();
  84. queryCondition.setStatus("0"); // 启用状态
  85. List<CostVerifyTemplate> enabledTemplates = costSurveyTemplateDao.selectByCondition(queryCondition);
  86. return CommonResult.<List<CostVerifyTemplate>>ok().value(enabledTemplates);
  87. }
  88. /**
  89. * 生成核定模板数据
  90. * @param templateId 模板ID
  91. * @param templatename 模板类型:1-成本调查固定表,其他-成本核定表
  92. * @param catalogId 监审id
  93. * @return 核定模板数据(包含表头和数据项)
  94. * @throws Exception
  95. */
  96. @GetMapping(value="/generateTemplateData")
  97. @ApiOperation(value="生成核定模板数据", httpMethod = "GET", notes = "根据模板ID和模板类型生成核定模板数据")
  98. public CommonResult<CostVerifyTemplate> generateTemplateData(
  99. @ApiParam(name="templateId", value="模板ID", required = true)
  100. @RequestParam String templateId,
  101. @ApiParam(name="templatename", value="模板名称", required = true)
  102. String templatename,@ApiParam(name="catalogId", value="监审id", required = true)
  103. String taskId,@ApiParam(name="taskId", value="任务id", required = false)
  104. @RequestParam String catalogId) throws Exception {
  105. //根据模板ID获取核定模板数据
  106. CostVerifyTemplate template = costSurveyTemplateDao.selectById(templateId);
  107. String tid = UUID.randomUUID().toString();
  108. template.setIsDelete("0");
  109. template.setSurveyTemplateName(templatename);
  110. template.setSurveyTemplateId(tid);
  111. template.setCreateBy(ContextUtil.getCurrentUser().getAccount());
  112. template.setCreateTime( LocalDateTime.now());
  113. template.setCreatetemplateid(templateId);
  114. template.setVersionNo(constbaseService.generateVersionNumber());
  115. template.setCatalogId(catalogId);
  116. template.setCreatemode("2");
  117. template.setCreatetemplateid(templateId);
  118. //新增修改后的模板数据
  119. costSurveyTemplateDao.insert(template);
  120. List<CostVerifyTemplateItems> itemsList = costVerifyTemplateItemsDao.selectByVerifyTemplateId(templateId,taskId);
  121. List<CostVerifyTemplateItems> updateitemsList=new ArrayList<>();
  122. // 从成本核定表获取启用状态的表头和数据项
  123. List<CostVerifyTemplateHeaders> headersList = costVerifyTemplateHeadersDao.selectBySurveyTemplateId(templateId);
  124. //将 headersList 保存到数据库中
  125. for (CostVerifyTemplateHeaders header : headersList) {
  126. String headerId = UUID.randomUUID().toString();
  127. header.setId(headerId);
  128. header.setSurveyTemplateId(tid);
  129. header.setCreateBy(ContextUtil.getCurrentUser().getAccount());
  130. header.setCreateTime( LocalDateTime.now());
  131. costVerifyTemplateHeadersDao.insert(header);
  132. if (itemsList != null && !itemsList.isEmpty()) {
  133. for (CostVerifyTemplateItems items : itemsList)
  134. {
  135. if (items.getHeadersId().equals(header.getId())){
  136. items.setHeadersId(headerId);
  137. updateitemsList.add(items);
  138. }
  139. }
  140. }
  141. }
  142. // 3. 将updateitemsList数据依次写入 CostVerifyTemplateItems 表中
  143. if (updateitemsList != null && !updateitemsList.isEmpty()) {
  144. for (CostVerifyTemplateItems items : updateitemsList)
  145. {
  146. String itemId = UUID.randomUUID().toString();
  147. items.setId(itemId);
  148. items.setSurveyTemplateId(tid);
  149. items.setCreateBy(ContextUtil.getCurrentUser().getAccount());
  150. items.setCreateTime( LocalDateTime.now());
  151. costVerifyTemplateItemsDao.insert(items);
  152. }
  153. }
  154. return CommonResult.<CostVerifyTemplate>ok().value(template);
  155. }
  156. /**
  157. * 根据id获取成本核定表模板表数据详情
  158. * @param id
  159. * @return
  160. * @throws Exception
  161. * ModelAndView
  162. */
  163. @GetMapping(value="/getDetail")
  164. @ApiOperation(value="根据id获取成本核定表模板表数据详情",httpMethod = "GET",notes = "根据id获取成本核定表模板表数据详情")
  165. public CommonResult<CostVerifyTemplate> getDetail(@ApiParam(name="id",value="业务对象主键", required = true)@RequestParam(required=true) String id) throws Exception{
  166. return CommonResult.<CostVerifyTemplate>ok().value(baseService.getDetail(id));
  167. }
  168. /**
  169. * 新增,更新成本核定表模板表
  170. * @param costSurveyTemplate
  171. * @throws Exception
  172. * @return
  173. * @exception
  174. */
  175. @PostMapping(value="/save")
  176. @ApiOperation(value = "新增,更新成本核定表模板表数据", httpMethod = "POST", notes = "新增,更新成本核定表模板表数据")
  177. public CommonResult<String> save(@ApiParam(name="CostSurveyTemplate",value="成本核定表模板表对象", required = true)@RequestBody CostVerifyTemplate costSurveyTemplate) throws Exception{
  178. String msg = StringUtil.isEmpty(costSurveyTemplate.getSurveyTemplateId()) ? "添加成本核定表模板表成功" : "更新成本核定表模板表成功";
  179. if(StringUtil.isEmpty(costSurveyTemplate.getSurveyTemplateId()))
  180. {
  181. IUser user = ContextUtil.getCurrentUser();
  182. costSurveyTemplate.setCreateBy(user.getAccount());
  183. costSurveyTemplate.setCreateTime(LocalDateTime.now());
  184. }
  185. else{
  186. costSurveyTemplate.setUpdateBy(ContextUtil.getCurrentUser().getAccount());
  187. costSurveyTemplate.setUpdateTime(LocalDateTime.now());
  188. }
  189. baseService.createOrUpdate(costSurveyTemplate);
  190. return CommonResult.<String>ok().message(msg);
  191. }
  192. /**
  193. * 根据id删除成本核定表模板数据
  194. * @param id
  195. * @return
  196. * @throws Exception
  197. */
  198. @ApiOperation(value = "根据id删除成本核定表模板数据", httpMethod = "GET", notes = "根据id删除成本核定表模板数据")
  199. @GetMapping(value = "/remove")
  200. public CommonResult<String> remove(@ApiParam(name = "id", value = "业务对象主键", required = true) @RequestParam(required = true) String id) throws Exception {
  201. baseService.remove(id);
  202. costVerifyTemplateItemsDao.deleteByCostVerifyTemplateId( id);
  203. costVerifyTemplateHeadersDao.deleteByCostVerifyTemplateId( id);
  204. return CommonResult.<String>ok().message("删除成本核定表模板成功");
  205. }
  206. /**
  207. * 批量删除成本核定表模板数据
  208. * @param ids 要删除的ID列表
  209. * @return 操作结果
  210. * @throws Exception
  211. */
  212. @ApiOperation(value = "批量删除成本核定表模板数据", httpMethod = "POST", notes = "批量删除成本核定表模板数据")
  213. @PostMapping(value = "/batchRemove")
  214. public CommonResult<String> batchRemove(@ApiParam(name = "ids", value = "业务对象主键列表", required = true) @RequestBody List<String> ids) throws Exception {
  215. if (ids == null || ids.isEmpty()) {
  216. return CommonResult.<String>error().message("删除失败:未选择任何数据");
  217. }
  218. try {
  219. baseService.batchRemove(ids);
  220. for (int i = 0; i <ids.size() ; i++) {
  221. costVerifyTemplateItemsDao.deleteByCostVerifyTemplateId(ids.get(i));
  222. costVerifyTemplateHeadersDao.deleteByCostVerifyTemplateId(ids.get(i));
  223. }
  224. return CommonResult.<String>ok().message("成功删除" + ids.size() + "条数据");
  225. } catch (Exception e) {
  226. return CommonResult.<String>error().message("删除失败:" + e.getMessage());
  227. }
  228. }
  229. /**
  230. * 获取除去指定ID外的所有成本核定表模板列表
  231. * @param surveyTemplateId 要排除的模板ID
  232. * @return 成本核定表模板列表
  233. * @throws Exception
  234. */
  235. @GetMapping(value="/listExcludeId")
  236. @ApiOperation(value="计算公式-选择成本核定表", httpMethod = "GET", notes = "获取除去指定ID外的所有成本核定表模板列表")
  237. public CommonResult<List<CostVerifyTemplate>> listExcludeId(
  238. @ApiParam(name="surveyTemplateId", value="要排除的模板ID", required = false)
  239. @RequestParam(required = false) String surveyTemplateId) throws Exception {
  240. CostVerifyTemplate queryCondition = new CostVerifyTemplate();
  241. queryCondition.setStatus("0");//启用状态的成本核定表模板
  242. IUser user = ContextUtil.getCurrentUser();
  243. queryCondition.setCreateBy(user.getAccount());
  244. // 这里可以根据业务需要设置其他查询条件
  245. List<CostVerifyTemplate> allTemplates = costSurveyTemplateDao.selectByCondition(queryCondition);
  246. // 如果提供了excludeId,则过滤掉该ID的记录
  247. if (surveyTemplateId != null && !surveyTemplateId.isEmpty()) {
  248. allTemplates = allTemplates.stream()
  249. .filter(template -> !surveyTemplateId.equals(template.getSurveyTemplateId()))
  250. .collect(Collectors.toList());
  251. }
  252. return CommonResult.<List<CostVerifyTemplate>>ok().value(allTemplates);
  253. }
  254. /**
  255. * 导出成本核定表Excel模板
  256. * @param templateId 模板ID
  257. * @param response HTTP响应对象
  258. * @throws Exception 异常
  259. */
  260. @GetMapping(value="/exportExcelTemplate")
  261. @ApiOperation(value="导出成本核定表Excel模板", httpMethod = "GET", notes = "导出成本核定表Excel模板")
  262. public void exportExcelTemplate(
  263. @ApiParam(name="templateId", value="成本核定模板ID", required = true)
  264. @RequestParam String templateId,
  265. @RequestParam String taskId,
  266. HttpServletResponse response) throws Exception {
  267. // 获取成本核定模板
  268. CostVerifyTemplate template = costSurveyTemplateDao.selectById(templateId);
  269. if (template == null) {
  270. response.sendError(HttpServletResponse.SC_BAD_REQUEST, "未找到指定的模板");
  271. return;
  272. }
  273. // 获取表头信息
  274. List<CostVerifyTemplateHeaders> headersList = costVerifyTemplateHeadersDao.selectBySurveyTemplateId(templateId);
  275. // 获取数据项信息
  276. List<CostVerifyTemplateItems> itemsList = costVerifyTemplateItemsDao.selectByVerifyTemplateId(templateId,taskId);
  277. // 创建Excel工作簿
  278. Workbook workbook = new XSSFWorkbook();
  279. Sheet sheet = workbook.createSheet(template.getSurveyTemplateName());
  280. // 创建表头行
  281. Row headerRow = sheet.createRow(0);
  282. // 按照orderNum排序表头
  283. headersList.sort(Comparator.comparing(CostVerifyTemplateHeaders::getOrderNum,
  284. Comparator.nullsLast(Comparator.naturalOrder())));
  285. // 根据表头信息创建Excel列标题
  286. for (int i = 0; i < headersList.size(); i++) {
  287. CostVerifyTemplateHeaders header = headersList.get(i);
  288. Cell cell = headerRow.createCell(i);
  289. cell.setCellValue(header.getFieldName());
  290. }
  291. // 按orderNum排序数据项
  292. itemsList.sort(Comparator.comparing(CostVerifyTemplateItems::getOrderNum,
  293. Comparator.nullsLast(Comparator.naturalOrder())));
  294. // 创建数据行(按orderNum分组)
  295. Map<Integer, List<CostVerifyTemplateItems>> itemsByOrder = itemsList.stream()
  296. .collect(Collectors.groupingBy(CostVerifyTemplateItems::getOrderNum));
  297. int rowNum = 1;
  298. for (Map.Entry<Integer, List<CostVerifyTemplateItems>> entry : itemsByOrder.entrySet()) {
  299. Row dataRow = sheet.createRow(rowNum++);
  300. for (int i = 0; i < headersList.size(); i++) {
  301. CostVerifyTemplateHeaders header = headersList.get(i);
  302. Cell cell = dataRow.createCell(i);
  303. // 查找对应的数据项
  304. for (CostVerifyTemplateItems item : entry.getValue()) {
  305. if (item.getHeadersId().equals(header.getId())) {
  306. cell.setCellValue(item.getRvalue() != null ? item.getRvalue() : "");
  307. break;
  308. }
  309. }
  310. }
  311. }
  312. // 自动调整列宽
  313. for (int i = 0; i < headersList.size(); i++) {
  314. sheet.autoSizeColumn(i);
  315. }
  316. // 设置响应头
  317. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
  318. response.setCharacterEncoding("utf-8");
  319. response.setHeader("Content-Disposition", "attachment; filename=" +
  320. URLEncoder.encode(template.getSurveyTemplateName(), "UTF-8") + ".xlsx");
  321. // 写入响应输出流
  322. workbook.write(response.getOutputStream());
  323. workbook.close();
  324. }
  325. //
  326. // // 数据录入
  327. // @PostMapping("/save-data")
  328. // @ApiOperation(value = "数据录入", httpMethod = "POST", notes = "数据录入")
  329. // public CommonResult<String> saveSurveyData(@RequestBody CostSurveyData data) {
  330. //
  331. //
  332. // try {
  333. // baseService.saveSurveyData(data);
  334. // return CommonResult.<String>ok().message("数据录入成功");
  335. // } catch (Exception e) {
  336. // return CommonResult.<String>error().message("数据录入失败:" + e.getMessage());
  337. // }
  338. //
  339. // }
  340. /**
  341. * 状态切换方法
  342. * 当状态为-1(草稿)时启用为0(启用)
  343. * 当状态为0(启用)或1(停用)时可以相互切换
  344. * @param id 成本核定表模板ID
  345. * @return 操作结果
  346. * @throws Exception
  347. */
  348. @ApiOperation(value = "状态切换", httpMethod = "POST", notes = "根据当前状态进行切换:草稿(-1)可启用为启用(0),启用(0)和停用(1)可相互切换")
  349. @PostMapping(value = "/enable")
  350. public CommonResult<String> enable(
  351. @ApiParam(name = "id", value = "成本核定表模板ID", required = true)
  352. @RequestParam String id) throws Exception {
  353. CostVerifyTemplate template = baseService.get(id);
  354. if (template == null) {
  355. return CommonResult.<String>error().message("未找到指定的成本核定表模板");
  356. }
  357. String currentStatus = template.getStatus();
  358. String newStatus = null;
  359. String message = null;
  360. // 根据当前状态决定切换到什么状态
  361. if ("-1".equals(currentStatus)) {
  362. // 草稿状态切换到启用状态
  363. newStatus = "0";
  364. message = "成本核定表模板启用成功";
  365. } else if ("0".equals(currentStatus)) {
  366. // 启用状态切换到停用状态
  367. newStatus = "1";
  368. message = "成本核定表模板停用成功";
  369. } else if ("1".equals(currentStatus)) {
  370. // 停用状态切换到启用状态
  371. newStatus = "0";
  372. message = "成本核定表模板启用成功";
  373. } else {
  374. return CommonResult.<String>error().message("不支持的状态切换操作");
  375. }
  376. // 更新状态
  377. template.setStatus(newStatus);
  378. template.setUpdateTime(LocalDateTime.now());
  379. template.setUpdateBy(ContextUtil.getCurrentUser().getAccount());
  380. baseService.createOrUpdate(template);
  381. return CommonResult.<String>ok().message(message);
  382. }
  383. }