package com.goafanti.techproject.service.impl; 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.time.LocalDate; import java.util.*; /** * 项目申报详情(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 TaskAnnualReportMapper taskAnnualReportMapper; @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 getByTid(Integer id) { TaskDetailsBo res = new TaskDetailsBo(); TOrderNew tOrderNew = tOrderNewMapper.selectByTid(id); TOrderMid mid = tOrderMidMapper.selectByOrderNo(tOrderNew.getOrderNo()); List tOrderTaskBos = tOrderTaskMapper.selectOrderTaskAll(tOrderNew.getOrderNo(), 4); List> list=new ArrayList<>(); TaskDetails taskDetails=taskDetailsMapper.selectByTid(id); LocalDate now = LocalDate.now(); //如果是会员 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()); //如果没有项目进度,查询同年份的项目进度 if (taskDetails==null&&!e.getId().equals(id)&&e.getcSort()==6){ taskDetails=taskDetailsMapper.selectByTid(e.getId()); } list.add(map); } } if (taskDetails != null) { int year = now.getYear(); List taskAnnualReports = taskAnnualReportMapper.selectThreeYear(taskDetails.getTid(), year); for (TaskAnnualReport e : taskAnnualReports) { if (e.getYear()==(year-1)){ res.setLastYear(e.getYear().toString()); res.setLastSalesAmount(e.getSalesAmount()); res.setLastRdBudget(e.getResearchAmount()); }else if (e.getYear()==(year-2)){ res.setBeforeLastYear(e.getYear().toString()); res.setBeforeLastSalesAmount(e.getSalesAmount()); res.setBeforeLastRdBudget(e.getResearchAmount()); } } BeanUtils.copyProperties(taskDetails, res); } 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.setUserName(mid.getBuyerName()); res.setOrderNo(tOrderNew.getOrderNo()); res.setContractNo(tOrderNew.getContractNo()); res.setMemberStatus(mid.getProjectType()); res.setMemberLvl(lvl); res.setTaskList(list); 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) { TOrderNew tOrderNew =tOrderNewMapper.selectByTid(taskDetails.getTid()); taskDetails.setUid(tOrderNew.getBuyerId()); taskDetails.setCreateTime(new Date()); taskDetails.setUpdateTime(new Date()); //数据计算 countTaskDetails(taskDetails); this.taskDetailsMapper.insert(taskDetails); addTaskDetailsLog(taskDetails); return taskDetails; } private void addTaskDetailsLog(TaskDetails taskDetails) { TaskDetailsLog log=new TaskDetailsLog(); BeanUtils.copyProperties(taskDetails, log); log.setTdid(taskDetails.getId()); log.setId(null); Admin adminToken = TokenManager.getAdminToken(); log.setAid(adminToken.getId()); log.setAname(adminToken.getName()); taskDetailsLogMapper.insert(log); } 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()); } //计算年度研发占比 //计算三年度的研发占比 LocalDate now = LocalDate.now(); int year = now.getYear(); List taskAnnualReports = taskAnnualReportMapper.selectThreeYear(taskDetails.getTid(), year); 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 (taskAnnualReports.size()==2){ BigDecimal res2 = getBigDecimal(rdSalesAmount, rdBudget, taskAnnualReports); taskDetails.setThreeYearsRdBudgetRate(res2.doubleValue()); } } //计算实际研发占比 if(taskDetails.getActualRdNumber() !=null || taskDetails.getActualRdAmount() !=null){ BigDecimal actualRdNumber = BigDecimal.valueOf(taskDetails.getActualRdNumber()); BigDecimal actualRdAmount = taskDetails.getActualRdAmount(); BigDecimal res = actualRdNumber.divide(actualRdAmount, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)); taskDetails.setActualRdRate(res.doubleValue()); if (taskAnnualReports.size()==2){ BigDecimal res2 = getBigDecimal(actualRdAmount, actualRdNumber, taskAnnualReports); taskDetails.setThreeYearsActualRdRate(res2.doubleValue()); } } //计算立项资料占比 if (taskDetails.getProjectApprovalWriteNumber()!=null){ BigDecimal projectApprovalWriteNumber = BigDecimal.valueOf(taskDetails.getProjectApprovalWriteNumber()); BigDecimal res = projectApprovalWriteNumber.divide(new BigDecimal(taskDetails.getProjectApprovalNumber()), 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100)); taskDetails.setProjectApprovalWriteRate(res.doubleValue()); } } private BigDecimal getBigDecimal(BigDecimal rdSalesAmount, BigDecimal rdBudget, List taskAnnualReports) { BigDecimal threeYearsRdSalesAmount = rdSalesAmount; BigDecimal threeYearsRdBudget = rdBudget; for (TaskAnnualReport e : taskAnnualReports) { threeYearsRdBudget=threeYearsRdBudget.add(e.getResearchAmount()); threeYearsRdSalesAmount=threeYearsRdSalesAmount.add(e.getSalesAmount()); } 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()); this.taskDetailsMapper.update(taskDetails); countTaskDetails(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 Object export(Integer id) { OutTaskDetailsBo res = new OutTaskDetailsBo(); NewExcelUtil excel=new NewExcelUtil<>(OutTaskDetailsBo.class); TaskDetailsBo byTid = getByTid(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; } }