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.DateUtils; import com.goafanti.common.utils.StringUtils; 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.InputTaskDetailsBo; import com.goafanti.techproject.bo.InputTaskFeature; 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.lang.reflect.InvocationTargetException; 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; @Resource private TTaskMemberMapper ttaskMemberMapper; @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(); TOrderTask tOrderTask = tOrderTaskMapper.queryById(id); TaskDetails taskDetails=taskDetailsMapper.selectById(tOrderTask.getProgressTid()); if (taskDetails !=null){ BeanUtils.copyProperties( taskDetails,res); } addOrderInformation(res); return res; } @Override public Result export(InputTaskDetailsBo in) { in.setPageNo(1); in.setPageSize(10000); Pagination page = detailsList(in); List list = (List) page.getList(); NewExcelUtil excel=new NewExcelUtil<>(TaskDetailsBo.class); return excel.exportTaskDetailsExcel(list,"项目进度表",uploadPath); } @Override public Pagination detailsList(InputTaskDetailsBo in) { in.setAid(TokenManager.getUserId()); Pagination page = findPage("selectTaskDetailsList", "selectTaskDetailsCount", in); List list = (List) page.getList(); List list2=new ArrayList<>(); for (TaskDetails e : list) { TaskDetailsBo bo=new TaskDetailsBo(); BeanUtils.copyProperties(e,bo); addOrderInformation(bo); pushGetServiceProject(bo); list2.add(bo); } page.setList(list2); return (Pagination) page; } private void addOrderInformation(TaskDetailsBo bo) { TOrderNew tOrderNew = tOrderNewMapper.selectByTid(bo.getTid()); TOrderTask tOrderTask = tOrderTaskMapper.queryById(bo.getTid()); TOrderMid mid = tOrderMidMapper.selectByOrderNo(tOrderNew.getOrderNo()); List> list; //获取项目服务年份算出平均值 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(); } } TTaskMember tTaskMember = ttaskMemberMapper.selectByTid(tOrderTask.getId()); String serviceYear = getServiceYer(tTaskMember.getServiceYear()); list=addOrderList(collect2,serviceYear); bo.setUserName(mid.getBuyerName()); bo.setOrderNo(tOrderNew.getOrderNo()); bo.setContractNo(tOrderNew.getContractNo()); bo.setServiceYear(serviceYear); bo.setMemberStatus(mid.getProjectType()); bo.setTaskList(list); if (bo.getMemberStatus()==null){ BigDecimal totalAmount = tOrderNew.getTotalAmount().divide(new BigDecimal(yearSum), 2, RoundingMode.HALF_UP); Integer lvl=getOrderLvl(totalAmount); bo.setMemberLvl(lvl); } bo.setFeatureList(taskFeatureMapper.selectByTdId(bo.getId())); } private String getServiceYer(String serviceYear) { String serviceYear2; if (StringUtils.isEmpty(serviceYear)){ serviceYear2 = ""; }else{ if (serviceYear.contains("(赠)")){ serviceYear2 = serviceYear.replace("(赠)", ""); }else { serviceYear2 = serviceYear; } } return serviceYear2; } private Integer getOrderLvl(BigDecimal totalAmount) { Integer lvl=null; if (totalAmount.compareTo(new BigDecimal("3"))<0){ lvl =1; }else if (totalAmount.compareTo(new BigDecimal("8"))<1){ lvl =2; }else if (totalAmount.compareTo(new BigDecimal("8"))>0){ lvl =3; } return lvl; } /** * 通过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); updateTask(taskDetails,tOrderNew.getOrderNo()); //新增日志数据 if (type==1){ try { addTaskDetailsLog(taskDetails); } catch (InvocationTargetException | IllegalAccessException e) { throw new RuntimeException(e); } } return taskDetails; } private void updateTask(TaskDetails taskDetails, String orderNo) { List tOrderTaskBos = tOrderTaskMapper.selectOrderTaskAll(orderNo, null); List collect = tOrderTaskBos.stream().filter(e -> e.getSplitStatus() == 0||e.getSplitStatus() == 2).collect(Collectors.toList()); //如果是会员 TOrderTaskBo thisTask = new TOrderTaskBo(); for (TOrderTaskBo e : collect) { if (e.getId().equals(taskDetails.getTid())){ thisTask=e; break; } } String serviceYear = getServiceYer(thisTask.getServiceYear()); for (TOrderTaskBo tOrderTaskBo : collect) { if (StringUtils.isNotEmpty(serviceYear)){ String serviceYer2 = getServiceYer(tOrderTaskBo.getServiceYear()); if (serviceYear.equals(serviceYer2)){ TOrderTask updatedTask = new TOrderTask(); updatedTask.setId(tOrderTaskBo.getId()); updatedTask.setProgressTid(taskDetails.getId()); tOrderTaskMapper.update(updatedTask); } } } } /** *新增的时候特殊数据可以是单传输,修改的时候可以多传 * * @param taskDetails 项目进度数据 * */ private void addTaskDetailsLog(TaskDetails taskDetails) throws InvocationTargetException, IllegalAccessException { Admin adminToken = TokenManager.getAdminToken(); TaskDetailsLog log=new TaskDetailsLog(); BeanUtils.copyProperties( taskDetails,log); log.setTdid(taskDetails.getId()); log.setId(null); assert adminToken != null; log.setAid(adminToken.getId()); log.setAname(adminToken.getName()); log.setCreateTime(new Date()); 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()); tfLog.setCreateTime(new Date()); 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 actualSalesAmount = taskDetails.getActualSalesAmount(); BigDecimal actualRdAmount = taskDetails.getActualRdAmount(); BigDecimal res3 = actualRdAmount.divide(actualSalesAmount, 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, actualSalesAmount, 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()); } //计算项目会员等级 TOrderNew tOrderNew = tOrderNewMapper.selectByTid(taskDetails.getTid()); List tOrderTaskBos = tOrderTaskMapper.selectOrderTaskAll(tOrderNew.getOrderNo(), 4); int yearSum=1; for (TOrderTaskBo e : tOrderTaskBos) { if (e.getYearSum()>yearSum){ yearSum=e.getYearSum(); } } BigDecimal totalAmount = tOrderNew.getTotalAmount().divide(new BigDecimal(yearSum), 2, RoundingMode.HALF_UP); Integer lvl=getOrderLvl(totalAmount); taskDetails.setMemberLvl(lvl); } 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,Integer type) { taskDetails.setUpdateTime(new Date()); countTaskDetails(taskDetails); this.taskDetailsMapper.update(taskDetails); TaskDetails res = this.queryById(taskDetails.getId()); //调用就保存,不需要区分不保存 // if (type !=null&&type==1){ try { addTaskDetailsLog(res); } catch (InvocationTargetException | IllegalAccessException e) { throw new RuntimeException(e); } // } return res; } @Override public Object updateDownload(TaskDetails newTd) { this.taskDetailsMapper.update(newTd); return this.queryById(newTd.getId()); } /** * 通过主键删除数据 * * @param id 主键 * @return 是否成功 */ @Override public boolean deleteById(Integer id) { this.taskDetailsMapper.deleteById(id); return true; } @Override public Result exportById(Integer id) { NewExcelUtil excel=new NewExcelUtil<>(TaskDetailsBo.class); TaskDetailsBo byTid = pushByTid(id); pushGetServiceProject(byTid); List list = new ArrayList<>(); list.add(byTid); return excel.exportTaskDetailsExcel(list,"项目进度表",uploadPath); } private void pushGetServiceProject( TaskDetailsBo res) { List> taskList = res.getTaskList(); String serviceYear = null; if (taskList!=null){ StringBuffer sb = new StringBuffer(); for (Map map : taskList) { sb.append(map.get("taskName")).append("-").append(map.get("serviceYear")).append(","); if (serviceYear==null)serviceYear = (String) map.get("serviceYear"); } res.setServiceYear(serviceYear); res.setServiceProject(sb.substring(0,sb.length()-1)); } } @Override public boolean checkTid(TaskDetails taskDetails) { TaskDetails res = taskDetailsMapper.selectByTid(taskDetails.getTid()); return res != null; } @Override public TaskFeature addFeature(InputTaskFeature in) { in.setCreateTime(new Date()); if (in.getStartTimeStr()!=null)in.setStartTime(DateUtils.parseDate(in.getStartTimeStr())); if (in.getEndTimeStr()!=null)in.setEndTime(DateUtils.parseDate(in.getEndTimeStr())); taskFeatureMapper.insert(in); return in; } @Override public TaskFeature updateFeature(InputTaskFeature in) { if (in.getStartTimeStr()!=null)in.setStartTime(DateUtils.parseDate(in.getStartTimeStr())); if (in.getEndTimeStr()!=null)in.setEndTime(DateUtils.parseDate(in.getEndTimeStr())); taskFeatureMapper.update(in); return taskFeatureMapper.selectById(in.getId()); } @Override public Object logList(Integer id, Integer pageNo, Integer pageSize) { Map param=new HashMap(); param.put("tdid",id); if (pageNo ==null)pageNo=1; if (pageSize ==null)pageSize=10; return findPage("selectByTidList", "selectByTidCount", param, pageNo, pageSize); } @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(tid)){ thisTask=e; break; } } String serviceYear = getServiceYer(thisTask.getServiceYear()); list=addOrderList(tOrderTaskBos, serviceYear); 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(); if (res.getMemberLvl()==null){ Integer lvl=getOrderLvl(totalAmount); res.setMemberLvl(lvl); } res.setTaskList(list); res.setFeatureList(taskFeatureLogMapper.selectByTdlid(id)); return res; } private List> addOrderList(List tOrderTaskBos, String serviceYear) { List> list =new ArrayList<>(); for (TOrderTaskBo e : tOrderTaskBos) { String serviceYear1 = getServiceYer(e.getServiceYear()); if (serviceYear1.equals(serviceYear)){ Map map=new HashMap<>(); map.put("serviceYear", e.getServiceYear()); map.put("taskName", e.getCommodityName()); map.put("id",e.getId()); list.add(map); } } return list; } @Override public Object deleteTaskFeature(Integer id) { return taskFeatureMapper.deleteById(id); } }