CostVerifyTemplateController.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  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. @RequestParam String templatename,@ApiParam(name="catalogId", value="监审id", required = true)
  103. @RequestParam String catalogId) throws Exception {
  104. //根据模板ID获取核定模板数据
  105. CostVerifyTemplate template = costSurveyTemplateDao.selectById(templateId);
  106. String tid = UUID.randomUUID().toString();
  107. template.setIsDelete("0");
  108. template.setSurveyTemplateName(templatename);
  109. template.setSurveyTemplateId(tid);
  110. template.setCreateBy(ContextUtil.getCurrentUser().getAccount());
  111. template.setCreateTime( LocalDateTime.now());
  112. template.setCreatetemplateid(templateId);
  113. template.setVersionNo(constbaseService.generateVersionNumber());
  114. template.setCatalogId(catalogId);
  115. template.setCreatemode("2");
  116. template.setCreatetemplateid(templateId);
  117. //新增修改后的模板数据
  118. costSurveyTemplateDao.insert(template);
  119. List<CostVerifyTemplateItems> itemsList = costVerifyTemplateItemsDao.selectByVerifyTemplateId(templateId);
  120. List<CostVerifyTemplateItems> updateitemsList=new ArrayList<>();
  121. // 从成本核定表获取启用状态的表头和数据项
  122. List<CostVerifyTemplateHeaders> headersList = costVerifyTemplateHeadersDao.selectBySurveyTemplateId(templateId);
  123. //将 headersList 保存到数据库中
  124. for (CostVerifyTemplateHeaders header : headersList) {
  125. String headerId = UUID.randomUUID().toString();
  126. header.setId(headerId);
  127. header.setSurveyTemplateId(tid);
  128. header.setCreateBy(ContextUtil.getCurrentUser().getAccount());
  129. header.setCreateTime( LocalDateTime.now());
  130. costVerifyTemplateHeadersDao.insert(header);
  131. if (itemsList != null && !itemsList.isEmpty()) {
  132. for (CostVerifyTemplateItems items : itemsList)
  133. {
  134. if (items.getHeadersId().equals(header.getId())){
  135. items.setHeadersId(headerId);
  136. updateitemsList.add(items);
  137. }
  138. }
  139. }
  140. }
  141. // 3. 将updateitemsList数据依次写入 CostVerifyTemplateItems 表中
  142. if (updateitemsList != null && !updateitemsList.isEmpty()) {
  143. for (CostVerifyTemplateItems items : updateitemsList)
  144. {
  145. String itemId = UUID.randomUUID().toString();
  146. items.setId(itemId);
  147. items.setSurveyTemplateId(tid);
  148. items.setCreateBy(ContextUtil.getCurrentUser().getAccount());
  149. items.setCreateTime( LocalDateTime.now());
  150. costVerifyTemplateItemsDao.insert(items);
  151. }
  152. }
  153. return CommonResult.<CostVerifyTemplate>ok().value(template);
  154. }
  155. /**
  156. * 根据id获取成本核定表模板表数据详情
  157. * @param id
  158. * @return
  159. * @throws Exception
  160. * ModelAndView
  161. */
  162. @GetMapping(value="/getDetail")
  163. @ApiOperation(value="根据id获取成本核定表模板表数据详情",httpMethod = "GET",notes = "根据id获取成本核定表模板表数据详情")
  164. public CommonResult<CostVerifyTemplate> getDetail(@ApiParam(name="id",value="业务对象主键", required = true)@RequestParam(required=true) String id) throws Exception{
  165. return CommonResult.<CostVerifyTemplate>ok().value(baseService.getDetail(id));
  166. }
  167. /**
  168. * 新增,更新成本核定表模板表
  169. * @param costSurveyTemplate
  170. * @throws Exception
  171. * @return
  172. * @exception
  173. */
  174. @PostMapping(value="/save")
  175. @ApiOperation(value = "新增,更新成本核定表模板表数据", httpMethod = "POST", notes = "新增,更新成本核定表模板表数据")
  176. public CommonResult<String> save(@ApiParam(name="CostSurveyTemplate",value="成本核定表模板表对象", required = true)@RequestBody CostVerifyTemplate costSurveyTemplate) throws Exception{
  177. String msg = StringUtil.isEmpty(costSurveyTemplate.getSurveyTemplateId()) ? "添加成本核定表模板表成功" : "更新成本核定表模板表成功";
  178. if(StringUtil.isEmpty(costSurveyTemplate.getSurveyTemplateId()))
  179. {
  180. IUser user = ContextUtil.getCurrentUser();
  181. costSurveyTemplate.setCreateBy(user.getAccount());
  182. costSurveyTemplate.setCreateTime(LocalDateTime.now());
  183. }
  184. else{
  185. costSurveyTemplate.setUpdateBy(ContextUtil.getCurrentUser().getAccount());
  186. costSurveyTemplate.setUpdateTime(LocalDateTime.now());
  187. }
  188. baseService.createOrUpdate(costSurveyTemplate);
  189. return CommonResult.<String>ok().message(msg);
  190. }
  191. /**
  192. * 根据id删除成本核定表模板数据
  193. * @param id
  194. * @return
  195. * @throws Exception
  196. */
  197. @ApiOperation(value = "根据id删除成本核定表模板数据", httpMethod = "GET", notes = "根据id删除成本核定表模板数据")
  198. @GetMapping(value = "/remove")
  199. public CommonResult<String> remove(@ApiParam(name = "id", value = "业务对象主键", required = true) @RequestParam(required = true) String id) throws Exception {
  200. baseService.remove(id);
  201. costVerifyTemplateItemsDao.deleteByCostVerifyTemplateId( id);
  202. costVerifyTemplateHeadersDao.deleteByCostVerifyTemplateId( id);
  203. return CommonResult.<String>ok().message("删除成本核定表模板成功");
  204. }
  205. /**
  206. * 批量删除成本核定表模板数据
  207. * @param ids 要删除的ID列表
  208. * @return 操作结果
  209. * @throws Exception
  210. */
  211. @ApiOperation(value = "批量删除成本核定表模板数据", httpMethod = "POST", notes = "批量删除成本核定表模板数据")
  212. @PostMapping(value = "/batchRemove")
  213. public CommonResult<String> batchRemove(@ApiParam(name = "ids", value = "业务对象主键列表", required = true) @RequestBody List<String> ids) throws Exception {
  214. if (ids == null || ids.isEmpty()) {
  215. return CommonResult.<String>error().message("删除失败:未选择任何数据");
  216. }
  217. try {
  218. baseService.batchRemove(ids);
  219. for (int i = 0; i <ids.size() ; i++) {
  220. costVerifyTemplateItemsDao.deleteByCostVerifyTemplateId(ids.get(i));
  221. costVerifyTemplateHeadersDao.deleteByCostVerifyTemplateId(ids.get(i));
  222. }
  223. return CommonResult.<String>ok().message("成功删除" + ids.size() + "条数据");
  224. } catch (Exception e) {
  225. return CommonResult.<String>error().message("删除失败:" + e.getMessage());
  226. }
  227. }
  228. /**
  229. * 获取除去指定ID外的所有成本核定表模板列表
  230. * @param surveyTemplateId 要排除的模板ID
  231. * @return 成本核定表模板列表
  232. * @throws Exception
  233. */
  234. @GetMapping(value="/listExcludeId")
  235. @ApiOperation(value="计算公式-选择成本核定表", httpMethod = "GET", notes = "获取除去指定ID外的所有成本核定表模板列表")
  236. public CommonResult<List<CostVerifyTemplate>> listExcludeId(
  237. @ApiParam(name="surveyTemplateId", value="要排除的模板ID", required = false)
  238. @RequestParam(required = false) String surveyTemplateId) throws Exception {
  239. CostVerifyTemplate queryCondition = new CostVerifyTemplate();
  240. queryCondition.setStatus("0");//启用状态的成本核定表模板
  241. IUser user = ContextUtil.getCurrentUser();
  242. queryCondition.setCreateBy(user.getAccount());
  243. // 这里可以根据业务需要设置其他查询条件
  244. List<CostVerifyTemplate> allTemplates = costSurveyTemplateDao.selectByCondition(queryCondition);
  245. // 如果提供了excludeId,则过滤掉该ID的记录
  246. if (surveyTemplateId != null && !surveyTemplateId.isEmpty()) {
  247. allTemplates = allTemplates.stream()
  248. .filter(template -> !surveyTemplateId.equals(template.getSurveyTemplateId()))
  249. .collect(Collectors.toList());
  250. }
  251. return CommonResult.<List<CostVerifyTemplate>>ok().value(allTemplates);
  252. }
  253. /**
  254. * 导出成本核定表Excel模板
  255. * @param templateId 模板ID
  256. * @param response HTTP响应对象
  257. * @throws Exception 异常
  258. */
  259. @GetMapping(value="/exportExcelTemplate")
  260. @ApiOperation(value="导出成本核定表Excel模板", httpMethod = "GET", notes = "导出成本核定表Excel模板")
  261. public void exportExcelTemplate(
  262. @ApiParam(name="templateId", value="成本核定模板ID", required = true)
  263. @RequestParam String templateId,
  264. HttpServletResponse response) throws Exception {
  265. // 获取成本核定模板
  266. CostVerifyTemplate template = costSurveyTemplateDao.selectById(templateId);
  267. if (template == null) {
  268. response.sendError(HttpServletResponse.SC_BAD_REQUEST, "未找到指定的模板");
  269. return;
  270. }
  271. // 获取表头信息
  272. List<CostVerifyTemplateHeaders> headersList = costVerifyTemplateHeadersDao.selectBySurveyTemplateId(templateId);
  273. // 获取数据项信息
  274. List<CostVerifyTemplateItems> itemsList = costVerifyTemplateItemsDao.selectByVerifyTemplateId(templateId);
  275. // 创建Excel工作簿
  276. Workbook workbook = new XSSFWorkbook();
  277. Sheet sheet = workbook.createSheet(template.getSurveyTemplateName());
  278. // 创建表头行
  279. Row headerRow = sheet.createRow(0);
  280. // 按照orderNum排序表头
  281. headersList.sort(Comparator.comparing(CostVerifyTemplateHeaders::getOrderNum,
  282. Comparator.nullsLast(Comparator.naturalOrder())));
  283. // 根据表头信息创建Excel列标题
  284. for (int i = 0; i < headersList.size(); i++) {
  285. CostVerifyTemplateHeaders header = headersList.get(i);
  286. Cell cell = headerRow.createCell(i);
  287. cell.setCellValue(header.getFieldName());
  288. }
  289. // 按orderNum排序数据项
  290. itemsList.sort(Comparator.comparing(CostVerifyTemplateItems::getOrderNum,
  291. Comparator.nullsLast(Comparator.naturalOrder())));
  292. // 创建数据行(按orderNum分组)
  293. Map<Integer, List<CostVerifyTemplateItems>> itemsByOrder = itemsList.stream()
  294. .collect(Collectors.groupingBy(CostVerifyTemplateItems::getOrderNum));
  295. int rowNum = 1;
  296. for (Map.Entry<Integer, List<CostVerifyTemplateItems>> entry : itemsByOrder.entrySet()) {
  297. Row dataRow = sheet.createRow(rowNum++);
  298. for (int i = 0; i < headersList.size(); i++) {
  299. CostVerifyTemplateHeaders header = headersList.get(i);
  300. Cell cell = dataRow.createCell(i);
  301. // 查找对应的数据项
  302. for (CostVerifyTemplateItems item : entry.getValue()) {
  303. if (item.getHeadersId().equals(header.getId())) {
  304. cell.setCellValue(item.getRvalue() != null ? item.getRvalue() : "");
  305. break;
  306. }
  307. }
  308. }
  309. }
  310. // 自动调整列宽
  311. for (int i = 0; i < headersList.size(); i++) {
  312. sheet.autoSizeColumn(i);
  313. }
  314. // 设置响应头
  315. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
  316. response.setCharacterEncoding("utf-8");
  317. response.setHeader("Content-Disposition", "attachment; filename=" +
  318. URLEncoder.encode(template.getSurveyTemplateName(), "UTF-8") + ".xlsx");
  319. // 写入响应输出流
  320. workbook.write(response.getOutputStream());
  321. workbook.close();
  322. }
  323. //
  324. // // 数据录入
  325. // @PostMapping("/save-data")
  326. // @ApiOperation(value = "数据录入", httpMethod = "POST", notes = "数据录入")
  327. // public CommonResult<String> saveSurveyData(@RequestBody CostSurveyData data) {
  328. //
  329. //
  330. // try {
  331. // baseService.saveSurveyData(data);
  332. // return CommonResult.<String>ok().message("数据录入成功");
  333. // } catch (Exception e) {
  334. // return CommonResult.<String>error().message("数据录入失败:" + e.getMessage());
  335. // }
  336. //
  337. // }
  338. /**
  339. * 状态切换方法
  340. * 当状态为-1(草稿)时启用为0(启用)
  341. * 当状态为0(启用)或1(停用)时可以相互切换
  342. * @param id 成本核定表模板ID
  343. * @return 操作结果
  344. * @throws Exception
  345. */
  346. @ApiOperation(value = "状态切换", httpMethod = "POST", notes = "根据当前状态进行切换:草稿(-1)可启用为启用(0),启用(0)和停用(1)可相互切换")
  347. @PostMapping(value = "/enable")
  348. public CommonResult<String> enable(
  349. @ApiParam(name = "id", value = "成本核定表模板ID", required = true)
  350. @RequestParam String id) throws Exception {
  351. CostVerifyTemplate template = baseService.get(id);
  352. if (template == null) {
  353. return CommonResult.<String>error().message("未找到指定的成本核定表模板");
  354. }
  355. String currentStatus = template.getStatus();
  356. String newStatus = null;
  357. String message = null;
  358. // 根据当前状态决定切换到什么状态
  359. if ("-1".equals(currentStatus)) {
  360. // 草稿状态切换到启用状态
  361. newStatus = "0";
  362. message = "成本核定表模板启用成功";
  363. } else if ("0".equals(currentStatus)) {
  364. // 启用状态切换到停用状态
  365. newStatus = "1";
  366. message = "成本核定表模板停用成功";
  367. } else if ("1".equals(currentStatus)) {
  368. // 停用状态切换到启用状态
  369. newStatus = "0";
  370. message = "成本核定表模板启用成功";
  371. } else {
  372. return CommonResult.<String>error().message("不支持的状态切换操作");
  373. }
  374. // 更新状态
  375. template.setStatus(newStatus);
  376. template.setUpdateTime(LocalDateTime.now());
  377. template.setUpdateBy(ContextUtil.getCurrentUser().getAccount());
  378. baseService.createOrUpdate(template);
  379. return CommonResult.<String>ok().message(message);
  380. }
  381. }