CostSurveyTemplateController.java 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631
  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.exception.BaseException;
  6. import com.hotent.base.query.PageList;
  7. import com.hotent.base.util.PinyinUtil;
  8. import com.hotent.baseInfo.manager.CostCatalogManager;
  9. import com.hotent.baseInfo.model.CostCatalog;
  10. import com.hotent.common.CrudService;
  11. import com.hotent.resp.PageResp;
  12. import com.hotent.surveyinfo.dao.CostSurveyTemplateDao;
  13. import com.hotent.surveyinfo.dao.CostSurveyTemplateHeadersDao;
  14. import com.hotent.surveyinfo.dao.CostSurveyTemplateItemsDao;
  15. import com.hotent.surveyinfo.manager.*;
  16. import com.hotent.surveyinfo.model.*;
  17. import com.hotent.surveyinfo.req.ConstSurveyPageParam;
  18. import com.hotent.surveyinfo.req.ConstSurveyPageReq;
  19. import com.hotent.uc.api.model.IUser;
  20. import com.hotent.uc.api.service.IUserService;
  21. import com.hotent.uc.manager.UserManager;
  22. import com.hotent.uc.model.User;
  23. import com.hotent.uc.util.ContextUtil;
  24. import io.swagger.annotations.Api;
  25. import org.apache.poi.ss.usermodel.Cell;
  26. import org.apache.poi.ss.usermodel.Row;
  27. import org.apache.poi.ss.usermodel.Sheet;
  28. import org.apache.poi.ss.usermodel.Workbook;
  29. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  30. import org.springframework.beans.factory.annotation.Autowired;
  31. import org.springframework.web.bind.annotation.*;
  32. import com.hotent.base.model.CommonResult;
  33. import com.hotent.base.util.StringUtil;
  34. import io.swagger.annotations.ApiOperation;
  35. import io.swagger.annotations.ApiParam;
  36. import com.hotent.base.controller.BaseController;
  37. import javax.servlet.http.HttpServletResponse;
  38. import java.net.URLEncoder;
  39. import java.time.LocalDateTime;
  40. import java.util.*;
  41. import java.util.stream.Collectors;
  42. /**
  43. * 成本调查表模板表 前端控制器
  44. *
  45. * @author 超级管理员
  46. * @company 山西清众科技股份有限公司
  47. * @since 2025-09-19
  48. */
  49. @RestController
  50. @RequestMapping("/costSurveyTemplate/v1/")
  51. @Api(tags = "成本调查")
  52. @ApiGroup(group = {ApiGroupConsts.GROUP_COST})
  53. public class CostSurveyTemplateController extends BaseController<CostSurveyTemplateManager, CostSurveyTemplate> {
  54. @Autowired
  55. CostSurveyTemplateManager constbaseService;
  56. @Autowired
  57. private CostCatalogManager costCatalogManager;
  58. @Autowired
  59. CostSurveyTemplateDao costSurveyTemplateDao;
  60. @Autowired
  61. CostSurveyTemplateVersionManager costSurveyTemplateVersionMapper;
  62. @Autowired
  63. CostSurveyTemplateHeadersDao costSurveyTemplateHeadersDao;
  64. @Autowired
  65. CostSurveyTemplateItemsDao costSurveyTemplateItemsDao;
  66. @Autowired
  67. private CostVerifyTemplateManager costVerifyTemplateManager;
  68. @Autowired
  69. private CostVerifyTemplateHeadersManager costVerifyTemplateHeadersManager;
  70. @Autowired
  71. private CostVerifyTemplateItemsManager costVerifyTemplateItemsManager;
  72. @Autowired
  73. private UserManager userService;
  74. // 创建通用服务实例
  75. private final CrudService crudService = new CrudService();
  76. /**
  77. * 获取所有成本调查表模板数据
  78. *
  79. * @return
  80. * @throws Exception
  81. */
  82. @PostMapping(value = "/listPage")
  83. @ApiOperation(value = "获取成本调查表模板数据", httpMethod = "POST", notes = "获取所有成本调查表模板数据集合")
  84. public PageList<CostSurveyTemplate> listPage(
  85. @RequestBody ConstSurveyPageParam params) throws Exception {
  86. return constbaseService.getCostSurveyListPage(params);
  87. }
  88. /**
  89. * 获取所有现行版启用的成本调查表模板数据
  90. *
  91. * @return
  92. * @throws Exception
  93. */
  94. @GetMapping(value = "/getallCurrentCostSurveyList")
  95. @ApiOperation(value = "获取所有现行版启用的成本调查表模板数据", httpMethod = "GET", notes = "获取所有现行版启用的成本调查表模板数据")
  96. public PageResp<CostSurveyTemplate> allCurrentCostSurveyList(ConstSurveyPageReq req) throws Exception {
  97. return crudService.pageQuery(req, constbaseService::getallCurrentCostSurveyList);
  98. }
  99. /**
  100. * 根据id获取成本调查表模板表数据详情
  101. *
  102. * @param id
  103. * @return
  104. * @throws Exception ModelAndView
  105. */
  106. @GetMapping(value = "/getDetail")
  107. @ApiOperation(value = "根据id获取成本调查表模板表数据详情", httpMethod = "GET", notes = "根据id获取成本调查表模板表数据详情")
  108. public CommonResult<CostSurveyTemplate> getDetail(@ApiParam(name = "id", value = "业务对象主键", required = true) @RequestParam(required = true) String id) throws Exception {
  109. return CommonResult.<CostSurveyTemplate>ok().value(baseService.getDetail(id));
  110. }
  111. /**
  112. * 新增,更新成本调查表模板表
  113. *
  114. * @param costSurveyTemplate
  115. * @return
  116. * @throws Exception
  117. * @throws
  118. */
  119. @PostMapping(value = "/save")
  120. @ApiOperation(value = "新增,更新成本调查表模板表数据", httpMethod = "POST", notes = "新增,更新成本调查表模板表数据")
  121. public CommonResult<String> save(@ApiParam(name = "CostSurveyTemplate", value = "成本调查表模板表对象", required = true) @RequestBody CostSurveyTemplate costSurveyTemplate) throws Exception {
  122. String msg = StringUtil.isEmpty(costSurveyTemplate.getSurveyTemplateId()) ? "添加成本调查表模板表成功" : "更新成本调查表模板表成功";
  123. User currentUser = ContextUtil.getCurrentUser();
  124. currentUser = userService.get(currentUser.getUserId());
  125. Integer dataScope = currentUser.getDataScope();
  126. if (dataScope == 0) {
  127. costSurveyTemplate.setAreaLevel("0");
  128. costSurveyTemplate.setAreaCode(currentUser.getProvinceCode());
  129. } else if (dataScope == 1){
  130. costSurveyTemplate.setAreaLevel("1");
  131. costSurveyTemplate.setAreaCode(currentUser.getCityCode());
  132. }else{
  133. costSurveyTemplate.setAreaLevel("2");
  134. costSurveyTemplate.setAreaCode(currentUser.getCountyCode());
  135. }
  136. if (StringUtil.isEmpty(costSurveyTemplate.getSurveyTemplateId())) {
  137. IUser user = ContextUtil.getCurrentUser();
  138. costSurveyTemplate.setCreateBy(user.getAccount());
  139. costSurveyTemplate.setCreateTime(LocalDateTime.now());
  140. costSurveyTemplate.setIsDelete("0");
  141. costSurveyTemplate.setStatus("-1");
  142. } else {
  143. costSurveyTemplate.setUpdateBy(ContextUtil.getCurrentUser().getAccount());
  144. costSurveyTemplate.setUpdateTime(LocalDateTime.now());
  145. }
  146. baseService.createOrUpdate(costSurveyTemplate);
  147. return CommonResult.<String>ok().message(msg);
  148. }
  149. /**
  150. * 根据id删除成本调查表模板数据
  151. *
  152. * @param id
  153. * @return
  154. * @throws Exception
  155. */
  156. @ApiOperation(value = "根据id删除成本调查表模板数据", httpMethod = "GET", notes = "根据id删除成本调查表模板数据")
  157. @GetMapping(value = "/remove")
  158. public CommonResult<String> remove(@ApiParam(name = "id", value = "业务对象主键", required = true) @RequestParam(required = true) String id) throws Exception {
  159. baseService.remove(id);
  160. return CommonResult.<String>ok().message("删除成本调查表模板成功");
  161. }
  162. /**
  163. * 批量删除成本调查表模板数据
  164. *
  165. * @param ids 要删除的ID列表
  166. * @return 操作结果
  167. * @throws Exception
  168. */
  169. @ApiOperation(value = "批量删除成本调查表模板数据", httpMethod = "POST", notes = "批量删除成本调查表模板数据")
  170. @PostMapping(value = "/batchRemove")
  171. public CommonResult<String> batchRemove(@ApiParam(name = "ids", value = "业务对象主键列表", required = true) @RequestBody List<String> ids) throws Exception {
  172. if (ids == null || ids.isEmpty()) {
  173. return CommonResult.<String>error().message("删除失败:未选择任何数据");
  174. }
  175. try {
  176. baseService.batchRemove(ids);
  177. return CommonResult.<String>ok().message("成功删除" + ids.size() + "条数据");
  178. } catch (Exception e) {
  179. return CommonResult.<String>error().message("删除失败:" + e.getMessage());
  180. }
  181. }
  182. /**
  183. * 获取除去指定ID外的所有成本调查表模板列表
  184. *
  185. * @param surveyTemplateId 要排除的模板ID
  186. * @return 成本调查表模板列表
  187. * @throws Exception
  188. */
  189. @GetMapping(value = "/listExcludeId")
  190. @ApiOperation(value = "计算公式-选择成本调查表", httpMethod = "GET", notes = "获取除去指定ID外的所有成本调查表模板列表")
  191. public CommonResult<List<CostSurveyTemplate>> listExcludeId(
  192. @ApiParam(name = "surveyTemplateId", value = "要排除的模板ID", required = false)
  193. @RequestParam(required = false) String surveyTemplateId) throws Exception {
  194. CostSurveyTemplate queryCondition = new CostSurveyTemplate();
  195. queryCondition.setStatus("0");//启用状态的成本调查表模板
  196. queryCondition.setTemplateType("2"); // 模板类型为固定表
  197. // IUser user = ContextUtil.getCurrentUser();
  198. // queryCondition.setCreateBy(user.getAccount());
  199. // 这里可以根据业务需要设置其他查询条件
  200. List<CostSurveyTemplate> allTemplates = costSurveyTemplateDao.selectByCondition(queryCondition);
  201. // 如果提供了excludeId,则过滤掉该ID的记录
  202. if (surveyTemplateId != null && !surveyTemplateId.isEmpty()) {
  203. allTemplates = allTemplates.stream()
  204. .filter(template -> !surveyTemplateId.equals(template.getSurveyTemplateId()))
  205. .collect(Collectors.toList());
  206. }
  207. return CommonResult.<List<CostSurveyTemplate>>ok().value(allTemplates);
  208. }
  209. /**
  210. * 获取所有模板类型为固定表的所有启用成本调查表数据
  211. *
  212. * @return 启用的固定表类型成本调查表列表
  213. * @throws Exception
  214. */
  215. @GetMapping(value = "/listFixedEnabled")
  216. @ApiOperation(value = "获取所有模板类型为固定表的所有启用成本调查表数据", httpMethod = "GET", notes = "获取所有模板类型为固定表的所有启用成本调查表数据")
  217. public CommonResult<List<CostSurveyTemplate>> listFixedEnabled(
  218. @ApiParam(name = "catalogId", value = "模板ID", required = false) @RequestParam (value="catalogId") String catalogId) throws Exception {
  219. CostSurveyTemplate queryCondition = new CostSurveyTemplate();
  220. IUser user = ContextUtil.getCurrentUser();
  221. User account = userService.getByAccount(user.getAccount());
  222. if (account!=null ) {
  223. if (account.getDataScope()==0) {
  224. queryCondition.setAreaCode(account.getProvinceCode());
  225. } else if (account.getDataScope()==1) {
  226. queryCondition.setAreaCode(account.getCityCode());
  227. }else {
  228. queryCondition.setAreaCode(account.getCountyCode());
  229. }
  230. }
  231. queryCondition.setStatus("0"); // 启用状态
  232. queryCondition.setTemplateType("2"); // 模板类型为固定表
  233. queryCondition.setCatalogId(catalogId);
  234. List<CostSurveyTemplate> templates = costSurveyTemplateDao.selectByCondition(queryCondition);
  235. return CommonResult.<List<CostSurveyTemplate>>ok().value(templates);
  236. }
  237. /**
  238. * 生成核定模板数据(通过templateId,状态为启用)
  239. *
  240. * @param templateId 模板ID
  241. * @return 核定模板数据
  242. * @throws Exception
  243. */
  244. @GetMapping(value = "/generateVerifyTemplateData")
  245. @ApiOperation(value = "生成核定模板数据", httpMethod = "GET", notes = "通过templateId获取启用状态的核定模板数据")
  246. public CommonResult<CostVerifyTemplate> generateVerifyTemplateData(
  247. @ApiParam(name = "templateId", value = "模板ID", required = true)
  248. @RequestParam String templateId, @ApiParam(name = "templatename", value = "模板名称", required = true)
  249. @RequestParam String templatename, @ApiParam(name = "catalogId", value = "监审id", required = true)
  250. String taskId, @ApiParam(name = "taskId", value = "任务id", required = false)
  251. @RequestParam String catalogId) throws Exception {
  252. if (taskId!=null){
  253. //先删
  254. costVerifyTemplateManager.remove(
  255. new QueryWrapper<CostVerifyTemplate>()
  256. .eq("task_id", taskId)
  257. );
  258. }
  259. CostCatalog costCatalog = costCatalogManager.getById(catalogId);
  260. if (costCatalog==null) {
  261. throw new BaseException("根据监审id未查询到实体信息");
  262. }
  263. CostSurveyTemplate queryCondition = new CostSurveyTemplate();
  264. queryCondition.setSurveyTemplateId(templateId);
  265. queryCondition.setStatus("0"); // 启用状态
  266. IUser user = ContextUtil.getCurrentUser();
  267. List<CostSurveyTemplate> templates = costSurveyTemplateDao.selectByCondition(queryCondition);
  268. CostSurveyTemplateVersion currentVersion = costSurveyTemplateVersionMapper.selectCurrentVersion(templateId);
  269. List<CostSurveyTemplateItems> updateites = new ArrayList<>();
  270. String ttemplateId = "";
  271. CostVerifyTemplate costVerifyTemplate = new CostVerifyTemplate();
  272. if (currentVersion != null) {
  273. CostSurveyTemplate sourceTemplate = templates.get(0);
  274. List<CostSurveyTemplateHeaders> headersList = costSurveyTemplateHeadersDao.selectBySurveyTemplateIdAndVersion(templateId, currentVersion.getId());
  275. List<CostSurveyTemplateItems> itemsList = costSurveyTemplateItemsDao.selectBySurveyTemplateIdAndVersion(templateId, currentVersion.getId());
  276. // 1. 开始将模板数据写入 CostVerifyTemplate 表中
  277. // 复制源模板的基本属性
  278. ttemplateId = UUID.randomUUID().toString();
  279. costVerifyTemplate.setSurveyTemplateId(ttemplateId);
  280. costVerifyTemplate.setSurveyTemplateName(sourceTemplate.getSurveyTemplateName());
  281. costVerifyTemplate.setTemplateType(sourceTemplate.getTemplateType());
  282. costVerifyTemplate.setCreatemode("1");
  283. costVerifyTemplate.setSurveyTemplateNameYw(PinyinUtil.getPinyin(sourceTemplate.getSurveyTemplateName()));
  284. costVerifyTemplate.setCreatetemplateid(sourceTemplate.getSurveyTemplateId());
  285. costVerifyTemplate.setStatus(taskId==null?"-1":"0");
  286. costVerifyTemplate.setCatalogId(catalogId);
  287. costVerifyTemplate.setCreateBy(user.getAccount());
  288. costVerifyTemplate.setCreateTime(LocalDateTime.now());
  289. costVerifyTemplate.setType(sourceTemplate.getType());
  290. costVerifyTemplate.setIsDelete("0");
  291. costVerifyTemplate.setTaskId(taskId);
  292. User account = userService.getByAccount(user.getAccount());
  293. if (account!=null ) {
  294. if (account.getDataScope()==0) {
  295. costVerifyTemplate.setAreaCode(account.getProvinceCode());
  296. } else if (account.getDataScope()==1) {
  297. costVerifyTemplate.setAreaCode(account.getCityCode());
  298. }else {
  299. costVerifyTemplate.setAreaCode(account.getCountyCode());
  300. }
  301. }
  302. //costVerifyTemplate.setCatalogId(sourceTemplate.getCatalogId());
  303. // 设置与源模板的关联关系
  304. costVerifyTemplate.setVersionNo(costVerifyTemplateManager.generateVersionNumber());
  305. // 保存成本核定模板
  306. costVerifyTemplateManager.createOrUpdate(costVerifyTemplate);
  307. // 2. 将headersList数据写入 CostVerifyTemplateHeaders 表中(批量保存)
  308. if (headersList != null && !headersList.isEmpty()) {
  309. List<CostVerifyTemplateHeaders> verifyHeadersList = new ArrayList<>();
  310. for (CostSurveyTemplateHeaders header : headersList) {
  311. CostVerifyTemplateHeaders verifyHeader = new CostVerifyTemplateHeaders();
  312. // 复制表头属性
  313. String headid = UUID.randomUUID().toString();
  314. verifyHeader.setId(headid);
  315. verifyHeader.setFieldName(header.getFieldName());
  316. verifyHeader.setFieldEname(header.getFieldEname());
  317. verifyHeader.setFieldType(header.getFieldType());
  318. // 关键:复制字段验证相关属性
  319. verifyHeader.setFieldTypelen(header.getFieldTypelen()); // 字段类型长度
  320. verifyHeader.setFieldTypenointlen(header.getFieldTypenointlen()); // 字段类型小数位长度
  321. verifyHeader.setFormat(header.getFormat()); // 格式
  322. verifyHeader.setIsDict(header.getIsDict()); // 是否绑定字典
  323. verifyHeader.setIsAuditPeriod(header.getIsAuditPeriod()); // 是否绑定监审期间
  324. verifyHeader.setShowVisible(header.getShowVisible()); // 隐藏字段显示
  325. verifyHeader.setTabtype(header.getTabtype());
  326. verifyHeader.setIsRequired(header.getIsRequired());
  327. verifyHeader.setOrderNum(header.getOrderNum());
  328. verifyHeader.setDictid(header.getDictid());
  329. verifyHeader.setDictCode(header.getDictCode());
  330. verifyHeader.setColumnComment(header.getColumnComment());
  331. verifyHeader.setColumnType(header.getColumnType());
  332. // 区域相关属性
  333. verifyHeader.setAreaCode(header.getAreaCode());
  334. verifyHeader.setAreaLevel(header.getAreaLevel());
  335. // 系统字段
  336. verifyHeader.setCreateBy(user.getAccount());
  337. verifyHeader.setCreateTime(LocalDateTime.now());
  338. // 设置关联关系
  339. verifyHeader.setSurveyTemplateId(ttemplateId);
  340. verifyHeader.setVersionId(currentVersion.getId());
  341. //修改items 指标项中的headersid
  342. if (itemsList != null && !itemsList.isEmpty()) {
  343. for (CostSurveyTemplateItems items : itemsList) {
  344. if (items.getHeadersId().equals(header.getId())) {
  345. items.setHeadersId(headid);
  346. updateites.add(items);
  347. }
  348. }
  349. }
  350. // 添加到批量保存列表
  351. verifyHeadersList.add(verifyHeader);
  352. }
  353. // 批量保存成本核定表头
  354. costVerifyTemplateHeadersManager.batchCreate(verifyHeadersList);
  355. }
  356. // 3. 将itemsList数据写入 CostVerifyTemplateItems 表中(批量保存)
  357. if (updateites != null && !updateites.isEmpty()) {
  358. List<CostVerifyTemplateItems> verifyItemsList = new ArrayList<>();
  359. for (CostSurveyTemplateItems item : updateites) {
  360. CostVerifyTemplateItems verifyItem = new CostVerifyTemplateItems();
  361. // 复制数据项属性
  362. String itemid = UUID.randomUUID().toString();
  363. verifyItem.setId(itemid);
  364. verifyItem.setRowid(item.getRowid());
  365. verifyItem.setParentid(item.getParentid());
  366. verifyItem.setRkey(item.getRkey());
  367. verifyItem.setRvalue(item.getRvalue());
  368. verifyItem.setCellCode(item.getCellCode());
  369. verifyItem.setCalculationFormula(item.getCalculationFormula());
  370. verifyItem.setUnit(item.getUnit());
  371. verifyItem.setOrderNum(item.getOrderNum());
  372. verifyItem.setJsonStr(item.getJsonStr());
  373. verifyItem.setCreateBy(user.getAccount());
  374. verifyItem.setCreateTime(LocalDateTime.now());
  375. verifyItem.setProjectId(item.getProjectId());
  376. verifyItem.setOrderText(item.getOrderText());
  377. verifyItem.setSurveyTemplateId(ttemplateId);
  378. verifyItem.setVersionId(currentVersion.getId());
  379. verifyItem.setHeadersId(item.getHeadersId());
  380. // 添加到批量保存列表
  381. verifyItemsList.add(verifyItem);
  382. }
  383. // 批量保存成本核定数据项
  384. costVerifyTemplateItemsManager.saveBatch(verifyItemsList);
  385. }
  386. }
  387. if (templates != null && !templates.isEmpty()) {
  388. return CommonResult.<CostVerifyTemplate>ok().value(costVerifyTemplate);
  389. } else {
  390. return CommonResult.<CostVerifyTemplate>error().message("未找到启用状态的模板数据");
  391. }
  392. }
  393. /**
  394. * 生成版本号,格式为:yyyyMMdd + 4位流水号(如:202509270001)
  395. *
  396. * @return 生成的版本号
  397. */
  398. public String generateVersionNumber() {
  399. // 1. 获取当前日期字符串
  400. String dateStr = new java.text.SimpleDateFormat("yyyyMMdd").format(new java.util.Date());
  401. // 2. 查询当日最大版本号
  402. String maxVersion = costSurveyTemplateVersionMapper.selectMaxVersionByDate(dateStr);
  403. int sequence = 1;
  404. if (maxVersion != null && maxVersion.startsWith(dateStr)) {
  405. // 3. 提取流水号部分并加1
  406. String sequenceStr = maxVersion.substring(8); // 取后4位
  407. sequence = Integer.parseInt(sequenceStr) + 1;
  408. }
  409. // 4. 格式化生成版本号
  410. return String.format("%s%04d", dateStr, sequence);
  411. }
  412. /**
  413. * 导出成本调查表Excel模板
  414. *
  415. * @param templateId 模板ID
  416. * @return Excel文件
  417. * @throws Exception
  418. */
  419. @GetMapping(value = "/exportExcelTemplate")
  420. @ApiOperation(value = "导出成本调查表Excel模板", httpMethod = "GET", notes = "导出Excel模板并填充内容")
  421. public void exportExcelTemplate(
  422. @ApiParam(name = "templateId", value = "模板ID", required = true)
  423. @RequestParam String templateId,
  424. HttpServletResponse response) throws Exception {
  425. // 获取当前启用版本
  426. CostSurveyTemplateVersion currentVersion = costSurveyTemplateVersionMapper.selectCurrentVersion(templateId);
  427. if (currentVersion == null) {
  428. response.sendError(HttpServletResponse.SC_BAD_REQUEST, "未找到启用的模板版本");
  429. return;
  430. }
  431. // 获取表头信息
  432. List<CostSurveyTemplateHeaders> headersList = costSurveyTemplateHeadersDao.selectBySurveyTemplateIdAndVersion(templateId, currentVersion.getId());
  433. // 获取数据项信息
  434. List<CostSurveyTemplateItems> itemsList = costSurveyTemplateItemsDao.selectBySurveyTemplateIdAndVersion(templateId, currentVersion.getId());
  435. // 创建Excel工作簿
  436. Workbook workbook = new XSSFWorkbook();
  437. Sheet sheet = workbook.createSheet(currentVersion.getSurveyTemplateName());
  438. // 创建表头行
  439. Row headerRow = sheet.createRow(0);
  440. // 根据表头信息创建Excel列标题
  441. for (int i = 0; i < headersList.size(); i++) {
  442. CostSurveyTemplateHeaders header = headersList.get(i);
  443. Cell cell = headerRow.createCell(i);
  444. cell.setCellValue(header.getFieldName());
  445. }
  446. // 按照orderNum排序表头
  447. headersList.sort(Comparator.comparing(CostSurveyTemplateHeaders::getOrderNum,
  448. Comparator.nullsLast(Comparator.naturalOrder())));
  449. // 填充数据行(示例数据)
  450. if (!itemsList.isEmpty()) {
  451. // 按orderNum排序数据项
  452. itemsList.sort(Comparator.comparing(CostSurveyTemplateItems::getOrderNum,
  453. Comparator.nullsLast(Comparator.naturalOrder())));
  454. // 创建示例行
  455. Row dataRow = sheet.createRow(1);
  456. for (int i = 0; i < headersList.size(); i++) {
  457. CostSurveyTemplateHeaders header = headersList.get(i);
  458. Cell cell = dataRow.createCell(i);
  459. // 查找对应的数据项
  460. for (CostSurveyTemplateItems item : itemsList) {
  461. if (item.getHeadersId().equals(header.getId())) {
  462. cell.setCellValue(item.getRvalue() != null ? item.getRvalue() : "");
  463. break;
  464. }
  465. }
  466. }
  467. }
  468. // 设置响应头
  469. response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
  470. response.setHeader("Content-Disposition", "attachment; filename=" +
  471. URLEncoder.encode(currentVersion.getSurveyTemplateName() + ".xlsx", "UTF-8"));
  472. // 写入响应输出流
  473. workbook.write(response.getOutputStream());
  474. workbook.close();
  475. }
  476. /**
  477. * 根据监管目录ID查询所有现行版本的所有成本调查表模板信息
  478. *
  479. * @param catalogId 监管目录ID
  480. * @return 成本调查表模板列表
  481. * @throws Exception
  482. */
  483. @GetMapping(value = "/listByCatalogId")
  484. @ApiOperation(value = "根据监管目录ID查询所有现行版本的成本调查表模板", httpMethod = "GET", notes = "根据监管目录ID查询所有现行版本的成本调查表模板信息")
  485. public CommonResult<List<CostSurveyTemplate>> listByCatalogId(
  486. @ApiParam(name = "catalogId", value = "监管目录ID", required = true)
  487. @RequestParam String catalogId) throws Exception {
  488. // 查询指定目录下的所有启用状态的模板
  489. CostSurveyTemplate queryCondition = new CostSurveyTemplate();
  490. queryCondition.setCatalogId(catalogId);
  491. queryCondition.setStatus("0"); // 启用状态
  492. List<CostSurveyTemplate> templates = costSurveyTemplateDao.selectByCondition(queryCondition);
  493. return CommonResult.<List<CostSurveyTemplate>>ok().value(templates);
  494. }
  495. /**
  496. * 状态切换方法
  497. * 当状态为-1(草稿)时启用为0(启用)
  498. * 当状态为0(启用)或1(停用)时可以相互切换
  499. *
  500. * @param id 成本调查表模板ID
  501. * @return 操作结果
  502. * @throws Exception
  503. */
  504. @ApiOperation(value = "状态切换", httpMethod = "GET", notes = "根据当前状态进行切换:草稿(-1)可启用为启用(0),启用(0)和停用(1)可相互切换")
  505. @GetMapping(value = "/enable")
  506. public CommonResult<String> enable(
  507. @ApiParam(name = "id", value = "成本调查表模板ID", required = true)
  508. @RequestParam String id) throws Exception {
  509. CostSurveyTemplate template = baseService.get(id);
  510. if (template == null) {
  511. return CommonResult.<String>error().message("未找到指定的成本调查表模板");
  512. }
  513. String currentStatus = template.getStatus();
  514. String newStatus = null;
  515. String message = null;
  516. // 根据当前状态决定切换到什么状态
  517. if ("-1".equals(currentStatus)) {
  518. // 草稿状态切换到启用状态
  519. newStatus = "0";
  520. message = "成本调查表模板启用成功";
  521. // 检查是否已经有现行版本
  522. CostSurveyTemplateVersion currentVersion = costSurveyTemplateVersionMapper.selectCurrentVersion(id);
  523. if (currentVersion == null) {
  524. return CommonResult.<String>error().message("启用失败:该模板没有现行版本");
  525. }
  526. } else if ("0".equals(currentStatus)) {
  527. // 启用状态切换到停用状态
  528. newStatus = "1";
  529. message = "成本调查表模板停用成功";
  530. } else if ("1".equals(currentStatus)) {
  531. // 停用状态切换到启用状态
  532. newStatus = "0";
  533. message = "成本调查表模板启用成功";
  534. } else {
  535. return CommonResult.<String>error().message("不支持的状态切换操作");
  536. }
  537. // 更新状态
  538. template.setStatus(newStatus);
  539. template.setUpdateTime(LocalDateTime.now());
  540. template.setUpdateBy(ContextUtil.getCurrentUser().getAccount());
  541. baseService.createOrUpdate(template);
  542. return CommonResult.<String>ok().message(message);
  543. }
  544. }