Преглед изворни кода

Merge branch 'test2' of jishutao/kede-server into prod

anderx пре 6 месеци
родитељ
комит
535e7c14c4
21 измењених фајлова са 1065 додато и 600 уклоњено
  1. 9 0
      src/main/java/com/goafanti/common/controller/PublicController.java
  2. 8 0
      src/main/java/com/goafanti/common/dao/TOrderNewMapper.java
  3. 3 0
      src/main/java/com/goafanti/common/dao/TOrderTaskMapper.java
  4. 250 557
      src/main/java/com/goafanti/common/mapper/TOrderNewMapper.xml
  5. 17 0
      src/main/java/com/goafanti/common/mapper/TOrderTaskMapper.xml
  6. 14 2
      src/main/java/com/goafanti/common/model/TOrderNew.java
  7. 5 1
      src/main/java/com/goafanti/common/utils/DateUtils.java
  8. 361 0
      src/main/java/com/goafanti/customer/bo/OutSelectUserChannelArchives.java
  9. 17 2
      src/main/java/com/goafanti/customer/service/impl/UserArchivesServiceImpl.java
  10. 0 2
      src/main/java/com/goafanti/expenseAccount/service/impl/ExpenseAccountServiceImpl.java
  11. 53 0
      src/main/java/com/goafanti/order/bo/InputOrderNewSignBo.java
  12. 108 0
      src/main/java/com/goafanti/order/bo/outStatistics/OutOrderNewSignBo.java
  13. 0 9
      src/main/java/com/goafanti/order/controller/AdminNewOrderApiController.java
  14. 18 0
      src/main/java/com/goafanti/order/controller/StatisticsApiController.java
  15. 5 1
      src/main/java/com/goafanti/order/service/OrderNewService.java
  16. 5 0
      src/main/java/com/goafanti/order/service/UserStaticticsService.java
  17. 1 0
      src/main/java/com/goafanti/order/service/impl/FundManagerOrderServiceImpl.java
  18. 1 0
      src/main/java/com/goafanti/order/service/impl/OrderChangeServiceImpl.java
  19. 80 2
      src/main/java/com/goafanti/order/service/impl/OrderNewServiceImpl.java
  20. 58 3
      src/main/java/com/goafanti/order/service/impl/UserStatisticsServiceImpl.java
  21. 52 21
      src/main/java/com/goafanti/techproject/service/impl/TaskDetailsServiceImpl.java

+ 9 - 0
src/main/java/com/goafanti/common/controller/PublicController.java

@@ -1018,4 +1018,13 @@ public class PublicController extends CertifyApiController {
 	public Result pushUserFirstInterview(){
 		return new Result<>().data(userArchivesInterviewService.pushUserFirstInterview());
 	}
+
+	/**
+	 * 处理客户最早面谈数据
+	 * @return
+	 */
+	@RequestMapping(value = "/pushUserFirstInterview", method = RequestMethod.GET)
+	public Result pushOrderNewUser(){
+		return new Result<>().data(orderNewService.pushOrderNewUser());
+	}
 }

+ 8 - 0
src/main/java/com/goafanti/common/dao/TOrderNewMapper.java

@@ -177,5 +177,13 @@ public interface TOrderNewMapper {
     List<String> selectByDepAndProcess(@Param("depId") String depId, @Param("processStatus") Integer processStatus);
 
     TOrderNew selectByTid(Integer tid);
+
+    /**
+     *
+     * @param buyerId   用户编号
+     * @param signTime  签单时间
+     * @param type   0=小于签单时间,1=大于签单时间
+     */
+    List<TOrderNew> selectBuyerIdAndSignTime(@Param("buyerId") String buyerId, @Param("signTime") Date signTime, @Param("type") Integer type);
 }
 

+ 3 - 0
src/main/java/com/goafanti/common/dao/TOrderTaskMapper.java

@@ -5,6 +5,7 @@ import com.goafanti.common.bo.UserOrderTask;
 import com.goafanti.common.model.TChangeTask;
 import com.goafanti.common.model.TOrderTask;
 import com.goafanti.order.bo.*;
+import com.goafanti.order.bo.outStatistics.OutOrderNewSignBo;
 import com.goafanti.organization.bo.ProjectTypePuls;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.data.domain.Pageable;
@@ -163,5 +164,7 @@ public interface TOrderTaskMapper {
 
     List<TOrderTaskBo> selectAdminTaskByTid(Integer tid);
     List<TOrderTaskBo> selectAdminTaskByAid(String aid);
+
+    List<OutOrderNewSignBo> orderNewSignToList(InputOrderNewSignBo in);
 }
 

Разлика између датотеке није приказан због своје велике величине
+ 250 - 557
src/main/java/com/goafanti/common/mapper/TOrderNewMapper.xml


+ 17 - 0
src/main/java/com/goafanti/common/mapper/TOrderTaskMapper.xml

@@ -3239,5 +3239,22 @@
         where c.sort in (3,6,9) and a.task_distribution_time>'2024-01-01' and a.split_status in (0,2)
           and a.task_receiver = #{aid}
     </select>
