Browse Source

签单客户丢失BUG修复

anderx 1 year ago
parent
commit
b1f3adb209

+ 0 - 88
src/main/java/com/goafanti/common/dao/TaskAnnualReportMapper.java

@@ -1,88 +0,0 @@
-package com.goafanti.common.dao;
-
-import com.goafanti.common.model.TaskAnnualReport;
-import org.apache.ibatis.annotations.Param;
-import org.springframework.data.domain.Pageable;
-
-import java.util.List;
-
-/**
- * 项目年报(TaskAnnualReport)表数据库访问层
- *
- * @author makejava
- * @since 2024-12-26 13:45:50
- */
-public interface TaskAnnualReportMapper {
-
-    /**
-     * 通过ID查询单条数据
-     *
-     * @param id 主键
-     * @return 实例对象
-     */
-    TaskAnnualReport queryById(Integer id);
-
-
-    /**
-     * 查询指定行数据
-     *
-     * @param taskAnnualReport 查询条件
-     * @param pageable         分页对象
-     * @return 对象列表
-     */
-    List<TaskAnnualReport> findTaskAnnualReportList(TaskAnnualReport taskAnnualReport, @Param("pageable") Pageable pageable);
-
-    /**
-     * 统计总行数
-     *
-     * @param taskAnnualReport 查询条件
-     * @return 总行数
-     */
-    int findTaskAnnualReportCount(TaskAnnualReport taskAnnualReport);
-
-    /**
-     * 新增数据
-     *
-     * @param taskAnnualReport 实例对象
-     * @return 影响行数
-     */
-    int insert(TaskAnnualReport taskAnnualReport);
-
-    /**
-     * 批量新增数据(MyBatis原生foreach方法)
-     *
-     * @param entities List<TaskAnnualReport> 实例对象列表
-     * @return 影响行数
-     */
-    int insertBatch(@Param("entities") List<TaskAnnualReport> entities);
-
-    /**
-     * 批量新增或按主键更新数据(MyBatis原生foreach方法)
-     *
-     * @param entities List<TaskAnnualReport> 实例对象列表
-     * @return 影响行数
-     * @throws org.springframework.jdbc.BadSqlGrammarException 入参是空List的时候会抛SQL语句错误的异常,请自行校验入参
-     */
-    int insertOrUpdateBatch(@Param("entities") List<TaskAnnualReport> entities);
-
-    /**
-     * 修改数据
-     *
-     * @param taskAnnualReport 实例对象
-     * @return 影响行数
-     */
-    int update(TaskAnnualReport taskAnnualReport);
-
-    /**
-     * 通过主键删除数据
-     *
-     * @param id 主键
-     * @return 影响行数
-     */
-    int deleteById(Integer id);
-
-    TaskAnnualReport selectByTidAndYear(@Param("tid") Integer tid, @Param("year") Integer year);
-
-    List<TaskAnnualReport> selectThreeYear(@Param("tid") Integer tid, @Param("year") Integer year);
-}
-

+ 0 - 184
src/main/java/com/goafanti/common/mapper/TaskAnnualReportMapper.xml

