TaskDetailsServiceImpl.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. package com.goafanti.techproject.service.impl;
  2. import com.goafanti.common.bo.Result;
  3. import com.goafanti.common.dao.*;
  4. import com.goafanti.common.model.*;
  5. import com.goafanti.common.utils.excel.NewExcelUtil;
  6. import com.goafanti.core.mybatis.BaseMybatisDao;
  7. import com.goafanti.core.mybatis.page.Pagination;
  8. import com.goafanti.core.shiro.token.TokenManager;
  9. import com.goafanti.order.bo.TOrderTaskBo;
  10. import com.goafanti.techproject.bo.OutTaskDetailsBo;
  11. import com.goafanti.techproject.bo.TaskDetailsBo;
  12. import com.goafanti.techproject.service.TaskDetailsService;
  13. import org.springframework.beans.BeanUtils;
  14. import org.springframework.beans.factory.annotation.Value;
  15. import org.springframework.stereotype.Service;
  16. import javax.annotation.Resource;
  17. import java.math.BigDecimal;
  18. import java.math.RoundingMode;
  19. import java.util.*;
  20. import java.util.stream.Collectors;
  21. /**
  22. * 项目申报详情(TaskDetails)表服务实现类
  23. *
  24. * @author makejava
  25. * @since 2024-12-26 17:11:50
  26. */
  27. @Service("taskDetailsService")
  28. public class TaskDetailsServiceImpl extends BaseMybatisDao<TaskDetailsMapper> implements TaskDetailsService {
  29. @Resource
  30. private TaskDetailsMapper taskDetailsMapper;
  31. @Resource
  32. private TaskDetailsLogMapper taskDetailsLogMapper;
  33. @Resource
  34. private TOrderNewMapper tOrderNewMapper;
  35. @Resource
  36. private TOrderMidMapper tOrderMidMapper;
  37. @Resource
  38. private TOrderTaskMapper tOrderTaskMapper;
  39. @Resource
  40. private TaskFeatureMapper taskFeatureMapper;
  41. @Resource
  42. private TaskFeatureLogMapper taskFeatureLogMapper;
  43. @Value(value = "${upload.path}")
  44. private final String uploadPath = null;
  45. @Override
  46. public Pagination<TaskDetails> list(TaskDetails taskDetails, Integer pageNo, Integer pageSize) {
  47. Map<String, Object> params = new HashMap<>();
  48. params.put("in", taskDetails);
  49. return (Pagination<TaskDetails>) findPage("findTaskDetailsList",
  50. "findTaskDetailsCount", params, pageNo, pageSize);
  51. }
  52. @Override
  53. public TaskDetailsBo pushByTid(Integer id) {
  54. TaskDetailsBo res = new TaskDetailsBo();
  55. TOrderNew tOrderNew = tOrderNewMapper.selectByTid(id);
  56. TOrderTask tOrderTask = tOrderTaskMapper.queryById(id);
  57. TOrderMid mid = tOrderMidMapper.selectByOrderNo(tOrderNew.getOrderNo());
  58. List<Map<String,Object >> list=new ArrayList<>();
  59. TaskDetails taskDetails=null;
  60. //获取项目服务年份算出平均值
  61. List<TOrderTaskBo> tOrderTaskBos = tOrderTaskMapper.selectOrderTaskAll(tOrderNew.getOrderNo(), null);
  62. List<TOrderTaskBo> collect = tOrderTaskBos.stream().filter(e -> e.getSplitStatus() == 1).collect(Collectors.toList());
  63. List<TOrderTaskBo> collect2 = tOrderTaskBos.stream().filter(e -> e.getSplitStatus() == 0||e.getSplitStatus() == 2).collect(Collectors.toList());
  64. int yearSum=1;
  65. for (TOrderTaskBo e : collect) {
  66. if (e.getYearSum()>yearSum){
  67. yearSum=e.getYearSum();
  68. }
  69. }
  70. if (tOrderTask.getProgressTid()==null){
  71. taskDetails=taskDetailsMapper.selectByTid(id);
  72. //首先直接查找,找不到的情况下找订单
  73. //如果是会员
  74. TOrderTaskBo thisTask = null;
  75. for (TOrderTaskBo e : collect2) {
  76. if (e.getId().equals(id)){
  77. thisTask=e;
  78. break;
  79. }
  80. }
  81. String serviceYear = thisTask.getServiceYear();
  82. if (serviceYear.contains("(赠)")){
  83. serviceYear=serviceYear.replace("(赠)", "");
  84. }
  85. Integer tid=null;
  86. for (TOrderTaskBo e : collect2) {
  87. e.getServiceLife();
  88. if (e.getServiceYear().equals(serviceYear)){
  89. Map<String,Object> map=new HashMap<>();
  90. map.put("serviceYear", e.getServiceYear());
  91. map.put("taskName", e.getCommodityName());
  92. map.put("id",e.getId());
  93. //如果没有项目进度,查询同年份的项目进度
  94. if (taskDetails==null&&!e.getId().equals(id)&&e.getcSort()==6){
  95. taskDetails=taskDetailsMapper.selectByTid(e.getId());
  96. tid=e.getId();
  97. }
  98. list.add(map);
  99. }
  100. }
  101. if (taskDetails !=null){
  102. BeanUtils.copyProperties(taskDetails, res);
  103. }
  104. res.setUserName(mid.getBuyerName());
  105. res.setOrderNo(tOrderNew.getOrderNo());
  106. res.setContractNo(tOrderNew.getContractNo());
  107. res.setMemberStatus(mid.getProjectType());
  108. res.setTaskList(list);
  109. BigDecimal totalAmount = tOrderNew.getTotalAmount().divide(new BigDecimal(yearSum), 2, RoundingMode.HALF_UP);
  110. String lvl=null;
  111. if (totalAmount.compareTo(new BigDecimal("3"))<0){
  112. lvl="A";
  113. }else if (totalAmount.compareTo(new BigDecimal("8"))<1){
  114. lvl="AA";
  115. }else if (totalAmount.compareTo(new BigDecimal("8"))>0){
  116. lvl="AAA";
  117. }
  118. res.setMemberLvl(lvl);
  119. res.setTaskList(list);
  120. res.setFeatureList(taskFeatureMapper.selectByTdId(id));
  121. if (tid==null){
  122. tid=taskDetails.getTid();
  123. TOrderTask update =new TOrderTask();
  124. update.setId(id);
  125. update.setProgressTid(tid);
  126. tOrderTaskMapper.update(update);
  127. }
  128. }else {
  129. taskDetails=taskDetailsMapper.selectByTid(tOrderTask.getProgressTid());
  130. BeanUtils.copyProperties(taskDetails, res);
  131. //如果是会员
  132. TOrderTaskBo thisTask = null;
  133. for (TOrderTaskBo e : collect2) {
  134. if (e.getId().equals(id)){
  135. thisTask=e;
  136. break;
  137. }
  138. }
  139. String serviceYear = thisTask.getServiceYear();
  140. if (serviceYear.contains("(赠)")){
  141. serviceYear=serviceYear.replace("(赠)", "");
  142. }
  143. Integer tid=null;
  144. for (TOrderTaskBo e : collect2) {
  145. if (e.getServiceYear().equals(serviceYear)){
  146. Map<String,Object> map=new HashMap<>();
  147. map.put("serviceYear", e.getServiceYear());
  148. map.put("taskName", e.getCommodityName());
  149. map.put("id",e.getId());
  150. list.add(map);
  151. }
  152. }
  153. if (taskDetails !=null){
  154. BeanUtils.copyProperties(taskDetails, res);
  155. }
  156. res.setUserName(mid.getBuyerName());
  157. res.setOrderNo(tOrderNew.getOrderNo());
  158. res.setContractNo(tOrderNew.getContractNo());
  159. res.setMemberStatus(mid.getProjectType());
  160. res.setTaskList(list);
  161. BigDecimal totalAmount = tOrderNew.getTotalAmount().divide(new BigDecimal(yearSum), 2, RoundingMode.HALF_UP);
  162. String lvl=null;
  163. if (totalAmount.compareTo(new BigDecimal("3"))<0){
  164. lvl="A";
  165. }else if (totalAmount.compareTo(new BigDecimal("8"))<1){
  166. lvl="AA";
  167. }else if (totalAmount.compareTo(new BigDecimal("8"))>0){
  168. lvl="AAA";
  169. }
  170. res.setMemberLvl(lvl);
  171. res.setTaskList(list);
  172. res.setFeatureList(taskFeatureMapper.selectByTdId(id));
  173. }
  174. return res;
  175. }
  176. /**
  177. * 通过ID查询单条数据
  178. *
  179. * @param id 主键
  180. * @return 实例对象
  181. */
  182. @Override
  183. public TaskDetails queryById(Integer id) {
  184. return this.taskDetailsMapper.selectById(id);
  185. }
  186. /**
  187. * 新增数据
  188. *
  189. * @param taskDetails 实例对象
  190. * @return 实例对象
  191. */
  192. @Override
  193. public TaskDetails insert(TaskDetails taskDetails,Integer type) {
  194. if (type ==null)type=0;
  195. Date date = new Date();
  196. TOrderNew tOrderNew =tOrderNewMapper.selectByTid(taskDetails.getTid());
  197. taskDetails.setUid(tOrderNew.getBuyerId());
  198. taskDetails.setCreateTime(date);
  199. taskDetails.setUpdateTime(date);
  200. //数据计算
  201. countTaskDetails(taskDetails);
  202. this.taskDetailsMapper.insert(taskDetails);
  203. //新增日志数据
  204. if (type==1){
  205. addTaskDetailsLog(taskDetails);
  206. }
  207. return taskDetails;
  208. }
  209. /**
  210. *新增的时候特殊数据可以是单传输,修改的时候可以多传
  211. *
  212. * @param taskDetails 项目进度数据
  213. *
  214. */
  215. private void addTaskDetailsLog(TaskDetails taskDetails) {
  216. Admin adminToken = TokenManager.getAdminToken();
  217. TaskDetailsLog log=new TaskDetailsLog();
  218. BeanUtils.copyProperties(taskDetails, log);
  219. log.setTdid(taskDetails.getId());
  220. log.setId(null);
  221. log.setAid(adminToken.getId());
  222. log.setAname(adminToken.getName());
  223. taskDetailsLogMapper.insert(log);
  224. List<TaskFeature> list = taskFeatureMapper.selectByTdId(taskDetails.getId());
  225. for (TaskFeature feature : list) {
  226. TaskFeatureLog tfLog = new TaskFeatureLog();
  227. BeanUtils.copyProperties(feature, tfLog);
  228. tfLog.setTdlId(log.getId());
  229. tfLog.setId(null);
  230. tfLog.setAid(adminToken.getId());
  231. tfLog.setAname(adminToken.getName());
  232. taskFeatureLogMapper.insert(tfLog);
  233. }
  234. }
  235. private void countTaskDetails(TaskDetails taskDetails) {
  236. //计算人员占比
  237. if (taskDetails.getWorkersNumber()!=null||
  238. taskDetails.getTechnologyNumber()!=null){
  239. BigDecimal wn = BigDecimal.valueOf(taskDetails.getWorkersNumber());
  240. BigDecimal tn = BigDecimal.valueOf(taskDetails.getTechnologyNumber());
  241. BigDecimal res = tn.divide(wn,4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
  242. taskDetails.setWorkersRate(res.doubleValue());
  243. }
  244. //计算研发预算完成进度 已归集研发费用总额÷年度研发预算总额X100%
  245. if (taskDetails.getActualRdAmount()!=null &&taskDetails.getRdBudget()!=null){
  246. BigDecimal multiply = taskDetails.getActualRdAmount().divide(taskDetails.getRdBudget(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
  247. taskDetails.setRdCompletionProgress(multiply.doubleValue());
  248. }
  249. //计算年度研发占比
  250. //计算三年度的研发占比
  251. if (taskDetails.getRdBudget() != null && taskDetails.getRdSalesAmount() != null){
  252. BigDecimal rdBudget = taskDetails.getRdBudget();
  253. BigDecimal rdSalesAmount = taskDetails.getRdSalesAmount();
  254. BigDecimal res = rdBudget.divide(rdSalesAmount, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
  255. taskDetails.setRdBudgetRate(res.doubleValue());
  256. //计算三年度的研发占比
  257. if (taskDetails.getLastRdSalesAmount()!=null && taskDetails.getLastRdBudget()!=null&&
  258. taskDetails.getBeforeLastRdSalesAmount()!=null && taskDetails.getBeforeLastRdBudget()!=null){
  259. BigDecimal res2 = getBigDecimal(rdSalesAmount, rdBudget, taskDetails);
  260. taskDetails.setThreeYearsRdBudgetRate(res2.doubleValue());
  261. }
  262. }
  263. //计算实际研发占比
  264. if(taskDetails.getActualRdNumber() !=null &&
  265. taskDetails.getActualRdAmount() !=null){
  266. BigDecimal actualRdNumber = BigDecimal.valueOf(taskDetails.getActualRdNumber());
  267. BigDecimal actualRdAmount = taskDetails.getActualRdAmount();
  268. BigDecimal res3 = actualRdNumber.divide(actualRdAmount, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
  269. taskDetails.setActualRdRate(res3.doubleValue());
  270. if (taskDetails.getLastRdSalesAmount()!=null && taskDetails.getLastRdBudget()!=null&&
  271. taskDetails.getBeforeLastRdSalesAmount()!=null && taskDetails.getBeforeLastRdBudget()!=null){
  272. BigDecimal res4 = getBigDecimal(actualRdAmount, actualRdNumber, taskDetails);
  273. taskDetails.setThreeYearsActualRdRate(res4.doubleValue());
  274. }
  275. }
  276. //计算立项资料占比
  277. if (taskDetails.getProjectApprovalWriteNumber()!=null){
  278. BigDecimal projectApprovalWriteNumber = BigDecimal.valueOf(taskDetails.getProjectApprovalWriteNumber());
  279. BigDecimal res5 = projectApprovalWriteNumber.divide(new BigDecimal(taskDetails.getProjectApprovalNumber()), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
  280. taskDetails.setProjectApprovalWriteRate(res5.doubleValue());
  281. }
  282. }
  283. private BigDecimal getBigDecimal(BigDecimal rdSalesAmount, BigDecimal rdBudget, TaskDetails taskDetails) {
  284. BigDecimal threeYearsRdSalesAmount = rdSalesAmount;
  285. BigDecimal threeYearsRdBudget = rdBudget;
  286. threeYearsRdSalesAmount = threeYearsRdSalesAmount.add(taskDetails.getLastRdSalesAmount()).add(taskDetails.getBeforeLastRdSalesAmount());
  287. threeYearsRdBudget = threeYearsRdBudget.add(taskDetails.getLastRdBudget()).add(taskDetails.getBeforeLastRdBudget());
  288. return threeYearsRdBudget.divide(threeYearsRdSalesAmount, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
  289. }
  290. /**
  291. * 修改数据
  292. *
  293. * @param taskDetails 实例对象
  294. * @return 实例对象
  295. */
  296. @Override
  297. public TaskDetails update(TaskDetails taskDetails) {
  298. taskDetails.setUpdateTime(new Date());
  299. countTaskDetails(taskDetails);
  300. this.taskDetailsMapper.update(taskDetails);
  301. TaskDetails res = this.queryById(taskDetails.getId());
  302. addTaskDetailsLog(res);
  303. return res;
  304. }
  305. /**
  306. * 通过主键删除数据
  307. *
  308. * @param id 主键
  309. * @return 是否成功
  310. */
  311. @Override
  312. public boolean deleteById(Integer id) {
  313. this.taskDetailsMapper.deleteById(id);
  314. return true;
  315. }
  316. @Override
  317. public Result export(Integer id) {
  318. OutTaskDetailsBo res = new OutTaskDetailsBo();
  319. NewExcelUtil<OutTaskDetailsBo> excel=new NewExcelUtil<>(OutTaskDetailsBo.class);
  320. TaskDetailsBo byTid = pushByTid(id);
  321. BeanUtils.copyProperties(byTid,res);
  322. StringBuffer sb = new StringBuffer();
  323. byTid.getTaskList().forEach(e->{
  324. if (res.getServiceyear()==null){
  325. res.setServiceyear((String) e.get("serviceYear"));
  326. }
  327. sb.append(e.get("taskName")).append("; ");
  328. });
  329. res.setServiceProject(sb.toString());
  330. return excel.exportTaskDetailsExcel(res,"项目进度表",uploadPath);
  331. }
  332. @Override
  333. public boolean checkTid(TaskDetails taskDetails) {
  334. TaskDetails res = taskDetailsMapper.selectByTid(taskDetails.getTid());
  335. return res != null;
  336. }
  337. @Override
  338. public TaskFeature addFeature(TaskFeature in) {
  339. in.setCreateTime(new Date());
  340. taskFeatureMapper.insert(in);
  341. return in;
  342. }
  343. @Override
  344. public TaskFeature updateFeature(TaskFeature in) {
  345. taskFeatureMapper.update(in);
  346. return taskFeatureMapper.selectById(in.getId());
  347. }
  348. @Override
  349. public Object logList(Integer id) {
  350. return taskDetailsLogMapper.selectByTid(id);
  351. }
  352. @Override
  353. public Object logDetails(Integer id) {
  354. TaskDetailsLog log = taskDetailsLogMapper.selectById(id);
  355. TaskDetails taskDetails = taskDetailsMapper.selectById(log.getTdid());
  356. Integer tid = taskDetails.getTid();
  357. TaskDetailsBo res = new TaskDetailsBo();
  358. TOrderNew tOrderNew = tOrderNewMapper.selectByTid(tid);
  359. TOrderMid mid = tOrderMidMapper.selectByOrderNo(tOrderNew.getOrderNo());
  360. List<Map<String,Object >> list=new ArrayList<>();
  361. List<TOrderTaskBo> tOrderTaskBos = tOrderTaskMapper.selectOrderTaskAll(tOrderNew.getOrderNo(), 4);
  362. //如果是会员
  363. TOrderTaskBo thisTask = null;
  364. for (TOrderTaskBo e : tOrderTaskBos) {
  365. if (e.getId().equals(id)){
  366. thisTask=e;
  367. break;
  368. }
  369. }
  370. String serviceYear = thisTask.getServiceYear();
  371. if (serviceYear.contains("(赠)")){
  372. serviceYear=serviceYear.replace("(赠)", "");
  373. }
  374. for (TOrderTaskBo e : tOrderTaskBos) {
  375. if (e.getServiceYear().equals(serviceYear)){
  376. Map<String,Object> map=new HashMap<>();
  377. map.put("serviceYear", e.getServiceYear());
  378. map.put("taskName", e.getCommodityName());
  379. map.put("id",e.getId());
  380. list.add(map);
  381. }
  382. }
  383. if (taskDetails !=null){
  384. BeanUtils.copyProperties(log, res);
  385. }
  386. res.setUserName(mid.getBuyerName());
  387. res.setOrderNo(tOrderNew.getOrderNo());
  388. res.setContractNo(tOrderNew.getContractNo());
  389. res.setMemberStatus(mid.getProjectType());
  390. res.setTaskList(list);
  391. BigDecimal totalAmount = tOrderNew.getTotalAmount();
  392. String lvl=null;
  393. if (totalAmount.compareTo(new BigDecimal("3"))<0){
  394. lvl="A";
  395. }else if (totalAmount.compareTo(new BigDecimal("8"))<1){
  396. lvl="AA";
  397. }else if (totalAmount.compareTo(new BigDecimal("8"))>0){
  398. lvl="AAA";
  399. }
  400. res.setMemberLvl(lvl);
  401. res.setTaskList(list);
  402. res.setFeatureList(taskFeatureMapper.selectByTdId(id));
  403. return res;
  404. }
  405. @Override
  406. public Object deleteTaskFeature(Integer id) {
  407. return taskFeatureMapper.deleteById(id);
  408. }
  409. }