+    <select id="orderNewSignToList" resultType="com.goafanti.order.bo.outStatistics.OutOrderNewSignBo">
+        select a.name,department.name depName,
+               newCounts,newAmount,(newCounts/(newCounts+counts)) newCountProportion,(newAmount/(newAmount+amount))newAmountProportion,
+               counts,amount,(counts/(newCounts+counts)) countProportion,(amount/(newAmount+amount))amountProportion
+        from (SELECT b.salesman_id,
+                     sum(if(b.new_sign_user=0,1,0))newCounts ,
+                     sum(if(b.new_sign_user=0,b.total_amount,0))newAmount,
+                     sum(if(b.new_sign_user=1,1,0))counts ,
+                     sum(if(b.new_sign_user=1,b.total_amount,0))amount
+              from  t_order_new b
+              where  b.process_status >0 and b.delete_sign in (0,2)
+                and sign_time BETWEEN #{startTime} and #{endTime}
+              group by b.salesman_id
+             )x
+        left join admin a on x.salesman_id =a.id
+        left join department on a.department_id =department.id
+    </select>
 </mapper>
 

+ 14 - 2
src/main/java/com/goafanti/common/model/TOrderNew.java

@@ -9,10 +9,10 @@ import java.util.Date;
  * 订单表(TOrderNew)实体类
  *
  * @author makejava
