TaskDetailsServiceImpl.java 20 KB

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