TaskDetailsServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. package com.goafanti.techproject.service.impl;
  2. import com.goafanti.common.dao.*;
  3. import com.goafanti.common.model.*;
  4. import com.goafanti.common.utils.excel.NewExcelUtil;
  5. import com.goafanti.core.mybatis.BaseMybatisDao;
  6. import com.goafanti.core.mybatis.page.Pagination;
  7. import com.goafanti.core.shiro.token.TokenManager;
  8. import com.goafanti.order.bo.TOrderTaskBo;
  9. import com.goafanti.techproject.bo.OutTaskDetailsBo;
  10. import com.goafanti.techproject.bo.TaskDetailsBo;
  11. import com.goafanti.techproject.service.TaskDetailsService;
  12. import org.springframework.beans.BeanUtils;
  13. import org.springframework.beans.factory.annotation.Value;
  14. import org.springframework.stereotype.Service;
  15. import javax.annotation.Resource;
  16. import java.math.BigDecimal;
  17. import java.math.RoundingMode;
  18. import java.time.LocalDate;
  19. import java.util.*;
  20. /**
  21. * 项目申报详情(TaskDetails)表服务实现类
  22. *
  23. * @author makejava
  24. * @since 2024-12-26 17:11:50
  25. */
  26. @Service("taskDetailsService")
  27. public class TaskDetailsServiceImpl extends BaseMybatisDao<TaskDetailsMapper> implements TaskDetailsService {
  28. @Resource
  29. private TaskDetailsMapper taskDetailsMapper;
  30. @Resource
  31. private TaskDetailsLogMapper taskDetailsLogMapper;
  32. @Resource
  33. private TOrderNewMapper tOrderNewMapper;
  34. @Resource
  35. private TOrderMidMapper tOrderMidMapper;
  36. @Resource
  37. private TOrderTaskMapper tOrderTaskMapper;
  38. @Resource
  39. private TaskAnnualReportMapper taskAnnualReportMapper;
  40. @Value(value = "${upload.path}")
  41. private final String uploadPath = null;
  42. @Override
  43. public Pagination<TaskDetails> list(TaskDetails taskDetails, Integer pageNo, Integer pageSize) {
  44. Map<String, Object> params = new HashMap<>();
  45. params.put("in", taskDetails);
  46. return (Pagination<TaskDetails>) findPage("findTaskDetailsList",
  47. "findTaskDetailsCount", params, pageNo, pageSize);
  48. }
  49. @Override
  50. public TaskDetailsBo getByTid(Integer id) {
  51. TaskDetailsBo res = new TaskDetailsBo();
  52. TOrderNew tOrderNew = tOrderNewMapper.selectByTid(id);
  53. TOrderMid mid = tOrderMidMapper.selectByOrderNo(tOrderNew.getOrderNo());
  54. List<TOrderTaskBo> tOrderTaskBos = tOrderTaskMapper.selectOrderTaskAll(tOrderNew.getOrderNo(), 4);
  55. List<Map<String,Object >> list=new ArrayList<>();
  56. TaskDetails taskDetails=taskDetailsMapper.selectByTid(id);
  57. LocalDate now = LocalDate.now();
  58. //如果是会员
  59. TOrderTaskBo thisTask = null;
  60. for (TOrderTaskBo e : tOrderTaskBos) {
  61. if (e.getId().equals(id)){
  62. thisTask=e;
  63. break;
  64. }
  65. }
  66. String serviceYear = thisTask.getServiceYear();
  67. if (serviceYear.contains("(赠)")){
  68. serviceYear=serviceYear.replace("(赠)", "");
  69. }
  70. for (TOrderTaskBo e : tOrderTaskBos) {
  71. if (e.getServiceYear().equals(serviceYear)){
  72. Map<String,Object> map=new HashMap<>();
  73. map.put("serviceYear", e.getServiceYear());
  74. map.put("taskName", e.getCommodityName());
  75. map.put("id",e.getId());
  76. //如果没有项目进度,查询同年份的项目进度
  77. if (taskDetails==null&&!e.getId().equals(id)&&e.getcSort()==6){
  78. taskDetails=taskDetailsMapper.selectByTid(e.getId());
  79. }
  80. list.add(map);
  81. }
  82. }
  83. if (taskDetails != null) {
  84. int year = now.getYear();
  85. List<TaskAnnualReport> taskAnnualReports = taskAnnualReportMapper.selectThreeYear(taskDetails.getTid(), year);
  86. for (TaskAnnualReport e : taskAnnualReports) {
  87. if (e.getYear()==(year-1)){
  88. res.setLastYear(e.getYear().toString());
  89. res.setLastSalesAmount(e.getSalesAmount());
  90. res.setLastRdBudget(e.getResearchAmount());
  91. }else if (e.getYear()==(year-2)){
  92. res.setBeforeLastYear(e.getYear().toString());
  93. res.setBeforeLastSalesAmount(e.getSalesAmount());
  94. res.setBeforeLastRdBudget(e.getResearchAmount());
  95. }
  96. }
  97. BeanUtils.copyProperties(taskDetails, res);
  98. }
  99. BigDecimal totalAmount = tOrderNew.getTotalAmount();
  100. String lvl=null;
  101. if (totalAmount.compareTo(new BigDecimal("3"))<0){
  102. lvl="A";
  103. }else if (totalAmount.compareTo(new BigDecimal("8"))<1){
  104. lvl="AA";
  105. }else if (totalAmount.compareTo(new BigDecimal("8"))>0){
  106. lvl="AAA";
  107. }
  108. res.setUserName(mid.getBuyerName());
  109. res.setOrderNo(tOrderNew.getOrderNo());
  110. res.setContractNo(tOrderNew.getContractNo());
  111. res.setMemberStatus(mid.getProjectType());
  112. res.setMemberLvl(lvl);
  113. res.setTaskList(list);
  114. return res;
  115. }
  116. /**
  117. * 通过ID查询单条数据
  118. *
  119. * @param id 主键
  120. * @return 实例对象
  121. */
  122. @Override
  123. public TaskDetails queryById(Integer id) {
  124. return this.taskDetailsMapper.selectById(id);
  125. }
  126. /**
  127. * 新增数据
  128. *
  129. * @param taskDetails 实例对象
  130. * @return 实例对象
  131. */
  132. @Override
  133. public TaskDetails insert(TaskDetails taskDetails) {
  134. TOrderNew tOrderNew =tOrderNewMapper.selectByTid(taskDetails.getTid());
  135. taskDetails.setUid(tOrderNew.getBuyerId());
  136. taskDetails.setCreateTime(new Date());
  137. taskDetails.setUpdateTime(new Date());
  138. //数据计算
  139. countTaskDetails(taskDetails);
  140. this.taskDetailsMapper.insert(taskDetails);
  141. addTaskDetailsLog(taskDetails);
  142. return taskDetails;
  143. }
  144. private void addTaskDetailsLog(TaskDetails taskDetails) {
  145. TaskDetailsLog log=new TaskDetailsLog();
  146. BeanUtils.copyProperties(taskDetails, log);
  147. log.setTdid(taskDetails.getId());
  148. log.setId(null);
  149. Admin adminToken = TokenManager.getAdminToken();
  150. log.setAid(adminToken.getId());
  151. log.setAname(adminToken.getName());
  152. taskDetailsLogMapper.insert(log);
  153. }
  154. private void countTaskDetails(TaskDetails taskDetails) {
  155. //计算人员占比
  156. if (taskDetails.getWorkersNumber()!=null||
  157. taskDetails.getTechnologyNumber()!=null){
  158. BigDecimal wn = BigDecimal.valueOf(taskDetails.getWorkersNumber());
  159. BigDecimal tn = BigDecimal.valueOf(taskDetails.getTechnologyNumber());
  160. BigDecimal res = tn.divide(wn,4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
  161. taskDetails.setWorkersRate(res.doubleValue());
  162. }
  163. //计算年度研发占比
  164. //计算三年度的研发占比
  165. LocalDate now = LocalDate.now();
  166. int year = now.getYear();
  167. List<TaskAnnualReport> taskAnnualReports = taskAnnualReportMapper.selectThreeYear(taskDetails.getTid(), year);
  168. if(taskDetails.getRdBudget() !=null ||
  169. taskDetails.getRdSalesAmount() !=null){
  170. BigDecimal rdBudget = taskDetails.getRdBudget();
  171. BigDecimal rdSalesAmount = taskDetails.getRdSalesAmount();
  172. BigDecimal res = rdBudget.divide(rdSalesAmount, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
  173. taskDetails.setRdBudgetRate(res.doubleValue());
  174. //计算三年度的研发占比
  175. if (taskAnnualReports.size()==2){
  176. BigDecimal res2 = getBigDecimal(rdSalesAmount, rdBudget, taskAnnualReports);
  177. taskDetails.setThreeYearsRdBudgetRate(res2.doubleValue());
  178. }
  179. }
  180. //计算实际研发占比
  181. if(taskDetails.getActualRdNumber() !=null ||
  182. taskDetails.getActualRdAmount() !=null){
  183. BigDecimal actualRdNumber = BigDecimal.valueOf(taskDetails.getActualRdNumber());
  184. BigDecimal actualRdAmount = taskDetails.getActualRdAmount();
  185. BigDecimal res = actualRdNumber.divide(actualRdAmount, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
  186. taskDetails.setActualRdRate(res.doubleValue());
  187. if (taskAnnualReports.size()==2){
  188. BigDecimal res2 = getBigDecimal(actualRdAmount, actualRdNumber, taskAnnualReports);
  189. taskDetails.setThreeYearsActualRdRate(res2.doubleValue());
  190. }
  191. }
  192. //计算立项资料占比
  193. if (taskDetails.getProjectApprovalWriteNumber()!=null){
  194. BigDecimal projectApprovalWriteNumber = BigDecimal.valueOf(taskDetails.getProjectApprovalWriteNumber());
  195. BigDecimal res = projectApprovalWriteNumber.divide(new BigDecimal(taskDetails.getProjectApprovalNumber()), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
  196. taskDetails.setProjectApprovalWriteRate(res.doubleValue());
  197. }
  198. }
  199. private BigDecimal getBigDecimal(BigDecimal rdSalesAmount, BigDecimal rdBudget, List<TaskAnnualReport> taskAnnualReports) {
  200. BigDecimal threeYearsRdSalesAmount = rdSalesAmount;
  201. BigDecimal threeYearsRdBudget = rdBudget;
  202. for (TaskAnnualReport e : taskAnnualReports) {
  203. threeYearsRdBudget=threeYearsRdBudget.add(e.getResearchAmount());
  204. threeYearsRdSalesAmount=threeYearsRdSalesAmount.add(e.getSalesAmount());
  205. }
  206. return threeYearsRdBudget.divide(threeYearsRdSalesAmount, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
  207. }
  208. /**
  209. * 修改数据
  210. *
  211. * @param taskDetails 实例对象
  212. * @return 实例对象
  213. */
  214. @Override
  215. public TaskDetails update(TaskDetails taskDetails) {
  216. taskDetails.setUpdateTime(new Date());
  217. this.taskDetailsMapper.update(taskDetails);
  218. countTaskDetails(taskDetails);
  219. TaskDetails res = this.queryById(taskDetails.getId());
  220. addTaskDetailsLog(res);
  221. return res;
  222. }
  223. /**
  224. * 通过主键删除数据
  225. *
  226. * @param id 主键
  227. * @return 是否成功
  228. */
  229. @Override
  230. public boolean deleteById(Integer id) {
  231. this.taskDetailsMapper.deleteById(id);
  232. return true;
  233. }
  234. @Override
  235. public Object export(Integer id) {
  236. OutTaskDetailsBo res = new OutTaskDetailsBo();
  237. NewExcelUtil<OutTaskDetailsBo> excel=new NewExcelUtil<>(OutTaskDetailsBo.class);
  238. TaskDetailsBo byTid = getByTid(id);
  239. BeanUtils.copyProperties(byTid,res);
  240. StringBuffer sb = new StringBuffer();
  241. byTid.getTaskList().forEach(e->{
  242. if (res.getServiceyear()==null){
  243. res.setServiceyear((String) e.get("serviceYear"));
  244. }
  245. sb.append(e.get("taskName")).append("; ");
  246. });
  247. res.setServiceProject(sb.toString());
  248. return excel.exportTaskDetailsExcel(res,"项目进度表",uploadPath);
  249. }
  250. @Override
  251. public boolean checkTid(TaskDetails taskDetails) {
  252. TaskDetails res = taskDetailsMapper.selectByTid(taskDetails.getTid());
  253. return res != null;
  254. }
  255. }