TaskDetailsServiceImpl.java 19 KB

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