CostAuditTaskInfoController.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. package com.hotent.enterpriseDeclare.controller.opinion;
  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.model.CommonResult;
  6. import com.hotent.base.util.StringUtil;
  7. import com.hotent.enterpriseDeclare.manager.CostAuditPeriodRecordManager;
  8. import com.hotent.enterpriseDeclare.manager.CostSurveyTemplateUploadDataManager;
  9. import com.hotent.enterpriseDeclare.model.CostAuditPeriodRecord;
  10. import com.hotent.enterpriseDeclare.model.CostSurveyTemplateUploadData;
  11. import com.hotent.project.manager.CostProjectApprovalManager;
  12. import com.hotent.project.manager.CostProjectTaskManager;
  13. import com.hotent.project.model.CostProjectApproval;
  14. import com.hotent.project.model.CostProjectTask;
  15. import com.hotent.project.resp.CostProjectApprovalDetailResp;
  16. import com.hotent.surveyinfo.dao.CostSurveyTemplateItemsDao;
  17. import com.hotent.surveyinfo.manager.CostSurveyTemplateHeadersManager;
  18. import com.hotent.surveyinfo.manager.CostSurveyTemplateManager;
  19. import com.hotent.surveyinfo.manager.CostSurveyTemplateUploadManager;
  20. import com.hotent.surveyinfo.manager.CostSurveyTemplateVersionManager;
  21. import com.hotent.surveyinfo.model.CostSurveyTemplateHeaders;
  22. import com.hotent.surveyinfo.model.CostSurveyTemplateItems;
  23. import com.hotent.surveyinfo.model.CostSurveyTemplateUpload;
  24. import com.hotent.surveyinfo.model.CostSurveyTemplateVersion;
  25. import com.hotent.surveyinfo.model.dto.CostItemData;
  26. import io.swagger.annotations.Api;
  27. import io.swagger.annotations.ApiOperation;
  28. import io.swagger.annotations.ApiParam;
  29. import org.springframework.beans.BeanUtils;
  30. import org.springframework.beans.factory.annotation.Autowired;
  31. import org.springframework.web.bind.annotation.*;
  32. import java.time.format.DateTimeFormatter;
  33. import java.util.*;
  34. import java.util.stream.Collectors;
  35. @Api(tags = "成本监审任务填报")
  36. @RestController
  37. @RequestMapping("/api/enterprise/castTaskInfo")
  38. @ApiGroup(group = {ApiGroupConsts.GROUP_COST})
  39. public class CostAuditTaskInfoController {
  40. @Autowired
  41. private CostSurveyTemplateUploadManager costSurveyTemplateUploadManager;
  42. @Autowired
  43. private CostSurveyTemplateItemsDao costSurveyTemplateItemsDao;
  44. @Autowired
  45. private CostSurveyTemplateVersionManager costSurveyTemplateVersionManager;
  46. @Autowired
  47. private CostSurveyTemplateHeadersManager costSurveyTemplateHeadersManager;
  48. @Autowired
  49. private CostSurveyTemplateUploadDataManager costSurveyTemplateUploadDataManager;
  50. @Autowired
  51. private CostAuditPeriodRecordManager costAuditPeriodRecordManager;
  52. @Autowired
  53. private CostSurveyTemplateManager costSurveyTemplateManager;
  54. @Autowired
  55. private CostProjectApprovalManager costProjectApprovalManager;
  56. @Autowired
  57. private CostProjectTaskManager costProjectTaskManager;
  58. /**
  59. * 企业报送-成本调查表-列表
  60. * @param taskId 任务ID
  61. * @return 上传记录列表(包含是否必填、是否上传等信息)
  62. * @throws Exception
  63. */
  64. @GetMapping(value="/listByTaskId")
  65. public CommonResult<List<CostSurveyTemplateUpload>> listByTaskId(
  66. @RequestParam(required = false) String taskId,
  67. @RequestParam(required = false) String catalogId
  68. ) throws Exception {
  69. List<CostSurveyTemplateUpload> uploadList = costSurveyTemplateUploadManager.listByTaskId(taskId);
  70. //创建记录
  71. if (uploadList.isEmpty()){
  72. List<CostSurveyTemplateUpload> costSurveyTemplateUploads = costSurveyTemplateUploadManager.listByCatalogId(catalogId);
  73. for (CostSurveyTemplateUpload costSurveyTemplateUpload : costSurveyTemplateUploads) {
  74. CostSurveyTemplateUpload upload = new CostSurveyTemplateUpload();
  75. BeanUtils.copyProperties(costSurveyTemplateUpload, upload);
  76. upload.setId(null);
  77. upload.setTaskId(taskId);
  78. upload.setIsUpload("0");
  79. costSurveyTemplateUploadManager.save(upload);
  80. }
  81. }
  82. return CommonResult.<List<CostSurveyTemplateUpload>>ok().value( costSurveyTemplateUploadManager.listByTaskId(taskId));
  83. }
  84. /**
  85. * 企业报送-成本调查表-在线填报所需字段
  86. * @param surveyTemplateId 成本调查表id
  87. * @return 指标项数据列表(带key-value拼接)
  88. */
  89. @GetMapping(value = "/listItemsByCurrentTemplateId")
  90. @ApiOperation(value = "根据成本调查表现行模板id获取所有指标数据", httpMethod = "GET", notes = "根据成本调查表现行模板id获取所有指标数据(带key-value拼接)")
  91. public CommonResult<CostItemData> listItemsByCurrentTemplateId(
  92. @ApiParam(name = "surveyTemplateId", value = "关联的成本调查表ID", required = true)
  93. @RequestParam(required = true) String surveyTemplateId) throws Exception
  94. {
  95. //根据模板id 查询历史版本是现行的版本信息
  96. CostSurveyTemplateVersion versiontemplate = costSurveyTemplateVersionManager.selectCurrentVersion(surveyTemplateId);
  97. if (versiontemplate == null) {
  98. return CommonResult.<CostItemData>ok().value(new CostItemData());
  99. }
  100. List<CostSurveyTemplateItems> items = costSurveyTemplateItemsDao.selectBySurveyTemplateIdAndVersion(surveyTemplateId, versiontemplate.getId());
  101. List<CostSurveyTemplateHeaders> headlist = costSurveyTemplateHeadersManager.listVisibleBySurveyTemplateIdAndVersion(surveyTemplateId, versiontemplate.getId());
  102. String filename = headlist.stream().map(CostSurveyTemplateHeaders::getFieldName).collect(Collectors.joining(","));
  103. String filenids = headlist.stream().map(CostSurveyTemplateHeaders::getId).collect(Collectors.joining(","));
  104. // 按 orderNum 分组
  105. Map<Integer, List<CostSurveyTemplateItems>> groupedByHeadersId = items.stream()
  106. .collect(Collectors.groupingBy(CostSurveyTemplateItems::getOrderNum));
  107. List<Map<String, String>> result = new ArrayList<>();
  108. for (Map.Entry<Integer, List<CostSurveyTemplateItems>> entry : groupedByHeadersId.entrySet()) {
  109. List<CostSurveyTemplateItems> group = entry.getValue();
  110. if (group.isEmpty()) continue;
  111. // 主项(可以取第一个)
  112. CostSurveyTemplateItems mainItem = group.get(0);
  113. String headersIds = "";
  114. String itemIds = "";
  115. // 构造 key-value 映射
  116. Map<String, String> keyValueMap = new HashMap<>();
  117. for (CostSurveyTemplateItems item : group) {
  118. if (item.getRkey() != null && item.getRvalue() != null) {
  119. keyValueMap.put(item.getRkey(), item.getRvalue());
  120. headersIds += item.getHeadersId() + ",";
  121. itemIds += item.getId() + ",";
  122. }
  123. }
  124. if (!StringUtil.isEmpty(headersIds))
  125. headersIds = headersIds.substring(0, headersIds.length() - 1);
  126. if (!StringUtil.isEmpty(itemIds))
  127. itemIds = itemIds.substring(0, itemIds.length() - 1);
  128. //mainItem 放入到keyValueMap中 除了 key value 这两个字段
  129. keyValueMap.put("id", mainItem.getId());
  130. keyValueMap.put("surveyTemplateId", mainItem.getSurveyTemplateId());
  131. keyValueMap.put("versionId", mainItem.getVersionId());
  132. keyValueMap.put("headersId", mainItem.getHeadersId());
  133. keyValueMap.put("cellCode", mainItem.getCellCode());
  134. keyValueMap.put("calculationFormula", mainItem.getCalculationFormula());
  135. keyValueMap.put("unit", mainItem.getUnit());
  136. keyValueMap.put("orderNum", mainItem.getOrderNum().toString());
  137. keyValueMap.put("jsonStr", mainItem.getJsonStr());
  138. keyValueMap.put("headersIds", headersIds);
  139. keyValueMap.put("itemIds", itemIds);
  140. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  141. keyValueMap.put("createTime", mainItem.getCreateTime() != null ? mainItem.getCreateTime().format(formatter) : null);
  142. keyValueMap.put("updateTime", mainItem.getUpdateTime() != null ? mainItem.getUpdateTime().format(formatter) : null);
  143. keyValueMap.put("createBy", mainItem.getCreateBy());
  144. keyValueMap.put("updateBy", mainItem.getUpdateBy());
  145. keyValueMap.put("projectId", mainItem.getProjectId());
  146. keyValueMap.put("orderText", mainItem.getOrderText());
  147. keyValueMap.put("calculationTemplateId", mainItem.getCalculationTemplateId());
  148. keyValueMap.put("rowid", mainItem.getRowid());
  149. keyValueMap.put("parentid", mainItem.getParentid());
  150. result.add(keyValueMap);
  151. }
  152. CostItemData data = new CostItemData();
  153. data.setFixedFields(filename); // 存储动态字段名
  154. data.setItemlist(result);
  155. data.setFixedFieldids(filenids);
  156. return CommonResult.<CostItemData>ok().value(data);
  157. }
  158. /**
  159. * 企业报送-成本调查表-在线填报保持
  160. * @param dataList 数据列表(实体类列表,包含uploadId、auditedUnitId、rowid、rkey、rvalue等字段)
  161. * @return 保存结果
  162. */
  163. @PostMapping(value = "/saveUploadData")
  164. @ApiOperation(value = "保存成本调查表模板上传数据", httpMethod = "POST", notes = "保存成本调查表模板上传数据,直接使用实体类列表。固定表和单记录直接保存,动态表需要先创建监审期间记录")
  165. public CommonResult<String> saveUploadData(
  166. @ApiParam(name = "dataList", value = "数据列表", required = true)
  167. @RequestBody List<CostSurveyTemplateUploadData> dataList) throws Exception {
  168. if (dataList == null || dataList.isEmpty()) {
  169. return CommonResult.<String>error().message("数据列表不能为空");
  170. }
  171. // 从第一条数据中提取信息
  172. CostSurveyTemplateUploadData firstData = dataList.get(0);
  173. String uploadId = firstData.getUploadId();
  174. String surveyTemplateId = firstData.getSurveyTemplateId();
  175. // 判断模板类型
  176. String templateType = null;
  177. if (StringUtil.isNotEmpty(surveyTemplateId)) {
  178. com.hotent.surveyinfo.model.CostSurveyTemplate template = costSurveyTemplateManager.getDetail(surveyTemplateId);
  179. if (template != null) {
  180. templateType = template.getTemplateType();
  181. }
  182. } else if (StringUtil.isNotEmpty(uploadId)) {
  183. CostSurveyTemplateUpload upload = costSurveyTemplateUploadManager.get(uploadId);
  184. if (upload != null && StringUtil.isNotEmpty(upload.getSurveyTemplateId())) {
  185. com.hotent.surveyinfo.model.CostSurveyTemplate template = costSurveyTemplateManager.getDetail(upload.getSurveyTemplateId());
  186. if (template != null) {
  187. templateType = template.getTemplateType();
  188. }
  189. }
  190. }
  191. // 如果是动态表(3),需要检查periodRecordId
  192. if ("3".equals(templateType)) {
  193. String periodRecordId = firstData.getPeriodRecordId();
  194. if (StringUtil.isEmpty(periodRecordId)) {
  195. return CommonResult.<String>error().message("动态表需要先创建监审期间记录,periodRecordId不能为空");
  196. }
  197. }
  198. costSurveyTemplateUploadDataManager.saveData(dataList);
  199. return CommonResult.<String>ok().message("保存数据成功");
  200. }
  201. /**
  202. * 企业报送-成本调查表-在线填报记录查看
  203. * @param queryData 查询条件(实体类,包含uploadId和auditedUnitId)
  204. * @return 数据列表(实体类列表)
  205. */
  206. @PostMapping(value = "/getUploadData")
  207. @ApiOperation(value = "查询成本调查表模板上传数据", httpMethod = "POST", notes = "查询成本调查表模板上传数据,返回实体类列表")
  208. public CommonResult<List<CostSurveyTemplateUploadData>> getUploadData(
  209. @ApiParam(name = "queryData", value = "查询条件", required = true)
  210. @RequestBody CostSurveyTemplateUploadData queryData) throws Exception {
  211. if (queryData == null || StringUtil.isEmpty(queryData.getUploadId()) || StringUtil.isEmpty(queryData.getAuditedUnitId())) {
  212. return CommonResult.<List<CostSurveyTemplateUploadData>>error().message("uploadId和auditedUnitId不能为空");
  213. }
  214. List<CostSurveyTemplateUploadData> dataList = costSurveyTemplateUploadDataManager.
  215. listByUploadIdAndAuditedUnitId(queryData.getUploadId(),queryData.getPeriodRecordId());
  216. return CommonResult.<List<CostSurveyTemplateUploadData>>ok().value(dataList);
  217. }
  218. /**
  219. * 企业报送-成本调查表-动态表-新增监审期间记录
  220. * @return 保存结果
  221. */
  222. @PostMapping(value = "/addPeriodRecord")
  223. @ApiOperation(value = "新增监审期间记录(动态表使用)", httpMethod = "POST", notes = "新增监审期间记录,用于动态表。必须先创建监审期间记录,然后才能编辑保存数据")
  224. public CommonResult<CostAuditPeriodRecord> addPeriodRecord(
  225. @ApiParam(name = "record", value = "监审期间记录", required = true)
  226. @RequestBody CostAuditPeriodRecord record) throws Exception {
  227. if (record == null) {
  228. return CommonResult.<CostAuditPeriodRecord>error().message("记录不能为空");
  229. }
  230. if (StringUtil.isEmpty(record.getAuditedUnitId())) {
  231. return CommonResult.<CostAuditPeriodRecord>error().message("auditedUnitId不能为空");
  232. }
  233. if (StringUtil.isEmpty(record.getAuditPeriod())) {
  234. return CommonResult.<CostAuditPeriodRecord>error().message("auditPeriod不能为空");
  235. }
  236. // 校验
  237. CostProjectTask task = costProjectTaskManager.getById(record.getTaskId());
  238. CostProjectApproval approval = costProjectApprovalManager.getById(task.getProjectId());
  239. if (approval == null) {
  240. return CommonResult.<CostAuditPeriodRecord>error().message("项目不存在");
  241. }
  242. if(!Arrays.asList(approval.getAuditPeriod().split( ",")).contains(record.getAuditPeriod())){
  243. return CommonResult.<CostAuditPeriodRecord>error().message("项目所属监审期间不存在");
  244. }
  245. // 如果已有的也不能添加
  246. CostAuditPeriodRecord existRecord = costAuditPeriodRecordManager.getOne(
  247. new QueryWrapper<CostAuditPeriodRecord>()
  248. .eq("task_id", record.getTaskId())
  249. .eq("audit_period", record.getAuditPeriod())
  250. );
  251. if (existRecord != null) {
  252. return CommonResult.<CostAuditPeriodRecord>error().message("项目所属监审期间已存在");
  253. }
  254. // 如果没有 uploadId,需要先创建主表
  255. String uploadId = record.getUploadId();
  256. if (StringUtil.isEmpty(uploadId)) {
  257. String catalogId = record.getCatalogId();
  258. String surveyTemplateId = record.getSurveyTemplateId();
  259. if (StringUtil.isEmpty(catalogId) || StringUtil.isEmpty(surveyTemplateId)) {
  260. return CommonResult.<CostAuditPeriodRecord>error().message("uploadId为空时,catalogId和surveyTemplateId不能为空");
  261. }
  262. // 创建主表记录
  263. CostSurveyTemplateUpload upload = new CostSurveyTemplateUpload();
  264. upload.setCatalogId(catalogId);
  265. upload.setSurveyTemplateId(surveyTemplateId);
  266. upload.setIsRequired("1");
  267. upload.setIsDeleted("0");
  268. upload.setOrderNum(0);
  269. upload.setTaskId(record.getTaskId());
  270. costSurveyTemplateUploadManager.save(upload);
  271. uploadId = upload.getId();
  272. record.setUploadId(uploadId);
  273. }
  274. // 设置填报时间为当前时间
  275. if (record.getReportingTime() == null) {
  276. record.setReportingTime(java.time.LocalDateTime.now());
  277. }
  278. costAuditPeriodRecordManager.createOrUpdate(record);
  279. return CommonResult.<CostAuditPeriodRecord>ok().value(record).message("新增监审期间记录成功");
  280. }
  281. /**
  282. * 企业报送-成本调查表-动态表-查询监审期间记录列表
  283. * @param queryData 查询条件(包含uploadId和auditedUnitId)
  284. * @return 记录列表
  285. */
  286. @PostMapping(value = "/listPeriodRecord")
  287. @ApiOperation(value = "查询监审期间记录列表(动态表使用)", httpMethod = "POST", notes = "查询监审期间记录列表,返回记录列表")
  288. public CommonResult<List<CostAuditPeriodRecord>> listPeriodRecord(
  289. @ApiParam(name = "queryData", value = "查询条件", required = true)
  290. @RequestBody CostAuditPeriodRecord queryData) throws Exception {
  291. if (queryData == null || StringUtil.isEmpty(queryData.getUploadId()) || StringUtil.isEmpty(queryData.getAuditedUnitId())) {
  292. return CommonResult.<List<CostAuditPeriodRecord>>ok().message(null);
  293. }
  294. List<CostAuditPeriodRecord> recordList = costAuditPeriodRecordManager.listByUploadIdAndAuditedUnitId(queryData.getUploadId(), queryData.getAuditedUnitId());
  295. return CommonResult.<List<CostAuditPeriodRecord>>ok().value(recordList);
  296. }
  297. /**
  298. * 企业报送-成本调查表-动态表-删除监审期间记录
  299. * @param id 记录ID
  300. * @return 删除结果
  301. */
  302. @PostMapping(value = "/deletePeriodRecord")
  303. @ApiOperation(value = "删除监审期间记录(动态表使用)", httpMethod = "POST", notes = "删除监审期间记录")
  304. public CommonResult<String> deletePeriodRecord(
  305. @ApiParam(name = "id", value = "记录ID", required = true)
  306. @RequestParam String id) throws Exception {
  307. if (StringUtil.isEmpty(id)) {
  308. return CommonResult.<String>error().message("id不能为空");
  309. }
  310. costAuditPeriodRecordManager.remove(id);
  311. return CommonResult.<String>ok().message("删除监审期间记录成功");
  312. }
  313. /**
  314. * 企业报送-成本调查表-审核
  315. * @return
  316. * @exception
  317. */
  318. @PostMapping(value="/review")
  319. public CommonResult<String> review(@RequestBody CostSurveyTemplateUpload costProjectTaskMaterial){
  320. CostSurveyTemplateUpload upload = costSurveyTemplateUploadManager.getById(costProjectTaskMaterial.getId());
  321. upload.setAuditedStatus(costProjectTaskMaterial.getAuditedStatus());
  322. costSurveyTemplateUploadManager.updateById(upload);
  323. return CommonResult.<String>ok();
  324. }
  325. }