CostVerifyTemplateController.java 19 KB

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