- * @since 2024-09-27 16:04:11
+ * @since 2025-07-21 10:45:15
  */
 public class TOrderNew implements Serializable {
-    private static final long serialVersionUID = 136119537408285619L;
+    private static final long serialVersionUID = -96001184610112478L;
     /**
      * 订单编号
      */
@@ -214,6 +214,10 @@ public class TOrderNew implements Serializable {
      * 0=无,1=待评分,2=部分评分,3=全部评分
      */
     private Integer scoreStatus;
+    /**
+     * 新购客户 0=是,1=否(未签单或者三年内未签单为新)
+     */
+    private Integer newSignUser;
 
 
     public String getOrderNo() {
@@ -616,5 +620,13 @@ public class TOrderNew implements Serializable {
         this.scoreStatus = scoreStatus;
     }
 
+    public Integer getNewSignUser() {
+        return newSignUser;
+    }
+
+    public void setNewSignUser(Integer newSignUser) {
+        this.newSignUser = newSignUser;
+    }
+
 }
 

+ 5 - 1
src/main/java/com/goafanti/common/utils/DateUtils.java

@@ -420,10 +420,14 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
 		return format.format(date);
 	}
 
-	public static String formatDateYYYYMMdd(Date date, String pattern) {
+	public static String formatDateYYYYMMdd(Date date) {
 		SimpleDateFormat format = new SimpleDateFormat(parsePatterns[1]);
 		return format.format(date);
 	}
+	public static String formatDateChineseYYYYMMdd(Date date) {
+		SimpleDateFormat format = new SimpleDateFormat(parsePatterns[12]);
+		return format.format(date);
+	}
 
 	public static String formatDateYYYYMMddHHmm(Date date) {
 		SimpleDateFormat format = new SimpleDateFormat(parsePatterns[2]);

+ 361 - 0
src/main/java/com/goafanti/customer/bo/OutSelectUserChannelArchives.java

@@ -0,0 +1,361 @@
+package com.goafanti.customer.bo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.goafanti.common.utils.excel.Excel;
+
+import java.util.Date;
+
+public class OutSelectUserChannelArchives {
+    private String id;
+    @Excel(name = "客户名称")
+    private String nickname;
+    @Excel(name = "客户类型",readConverterExp = "0=私有渠道,1=公共渠道,2=签单渠道,3=外联渠道",width = 8)
+    private Integer shareType;
+    private Integer signBills;
+    private String businessScope;
+    @Excel(name = "渠道类型",readConverterExp = "1=其他,2=民主党派,3=园区,4=民间组织,5=战略合作单位",width = 8)
+    private Integer channelType;
+    @Excel(name = "企业数",width = 8)
+    private Integer enterpriseCount;
+
+    private String industry;
+    @Excel(name = "联系人")
+    private String contactName;
+    private String contactMobile;
+    @Excel(name = "所属人")
+    private String adminName;
+    @Excel(name = "面谈项目")
+    private String intendedProject;
+    @Excel(name = "考核指标")
+    private String channelIndicators;
+    @Excel(name = "面谈思路及目的")
+    private String interviewIdeas;
+    @Excel(name = "面谈人及分工")
+    private String interviewDistribution;
+    private Integer  patentCount;
+    private Integer inventionPatentCount;
+    private Integer utilityModelCount;
+    private Integer appearancePatentCount;
+    private Integer softwareWorksCount;
+    private Integer otherCount;
+    private Integer standard;
+
+    private String financialData;
+
+    private String earlyCommunication;
+
+    /**
+     * 母/子公司数
+     */
+    private Integer companyCount;
+    /**
+     * 社保人数
+     */
+    private Integer socialSecurityCount;
+    /**
+     * 对外投资控股的企业数
+     */
+    private Integer externalInvestCount;
+    /**
+     * 对外投资控股的行业
+     */
+
+    private String externalInvestIndustryName;
+    /**
+     * 对外投资控股的企业名称
+     */
+    /**
+     * 对外投资控股的企业编号
+     */
+//    @Excel(name = "对外投资控股的企业编号")
+//    private String externalInvestId;
+    /**
+     * 对外投资控股的行业名称
+     */
+
+    @Excel(name = "所属部门")
+    private String depName;
+    @Excel(name = "修改时间",dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+    @Excel(name = "省",width = 8)
+    private String province;
+    @Excel(name = "市",width = 8)
+    private String city;
+    @Excel(name = "区",width = 8)
+    private String area;
+    @Excel(name = "公出面谈信息")
+    private String publicContent;
+
+    public Integer getStandard() {
+        return standard;
+    }
+
+    public void setStandard(Integer standard) {
+        this.standard = standard;
+    }
+
+    public Integer getCompanyCount() {
+        return companyCount;
+    }
+
+    public void setCompanyCount(Integer companyCount) {
+        this.companyCount = companyCount;
+    }
+
+    public Integer getSocialSecurityCount() {
+        return socialSecurityCount;
+    }
+
+    public void setSocialSecurityCount(Integer socialSecurityCount) {
+        this.socialSecurityCount = socialSecurityCount;
+    }
+
+    public Integer getExternalInvestCount() {
+        return externalInvestCount;
+    }
+
+    public void setExternalInvestCount(Integer externalInvestCount) {
+        this.externalInvestCount = externalInvestCount;
+    }
+
+    public String getExternalInvestIndustryName() {
+        return externalInvestIndustryName;
+    }
+
+    public void setExternalInvestIndustryName(String externalInvestIndustryName) {
+        this.externalInvestIndustryName = externalInvestIndustryName;
+    }
+
+
+    public String getContactMobile() {
+        return contactMobile;
+    }
+
+    public void setContactMobile(String contactMobile) {
+        this.contactMobile = contactMobile;
+    }
+
+    public String getPublicContent() {
+        return publicContent;
+    }
+
+    public void setPublicContent(String publicContent) {
+        this.publicContent = publicContent;
+    }
+
+    public Integer getSignBills() {
+        return signBills;
+    }
+
+    public void setSignBills(Integer signBills) {
+        this.signBills = signBills;
+    }
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getNickname() {
+        return nickname;
+    }
+
+    public void setNickname(String nickname) {
+        this.nickname = nickname;
+    }
+
+    public String getProvince() {
+        return province;
+    }
+
+    public void setProvince(String province) {
+        this.province = province;
+    }
+
+    public String getCity() {
+        return city;
+    }
+
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+    public String getArea() {
+        return area;
+    }
+
+    public void setArea(String area) {
+        this.area = area;
+    }
+
+    public Integer getShareType() {
+        return shareType;
+    }
+
+    public void setShareType(Integer shareType) {
+        this.shareType = shareType;
+    }
+
+    public Integer getChannelType() {
+        return channelType;
+    }
+
+    public void setChannelType(Integer channelType) {
+        this.channelType = channelType;
+    }
+
+    public Integer getEnterpriseCount() {
+        return enterpriseCount;
+    }
+
+    public void setEnterpriseCount(Integer enterpriseCount) {
+        this.enterpriseCount = enterpriseCount;
+    }
+
+    public String getContactName() {
+        return contactName;
+    }
+
+    public void setContactName(String contactName) {
+        this.contactName = contactName;
+    }
+
+    public String getAdminName() {
+        return adminName;
+    }
+
+    public void setAdminName(String adminName) {
+        this.adminName = adminName;
+    }
+
+    public String getChannelIndicators() {
+        return channelIndicators;
+    }
+
+    public void setChannelIndicators(String channelIndicators) {
+        this.channelIndicators = channelIndicators;
+    }
+
+    public String getInterviewIdeas() {
+        return interviewIdeas;
+    }
+
+    public void setInterviewIdeas(String interviewIdeas) {
+        this.interviewIdeas = interviewIdeas;
+    }
+
+    public String getIntendedProject() {
+        return intendedProject;
+    }
+
+    public void setIntendedProject(String intendedProject) {
+        this.intendedProject = intendedProject;
+    }
+
+    public String getInterviewDistribution() {
+        return interviewDistribution;
+    }
+
+    public void setInterviewDistribution(String interviewDistribution) {
+        this.interviewDistribution = interviewDistribution;
+    }
+
+    public String getDepName() {
+        return depName;
+    }
+
+    public void setDepName(String depName) {
+        this.depName = depName;
+    }
+
+    public String getIndustry() {
+        return industry;
+    }
+
+    public void setIndustry(String industry) {
+        this.industry = industry;
+    }
+
+    public String getBusinessScope() {
+        return businessScope;
+    }
+
+    public void setBusinessScope(String businessScope) {
+        this.businessScope = businessScope;
+    }
+
+    public String getFinancialData() {
+        return financialData;
+    }
+
+    public void setFinancialData(String financialData) {
+        this.financialData = financialData;
+    }
+
+    public String getEarlyCommunication() {
+        return earlyCommunication;
+    }
+
+    public void setEarlyCommunication(String earlyCommunication) {
+        this.earlyCommunication = earlyCommunication;
+    }
+
+    public Integer getPatentCount() {
+        return patentCount;
+    }
+
+    public void setPatentCount(Integer patentCount) {
+        this.patentCount = patentCount;
+    }
+
+    public Integer getInventionPatentCount() {
+        return inventionPatentCount;
+    }
+
+    public void setInventionPatentCount(Integer inventionPatentCount) {
+        this.inventionPatentCount = inventionPatentCount;
+    }
+
+    public Integer getUtilityModelCount() {
+        return utilityModelCount;
+    }
+
+    public void setUtilityModelCount(Integer utilityModelCount) {
+        this.utilityModelCount = utilityModelCount;
+    }
+
+    public Integer getAppearancePatentCount() {
+        return appearancePatentCount;
+    }
+
+    public void setAppearancePatentCount(Integer appearancePatentCount) {
+        this.appearancePatentCount = appearancePatentCount;
+    }
+
+    public Integer getSoftwareWorksCount() {
+        return softwareWorksCount;
+    }
+
+    public void setSoftwareWorksCount(Integer softwareWorksCount) {
+        this.softwareWorksCount = softwareWorksCount;
+    }
+
+    public Integer getOtherCount() {
+        return otherCount;
+    }
+
+    public void setOtherCount(Integer otherCount) {
+        this.otherCount = otherCount;
+    }
+}

+ 17 - 2
src/main/java/com/goafanti/customer/service/impl/UserArchivesServiceImpl.java

@@ -11,6 +11,7 @@ import com.goafanti.core.mybatis.page.Pagination;
 import com.goafanti.core.shiro.token.TokenManager;
 import com.goafanti.customer.bo.InputSelectUserArchives;
 import com.goafanti.customer.bo.OutSelectUserArchives;
+import com.goafanti.customer.bo.OutSelectUserChannelArchives;
 import com.goafanti.customer.bo.UserArchivesDetails;
 import com.goafanti.customer.service.CustomerService;
 import com.goafanti.customer.service.UserArchivesService;
@@ -395,8 +396,22 @@ public class UserArchivesServiceImpl extends BaseMybatisDao< UserArchivesMapper>
             List<selectByUidAidBo> userArchivesInterviews = userArchivesInterviewMapper.selectByUidAid(e.getId(), null);
             e.setPublicContent(pushContent(userArchivesInterviews));
         });
-        NewExcelUtil<OutSelectUserArchives> newExcelUtil = new NewExcelUtil<>(OutSelectUserArchives.class);
-        return newExcelUtil.exportExcel( list,"用户档案",uploadPath);
+        String sheetName = "用户档案";
+        if (in.getNewChannel()==1){
+            sheetName="渠道档案";
+            NewExcelUtil<OutSelectUserChannelArchives> newExcelUtil = new NewExcelUtil<>(OutSelectUserChannelArchives.class);
+            List<OutSelectUserChannelArchives> newList = new ArrayList<>();
+            //将类型转换
+            list.stream().forEach(e ->{
+                OutSelectUserChannelArchives outSelectUserChannelArchives = new OutSelectUserChannelArchives();
+                BeanUtils.copyProperties(e,outSelectUserChannelArchives);
+                newList.add(outSelectUserChannelArchives);
+            });
+            return newExcelUtil.exportExcel( newList,sheetName,uploadPath);
+        }else {
+            NewExcelUtil<OutSelectUserArchives> newExcelUtil = new NewExcelUtil<>(OutSelectUserArchives.class);
+            return newExcelUtil.exportExcel( list,sheetName,uploadPath);
+        }
     }
 
 

+ 0 - 2
src/main/java/com/goafanti/expenseAccount/service/impl/ExpenseAccountServiceImpl.java

@@ -1536,9 +1536,7 @@ public class ExpenseAccountServiceImpl extends BaseMybatisDao<ExpenseAccountMapp
                             useOyd = yearMaxDurationList.get(i);
                         }
                     }
