TaskDetailsServiceImpl.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  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.InputTaskDetailsBo;
  13. import com.goafanti.techproject.bo.InputTaskFeature;
  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.lang.reflect.InvocationTargetException;
  21. import java.math.BigDecimal;
  22. import java.math.RoundingMode;
  23. import java.util.*;
  24. import java.util.stream.Collectors;
  25. /**
  26. * 项目申报详情(TaskDetails)表服务实现类
  27. *
  28. * @author makejava
  29. * @since 2024-12-26 17:11:50
  30. */
  31. @Service("taskDetailsService")
  32. public class TaskDetailsServiceImpl extends BaseMybatisDao<TaskDetailsMapper> implements TaskDetailsService {
  33. @Resource
  34. private TaskDetailsMapper taskDetailsMapper;
  35. @Resource
  36. private TaskDetailsLogMapper taskDetailsLogMapper;
  37. @Resource
  38. private TOrderNewMapper tOrderNewMapper;
  39. @Resource
  40. private TOrderMidMapper tOrderMidMapper;
  41. @Resource
  42. private TOrderTaskMapper tOrderTaskMapper;
  43. @Resource
  44. private TaskFeatureMapper taskFeatureMapper;
  45. @Resource
  46. private TaskFeatureLogMapper taskFeatureLogMapper;
  47. @Resource
  48. private TTaskMemberMapper ttaskMemberMapper;
  49. @Value(value = "${upload.path}")
  50. private final String uploadPath = null;
  51. @Override
  52. public Pagination<TaskDetails> list(TaskDetails taskDetails, Integer pageNo, Integer pageSize) {
  53. Map<String, Object> params = new HashMap<>();
  54. params.put("in", taskDetails);
  55. return (Pagination<TaskDetails>) findPage("findTaskDetailsList",
  56. "findTaskDetailsCount", params, pageNo, pageSize);
  57. }
  58. @Override
  59. public TaskDetailsBo pushByTid(Integer id) {
  60. TaskDetailsBo res = new TaskDetailsBo();
  61. TOrderTask tOrderTask = tOrderTaskMapper.queryById(id);
  62. TaskDetails taskDetails=taskDetailsMapper.selectById(tOrderTask.getProgressTid());
  63. if (taskDetails !=null){
  64. BeanUtils.copyProperties( taskDetails,res);
  65. }
  66. addOrderInformation(res);
  67. return res;
  68. }
  69. @Override
  70. public Result export(InputTaskDetailsBo in) {
  71. in.setPageNo(1);
  72. in.setPageSize(10000);
  73. Pagination<TaskDetailsBo> page = detailsList(in);
  74. List<TaskDetailsBo> list = (List<TaskDetailsBo>) page.getList();
  75. NewExcelUtil<TaskDetailsBo> excel=new NewExcelUtil<>(TaskDetailsBo.class);
  76. return excel.exportTaskDetailsExcel(list,"项目进度表",uploadPath);
  77. }
  78. @Override
  79. public Pagination<TaskDetailsBo> detailsList(InputTaskDetailsBo in) {
  80. in.setAid(TokenManager.getUserId());
  81. Pagination<?> page = findPage("selectTaskDetailsList", "selectTaskDetailsCount", in);
  82. List<TaskDetails> list = (List<TaskDetails>) page.getList();
  83. List<TaskDetailsBo> list2=new ArrayList<>();
  84. for (TaskDetails e : list) {
  85. TaskDetailsBo bo=new TaskDetailsBo();
  86. BeanUtils.copyProperties(e,bo);
  87. addOrderInformation(bo);
  88. pushGetServiceProject(bo);
  89. list2.add(bo);
  90. }
  91. page.setList(list2);
  92. return (Pagination<TaskDetailsBo>) page;
  93. }
  94. private void addOrderInformation(TaskDetailsBo bo) {
  95. TOrderNew tOrderNew = tOrderNewMapper.selectByTid(bo.getTid());
  96. TOrderTask tOrderTask = tOrderTaskMapper.queryById(bo.getTid());
  97. TOrderMid mid = tOrderMidMapper.selectByOrderNo(tOrderNew.getOrderNo());
  98. List<Map<String,Object >> list;
  99. //获取项目服务年份算出平均值
  100. List<TOrderTaskBo> tOrderTaskBos = tOrderTaskMapper.selectOrderTaskAll(tOrderNew.getOrderNo(), null);
  101. List<TOrderTaskBo> collect = tOrderTaskBos.stream().filter(e -> e.getSplitStatus() == 1).collect(Collectors.toList());
  102. List<TOrderTaskBo> collect2 = tOrderTaskBos.stream().filter(e -> e.getSplitStatus() == 0||e.getSplitStatus() == 2).collect(Collectors.toList());
  103. int yearSum=1;
  104. for (TOrderTaskBo e : collect) {
  105. if (e.getYearSum()>yearSum){
  106. yearSum=e.getYearSum();
  107. }
  108. }
  109. TTaskMember tTaskMember = ttaskMemberMapper.selectByTid(tOrderTask.getId());
  110. String serviceYear = getServiceYer(tTaskMember.getServiceYear());
  111. list=addOrderList(collect2,serviceYear);
  112. bo.setUserName(mid.getBuyerName());
  113. bo.setOrderNo(tOrderNew.getOrderNo());
  114. bo.setContractNo(tOrderNew.getContractNo());
  115. bo.setServiceYear(serviceYear);
  116. bo.setMemberStatus(mid.getProjectType());
  117. bo.setTaskList(list);
  118. if (bo.getMemberStatus()==null){
  119. BigDecimal totalAmount = tOrderNew.getTotalAmount().divide(new BigDecimal(yearSum), 2, RoundingMode.HALF_UP);
  120. Integer lvl=getOrderLvl(totalAmount);
  121. bo.setMemberLvl(lvl);
  122. }
  123. bo.setFeatureList(taskFeatureMapper.selectByTdId(bo.getId()));
  124. }
  125. private String getServiceYer(String serviceYear) {
  126. String serviceYear2;
  127. if (StringUtils.isEmpty(serviceYear)){
  128. serviceYear2 = "";
  129. }else{
  130. if (serviceYear.contains("(赠)")){
  131. serviceYear2 = serviceYear.replace("(赠)", "");
  132. }else {
  133. serviceYear2 = serviceYear;
  134. }
  135. }
  136. return serviceYear2;
  137. }
  138. private Integer getOrderLvl(BigDecimal totalAmount) {
  139. Integer lvl=null;
  140. if (totalAmount.compareTo(new BigDecimal("3"))<0){
  141. lvl =1;
  142. }else if (totalAmount.compareTo(new BigDecimal("8"))<1){
  143. lvl =2;
  144. }else if (totalAmount.compareTo(new BigDecimal("8"))>0){
  145. lvl =3;
  146. }
  147. return lvl;
  148. }
  149. /**
  150. * 通过ID查询单条数据
  151. *
  152. * @param id 主键
  153. * @return 实例对象
  154. */
  155. @Override
  156. public TaskDetails queryById(Integer id) {
  157. return this.taskDetailsMapper.selectById(id);
  158. }
  159. /**
  160. * 新增数据
  161. *
  162. * @param taskDetails 实例对象
  163. * @return 实例对象
  164. */
  165. @Override
  166. public TaskDetails insert(TaskDetails taskDetails,Integer type) {
  167. if (type ==null)type=0;
  168. Date date = new Date();
  169. TOrderNew tOrderNew =tOrderNewMapper.selectByTid(taskDetails.getTid());
  170. taskDetails.setUid(tOrderNew.getBuyerId());
  171. taskDetails.setCreateTime(date);
  172. taskDetails.setUpdateTime(date);
  173. //数据计算
  174. countTaskDetails(taskDetails);
  175. this.taskDetailsMapper.insert(taskDetails);
  176. updateTask(taskDetails,tOrderNew.getOrderNo());
  177. //新增日志数据
  178. if (type==1){
  179. try {
  180. addTaskDetailsLog(taskDetails);
  181. } catch (InvocationTargetException | IllegalAccessException e) {
  182. throw new RuntimeException(e);
  183. }
  184. }
  185. return taskDetails;
  186. }
  187. private void updateTask(TaskDetails taskDetails, String orderNo) {
  188. List<TOrderTaskBo> tOrderTaskBos = tOrderTaskMapper.selectOrderTaskAll(orderNo, null);
  189. List<TOrderTaskBo> collect = tOrderTaskBos.stream().filter(e -> e.getSplitStatus() == 0||e.getSplitStatus() == 2).collect(Collectors.toList());
  190. //如果是会员
  191. TOrderTaskBo thisTask = new TOrderTaskBo();
  192. for (TOrderTaskBo e : collect) {
  193. if (e.getId().equals(taskDetails.getTid())){
  194. thisTask=e;
  195. break;
  196. }
  197. }
  198. String serviceYear = getServiceYer(thisTask.getServiceYear());
  199. for (TOrderTaskBo tOrderTaskBo : collect) {
  200. if (StringUtils.isNotEmpty(serviceYear)){
  201. String serviceYer2 = getServiceYer(tOrderTaskBo.getServiceYear());
  202. if (serviceYear.equals(serviceYer2)){
  203. TOrderTask updatedTask = new TOrderTask();
  204. updatedTask.setId(tOrderTaskBo.getId());
  205. updatedTask.setProgressTid(taskDetails.getId());
  206. tOrderTaskMapper.update(updatedTask);
  207. }
  208. }
  209. }
  210. }
  211. /**
  212. *新增的时候特殊数据可以是单传输,修改的时候可以多传
  213. *
  214. * @param taskDetails 项目进度数据
  215. *
  216. */
  217. private void addTaskDetailsLog(TaskDetails taskDetails) throws InvocationTargetException, IllegalAccessException {
  218. Admin adminToken = TokenManager.getAdminToken();
  219. TaskDetailsLog log=new TaskDetailsLog();
  220. BeanUtils.copyProperties( taskDetails,log);
  221. log.setTdid(taskDetails.getId());
  222. log.setId(null);
  223. assert adminToken != 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 actualSalesAmount = taskDetails.getActualSalesAmount();
  272. BigDecimal actualRdAmount = taskDetails.getActualRdAmount();
  273. BigDecimal res3 = actualRdAmount.divide(actualSalesAmount, 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, actualSalesAmount, 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. TOrderNew tOrderNew = tOrderNewMapper.selectByTid(taskDetails.getTid());
  289. List<TOrderTaskBo> tOrderTaskBos = tOrderTaskMapper.selectOrderTaskAll(tOrderNew.getOrderNo(), 4);
  290. int yearSum=1;
  291. for (TOrderTaskBo e : tOrderTaskBos) {
  292. if (e.getYearSum()>yearSum){
  293. yearSum=e.getYearSum();
  294. }
  295. }
  296. BigDecimal totalAmount = tOrderNew.getTotalAmount().divide(new BigDecimal(yearSum), 2, RoundingMode.HALF_UP);
  297. Integer lvl=getOrderLvl(totalAmount);
  298. taskDetails.setMemberLvl(lvl);
  299. }
  300. private BigDecimal getBigDecimal(BigDecimal rdSalesAmount, BigDecimal rdBudget, TaskDetails taskDetails) {
  301. BigDecimal threeYearsRdSalesAmount = rdSalesAmount;
  302. BigDecimal threeYearsRdBudget = rdBudget;
  303. threeYearsRdSalesAmount = threeYearsRdSalesAmount.add(taskDetails.getLastRdSalesAmount()).add(taskDetails.getBeforeLastRdSalesAmount());
  304. threeYearsRdBudget = threeYearsRdBudget.add(taskDetails.getLastRdBudget()).add(taskDetails.getBeforeLastRdBudget());
  305. return threeYearsRdBudget.divide(threeYearsRdSalesAmount, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
  306. }
  307. /**
  308. * 修改数据
  309. *
  310. * @param taskDetails 实例对象
  311. * @return 实例对象
  312. */
  313. @Override
  314. public TaskDetails update(TaskDetails taskDetails,Integer type) {
  315. taskDetails.setUpdateTime(new Date());
  316. countTaskDetails(taskDetails);
  317. this.taskDetailsMapper.update(taskDetails);
  318. TaskDetails res = this.queryById(taskDetails.getId());
  319. //调用就保存,不需要区分不保存
  320. // if (type !=null&&type==1){
  321. try {
  322. addTaskDetailsLog(res);
  323. } catch (InvocationTargetException | IllegalAccessException e) {
  324. throw new RuntimeException(e);
  325. }
  326. // }
  327. return res;
  328. }
  329. @Override
  330. public Object updateDownload(TaskDetails newTd) {
  331. this.taskDetailsMapper.update(newTd);
  332. return this.queryById(newTd.getId());
  333. }
  334. /**
  335. * 通过主键删除数据
  336. *
  337. * @param id 主键
  338. * @return 是否成功
  339. */
  340. @Override
  341. public boolean deleteById(Integer id) {
  342. this.taskDetailsMapper.deleteById(id);
  343. return true;
  344. }
  345. @Override
  346. public Result exportById(Integer id) {
  347. NewExcelUtil<TaskDetailsBo> excel=new NewExcelUtil<>(TaskDetailsBo.class);
  348. TaskDetailsBo byTid = pushByTid(id);
  349. pushGetServiceProject(byTid);
  350. List<TaskDetailsBo> list = new ArrayList<>();
  351. list.add(byTid);
  352. return excel.exportTaskDetailsExcel(list,"项目进度表",uploadPath);
  353. }
  354. private void pushGetServiceProject( TaskDetailsBo res) {
  355. List<Map<String, Object>> taskList = res.getTaskList();
  356. String serviceYear = null;
  357. if (taskList!=null){
  358. StringBuffer sb = new StringBuffer();
  359. for (Map<String, Object> map : taskList) {
  360. sb.append(map.get("taskName")).append("-").append(map.get("serviceYear")).append(",");
  361. if (serviceYear==null)serviceYear = (String) map.get("serviceYear");
  362. }
  363. res.setServiceYear(serviceYear);
  364. res.setServiceProject(sb.substring(0,sb.length()-1));
  365. }
  366. }
  367. @Override
  368. public boolean checkTid(TaskDetails taskDetails) {
  369. TaskDetails res = taskDetailsMapper.selectByTid(taskDetails.getTid());
  370. return res != null;
  371. }
  372. @Override
  373. public TaskFeature addFeature(InputTaskFeature in) {
  374. in.setCreateTime(new Date());
  375. if (in.getStartTimeStr()!=null)in.setStartTime(DateUtils.parseDate(in.getStartTimeStr()));
  376. if (in.getEndTimeStr()!=null)in.setEndTime(DateUtils.parseDate(in.getEndTimeStr()));
  377. taskFeatureMapper.insert(in);
  378. return in;
  379. }
  380. @Override
  381. public TaskFeature updateFeature(InputTaskFeature in) {
  382. if (in.getStartTimeStr()!=null)in.setStartTime(DateUtils.parseDate(in.getStartTimeStr()));
  383. if (in.getEndTimeStr()!=null)in.setEndTime(DateUtils.parseDate(in.getEndTimeStr()));
  384. taskFeatureMapper.update(in);
  385. return taskFeatureMapper.selectById(in.getId());
  386. }
  387. @Override
  388. public Object logList(Integer id, Integer pageNo, Integer pageSize) {
  389. Map<String,Object> param=new HashMap<String, Object>();
  390. param.put("tdid",id);
  391. if (pageNo ==null)pageNo=1;
  392. if (pageSize ==null)pageSize=10;
  393. return findPage("selectByTidList", "selectByTidCount", param, pageNo, pageSize);
  394. }
  395. @Override
  396. public Object logDetails(Integer id) {
  397. TaskDetailsLog log = taskDetailsLogMapper.selectById(id);
  398. TaskDetails taskDetails = taskDetailsMapper.selectById(log.getTdid());
  399. Integer tid = taskDetails.getTid();
  400. TaskDetailsBo res = new TaskDetailsBo();
  401. TOrderNew tOrderNew = tOrderNewMapper.selectByTid(tid);
  402. TOrderMid mid = tOrderMidMapper.selectByOrderNo(tOrderNew.getOrderNo());
  403. List<Map<String,Object >> list=new ArrayList<>();
  404. List<TOrderTaskBo> tOrderTaskBos = tOrderTaskMapper.selectOrderTaskAll(tOrderNew.getOrderNo(), 4);
  405. //如果是会员
  406. TOrderTaskBo thisTask = null;
  407. for (TOrderTaskBo e : tOrderTaskBos) {
  408. if (e.getId().equals(tid)){
  409. thisTask=e;
  410. break;
  411. }
  412. }
  413. String serviceYear = getServiceYer(thisTask.getServiceYear());
  414. list=addOrderList(tOrderTaskBos, serviceYear);
  415. if (taskDetails !=null){
  416. BeanUtils.copyProperties(log, res);
  417. }
  418. res.setUserName(mid.getBuyerName());
  419. res.setOrderNo(tOrderNew.getOrderNo());
  420. res.setContractNo(tOrderNew.getContractNo());
  421. res.setMemberStatus(mid.getProjectType());
  422. res.setTaskList(list);
  423. BigDecimal totalAmount = tOrderNew.getTotalAmount();
  424. if (res.getMemberLvl()==null){
  425. Integer lvl=getOrderLvl(totalAmount);
  426. res.setMemberLvl(lvl);
  427. }
  428. res.setTaskList(list);
  429. res.setFeatureList(taskFeatureLogMapper.selectByTdlid(id));
  430. return res;
  431. }
  432. private List<Map<String, Object>> addOrderList(List<TOrderTaskBo> tOrderTaskBos, String serviceYear) {
  433. List<Map<String, Object>> list =new ArrayList<>();
  434. for (TOrderTaskBo e : tOrderTaskBos) {
  435. String serviceYear1 = getServiceYer(e.getServiceYear());
  436. if (serviceYear1.equals(serviceYear)){
  437. Map<String,Object> map=new HashMap<>();
  438. map.put("serviceYear", e.getServiceYear());
  439. map.put("taskName", e.getCommodityName());
  440. map.put("id",e.getId());
  441. list.add(map);
  442. }
  443. }
  444. return list;
  445. }
  446. @Override
  447. public Object deleteTaskFeature(Integer id) {
  448. return taskFeatureMapper.deleteById(id);
  449. }
  450. }