@@ -1,184 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.goafanti.common.dao.TaskAnnualReportMapper">
-
-    <resultMap type="com.goafanti.common.model.TaskAnnualReport" id="TaskAnnualReportMap">
-        <result property="id" column="id" jdbcType="INTEGER"/>
-        <result property="uid" column="uid" jdbcType="VARCHAR"/>
-        <result property="tid" column="tid" jdbcType="INTEGER"/>
-        <result property="year" column="year" jdbcType="INTEGER"/>
-        <result property="salesAmount" column="sales_amount" jdbcType="VARCHAR"/>
-        <result property="researchAmount" column="research_amount" jdbcType="VARCHAR"/>
-        <result property="aid" column="aid" jdbcType="VARCHAR"/>
-        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
-    </resultMap>
-
-    <sql id="TaskAnnualReportAllSql">
-        id, uid, tid, year, sales_amount, research_amount, aid, create_time
-    </sql>
-
-    <!--查询单个-->
-    <select id="queryById" resultMap="TaskAnnualReportMap">
-        select
-        <include refid="TaskAnnualReportAllSql"/>
-        from task_annual_report
-        where id = #{id}
-    </select>
-
-    <!--查询指定行数据-->
-    <select id="findTaskAnnualReportList" resultMap="TaskAnnualReportMap">
-        select
-        <include refid="TaskAnnualReportAllSql"/>
-
-        from task_annual_report
-        <where>
-            <if test="id != null">
-                and id = #{id}
-            </if>
-            <if test="uid != null and uid != ''">
-                and uid = #{uid}
-            </if>
-            <if test="tid != null">
-                and tid = #{tid}
-            </if>
-            <if test="year != null">
-                and year = #{year}
-            </if>
-            <if test="salesAmount != null">
-                and sales_amount = #{salesAmount}
-            </if>
-            <if test="researchAmount != null">
-                and research_amount = #{researchAmount}
-            </if>
-            <if test="aid != null and aid != ''">
-                and aid = #{aid}
-            </if>
-            <if test="createTime != null">
-                and create_time = #{createTime}
-            </if>
-        </where>
-        <if test="page_sql != null">
-            ${page_sql}
-        </if>
-    </select>
-
-    <!--统计总行数-->
-    <select id="findTaskAnnualReportCount" resultType="java.lang.Integer">
-        select count(1)
-        from task_annual_report
-        <where>
-            <if test="id != null">
-                and id = #{id}
-            </if>
-            <if test="uid != null and uid != ''">
-                and uid = #{uid}
-            </if>
-            <if test="tid != null">
-                and tid = #{tid}
-            </if>
-            <if test="year != null">
-                and year = #{year}
-            </if>
-            <if test="salesAmount != null">
-                and sales_amount = #{salesAmount}
-            </if>
-            <if test="researchAmount != null">
-                and research_amount = #{researchAmount}
-            </if>
-            <if test="aid != null and aid != ''">
-                and aid = #{aid}
-            </if>
-            <if test="createTime != null">
-                and create_time = #{createTime}
-            </if>
-        </where>
-    </select>
-
-
-    <!--新增所有列-->
-    <insert id="insert" keyProperty="id" useGeneratedKeys="true">
-        insert into task_annual_report(uid, tid, year, sales_amount, research_amount, aid, create_time)
-        values (#{uid}, #{tid}, #{year}, #{salesAmount}, #{researchAmount}, #{aid}, #{createTime})
-    </insert>
-
-    <insert id="insertBatch">
-        insert into task_annual_report(uid, tid, year, sales_amount, research_amount, aid, create_time)
-        values
-        <foreach collection="entities" item="entity" separator=",">
-            (#{entity.uid}, #{entity.tid}, #{entity.year}, #{entity.salesAmount}, #{entity.researchAmount},
-            #{entity.aid}, #{entity.createTime})
-        </foreach>
-    </insert>
-
-    <insert id="insertOrUpdateBatch" keyProperty="id" useGeneratedKeys="true">
-        insert into task_annual_report(uid, tid, year, sales_amount, research_amount, aid, create_time)
-        values
-        <foreach collection="entities" item="entity" separator=",">
-            (#{entity.uid}, #{entity.tid}, #{entity.year}, #{entity.salesAmount}, #{entity.researchAmount},
-            #{entity.aid}, #{entity.createTime})
-        </foreach>
-        on duplicate key update
-        uid = values(uid),
-        tid = values(tid),
-        year = values(year),
-        sales_amount = values(sales_amount),
-        research_amount = values(research_amount),
-        aid = values(aid),
-        create_time = values(create_time)
-    </insert>
-
-    <!--通过主键修改数据-->
-    <update id="update">
-        update task_annual_report
-        <set>
-            <if test="uid != null and uid != ''">
-                uid = #{uid},
-            </if>
-            <if test="tid != null">
-                tid = #{tid},
-            </if>
-            <if test="year != null">
-                year = #{year},
-            </if>
-            <if test="salesAmount != null">
-                sales_amount = #{salesAmount},
-            </if>
-            <if test="researchAmount != null">
-                research_amount = #{researchAmount},
-            </if>
-            <if test="aid != null and aid != ''">
-                aid = #{aid},
-            </if>
-            <if test="createTime != null">
-                create_time = #{createTime},
-            </if>
-        </set>
-        where id = #{id}
-    </update>
-
-    <!--通过主键删除-->
-    <delete id="deleteById">
-        delete
-        from task_annual_report
-        where id = #{id}
-    </delete>
-
-    <select id="selectByTidAndYear" resultMap="TaskAnnualReportMap">
-        select
-        <include refid="TaskAnnualReportAllSql"/>
-        from task_annual_report
-        where tid = #{tid} and year = #{year}
-    </select>
-
-    <select id="selectThreeYear" resultMap="TaskAnnualReportMap">
-        select
-        <include refid="TaskAnnualReportAllSql"/>
-        from task_annual_report
-        where tid = #{tid}
-        <if test="year !=null">
-            and year in (#{year}-1,#{year}-2)
-        </if>
-    </select>
-
-</mapper>
-

+ 0 - 88
src/main/java/com/goafanti/techproject/controller/TaskAnnualReportController.java

@@ -1,88 +0,0 @@
-package com.goafanti.techproject.controller;
-
-import com.goafanti.common.bo.Result;
-import com.goafanti.common.controller.BaseController;
-import com.goafanti.common.model.TaskAnnualReport;
-import com.goafanti.techproject.service.TaskAnnualReportService;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.annotation.Resource;
-
-/**
- * 项目年报(TaskAnnualReport)表控制层
- *
- * @author makejava
- * @since 2024-12-26 10:55:04
- */
-@RestController
-@RequestMapping("/api/admin/taskAnnualReport")
-public class TaskAnnualReportController extends BaseController {
-    /**
-     * 服务对象
-     */
-    @Resource
-    private TaskAnnualReportService taskAnnualReportService;
-
-
-    /**
-     * 新增数据
-     *
-     * @param taskAnnualReport 实体
-     * @return 新增结果
-     */
-    @PostMapping("/add")
-    public Result add(TaskAnnualReport taskAnnualReport) {
-        return new Result<>().data(this.taskAnnualReportService.insert(taskAnnualReport));
-    }
-
-
-    /**
-     * 通过主键查询单条数据
-     *
-     * @param id 主键
-     * @return 单条数据
-     */
-    @GetMapping("/get")
-    public Result<TaskAnnualReport> queryById(Integer id) {
-        return new Result<>().data(this.taskAnnualReportService.queryById(id));
-    }
-
-
-    /**
-     * 编辑数据
-     *
-     * @param taskAnnualReport 实体
-     * @return 编辑结果
-     */
-    @PostMapping("/update")
-    public Result edit(TaskAnnualReport taskAnnualReport) {
-        return new Result<>().data(this.taskAnnualReportService.update(taskAnnualReport));
-    }
-
-    /**
-     * 删除数据
-     *
-     * @param id 主键
-     * @return 删除是否成功
-     */
-    @GetMapping("/delete")
-    public Result deleteById(Integer id) {
-        return new Result<>().data(this.taskAnnualReportService.deleteById(id));
-    }
-
-    /**
-     * 列表查询
-     *
-     * @param in 参数
-     * @return
-     */
-    @GetMapping("/list")
-    public Result<TaskAnnualReport> list(TaskAnnualReport in, Integer pageNo, Integer pageSize) {
-        return new Result<>().data(this.taskAnnualReportService.list(in, pageNo, pageSize));
-    }
-
-}
-

+ 5 - 4
src/main/java/com/goafanti/techproject/controller/TaskDetailsController.java

@@ -4,6 +4,7 @@ import com.goafanti.common.bo.Result;
 import com.goafanti.common.constant.ErrorConstants;
 import com.goafanti.common.controller.BaseController;
 import com.goafanti.common.model.TaskDetails;
+import com.goafanti.common.model.TaskFeature;
 import com.goafanti.techproject.service.TaskDetailsService;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -35,13 +36,13 @@ public class TaskDetailsController extends BaseController {
      * @return 新增结果
      */
     @PostMapping("/add")
-    public Result<TaskDetails> add(TaskDetails taskDetails) {
+    public Result<TaskDetails> add(TaskDetails taskDetails, TaskFeature taskFeature) {
         Result<TaskDetails> res = new Result<>();
         if (taskDetailsService.checkTid(taskDetails)){
             res.getError().add(buildError("项目进度与年份", ErrorConstants.PARAM_BEING_ERROR));
             return res;
         }
-        return res.data(this.taskDetailsService.insert(taskDetails));
+        return res.data(this.taskDetailsService.insert(taskDetails,taskFeature));
     }
 
 
@@ -75,8 +76,8 @@ public class TaskDetailsController extends BaseController {
      * @return 编辑结果
      */
     @PostMapping("/update")
-    public Result edit(TaskDetails taskDetails) {
-        return new Result<>().data(this.taskDetailsService.update(taskDetails));
+    public Result edit(TaskDetails taskDetails, TaskFeature taskFeature) {
+        return new Result<>().data(this.taskDetailsService.update(taskDetails,  taskFeature));
     }
 
     /**

+ 8 - 2
src/main/java/com/goafanti/techproject/service/TaskDetailsService.java

@@ -2,6 +2,7 @@ package com.goafanti.techproject.service;
 
 import com.goafanti.common.bo.Result;
 import com.goafanti.common.model.TaskDetails;
+import com.goafanti.common.model.TaskFeature;
 import com.goafanti.techproject.bo.TaskDetailsBo;
 
 /**
@@ -27,15 +28,16 @@ public interface TaskDetailsService {
      * @param taskDetails 实例对象
      * @return 实例对象
      */
-    TaskDetails insert(TaskDetails taskDetails);
+    TaskDetails insert(TaskDetails taskDetails,TaskFeature taskFeature);
 
     /**
      * 修改数据
      *
      * @param taskDetails 实例对象
+     * @param taskFeature
      * @return 实例对象
      */
-    TaskDetails update(TaskDetails taskDetails);
+    TaskDetails update(TaskDetails taskDetails, TaskFeature taskFeature);
 
     /**
      * 通过主键删除数据
@@ -58,4 +60,8 @@ public interface TaskDetailsService {
     Result export(Integer id);
 
     boolean checkTid(TaskDetails taskDetails);
+
+    TaskFeature addFeature(TaskFeature in);
+
+    TaskFeature updateFeature(TaskFeature in);
 }

+ 0 - 96
src/main/java/com/goafanti/techproject/service/impl/TaskAnnualReportServiceImpl.java

@@ -1,96 +0,0 @@
-package com.goafanti.techproject.service.impl;
-
-import com.goafanti.common.dao.TOrderNewMapper;
-import com.goafanti.common.dao.TaskAnnualReportMapper;
-import com.goafanti.common.model.TOrderNew;
-import com.goafanti.common.model.TaskAnnualReport;
-import com.goafanti.core.mybatis.BaseMybatisDao;
-import com.goafanti.core.mybatis.page.Pagination;
-import com.goafanti.core.shiro.token.TokenManager;
-import com.goafanti.techproject.service.TaskAnnualReportService;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * 项目年报(TaskAnnualReport)表服务实现类
- *
- * @author makejava
- * @since 2024-12-26 10:55:04
- */
-@Service("taskAnnualReportService")
-public class TaskAnnualReportServiceImpl extends BaseMybatisDao<TaskAnnualReportMapper> implements TaskAnnualReportService {
-    @Resource
-    private TaskAnnualReportMapper taskAnnualReportMapper;
-    @Resource
-    private TOrderNewMapper tOrderNewMapper;
-
-
-    @Override
-    public Pagination<TaskAnnualReport> list(TaskAnnualReport taskAnnualReport, Integer pageNo, Integer pageSize) {
-        Map<String, Object> params = new HashMap<>();
-        params.put("in", taskAnnualReport);
-        return (Pagination<TaskAnnualReport>) findPage("findTaskAnnualReportList",
-                "findTaskAnnualReportCount", params, pageNo, pageSize);
-    }
-
-    /**
-     * 通过ID查询单条数据
-     *
-     * @param id 主键
-     * @return 实例对象
-     */
-    @Override
-    public TaskAnnualReport queryById(Integer id) {
-        return this.taskAnnualReportMapper.queryById(id);
-    }
-
-
-    /**
-     * 新增数据
-     *
-     * @param taskAnnualReport 实例对象
-     * @return 实例对象
-     */
-    @Override
-    public TaskAnnualReport insert(TaskAnnualReport taskAnnualReport) {
-        TOrderNew tOrderNew =tOrderNewMapper.selectByTid(taskAnnualReport.getTid());
-        taskAnnualReport.setAid(TokenManager.getAdminId());
-        taskAnnualReport.setUid(tOrderNew.getBuyerId());
-        taskAnnualReport.setCreateTime(new Date());
-        TaskAnnualReport use = taskAnnualReportMapper.selectByTidAndYear(taskAnnualReport.getTid(), taskAnnualReport.getYear());
-        if (use !=null){
-            taskAnnualReport.setId(use.getId());
-            return update(taskAnnualReport);
-        }else {
-            this.taskAnnualReportMapper.insert(taskAnnualReport);
-            return taskAnnualReport;
-        }
-    }
-
-    /**
-     * 修改数据
-     *
-     * @param taskAnnualReport 实例对象
-     * @return 实例对象
-     */
-    @Override
-    public TaskAnnualReport update(TaskAnnualReport taskAnnualReport) {
-        this.taskAnnualReportMapper.update(taskAnnualReport);
-        return this.queryById(taskAnnualReport.getId());
-    }
-
-    /**
-     * 通过主键删除数据
-     *
-     * @param id 主键
-     * @return 是否成功
-     */
-    @Override
-    public boolean deleteById(Integer id) {
-        return this.taskAnnualReportMapper.deleteById(id) > 0;
-    }
-}

+ 46 - 31
src/main/java/com/goafanti/techproject/service/impl/TaskDetailsServiceImpl.java

@@ -42,7 +42,10 @@ public class TaskDetailsServiceImpl extends BaseMybatisDao<TaskDetailsMapper> im
     @Resource
     private TOrderTaskMapper tOrderTaskMapper;
     @Resource
-    private TaskAnnualReportMapper taskAnnualReportMapper;
+    private TaskFeatureMapper taskFeatureMapper;
+    @Resource
+    private TaskFeatureLogMapper taskFeatureLogMapper;
+
 
 
     @Value(value = "${upload.path}")
@@ -133,7 +136,7 @@ public class TaskDetailsServiceImpl extends BaseMybatisDao<TaskDetailsMapper> im
      * @return 实例对象
      */
     @Override
-    public TaskDetails insert(TaskDetails taskDetails) {
+    public TaskDetails insert(TaskDetails taskDetails,TaskFeature taskFeature) {
         TOrderNew tOrderNew =tOrderNewMapper.selectByTid(taskDetails.getTid());
         taskDetails.setUid(tOrderNew.getBuyerId());
         taskDetails.setCreateTime(new Date());
@@ -141,19 +144,28 @@ public class TaskDetailsServiceImpl extends BaseMybatisDao<TaskDetailsMapper> im
         //数据计算
         countTaskDetails(taskDetails);
         this.taskDetailsMapper.insert(taskDetails);
-        addTaskDetailsLog(taskDetails);
+        taskFeature.setId(taskDetails.getId());
+        this.taskFeatureMapper.insert(taskFeature);
+        addTaskDetailsLog(taskDetails,taskFeature);
         return taskDetails;
     }
 
-    private void addTaskDetailsLog(TaskDetails taskDetails) {
+    private void addTaskDetailsLog(TaskDetails taskDetails,TaskFeature taskFeature) {
+        Admin adminToken = TokenManager.getAdminToken();
         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);
+        TaskFeatureLog tfLog = new TaskFeatureLog();
+        BeanUtils.copyProperties(taskFeature, tfLog);
+        tfLog.setTdlId(log.getId());
+        tfLog.setId(null);
+        tfLog.setAid(adminToken.getId());
+        tfLog.setAname(adminToken.getName());
+        taskFeatureLogMapper.insert(tfLog);
     }
 
     private void countTaskDetails(TaskDetails taskDetails) {
@@ -167,48 +179,37 @@ public class TaskDetailsServiceImpl extends BaseMybatisDao<TaskDetailsMapper> im
         }
         //计算年度研发占比
         //计算三年度的研发占比
-        List<TaskAnnualReport> taskAnnualReports = taskAnnualReportMapper.selectThreeYear(taskDetails.getTid(), null);
-        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());
-            }
-
-
-        }
+            BigDecimal res2 = getBigDecimal(rdSalesAmount, rdBudget, taskDetails);
+            taskDetails.setThreeYearsRdBudgetRate(res2.doubleValue());
         //计算实际研发占比
-        if(taskDetails.getActualRdNumber() !=null ||
+        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());
-            }
+            BigDecimal res3 = actualRdNumber.divide(actualRdAmount, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
+            taskDetails.setActualRdRate(res3.doubleValue());
+            BigDecimal res4 = getBigDecimal(actualRdAmount, actualRdNumber, taskDetails);
+                taskDetails.setThreeYearsActualRdRate(res4.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());
+            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, List<TaskAnnualReport> taskAnnualReports) {
+    private BigDecimal getBigDecimal(BigDecimal rdSalesAmount, BigDecimal rdBudget, TaskDetails taskDetails) {
         BigDecimal threeYearsRdSalesAmount = rdSalesAmount;
         BigDecimal threeYearsRdBudget = rdBudget;
-        for (TaskAnnualReport e : taskAnnualReports) {
-            threeYearsRdBudget=threeYearsRdBudget.add(e.getResearchAmount());
-            threeYearsRdSalesAmount=threeYearsRdSalesAmount.add(e.getSalesAmount());
-        }
+        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));
     }
 
@@ -216,15 +217,16 @@ public class TaskDetailsServiceImpl extends BaseMybatisDao<TaskDetailsMapper> im
      * 修改数据
      *
      * @param taskDetails 实例对象
+     * @param taskFeature
      * @return 实例对象
      */
     @Override
-    public TaskDetails update(TaskDetails taskDetails) {
+    public TaskDetails update(TaskDetails taskDetails, TaskFeature taskFeature) {
         taskDetails.setUpdateTime(new Date());
         this.taskDetailsMapper.update(taskDetails);
         countTaskDetails(taskDetails);
         TaskDetails res = this.queryById(taskDetails.getId());
-        addTaskDetailsLog(res);
+        addTaskDetailsLog(res,taskFeature);
         return res;
     }
 
@@ -263,4 +265,17 @@ public class TaskDetailsServiceImpl extends BaseMybatisDao<TaskDetailsMapper> im
         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());
+    }
 }