SubjectController.java 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. package com.txz.cif.web.mng;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollUtil;
  4. import cn.hutool.core.date.DateUtil;
  5. import cn.hutool.core.util.StrUtil;
  6. import cn.hutool.json.JSONUtil;
  7. import cn.hutool.poi.excel.ExcelUtil;
  8. import cn.hutool.poi.excel.ExcelWriter;
  9. import com.txz.cif.core.Result;
  10. import com.txz.cif.model.DayCut;
  11. import com.txz.cif.model.Subject;
  12. import com.txz.cif.service.DayCutService;
  13. import com.txz.cif.service.SubjectService;
  14. import com.txz.cif.web.bo.AccountBO;
  15. import com.txz.cif.web.bo.SubjectBO;
  16. import com.txz.cif.web.para.AccountListParam;
  17. import com.txz.cif.web.para.InnerAccountParam;
  18. import com.txz.cif.web.para.RechargeForm;
  19. import com.txz.cif.web.para.SubjectListParam;
  20. import com.txz.cif.core.ResultGenerator;
  21. import com.txz.cif.model.Account;
  22. import com.txz.cif.service.AccountService;
  23. import com.txz.cif.core.ResultCode;
  24. import com.github.pagehelper.PageHelper;
  25. import com.github.pagehelper.PageInfo;
  26. import org.springframework.validation.annotation.Validated;
  27. import org.springframework.web.bind.annotation.*;
  28. import org.slf4j.Logger;
  29. import org.slf4j.LoggerFactory;
  30. import com.txz.core.ServiceException;
  31. import io.swagger.annotations.Api;
  32. import io.swagger.annotations.ApiOperation;
  33. import tk.mybatis.mapper.entity.Condition;
  34. import tk.mybatis.mapper.entity.Example.Criteria;
  35. import javax.annotation.Resource;
  36. import javax.servlet.ServletOutputStream;
  37. import javax.servlet.http.HttpServletResponse;
  38. import java.math.BigDecimal;
  39. import java.util.*;
  40. import java.util.stream.Collectors;
  41. import org.apache.commons.lang.StringUtils;
  42. /**
  43. * Created by CodeGenerator on 2022/11/04.
  44. */
  45. @Api(tags = "[后台]科目管理")
  46. @RestController
  47. @RequestMapping("/subject")
  48. public class SubjectController {
  49. private static Logger log = LoggerFactory.getLogger(SubjectController.class);
  50. @Resource
  51. private SubjectService subjectService;
  52. @Resource
  53. private DayCutService dayCutService;
  54. @PostMapping("/list")
  55. @ApiOperation(value = "获取科目列表",httpMethod = "POST")
  56. public Result<List<SubjectBO>> list(@Validated @RequestBody SubjectListParam param) {
  57. if (param.getStartTime().length()>10){
  58. param.setStartTime(param.getStartTime().substring(0,10));
  59. }
  60. if (param.getEndTime().length()>10){
  61. param.setEndTime(param.getEndTime().substring(0,10));
  62. }
  63. Date endTime = DateUtil.parse(param.getEndTime(),"yyyy-MM-dd");
  64. if (endTime.after(DateUtil.yesterday())){
  65. return ResultGenerator.genFailResult(ResultCode.ENDTIME_ERROR);
  66. }
  67. try {
  68. List<Subject> subjects = subjectService.findAll();
  69. if (CollUtil.isEmpty(subjects)){
  70. return ResultGenerator.genSuccessResult(CollUtil.newArrayList());
  71. }
  72. List<SubjectBO> list = new ArrayList<>();
  73. for (Subject subject:subjects) {
  74. SubjectBO bo = BeanUtil.toBean(subject,SubjectBO.class);
  75. bo.setSubjectId(subject.getId());
  76. if (subject.getLeaf() == 1){
  77. //设置初始日余额、日余额、借方发生额、贷方发生额
  78. DayCut startDayCut = dayCutService.findByDayAndSubjectId(param.getStartTime(),subject.getId());
  79. if (startDayCut == null){
  80. startDayCut = DayCut.builder().initAmount(BigDecimal.ZERO).build();
  81. }
  82. bo.setInitAmount(startDayCut.getInitAmount());
  83. DayCut endDayCut = dayCutService.findByDayAndSubjectId(param.getEndTime(),subject.getId());
  84. if (endDayCut == null){
  85. endDayCut = DayCut.builder().initAmount(BigDecimal.ZERO).build();
  86. }
  87. bo.setEndAmount(endDayCut.getEndAmount());
  88. bo.setDebitAmount(dayCutService.sumAmount(subject.getId(),"D",param.getStartTime(),param.getEndTime()));
  89. bo.setCreditAmount(dayCutService.sumAmount(subject.getId(),"C",param.getStartTime(),param.getEndTime()));
  90. }
  91. list.add(bo);
  92. }
  93. Map<String, SubjectBO> map = assembling(list);
  94. List<SubjectBO> ret = CollUtil.newArrayList(map.get("1"),map.get("2"),map.get("3"),map.get("4"));
  95. return ResultGenerator.genSuccessResult(ret);
  96. } catch (Exception e) {
  97. log.error("查询对象操作异常e:{}",e);
  98. return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
  99. }
  100. }
  101. /**
  102. * 组装树结构
  103. * @param list
  104. * @return
  105. */
  106. private Map<String, SubjectBO> assembling(List<SubjectBO> list) {
  107. Map<String, SubjectBO> temp = new HashMap(list.size());
  108. for (SubjectBO subject:list) {
  109. //存入自己
  110. temp.put(subject.getSubjectId()+"",subject);
  111. }
  112. for (SubjectBO subject:list) {
  113. //寻找父亲
  114. SubjectBO parent = temp.get(subject.getParentId()+"");
  115. if (parent == null){
  116. continue;
  117. }
  118. if (CollUtil.isEmpty(parent.getChildren())){
  119. parent.setChildren(CollUtil.newArrayList(subject));
  120. } else {
  121. parent.getChildren().add(subject);
  122. }
  123. }
  124. return temp;
  125. }
  126. @GetMapping("/export")
  127. @ApiOperation(value = "导出",httpMethod = "GET")
  128. public void export( SubjectListParam param, HttpServletResponse response) {
  129. ExcelWriter writer = ExcelUtil.getWriter();
  130. try {
  131. /**
  132. */
  133. String head = "账务数据";
  134. List<List<Object>> rows = new LinkedList<>();
  135. try {
  136. if (param.getStartTime().length()>10){
  137. param.setStartTime(param.getStartTime().substring(0,10));
  138. }
  139. if (param.getEndTime().length()>10){
  140. param.setEndTime(param.getEndTime().substring(0,10));
  141. }
  142. Date endTime = DateUtil.parse(param.getEndTime(),"yyyy-MM-dd");
  143. if (endTime.after(DateUtil.yesterday())){
  144. return ;
  145. }
  146. head = param.getStartTime()+"-"+param.getEndTime()+head;
  147. List<Subject> subjects = subjectService.findAll();
  148. if (CollUtil.isEmpty(subjects)){
  149. return ;
  150. }
  151. List<SubjectBO> list = new ArrayList<>();
  152. for (Subject subject:subjects) {
  153. SubjectBO bo = BeanUtil.toBean(subject,SubjectBO.class);
  154. bo.setSubjectId(subject.getId());
  155. if (subject.getLeaf() == 1){
  156. //设置初始日余额、日余额、借方发生额、贷方发生额
  157. DayCut startDayCut = dayCutService.findByDayAndSubjectId(param.getStartTime(),subject.getId());
  158. if (startDayCut == null){
  159. startDayCut = DayCut.builder().initAmount(BigDecimal.ZERO).build();
  160. }
  161. bo.setInitAmount(startDayCut.getInitAmount());
  162. DayCut endDayCut = dayCutService.findByDayAndSubjectId(param.getEndTime(),subject.getId());
  163. if (endDayCut == null){
  164. endDayCut = DayCut.builder().endAmount(BigDecimal.ZERO).build();
  165. }
  166. bo.setEndAmount(endDayCut.getEndAmount());
  167. bo.setDebitAmount(dayCutService.sumAmount(subject.getId(),"D",param.getStartTime(),param.getEndTime()));
  168. bo.setCreditAmount(dayCutService.sumAmount(subject.getId(),"C",param.getStartTime(),param.getEndTime()));
  169. }
  170. list.add(bo);
  171. }
  172. Map<String, SubjectBO> map = assembling(list);
  173. List<SubjectBO> ret = CollUtil.newArrayList(map.get("1"),map.get("2"),map.get("3"),map.get("4"));
  174. for (SubjectBO temp:ret) {
  175. List<Object> rowA = CollUtil.newArrayList(temp.getAliases()
  176. , temp.getName()
  177. , temp.getDirection()
  178. , temp.getInitAmount() == null? "0.0":temp.getInitAmount().toPlainString()
  179. , temp.getDebitAmount()== null? "0.0":temp.getDebitAmount().toPlainString()
  180. , temp.getCreditAmount()== null? "0.0":temp.getCreditAmount().toPlainString()
  181. , temp.getEndAmount()== null? "0.0":temp.getEndAmount().toPlainString()
  182. );
  183. rows.add(rowA);
  184. if (CollUtil.isNotEmpty(temp.getChildren())){
  185. for (SubjectBO temp2:temp.getChildren()) {
  186. List<Object> rowA2 = CollUtil.newArrayList(temp2.getAliases()
  187. , temp2.getName()
  188. , temp2.getDirection()
  189. , temp2.getInitAmount() == null? "0.0":temp2.getInitAmount().toPlainString()
  190. , temp2.getDebitAmount()== null? "0.0":temp2.getDebitAmount().toPlainString()
  191. , temp2.getCreditAmount()== null? "0.0":temp2.getCreditAmount().toPlainString()
  192. , temp2.getEndAmount()== null? "0.0":temp2.getEndAmount().toPlainString()
  193. );
  194. rows.add(rowA2);
  195. }
  196. }
  197. }
  198. } catch (Exception e) {
  199. log.error("查询对象操作异常e:{}",e);
  200. return ;
  201. }
  202. List<String> rowHead = CollUtil.newArrayList("科目别名", "科目", "余额方向", "初始日余额",
  203. "借方发生额","贷方发生额","日余额");
  204. writer.writeHeadRow(rowHead);
  205. writer.write(rows);
  206. //设置宽度自适应
  207. writer.setColumnWidth(-1, 22);
  208. //response为HttpServletResponse对象
  209. response.setContentType("application/vnd.ms-excel;charset=utf-8");
  210. //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
  211. response.setHeader("Content-Disposition", "attachment;filename=" + new String((head).getBytes("UTF-8"), "ISO-8859-1") + ".xls");
  212. ServletOutputStream out = response.getOutputStream();
  213. //out为OutputStream,需要写出到的目标流
  214. writer.flush(out);
  215. } catch (Exception e) {
  216. log.error("导出异常",e);
  217. e.printStackTrace();
  218. } finally {
  219. // 关闭writer,释放内存
  220. writer.close();
  221. }
  222. }
  223. }