package com.goafanti.techproject.service.impl; import com.goafanti.common.bo.Result; import com.goafanti.common.dao.*; import com.goafanti.common.model.*; import com.goafanti.common.utils.excel.NewExcelUtil; import com.goafanti.core.mybatis.BaseMybatisDao; import com.goafanti.core.mybatis.page.Pagination; import com.goafanti.core.shiro.token.TokenManager; import com.goafanti.order.bo.TOrderTaskBo; import com.goafanti.techproject.bo.OutTaskDetailsBo; import com.goafanti.techproject.bo.TaskDetailsBo; import com.goafanti.techproject.service.TaskDetailsService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; /** * 项目申报详情(TaskDetails)表服务实现类 * * @author makejava * @since 2024-12-26 17:11:50 */ @Service("taskDetailsService") public class TaskDetailsServiceImpl extends BaseMybatisDao implements TaskDetailsService { @Resource private TaskDetailsMapper taskDetailsMapper; @Resource private TaskDetailsLogMapper taskDetailsLogMapper; @Resource private TOrderNewMapper tOrderNewMapper; @Resource private TOrderMidMapper tOrderMidMapper; @Resource private TOrderTaskMapper tOrderTaskMapper; @Resource private TaskFeatureMapper taskFeatureMapper; @Resource private TaskFeatureLogMapper taskFeatureLogMapper; @Value(value = "${upload.path}") private final String uploadPath = null; @Override public Pagination list(TaskDetails taskDetails, Integer pageNo, Integer pageSize) { Map params = new HashMap<>(); params.put("in", taskDetails); return (Pagination) findPage("findTaskDetailsList", "findTaskDetailsCount", params, pageNo, pageSize); } @Override public TaskDetailsBo pushByTid(Integer id) { TaskDetailsBo res = new TaskDetailsBo(); TOrderNew tOrderNew = tOrderNewMapper.selectByTid(id); TOrderTask tOrderTask = tOrderTaskMapper.queryById(id); TOrderMid mid = tOrderMidMapper.selectByOrderNo(tOrderNew.getOrderNo()); List> list=new ArrayList<>(); TaskDetails taskDetails=null; //获取项目服务年份算出平均值 List tOrderTaskBos = tOrderTaskMapper.selectOrderTaskAll(tOrderNew.getOrderNo(), null); List collect = tOrderTaskBos.stream().filter(e -> e.getSplitStatus() == 1).collect(Collectors.toList()); List collect2 = tOrderTaskBos.stream().filter(e -> e.getSplitStatus() == 0||e.getSplitStatus() == 2).collect(Collectors.toList()); int yearSum=1; for (TOrderTaskBo e : collect) { if (e.getYearSum()>yearSum){ yearSum=e.getYearSum(); } } if (tOrderTask.getProgressTid()==null){ taskDetails=taskDetailsMapper.selectByTid(id); //首先直接查找,找不到的情况下找订单 //如果是会员 TOrderTaskBo thisTask = null; for (TOrderTaskBo e : collect2) { if (e.getId().equals(id)){ thisTask=e; break; } } String serviceYear = thisTask.getServiceYear(); if (serviceYear.contains("(赠)")){ serviceYear=serviceYear.replace("(赠)", ""); } Integer tid=null; for (TOrderTaskBo e : collect2) { e.getServiceLife(); if (e.getServiceYear().equals(serviceYear)){ Map map=new HashMap<>(); map.put("serviceYear", e.getServiceYear()); map.put("taskName", e.getCommodityName()); map.put("id",e.getId()); //如果没有项目进度,查询同年份的项目进度 if (taskDetails==null&&!e.getId().equals(id)&&e.getcSort()==6){ taskDetails=taskDetailsMapper.selectByTid(e.getId()); tid=e.getId(); } list.add(map); } } if (taskDetails !=null){ BeanUtils.copyProperties(taskDetails, res); } res.setUserName(mid.getBuyerName()); res.setOrderNo(tOrderNew.getOrderNo()); res.setContractNo(tOrderNew.getContractNo()); res.setMemberStatus(mid.getProjectType()); res.setTaskList(list); BigDecimal totalAmount = tOrderNew.getTotalAmount().divide(new BigDecimal(yearSum), 2, RoundingMode.HALF_UP); String lvl=null; if (totalAmount.compareTo(new BigDecimal("3"))<0){ lvl="A"; }else if (totalAmount.compareTo(new BigDecimal("8"))<1){ lvl="AA"; }else if (totalAmount.compareTo(new BigDecimal("8"))>0){ lvl="AAA"; } res.setMemberLvl(lvl); res.setTaskList(list); res.setFeatureList(taskFeatureMapper.selectByTdId(id)); if (tid==null){ tid=taskDetails.getTid(); TOrderTask update =new TOrderTask(); update.setId(id); update.setProgressTid(tid); tOrderTaskMapper.update(update); } }else { taskDetails=taskDetailsMapper.selectByTid(tOrderTask.getProgressTid()); //如果是会员 TOrderTaskBo thisTask = null; for (TOrderTaskBo e : collect2) { if (e.getId().equals(id)){ thisTask=e; break; } } String serviceYear = thisTask.getServiceYear(); if (serviceYear.contains("(赠)")){ serviceYear=serviceYear.replace("(赠)", ""); } Integer tid=null; for (TOrderTaskBo e : collect2) { if (e.getServiceYear().equals(serviceYear)){ Map map=new HashMap<>(); map.put("serviceYear", e.getServiceYear()); map.put("taskName", e.getCommodityName()); map.put("id",e.getId()); list.add(map); } } if (taskDetails !=null){ BeanUtils.copyProperties(taskDetails, res); } res.setUserName(mid.getBuyerName()); res.setOrderNo(tOrderNew.getOrderNo()); res.setContractNo(tOrderNew.getContractNo()); res.setMemberStatus(mid.getProjectType()); res.setTaskList(list); BigDecimal totalAmount = tOrderNew.getTotalAmount().divide(new BigDecimal(yearSum), 2, RoundingMode.HALF_UP); String lvl=null; if (totalAmount.compareTo(new BigDecimal("3"))<0){ lvl="A"; }else if (totalAmount.compareTo(new BigDecimal("8"))<1){ lvl="AA"; }else if (totalAmount.compareTo(new BigDecimal("8"))>0){ lvl="AAA"; } res.setMemberLvl(lvl); res.setTaskList(list); res.setFeatureList(taskFeatureMapper.selectByTdId(id)); } return res; } /** * 通过ID查询单条数据 * * @param id 主键 * @return 实例对象 */ @Override public TaskDetails queryById(Integer id) { return this.taskDetailsMapper.selectById(id); } /** * 新增数据 * * @param taskDetails 实例对象 * @return 实例对象 */ @Override public TaskDetails insert(TaskDetails taskDetails,Integer type) { if (type ==null)type=0; Date date = new Date(); TOrderNew tOrderNew =tOrderNewMapper.selectByTid(taskDetails.getTid()); taskDetails.setUid(tOrderNew.getBuyerId()); taskDetails.setCreateTime(date); taskDetails.setUpdateTime(date); //数据计算 countTaskDetails(taskDetails); this.taskDetailsMapper.insert(taskDetails); //新增日志数据 if (type==1){ addTaskDetailsLog(taskDetails); } return taskDetails; } /** *新增的时候特殊数据可以是单传输,修改的时候可以多传 * * @param taskDetails 项目进度数据 * */ private void addTaskDetailsLog(TaskDetails taskDetails) { Admin adminToken = TokenManager.getAdminToken(); TaskDetailsLog log=new TaskDetailsLog(); BeanUtils.copyProperties(taskDetails, log); log.setTdid(taskDetails.getId()); log.setId(null); log.setAid(adminToken.getId()); log.setAname(adminToken.getName()); taskDetailsLogMapper.insert(log); List list = taskFeatureMapper.selectByTdId(taskDetails.getId()); for (TaskFeature feature : list) { TaskFeatureLog tfLog = new TaskFeatureLog(); BeanUtils.copyProperties(feature, tfLog); tfLog.setTdlId(log.getId()); tfLog.setId(null); tfLog.setAid(adminToken.getId()); tfLog.setAname(adminToken.getName()); taskFeatureLogMapper.insert(tfLog); } } private void countTaskDetails(TaskDetails taskDetails) { //计算人员占比 if (taskDetails.getWorkersNumber()!=null|| taskDetails.getTechnologyNumber()!=null){ BigDecimal wn = BigDecimal.valueOf(taskDetails.getWorkersNumber()); BigDecimal tn = BigDecimal.valueOf(taskDetails.getTechnologyNumber()); BigDecimal res = tn.divide(wn,4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)); taskDetails.setWorkersRate(res.doubleValue()); } //计算研发预算完成进度 已归集研发费用总额÷年度研发预算总额X100% if (taskDetails.getActualRdAmount()!=null &&taskDetails.getRdBudget()!=null){ BigDecimal multiply = taskDetails.getActualRdAmount().divide(taskDetails.getRdBudget(), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)); taskDetails.setRdCompletionProgress(multiply.doubleValue()); } //计算年度研发占比 //计算三年度的研发占比 if (taskDetails.getRdBudget() != null && taskDetails.getRdSalesAmount() != null){ BigDecimal rdBudget = taskDetails.getRdBudget(); BigDecimal rdSalesAmount = taskDetails.getRdSalesAmount(); BigDecimal res = rdBudget.divide(rdSalesAmount, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)); taskDetails.setRdBudgetRate(res.doubleValue()); //计算三年度的研发占比 if (taskDetails.getLastRdSalesAmount()!=null && taskDetails.getLastRdBudget()!=null&& taskDetails.getBeforeLastRdSalesAmount()!=null && taskDetails.getBeforeLastRdBudget()!=null){ BigDecimal res2 = getBigDecimal(rdSalesAmount, rdBudget, taskDetails); taskDetails.setThreeYearsRdBudgetRate(res2.doubleValue()); } } //计算实际研发占比 if(taskDetails.getActualRdNumber() !=null && taskDetails.getActualRdAmount() !=null){ BigDecimal actualRdNumber = BigDecimal.valueOf(taskDetails.getActualRdNumber()); BigDecimal actualRdAmount = taskDetails.getActualRdAmount(); BigDecimal res3 = actualRdNumber.divide(actualRdAmount, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)); taskDetails.setActualRdRate(res3.doubleValue()); if (taskDetails.getLastRdSalesAmount()!=null && taskDetails.getLastRdBudget()!=null&& taskDetails.getBeforeLastRdSalesAmount()!=null && taskDetails.getBeforeLastRdBudget()!=null){ BigDecimal res4 = getBigDecimal(actualRdAmount, actualRdNumber, taskDetails); taskDetails.setThreeYearsActualRdRate(res4.doubleValue()); } } //计算立项资料占比 if (taskDetails.getProjectApprovalWriteNumber()!=null){ BigDecimal projectApprovalWriteNumber = BigDecimal.valueOf(taskDetails.getProjectApprovalWriteNumber()); BigDecimal res5 = projectApprovalWriteNumber.divide(new BigDecimal(taskDetails.getProjectApprovalNumber()), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)); taskDetails.setProjectApprovalWriteRate(res5.doubleValue()); } } private BigDecimal getBigDecimal(BigDecimal rdSalesAmount, BigDecimal rdBudget, TaskDetails taskDetails) { BigDecimal threeYearsRdSalesAmount = rdSalesAmount; BigDecimal threeYearsRdBudget = rdBudget; threeYearsRdSalesAmount = threeYearsRdSalesAmount.add(taskDetails.getLastRdSalesAmount()).add(taskDetails.getBeforeLastRdSalesAmount()); threeYearsRdBudget = threeYearsRdBudget.add(taskDetails.getLastRdBudget()).add(taskDetails.getBeforeLastRdBudget()); return threeYearsRdBudget.divide(threeYearsRdSalesAmount, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)); } /** * 修改数据 * * @param taskDetails 实例对象 * @return 实例对象 */ @Override public TaskDetails update(TaskDetails taskDetails) { taskDetails.setUpdateTime(new Date()); countTaskDetails(taskDetails); this.taskDetailsMapper.update(taskDetails); TaskDetails res = this.queryById(taskDetails.getId()); addTaskDetailsLog(res); return res; } /** * 通过主键删除数据 * * @param id 主键 * @return 是否成功 */ @Override public boolean deleteById(Integer id) { this.taskDetailsMapper.deleteById(id); return true; } @Override public Result export(Integer id) { OutTaskDetailsBo res = new OutTaskDetailsBo(); NewExcelUtil excel=new NewExcelUtil<>(OutTaskDetailsBo.class); TaskDetailsBo byTid = pushByTid(id); BeanUtils.copyProperties(byTid,res); StringBuffer sb = new StringBuffer(); byTid.getTaskList().forEach(e->{ if (res.getServiceyear()==null){ res.setServiceyear((String) e.get("serviceYear")); } sb.append(e.get("taskName")).append("; "); }); res.setServiceProject(sb.toString()); return excel.exportTaskDetailsExcel(res,"项目进度表",uploadPath); } @Override public boolean checkTid(TaskDetails taskDetails) { TaskDetails res = taskDetailsMapper.selectByTid(taskDetails.getTid()); return res != null; } @Override public TaskFeature addFeature(TaskFeature in) { in.setCreateTime(new Date()); taskFeatureMapper.insert(in); return in; } @Override public TaskFeature updateFeature(TaskFeature in) { taskFeatureMapper.update(in); return taskFeatureMapper.selectById(in.getId()); } @Override public Object logList(Integer id) { return taskDetailsLogMapper.selectByTid(id); } @Override public Object logDetails(Integer id) { TaskDetailsLog log = taskDetailsLogMapper.selectById(id); TaskDetails taskDetails = taskDetailsMapper.selectById(log.getTdid()); Integer tid = taskDetails.getTid(); TaskDetailsBo res = new TaskDetailsBo(); TOrderNew tOrderNew = tOrderNewMapper.selectByTid(tid); TOrderMid mid = tOrderMidMapper.selectByOrderNo(tOrderNew.getOrderNo()); List> list=new ArrayList<>(); List tOrderTaskBos = tOrderTaskMapper.selectOrderTaskAll(tOrderNew.getOrderNo(), 4); //如果是会员 TOrderTaskBo thisTask = null; for (TOrderTaskBo e : tOrderTaskBos) { if (e.getId().equals(id)){ thisTask=e; break; } } String serviceYear = thisTask.getServiceYear(); if (serviceYear.contains("(赠)")){ serviceYear=serviceYear.replace("(赠)", ""); } for (TOrderTaskBo e : tOrderTaskBos) { if (e.getServiceYear().equals(serviceYear)){ Map map=new HashMap<>(); map.put("serviceYear", e.getServiceYear()); map.put("taskName", e.getCommodityName()); map.put("id",e.getId()); list.add(map); } } if (taskDetails !=null){ BeanUtils.copyProperties(log, res); } res.setUserName(mid.getBuyerName()); res.setOrderNo(tOrderNew.getOrderNo()); res.setContractNo(tOrderNew.getContractNo()); res.setMemberStatus(mid.getProjectType()); res.setTaskList(list); BigDecimal totalAmount = tOrderNew.getTotalAmount(); String lvl=null; if (totalAmount.compareTo(new BigDecimal("3"))<0){ lvl="A"; }else if (totalAmount.compareTo(new BigDecimal("8"))<1){ lvl="AA"; }else if (totalAmount.compareTo(new BigDecimal("8"))>0){ lvl="AAA"; } res.setMemberLvl(lvl); res.setTaskList(list); res.setFeatureList(taskFeatureMapper.selectByTdId(id)); return res; } @Override public Object deleteTaskFeature(Integer id) { return taskFeatureMapper.deleteById(id); } }