Browse Source

开发新老客户逻辑

anderx 5 months ago
parent
commit
8830c13a0e

+ 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);
 }
 

+ 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>
 

+ 4 - 0
src/main/java/com/goafanti/common/utils/DateUtils.java

@@ -423,6 +423,10 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
 		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]);

+ 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;
+    }
+}

+ 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 - 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);
 }

+ 30 - 3
src/main/java/com/goafanti/order/service/impl/OrderNewServiceImpl.java

@@ -652,10 +652,36 @@ public class OrderNewServiceImpl extends BaseMybatisDao<TOrderNewMapper> impleme
 		pushOrderDunContent(t2);
 		//计算公出统计
 		pushOrderPublicReleaseCount(t2);
-
+		//处理新旧订单问题
+		if (isSubmit==1)pushNewSignUser(t2);
 		return 1;
 	}
 
+	private 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);
+		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){
+				t.setNewSignUser(1);
+				tOrderNewMapper.update(t);
+			}
+		}
+	}
+
 	private void pushApprovalType(TOrderNewWithBLOBs t) {
 		if (StringUtils.isBlank(t.getType())|| Objects.equals(t.getApproval(), ApprovalNewState.FTP.getCode())){
 			tOrderApprovalMapper.deleteByOderNo(t.getOrderNo());
@@ -2671,11 +2697,12 @@ public class OrderNewServiceImpl extends BaseMybatisDao<TOrderNewMapper> impleme
 		List<String> list=new ArrayList<>();
 		for (TOrderNew e : tOrderNews) {
 			String buyerId = e.getBuyerId();
-			List<TOrderNew> tOrderNews1 = tOrderNewMapper.selectBuyerIdAndSignTime(buyerId, e.getSignTime(), 1);
+			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(e.getSignTime(),signTime );
+				long daysBetween = DateUtils.getDaysBetween(signTime,e.getSignTime());
+				System.out.println(daysBetween);
 				if (daysBetween<max){
 					list.add(e.getOrderNo());
 				}

+ 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();