-
                 }
-
                 //获取未归集的订单
                 List<BigDecimal> orderNoNotCountAmount = expenseAccountMapper.getOrderNoNotCountAmount(e.getOrderNo());
                 BigDecimal countAmount = orderNoNotCountAmount.stream().reduce(BigDecimal.ZERO, BigDecimal::add);

+ 53 - 0
src/main/java/com/goafanti/order/bo/InputOrderNewSignBo.java

@@ -0,0 +1,53 @@
+package com.goafanti.order.bo;
+
+import java.util.Date;
+
+public class InputOrderNewSignBo {
+
+    private Integer type;
+    private Date startTime;
+    private Date endTime;
+
+    private Integer pageSize;
+    private Integer pageNo;
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(Integer pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public Integer getPageNo() {
+        return pageNo;
+    }
+
+    public void setPageNo(Integer pageNo) {
+        this.pageNo = pageNo;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+}

+ 108 - 0
src/main/java/com/goafanti/order/bo/outStatistics/OutOrderNewSignBo.java

@@ -0,0 +1,108 @@
+package com.goafanti.order.bo.outStatistics;
+
+import com.goafanti.common.utils.excel.Excel;
+
+import java.math.BigDecimal;
+
+public class OutOrderNewSignBo {
+    @Excel(name = "签单人")
+    private String name;
+    @Excel(name = "部门")
+    private String depName;
+    @Excel(name = "新客户签单数")
+    private String newCounts;
+    @Excel(name = "新客户签单金额")
+    private BigDecimal newAmount;
+    @Excel(name = "新客户签单数占比", percentage = 1,scale = 2)
+    private String newCountProportion;
+    @Excel(name = "新客户签单金额占比", percentage = 1,scale = 2)
+    private String newAmountProportion;
+    @Excel(name = "旧客户签单数")
+    private String counts;
+    @Excel(name = "旧客户签单金额")
+    private BigDecimal amount;
+    @Excel(name = "旧客户签单数占比",percentage = 1,scale = 2)
+    private String countProportion;
+    @Excel(name = "旧客户签单金额占比", percentage = 1,scale = 2)
+    private String amountProportion;
+
+    public String getDepName() {
+        return depName;
+    }
+
+    public void setDepName(String depName) {
+        this.depName = depName;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getNewCounts() {
+        return newCounts;
+    }
+
+    public void setNewCounts(String newCounts) {
+        this.newCounts = newCounts;
+    }
+
+    public BigDecimal getNewAmount() {
+        return newAmount;
+    }
+
+    public void setNewAmount(BigDecimal newAmount) {
+        this.newAmount = newAmount;
+    }
+
+    public String getNewCountProportion() {
+        return newCountProportion;
+    }
+
+    public void setNewCountProportion(String newCountProportion) {
+        this.newCountProportion = newCountProportion;
+    }
+
+    public String getNewAmountProportion() {
+        return newAmountProportion;
+    }
+
+    public void setNewAmountProportion(String newAmountProportion) {
+        this.newAmountProportion = newAmountProportion;
+    }
+
+    public String getCounts() {
+        return counts;
+    }
+
+    public void setCounts(String counts) {
+        this.counts = counts;
+    }
+
+    public BigDecimal getAmount() {
+        return amount;
+    }
+
+    public void setAmount(BigDecimal amount) {
+        this.amount = amount;
+    }
+
+    public String getCountProportion() {
+        return countProportion;
+    }
+
+    public void setCountProportion(String countProportion) {
+        this.countProportion = countProportion;
+    }
+
+    public String getAmountProportion() {
+        return amountProportion;
+    }
+
+    public void setAmountProportion(String amountProportion) {
+        this.amountProportion = amountProportion;
+    }
+}

+ 0 - 9
src/main/java/com/goafanti/order/controller/AdminNewOrderApiController.java

@@ -50,7 +50,6 @@ public class AdminNewOrderApiController extends CertifyApiController {
 	 * @param salesType 销售类型
 	 * @param channelId 渠道编号
 	 * @param other 备注
-	 * @return
 	 */
 	@RequestMapping(value = "/createOrder",method = RequestMethod.POST)
 	public Result createOrder(String uid,Integer orderType,Integer userType,
@@ -241,8 +240,6 @@ public class AdminNewOrderApiController extends CertifyApiController {
 
 	/**
 	 * 订单详情
-	 * @param orderNo
-	 * @return
 	 */
 	@RequestMapping(value = "/getOrderNewDetail", method = RequestMethod.GET)
 	public Result getOrderNewDetail(String orderNo){
@@ -258,8 +255,6 @@ public class AdminNewOrderApiController extends CertifyApiController {
 
 	/**
 	 * 订单审核列表
-	 * @param orderNo
-	 * @return
 	 */
 	@RequestMapping(value = "/getProcessName", method = RequestMethod.GET)
 	public Result getProcessName(String orderNo){
@@ -332,7 +327,6 @@ public class AdminNewOrderApiController extends CertifyApiController {
 	 *  specially 0 个人 1 营销员管理 2 驳回 3 特批 4 咨询师管理 5部门订单查询 6客服查询 7统计签单订单 8客户订单列表 9 复审订单 10 营销经理 11运营保障 12 公出最大值待审核
 	 *  distribution (咨询师管理列表 0 未分配 1部分 2全部
 	 *  amountStatus  0 10万元以下 1 10万~20万 2 20万~30万 3 30万~40万  4 40万以上
-	 * @return
 	 */
 	@RequestMapping(value="/orderNewList", method = RequestMethod.GET)
 	public Result orderNewList(InputOrderNewListBo in){
@@ -346,7 +340,6 @@ public class AdminNewOrderApiController extends CertifyApiController {
 	 *  specially 0 个人 1 营销员管理 2 驳回 3 特批 4 咨询师管理 5部门订单查询 6客服查询 7统计签单订单 8客户订单列表 9 复审订单 10 营销经理
 	 *  distribution (咨询师管理列表 0 未分配 1部分 2全部
 	 *  amountStatus  0 10万元以下 1 10万~20万 2 20万~30万 3 30万~40万  4 40万以上
-	 * @return
 	 */
 	@RequestMapping(value="/orderNewListDownload", method = RequestMethod.GET)
 	public Result orderNewListDownload(InputOrderNewListBo in,HttpServletResponse response){
@@ -361,8 +354,6 @@ public class AdminNewOrderApiController extends CertifyApiController {
 
 	/**
 	 * 销售来源订单列表
-	 * @param in
-	 * @return
 	 */
 	@RequestMapping(value="/statistics/orderList", method = RequestMethod.GET)
 	public Result orderNewList(InputStatisticsOrderList in ){

+ 18 - 0
src/main/java/com/goafanti/order/controller/StatisticsApiController.java

@@ -8,6 +8,7 @@ import com.goafanti.common.utils.excel.NewExcelUtil;
 import com.goafanti.core.mybatis.page.Pagination;
 import com.goafanti.core.shiro.token.TokenManager;
 import com.goafanti.order.bo.*;
+import com.goafanti.order.bo.outStatistics.OutOrderNewSignBo;
 import com.goafanti.order.bo.outStatistics.OutOrderSalesSourceAmount;
 import com.goafanti.order.service.OrderStatisticsService;
 import com.goafanti.order.service.ProjectStatisticsService;
@@ -213,6 +214,23 @@ public class StatisticsApiController extends CertifyApiController {
 	}
 
 
+	/**
+	 * 新老订单统计导出
+	 */
+	@RequestMapping(value = "/orderNewSign/export",method = RequestMethod.GET)
+	public Result orderNewSignExport(InputOrderNewSignBo in,HttpServletResponse response){
+		in.setPageSize(999999);
+		in.setPageNo(1);
+		String str=userStaticticsService.getOrderNewSignTime(in);
+		List<OutOrderNewSignBo> list = userStaticticsService.orderNewSignToList(in);
+		NewExcelUtil<OutOrderNewSignBo> excelUtil=new NewExcelUtil<>(OutOrderNewSignBo.class);
+
+
+		return excelUtil.exportExcel(list,str,response);
+//		return excelUtil.TestExportExcel(list,"订单项目数据统计表",uploadPath);
+	}
+
+
 
 
 }

+ 5 - 1
src/main/java/com/goafanti/order/service/OrderNewService.java

@@ -229,7 +229,9 @@ public interface OrderNewService {
 
 	void orderNewListDownload(InputOrderNewListBo in, HttpServletResponse response);
 
-	void pushOrderPublicReleaseCount(TOrderNew e);
+    void pushNewSignUser(TOrderNew t2);
+
+    void pushOrderPublicReleaseCount(TOrderNew e);
 
 	List<TOrderNew> selectGetAll();
 
@@ -245,4 +247,6 @@ public interface OrderNewService {
 
 
     Object updateAddGroupChat(TOrderMid us);
+
+    Object pushOrderNewUser();
 }

+ 5 - 0
src/main/java/com/goafanti/order/service/UserStaticticsService.java

@@ -2,6 +2,7 @@ package com.goafanti.order.service;
 
 import com.goafanti.core.mybatis.page.Pagination;
 import com.goafanti.order.bo.*;
+import com.goafanti.order.bo.outStatistics.OutOrderNewSignBo;
 
 import java.util.List;
 
@@ -18,4 +19,8 @@ public interface UserStaticticsService {
     List<OutSignStatistics> signStatisticsGetList(InputSignStatistics in);
 
     Pagination<OutOrderProject> orderProject(InputOrderProject in);
+
+    List<OutOrderNewSignBo> orderNewSignToList(InputOrderNewSignBo in);
+
+    String getOrderNewSignTime(InputOrderNewSignBo in);
 }

+ 1 - 0
src/main/java/com/goafanti/order/service/impl/FundManagerOrderServiceImpl.java

@@ -217,6 +217,7 @@ public class FundManagerOrderServiceImpl extends BaseMybatisDao<TOrderNewMapper>
 		}
 		Admin admin=adminMapper.selectFinanceAdminByOrderDep(t.getOrderDep());
 		orderNewService.financeCountOrderUnauditedSubtraction(t,1);
+		orderNewService.pushNewSignUser(t);
 		return c;
 	}
 	public void pushGeneralSendNoticeAndEmail(List<String> alist, Integer type,TOrderNewBo o,String adminId,Integer approval){

+ 1 - 0
src/main/java/com/goafanti/order/service/impl/OrderChangeServiceImpl.java

@@ -781,6 +781,7 @@ public class OrderChangeServiceImpl extends BaseMybatisDao<NewOrderChangeMapper>
 			noc.setVoucherUrl(t.getVoucherUrl());
 			noc.setTotalAmount(t.getTotalAmount());
 			noc.setSettlementAmount(t.getSettlementAmount());
+			noc.setFirstAmount(t.getFirstAmount());
 			noc.setChangeAmount(t.getChangeAmount());
 			noc.setApplicant(t.getApplicant());
 			noc.setStatus(1);//订单置为正常

+ 80 - 2
src/main/java/com/goafanti/order/service/impl/OrderNewServiceImpl.java

@@ -652,10 +652,43 @@ public class OrderNewServiceImpl extends BaseMybatisDao<TOrderNewMapper> impleme
 		pushOrderDunContent(t2);
 		//计算公出统计
 		pushOrderPublicReleaseCount(t2);
-
+		//处理新旧订单问题
+		if (isSubmit==1)pushNewSignUser(t);
 		return 1;
 	}
 
+	@Override
+	public void pushNewSignUser(TOrderNew t2) {
+		//看有没有时间后的订单,有则先处理后订单
+		List<TOrderNew> tOrderNews = tOrderNewMapper.selectBuyerIdAndSignTime(t2.getBuyerId(), t2.getSignTime(), 1);
+		for (TOrderNew tOrderNew : tOrderNews) {
+			pushOrderNewSignUser(tOrderNew);
+		}
+		pushOrderNewSignUser(t2);
+	}
+
+	private void pushOrderNewSignUser(TOrderNew t) {
+		//最大年限设置3年
+		int max=365*3;
+		List<TOrderNew> tOrderNews = tOrderNewMapper.selectBuyerIdAndSignTime(t.getBuyerId(), t.getSignTime(), 0);
+		TOrderNew updater = new TOrderNew();
+		updater.setOrderNo(t.getOrderNo());
+		if (tOrderNews.size()>0){
+			TOrderNew tOrderNew = tOrderNews.get(tOrderNews.size() - 1);
+			Date signTime = tOrderNew.getSignTime();
+			long daysBetween = DateUtils.getDaysBetween(signTime,t.getSignTime());
+			System.out.println(daysBetween);
+			if (daysBetween<max){
+				updater.setNewSignUser(1);
+			}else {
+				updater.setNewSignUser(0);
+			}
+		}else {
+			updater.setNewSignUser(0);
+		}
+			tOrderNewMapper.update(updater);
+	}
+
 	private void pushApprovalType(TOrderNewWithBLOBs t) {
 		if (StringUtils.isBlank(t.getType())|| Objects.equals(t.getApproval(), ApprovalNewState.FTP.getCode())){
 			tOrderApprovalMapper.deleteByOderNo(t.getOrderNo());
@@ -931,7 +964,13 @@ public class OrderNewServiceImpl extends BaseMybatisDao<TOrderNewMapper> impleme
 		}
 		addOrderLog(tl,reason);
 		pushGeneralSendNoticeAndEmail(aids, noticeType,order, TokenManager.getAdminId(),t2.getApproval());
-		return tOrderNewMapper.update(t);
+		tOrderNewMapper.update(t);
+		if (type==0){
+			t.setBuyerId(t2.getBuyerId());
+			t.setSignTime(t2.getSignTime());
+			pushNewSignUser(t);
+		}
+		return 1;
 	}
 
 
@@ -1446,6 +1485,11 @@ public class OrderNewServiceImpl extends BaseMybatisDao<TOrderNewMapper> impleme
 		}
 		TOrderNewBo order = tOrderNewMapper.getSaleIdByOno(t2.getOrderNo());
 		pushGeneralSendNoticeAndEmail(aids, type,order, TokenManager.getAdminId(),t2.getApproval());
+		if (orderStatus.equals(OrderNewState.QDSHJJ.getCode())) {
+			t.setBuyerId(t2.getBuyerId());
+			t.setSignTime(t2.getSignTime());
+			pushNewSignUser(t);
+		}
 		return 1;
 	}
 
@@ -1810,6 +1854,11 @@ public class OrderNewServiceImpl extends BaseMybatisDao<TOrderNewMapper> impleme
 		pushGeneralSendNoticeAndEmail(aids, type,order, TokenManager.getAdminId(),t2.getApproval());
 		//新增特批催款信息
 		tOrderNewMapper.update(t);
+		if (confirm==3){
+			t.setBuyerId(t2.getBuyerId());
+			t.setSignTime(t2.getSignTime());
+			pushNewSignUser(t);
+		}
 		return 1;
 	}
 
@@ -2075,6 +2124,7 @@ public class OrderNewServiceImpl extends BaseMybatisDao<TOrderNewMapper> impleme
 		pushGeneralSendNoticeAndEmail(aids, NoticeStatus.ORDER_NO.getCode(),order, TokenManager.getAdminId(),t.getApproval());
 		tOrderNewMapper.update(t);
 		financeCountOrderUnauditedSubtraction(t,2);
+		pushNewSignUser(t);
 		return 1;
 	}
 
@@ -2663,4 +2713,32 @@ public class OrderNewServiceImpl extends BaseMybatisDao<TOrderNewMapper> impleme
 		return 1;
 	}
 
+	@Override
+	public Object pushOrderNewUser() {
+		List<TOrderNew> tOrderNews = tOrderNewMapper.selectgetAll();
+		//最大年限设置3年
+		int max=365*3;
+		List<String> list=new ArrayList<>();
+		for (TOrderNew e : tOrderNews) {
+			String buyerId = e.getBuyerId();
+			List<TOrderNew> tOrderNews1 = tOrderNewMapper.selectBuyerIdAndSignTime(buyerId, e.getSignTime(), 0);
+			if (tOrderNews1.size()>0){
+				TOrderNew tOrderNew = tOrderNews1.get(tOrderNews1.size() - 1);
+				Date signTime = tOrderNew.getSignTime();
+				long daysBetween = DateUtils.getDaysBetween(signTime,e.getSignTime());
+				System.out.println(daysBetween);
+				if (daysBetween<max){
+					list.add(e.getOrderNo());
+				}
+			}
+		}
+		for (String s : list) {
+			TOrderNew tOrderNew = new TOrderNew();
+			tOrderNew.setOrderNo(s);
+			tOrderNew.setNewSignUser(1);
+			tOrderNewMapper.update(tOrderNew);
+		}
+		return 1;
+	}
+
 }

+ 58 - 3
src/main/java/com/goafanti/order/service/impl/UserStatisticsServiceImpl.java

@@ -1,22 +1,30 @@
 package com.goafanti.order.service.impl;
 
 import com.goafanti.admin.service.DepartmentService;
+import com.goafanti.common.dao.TOrderNewMapper;
 import com.goafanti.common.dao.TOrderTaskMapper;
 import com.goafanti.common.dao.UserMidMapper;
 import com.goafanti.common.error.BusinessException;
+import com.goafanti.common.utils.DateUtils;
 import com.goafanti.common.utils.StringUtils;
 import com.goafanti.core.mybatis.BaseMybatisDao;
 import com.goafanti.core.mybatis.page.Pagination;
 import com.goafanti.order.bo.*;
+import com.goafanti.order.bo.outStatistics.OutOrderNewSignBo;
 import com.goafanti.order.enums.NewProjectStatus;
 import com.goafanti.order.service.UserStaticticsService;
 import groovy.util.logging.Log4j;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.temporal.TemporalAdjusters;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -25,10 +33,12 @@ import java.util.Map;
 @Log4j
 public class UserStatisticsServiceImpl extends BaseMybatisDao<UserMidMapper> implements UserStaticticsService {
 
-	@Autowired
+	@Resource
 	private DepartmentService departmentService;
-	@Autowired
+	@Resource
 	private TOrderTaskMapper tOrderTaskMapper;
+	@Resource
+	private TOrderNewMapper tOrderNewMapper;
 
 	@Override
 	public Pagination<OutSignSummary> signSummary(InputSignSummary in) {
@@ -191,6 +201,51 @@ public class UserStatisticsServiceImpl extends BaseMybatisDao<UserMidMapper> imp
 		return page;
 	}
 
+
+
+	@Override
+	public String getOrderNewSignTime(InputOrderNewSignBo in) {
+		if(in.getType()==null){
+			in.setStartTime(DateUtils.parseDate("2024-01-01"));
+			in.setEndTime(DateUtils.parseDate("2025-01-01"));
+		}else if(in.getType()==0){
+			//获取本周起止时间开始时间和结束时间
+			// 获取当前日期
+			LocalDate today = LocalDate.now();
+
+			// 获取本周的开始时间(星期一)
+			LocalDate startOfWeek = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
+			// 获取下周的周一作为结束时间
+			LocalDate endOfWeek = today.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
+			Date startDate = Date.from(startOfWeek.atStartOfDay(ZoneId.systemDefault()).toInstant());
+			Date endDate = Date.from(endOfWeek.atStartOfDay(ZoneId.systemDefault()).toInstant());
+			in.setStartTime(startDate);
+			in.setEndTime(endDate);
+		}else {
+			//获取本月第一天和下月第一天
+			// 获取当前日期
+			LocalDate today = LocalDate.now();
+			// 获取本月的第一天
+			LocalDate firstDayOfMonth = today.withDayOfMonth(1);
+			// 获取下月的第一天
+			LocalDate firstDayOfNextMonth = firstDayOfMonth.plusMonths(1);
+			Date startDate = Date.from(firstDayOfMonth.atStartOfDay(ZoneId.systemDefault()).toInstant());
+			Date endDate = Date.from(firstDayOfNextMonth.atStartOfDay(ZoneId.systemDefault()).toInstant());
+			in.setStartTime(startDate);
+			in.setEndTime(endDate);
+		}
+		String str=DateUtils.formatDateChineseYYYYMMdd(in.getStartTime())
+				+"-"+DateUtils.formatDateChineseYYYYMMdd(in.getEndTime())
+				+"订单新老客签单统计";
+		return str;
+	}
+
+	@Override
+	public List<OutOrderNewSignBo> orderNewSignToList(InputOrderNewSignBo in) {
+		List<OutOrderNewSignBo> list=tOrderTaskMapper.orderNewSignToList(in);
+		return list;
+	}
+
 	private void pushOrderProjectParam(InputOrderProject in, Map<String, Object> map) {
 		Class<InputOrderProject> clazz= (Class<InputOrderProject>) in.getClass();
 		Field[] declaredFields = clazz.getDeclaredFields();

+ 52 - 21
src/main/java/com/goafanti/techproject/service/impl/TaskDetailsServiceImpl.java

@@ -320,37 +320,54 @@ public class TaskDetailsServiceImpl extends BaseMybatisDao<TaskDetailsMapper> im
         //计算人员占比
         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());
+            if(taskDetails.getWorkersNumber()==0||taskDetails.getTechnologyNumber()==0){
+                taskDetails.setWorkersRate(0.0);
+            }else{
+                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().compareTo(BigDecimal.ZERO)==0||taskDetails.getActualRdAmount().compareTo(BigDecimal.ZERO)==0){
+                taskDetails.setRdCompletionProgress(0.0);
+            }else {
+                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.getRdBudget().compareTo(BigDecimal.ZERO)==0||taskDetails.getRdSalesAmount().compareTo(BigDecimal.ZERO)==0){
+                    taskDetails.setRdBudgetRate(0.0);
+                }else {
+                    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){
+                        taskDetails.getBeforeLastRdSalesAmount()!=null && taskDetails.getBeforeLastRdBudget()!=null){
                     BigDecimal res2 = getBigDecimal(rdSalesAmount, rdBudget, taskDetails);
                     taskDetails.setThreeYearsRdBudgetRate(res2.doubleValue());
                 }
             }
         //计算实际研发占比
-        if(taskDetails.getActualRdNumber() !=null &&
+        if(taskDetails.getActualSalesAmount() !=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.getActualSalesAmount().compareTo(BigDecimal.ZERO)==0||taskDetails.getActualRdAmount().compareTo(BigDecimal.ZERO)==0){
+                taskDetails.setActualRdRate(0.0);
+            }else {
+                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);
@@ -358,10 +375,14 @@ public class TaskDetailsServiceImpl extends BaseMybatisDao<TaskDetailsMapper> im
             }
         }
         //计算立项资料占比
-        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());
+        if (taskDetails.getProjectApprovalWriteNumber()!=null&& taskDetails.getProjectApprovalNumber()!=null){
+            if (taskDetails.getProjectApprovalWriteNumber()==0||taskDetails.getProjectApprovalNumber()==0){
+                taskDetails.setProjectApprovalWriteRate(0.0);
+            }else {
+                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());
@@ -378,11 +399,21 @@ public class TaskDetailsServiceImpl extends BaseMybatisDao<TaskDetailsMapper> im
     }
 
     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));
+        BigDecimal threeYearsRdSalesAmount = BigDecimal.ZERO;
+        BigDecimal threeYearsRdBudget = BigDecimal.ZERO;
+        threeYearsRdSalesAmount = threeYearsRdSalesAmount
+                .add(rdSalesAmount)
+                .add(taskDetails.getLastRdSalesAmount())
+                .add(taskDetails.getBeforeLastRdSalesAmount());
+        threeYearsRdBudget = threeYearsRdBudget
+                .add(rdBudget)
+                .add(taskDetails.getLastRdBudget())
+                .add(taskDetails.getBeforeLastRdBudget());
+        if (threeYearsRdSalesAmount.compareTo(BigDecimal.ZERO)==0||threeYearsRdBudget.compareTo(BigDecimal.ZERO)==0){
+            return BigDecimal.ZERO;
+        }else {
+            return threeYearsRdBudget.divide(threeYearsRdSalesAmount, 4, RoundingMode.HALF_UP).multiply(new BigDecimal(100));
+        }
     }
 
     /**