Browse Source

Merge branch 'master' of http://git.tjyourong.com.cn/ctop/adsp-cloud

yumeng 3 years ago
parent
commit
3ea5046230
18 changed files with 2012 additions and 196 deletions
  1. 50 31
      jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java
  2. 331 155
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/controller/CwjsPolicyInfoController.java
  3. 1 0
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/controller/CwjsSaleAssistantInfoController.java
  4. 18 1
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/entity/CwjsPolicyInfo.java
  5. 14 0
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/mapper/CwjsPolicyApprovalLogMapper.java
  6. 34 0
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/mapper/CwjsPolicyInfoMapper.java
  7. 35 1
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/mapper/xml/CwjsPolicyApprovalLogMapper.xml
  8. 155 6
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/mapper/xml/CwjsPolicyInfoMapper.xml
  9. 2 2
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/mapper/xml/CwjsSaleAssistantInfoMapper.xml
  10. 15 0
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/service/ICwjsPolicyInfoService.java
  11. 70 0
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/service/impl/CwjsPolicyInfoServiceImpl.java
  12. 16 0
      jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/service/serviceImpl/ReportSettlementServiceImpl.java
  13. 171 0
      jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/controller/ManagerSaleValueController.java
  14. 55 0
      jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/entity/ManagerSaleValue.java
  15. 80 0
      jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/mapper/ManagerSaleValueMapper.java
  16. 556 0
      jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/mapper/xml/ManagerSaleValueMapper.xml
  17. 28 0
      jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/service/IManagerSaleValueService.java
  18. 381 0
      jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/service/impl/ManagerSaleValueServiceImpl.java

+ 50 - 31
jeecg-boot-base/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/DateUtils.java

@@ -5,13 +5,19 @@ import org.slf4j.LoggerFactory;
 import org.springframework.util.StringUtils;
 
 import java.beans.PropertyEditorSupport;
-import java.math.BigDecimal;
-import java.sql.SQLOutput;
 import java.sql.Timestamp;
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.TimeZone;
 
 /**
  * 类描述:时间操作定义类
@@ -1718,6 +1724,18 @@ public class DateUtils extends PropertyEditorSupport {
     }
 
     /**
+     * 获取上个月第一天时间
+     */
+    public static String lastMonthFirstDay(String fmt) {
+        SimpleDateFormat sdf = new SimpleDateFormat(fmt);
+        Calendar calendar = Calendar.getInstance();
+        calendar.add(Calendar.MONTH, -1);
+        calendar.set(Calendar.DAY_OF_MONTH, 1);//设置为1号,当前日期既为本月第一天
+        return sdf.format(calendar.getTime());
+    }
+
+
+    /**
      * 根据数字查询本周对应的日期
      * 1-7对应周一~周天
      *
@@ -1806,6 +1824,7 @@ public class DateUtils extends PropertyEditorSupport {
     /**
      * 日期转int
      * 2022-01-18 ====>>>> 20220118
+     *
      * @param date
      * @return
      */
@@ -1820,6 +1839,7 @@ public class DateUtils extends PropertyEditorSupport {
 
     /**
      * 获取当前月份第一天
+     *
      * @return 返回格式:20220119
      * zian Y
      */
@@ -1827,7 +1847,7 @@ public class DateUtils extends PropertyEditorSupport {
         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
         Calendar c = Calendar.getInstance();
         c.add(Calendar.MONTH, 0);
-        c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天
+        c.set(Calendar.DAY_OF_MONTH, 1);//设置为1号,当前日期既为本月第一天
         String first = format.format(c.getTime());
         return getDateInteger(first);
     }
@@ -1836,6 +1856,7 @@ public class DateUtils extends PropertyEditorSupport {
     /**
      * 整形 年月日 转 String 月-日
      * 20220120 时间格式 转换为 01-20
+     *
      * @param dateString
      * @return
      */
@@ -1847,14 +1868,13 @@ public class DateUtils extends PropertyEditorSupport {
             Date date = df.parse(dateString);
             SimpleDateFormat dfStr = new SimpleDateFormat("MM-dd");
             newDate = dfStr.format(date);
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
         }
         return newDate;
     }
 
 
-
     /**
      * 获取 两个日期之间的所有 日期
      *
@@ -1886,6 +1906,7 @@ public class DateUtils extends PropertyEditorSupport {
 
     /**
      * 时间 去重 排序
+     *
      * @param list
      * @return
      */
@@ -1927,58 +1948,56 @@ public class DateUtils extends PropertyEditorSupport {
     }
 
 
-
     /**
      * 根据本阶段日期 获取上阶段 开始 和 截至 日期
+     *
      * @param startTime 本阶段开始时间
-     * @param endTime 本阶段截至时间
+     * @param endTime   本阶段截至时间
      * @return
      * @throws ParseException
      */
-    public static Map<String,String> getStartEndTime(String startTime,String endTime) throws ParseException {
-        Map<String,String> timeMap = new HashMap();
+    public static Map<String, String> getStartEndTime(String startTime, String endTime) throws ParseException {
+        Map<String, String> timeMap = new HashMap();
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
         Date start = sdf.parse(startTime);
         Date end = sdf.parse(endTime);
         //相差天数
-        Long daysBetween = (end.getTime()-start.getTime())/(60*60*24*1000);
+        Long daysBetween = (end.getTime() - start.getTime()) / (60 * 60 * 24 * 1000);
         String lastTimeStart = getSubtractTime(start, daysBetween.intValue());
         String lastTimeEnd = getSubtractTime(end, daysBetween.intValue());
-        timeMap.put("lastTimeStart",lastTimeStart);
-        timeMap.put("lastTimeEnd",lastTimeEnd);
-        timeMap.put("daysBetween",daysBetween.toString());
+        timeMap.put("lastTimeStart", lastTimeStart);
+        timeMap.put("lastTimeEnd", lastTimeEnd);
+        timeMap.put("daysBetween", daysBetween.toString());
         return timeMap;
     }
 
     /**
      * 返回 日期 - 天数 的string 日期
-     * @param time 时间
+     *
+     * @param time        时间
      * @param daysBetween 天数
      * @return
      */
-    public static String getSubtractTime(Date time,Integer daysBetween){
+    public static String getSubtractTime(Date time, Integer daysBetween) {
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
-        Calendar rightNow  = Calendar.getInstance();
-        rightNow .setTime(time);
-        if (daysBetween.intValue() > 0){
-            rightNow .add(Calendar.DAY_OF_YEAR,-daysBetween.intValue()-1);//日期加 相差的 天数 再 -1
-        }else {
-            rightNow .add(Calendar.DAY_OF_YEAR,-1);//日期 -1
-        }
-        Date rightNowTime = rightNow .getTime();
+        Calendar rightNow = Calendar.getInstance();
+        rightNow.setTime(time);
+        if (daysBetween.intValue() > 0) {
+            rightNow.add(Calendar.DAY_OF_YEAR, -daysBetween.intValue() - 1);//日期加 相差的 天数 再 -1
+        } else {
+            rightNow.add(Calendar.DAY_OF_YEAR, -1);//日期 -1
+        }
+        Date rightNowTime = rightNow.getTime();
         String nowTime = sdf.format(rightNowTime);
         return nowTime;
     }
 
 
-
-
-
-    public static void main(String[] args) throws Exception{
+    public static void main(String[] args) throws Exception {
         //System.out.println(DateUtils.getFirstDayByMonth());
         //System.out.println(intDateToString("20210101"));
 
-       // SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
+        // SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
         //System.out.println(sdf1.parse("20220115"));
 
        /* Double  a = 3.268890;
@@ -1992,10 +2011,10 @@ public class DateUtils extends PropertyEditorSupport {
         //BigDecimal unitRatio = BigDecimal.valueOf((groupNum - yesNum) / yesNum).multiply(new BigDecimal(100));
         //System.out.println(unitRatio);
 
-        System.out.println(getFirstDayByMonth());;
+        System.out.println(getFirstDayByMonth());
+        ;
 
     }
 
 
-
 }

+ 331 - 155
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/controller/CwjsPolicyInfoController.java

@@ -20,6 +20,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.entity.SysUser;
@@ -33,6 +34,7 @@ import org.jeecg.ctop.finance.policy.service.*;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import lombok.extern.slf4j.Slf4j;
 
+import org.jeecg.ctop.finance.policy.service.impl.CwjsCompanySubjectServiceImpl;
 import org.jeecg.ctop.finance.policy.utils.Check;
 import org.jeecg.ctop.finance.policy.utils.ListPageUtil;
 import org.jeecg.ctop.finance.settlement.service.serviceImpl.ReportSettlementServiceImpl;
@@ -110,6 +112,8 @@ public class CwjsPolicyInfoController {
 
 	 }
 
+	 @Autowired
+	 private ICwjsCompanySubjectService cwjsCompanySubjectService;
 	 /**
 	  * 审核-master
 	  * @param id 政策id
@@ -119,136 +123,212 @@ public class CwjsPolicyInfoController {
 	  * @return
 	  */
 	 @GetMapping(value = "/policyApproval")
-	 public Result policyApproval(@RequestParam(name="id",required=true) Integer id,
-	 							@RequestParam(name="type",required=true) Integer type,
-								  @RequestParam(name="userId",required=true) String userId,
+	 public Result policyApproval(@RequestParam(name="id") Integer id,
+	 							@RequestParam(name="type") Integer type,
+								  @RequestParam(name="userId") String userId,
 								@RequestParam(name="approvalContent",required=false) String approvalContent){
-//		LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-		CwjsPolicyInfo cwjsPolicyInfoEntity = cwjsPolicyInfoService.getById(id);
-		 if(cwjsPolicyInfoEntity==null) {
+
+		CwjsPolicyInfo cwjsPolicyInfo = cwjsPolicyInfoService.getById(id);
+		 if(cwjsPolicyInfo==null) {
 			 return Result.error("政策不存在或已被删除,请重新选择要审核的政策。");
 		 }
-		 //获取 主体
-		 Integer companySubjectId= cwjsPolicyInfoEntity.getCompanySubjectId();
+		 cwjsPolicyInfo.setLoginUserId(userId);
+		 cwjsPolicyInfo.setApprovalContent(approvalContent);
+		 //获取 公司主题
+		 Integer companySubjectId = cwjsPolicyInfo.getCompanySubjectId();
 
-		 // 当前用户是否是审核人
-		 CwjsCompanyApprovalUser cwjsCompanyApprovalUser = companyApprovalUserMapper.queryByCompanySubjectIdAndUserId(companySubjectId, userId);
+		 CwjsCompanySubject companySubject = cwjsCompanySubjectService.getById(companySubjectId);
+		 cwjsPolicyInfo.setCompanyId(companySubject.getCompanyId());
 
-		 if(type == 1){	//审核提交	等于新增的时候
-			 List<CwjsCompanyApprovalUser> cwjsCompanyApprovalUsers = companyApprovalUserMapper.queryByCompanySubjectId(companySubjectId);
-			 if(Check.isNull(cwjsCompanyApprovalUsers)){
-				 return Result.errorMsg("此业务线暂时无审核人员,提交审核无效,请联系开发人员添加此区域主体的审核人员");
-			 }
-			 //普通销售,审核都是1,审核进度的人都是等级为0的审核人id
-			 cwjsCompanyApprovalUsers.forEach(cwjsCompanyApprovalUser2 -> {
-				 if(cwjsCompanyApprovalUser2.getLevel() == 0){
-					 cwjsPolicyInfoEntity.setApprovedStatus(1);
-					 cwjsPolicyInfoEntity.setApprovedProgress(cwjsCompanyApprovalUser2.getApprovalUserId());
-				 }
-			 });
-			 //如果满足 当前用户 是 审核人员 且 创建人
-			 cwjsCompanyApprovalUsers.forEach(cwjsCompanyApprovalUser2 -> {
-				 if(cwjsCompanyApprovalUser2.getApprovalUserId().equalsIgnoreCase(cwjsPolicyInfoEntity.getCreateUserId())
-						 && cwjsCompanyApprovalUser2.getApprovalUserId().equalsIgnoreCase(userId)){
-					 CwjsCompanyApprovalUser approvalUserNext = companyApprovalUserMapper.queryByCompanySubjectIdAndLevel(companySubjectId, cwjsCompanyApprovalUser2.getLevel()+1);
-					 if(Check.isNull(approvalUserNext)){
-						 cwjsPolicyInfoEntity.setApprovedStatus(3);
-						 cwjsPolicyInfoEntity.setApprovedProgress(null);
-					 }else{
-						 cwjsPolicyInfoEntity.setApprovedStatus(2);
-						 cwjsPolicyInfoEntity.setApprovedProgress(approvalUserNext.getApprovalUserId());
-					 }
-				 }
-			 });
 
-			 JSONObject wChatIdByUserId = mailLogMapper.getWChatIdByUserId(cwjsPolicyInfoEntity.getApprovedProgress());
-			 StringBuilder text = new StringBuilder();
-			 text.append("您有一条销售政策需要审核,该客户为:");
-			 text.append(cwjsPolicyInfoEntity.getCompanyName());
-			 text.append(",请及时登录助手平台-销售政策页面进行审核,谢谢!");
-			 corpWexinUtils.sendMessageByWeChatId(wChatIdByUserId,text.toString());
-		}
-		 if(type == 2){	//审核通过  是不是终审,不是就给当前的下一个人发企业微信
-			 CwjsCompanyApprovalUser nextApprovalUser = null;
-			 //查询 下一个 审核人
-		 	if(!Check.isNull(cwjsCompanyApprovalUser)){
-				nextApprovalUser = companyApprovalUserMapper.queryByCompanySubjectIdAndLevel(companySubjectId, cwjsCompanyApprovalUser.getLevel() + 1);
+		 //当前政策审核人
+		 String approvalUser = cwjsPolicyInfo.getApprovedProgress();
+
+		 //政策所属销售的部门 和 上级
+		 JSONObject examineUser = cwjsPolicyInfoMapper.getUserLeaderAndDirectorByRoleName(cwjsPolicyInfo.getSaleId(),"分公司总经理");
+		 String firstAudit = "";//第一次审核人
+
+		 // 提交 - 待审核
+		 //华北==> 法务  其他===> 销售上级
+		 if(type == 1){
+		 	if (cwjsPolicyInfo.getAdvancePay() == 0 && cwjsPolicyInfo.getCustomerFlag() == 0){
+				//第一次审核人 -- 法务(法务有多个用户 无法判断审核人 所以 法务审核人为 角色code legalAffairs 占位)
+				//firstAudit = examineUser.getString("directorId");
+				firstAudit = "legalAffairs";
+			}else {
+				//销售的 上级
+				firstAudit = examineUser.getString("leaderId");
 			}
-			 if(Check.isNull(nextApprovalUser)){//没有下一个审核人员,是终审
-				cwjsPolicyInfoEntity.setApprovedStatus(3);
-				 /**
-				  * 终审通过后 添加 起始时间
-				  */
-				 reportSettlementService.cwjsPRofit(cwjsPolicyInfoEntity);
-			}else{	//不是终审
-				cwjsPolicyInfoEntity.setApprovedStatus(2);
-				cwjsPolicyInfoEntity.setApprovedProgress(nextApprovalUser.getApprovalUserId());	//设置一下个人为审核人员
-				 JSONObject wChatIdByUserId = mailLogMapper.getWChatIdByUserId(nextApprovalUser.getApprovalUserId());
+
+			 cwjsPolicyInfo.setApprovedStatus(1);
+			 cwjsPolicyInfo.setApprovedProgress(firstAudit);
+
+
+			 if(StringUtils.equals(firstAudit,"legalAffairs")){
+				 List<JSONObject> legalUserList = cwjsPolicyInfoService.getLegalAffairsUsers();
+				 for (JSONObject jsonObject : legalUserList) {
+					 JSONObject wChatIdByUserId = mailLogMapper.getWChatIdByUserId(jsonObject.getString("userId"));
+					 StringBuilder text = new StringBuilder();
+					 text.append("您有一条销售政策需要审核,该客户为:");
+					 text.append(cwjsPolicyInfo.getCompanyName());
+					 text.append(",请及时登录助手平台-销售政策页面进行审核,谢谢!");
+					 corpWexinUtils.sendMessageByWeChatId(wChatIdByUserId,text.toString());
+				 }
+			 } else {
+				 JSONObject wChatIdByUserId = mailLogMapper.getWChatIdByUserId(cwjsPolicyInfo.getApprovedProgress());
 				 StringBuilder text = new StringBuilder();
 				 text.append("您有一条销售政策需要审核,该客户为:");
-				 text.append(cwjsPolicyInfoEntity.getCompanyName());
+				 text.append(cwjsPolicyInfo.getCompanyName());
 				 text.append(",请及时登录助手平台-销售政策页面进行审核,谢谢!");
 				 corpWexinUtils.sendMessageByWeChatId(wChatIdByUserId,text.toString());
+			 }
+
+			 //添加记录
+			 CwjsPolicyApprovalLog policyApprovalLog = new CwjsPolicyApprovalLog();
+			 policyApprovalLog.setPolicyId(cwjsPolicyInfo.getId());
+			 policyApprovalLog.setCreateUserId(cwjsPolicyInfo.getCreateUserId());
+			 policyApprovalLog.setApprovalStatus(0);
+			 policyApprovalLog.setApprovalContent("提交政策");
+			 policyApprovalLog.setCreateTime(new Date());
+			 policyApprovalLogService.save(policyApprovalLog);
+
+		}
+		 //审核通过 是不是终审,不是就给当前的下一个人发企业微信
+		 if(type == 2){
+
+			 //第一个审核人 - 法务
+		 	if(approvalUser.equals("legalAffairs")){
+				cwjsPolicyInfo.setApprovedStatus(1);
+				cwjsPolicyInfo.setApprovedProgress(examineUser.getString("leaderId"));	//设置一下个审核人员  上级
+		 	}
+
+
+			 //查询审核人角色
+			 String roleCode = roleService.getRoleCodeByUserId(approvalUser);
+
+		 	//第二个审核人 = 上级
+		 	//if(approvalUser.equals(examineUser.getString("leaderId"))){
+		 	if(StringUtils.equals("saleDirector",roleCode)){//审核人角色为销售总监
+		 		if(examineUser.getString("departName").contains("渠道")){
+					cwjsPolicyInfo.setApprovedStatus(3);
+					cwjsPolicyInfoService.updateById(cwjsPolicyInfo);
+
+					/**
+					 * 终审通过后 添加 起始时间
+					 */
+					reportSettlementService.cwjsPRofit(cwjsPolicyInfo);
+					return Result.successMsg("审核通过",cwjsPolicyInfo);
+				}
+
+				if(examineUser.getString("departName").contains("销售")){
+					//华北 ---> 自动转老板
+					if (cwjsPolicyInfo.getCompanyId().equals("d57fecdcf7a94d009736d9c850731582")){
+						//查询 是否符合条件
+						List<JSONObject> autoConveryList = cwjsPolicyInfoMapper.selAutoConveryInfo(cwjsPolicyInfo.getAccountingPeriod(),cwjsPolicyInfo.getMediaType(),
+								cwjsPolicyInfo.getAdvancePay(),cwjsPolicyInfo.getRebateType(),cwjsPolicyInfo.getRebateRate());
+						if (!Check.isNull(autoConveryList)){
+							cwjsPolicyInfoService.automaticConveyBossExamine(cwjsPolicyInfo);
+							cwjsPolicyInfoService.updateById(cwjsPolicyInfo);
+							log.info("-----自动转老板");
+							return Result.successMsg("审核通过",cwjsPolicyInfo);
+						}else {
+							//结束
+							cwjsPolicyInfo.setApprovedStatus(3);
+							cwjsPolicyInfoService.updateById(cwjsPolicyInfo);
+
+							/**
+							 * 终审通过后 添加 起始时间
+							 */
+							reportSettlementService.cwjsPRofit(cwjsPolicyInfo);
+							return Result.successMsg("审核通过",cwjsPolicyInfo);
+
+						}
+					}else {
+						// 下一步审核 分公司总经理
+						cwjsPolicyInfo.setApprovedStatus(1);
+						cwjsPolicyInfo.setApprovedProgress(examineUser.getString("directorId"));	//设置一下个审核人员  分公司总经理
+
+					}
+				}
+
 			}
+
+		 	//第三个审核人- 分公司总经理
+			 if(approvalUser.equals(examineUser.getString("directorId"))){
+				 cwjsPolicyInfo.setApprovedStatus(3);
+				 cwjsPolicyInfoService.updateById(cwjsPolicyInfo);
+
+
+				 /**
+				  * 终审通过后 添加 起始时间
+				  */
+				 reportSettlementService.cwjsPRofit(cwjsPolicyInfo);
+				 return Result.successMsg("审核通过",cwjsPolicyInfo);
+			 }
+
+			 //老板
+			 if (approvalUser.equals(userId) && userId.equals("4aba62011120ac565c7f2b9f8f4aa96b")){
+				 cwjsPolicyInfo.setApprovedStatus(3);
+				 cwjsPolicyInfoService.updateById(cwjsPolicyInfo);
+
+				 /**
+				  * 终审通过后 添加 起始时间
+				  */
+				 reportSettlementService.cwjsPRofit(cwjsPolicyInfo);
+				 return Result.successMsg("审核通过",cwjsPolicyInfo);
+			 }
+
+
+
+
+			 JSONObject wChatIdByUserId = mailLogMapper.getWChatIdByUserId(cwjsPolicyInfo.getApprovedProgress());
+			 StringBuilder text = new StringBuilder();
+			 text.append("您有一条销售政策需要审核,该客户为:");
+			 text.append(cwjsPolicyInfo.getCompanyName());
+			 text.append(",请及时登录助手平台-销售政策页面进行审核,谢谢!");
+			 corpWexinUtils.sendMessageByWeChatId(wChatIdByUserId,text.toString());
+
 			CwjsPolicyApprovalLog policyApprovalLog = new CwjsPolicyApprovalLog();
 			policyApprovalLog.setPolicyId(id);
 			policyApprovalLog.setCreateUserId(userId);
 			policyApprovalLog.setApprovalStatus(0);
+			 policyApprovalLog.setApprovalContent(Check.isNull(approvalContent) ? "审核通过" : approvalContent);
+			 policyApprovalLog.setCreateTime(new Date());
 			policyApprovalLogService.save(policyApprovalLog);
 
-
 		}
 	 	if(type == 3){	//审核拒绝	给申请人发企业微信
-			cwjsPolicyInfoEntity.setApprovedStatus(4);
+			cwjsPolicyInfo.setApprovedStatus(4);
+
 			CwjsPolicyApprovalLog policyApprovalLog = new CwjsPolicyApprovalLog();
+			policyApprovalLog.setApprovalStatus(1);
 			policyApprovalLog.setPolicyId(id);
 			policyApprovalLog.setCreateUserId(userId);
-			policyApprovalLog.setApprovalContent(approvalContent);
-			policyApprovalLog.setApprovalStatus(1);
+			policyApprovalLog.setApprovalContent(Check.isNull(approvalContent) ? "审核拒绝" : approvalContent);
+			policyApprovalLog.setCreateTime(new Date());
 			policyApprovalLogService.save(policyApprovalLog);
 
-			JSONObject wChatIdByUserId = mailLogMapper.getWChatIdByUserId(cwjsPolicyInfoEntity.getCreateUserId());
+
+			JSONObject wChatIdByUserId = mailLogMapper.getWChatIdByUserId(cwjsPolicyInfo.getCreateUserId());
 			StringBuilder text = new StringBuilder();
 			text.append("您有一条销售政策审核未通过,客户为:");
-			text.append(cwjsPolicyInfoEntity.getCompanyName());
+			text.append(cwjsPolicyInfo.getCompanyName());
 			text.append(",请及时登录助手平台-销售政策页面进行政策修改,谢谢!");
 			corpWexinUtils.sendMessageByWeChatId(wChatIdByUserId,text.toString());
 		}
 
-	 	//转领导审批 只有审核人是最后一个人的时候 才可以转领导
+	 	//手动-转领导审批 只有审核人是最后一个人的时候 才可以转领导
 	 	if (type == 4){
-			//根据主体查询 最后一个审核人员
-			CwjsCompanyApprovalUser endApprovalUser = companyApprovalUserMapper.getEndApprovalUserBySub(companySubjectId);
-			if (!Check.isNull(endApprovalUser)){
-				if (!userId.equals(endApprovalUser.getApprovalUserId())){
-					return Result.errorMsg("当前所登录用户不是最后一个审核人员,无法转领导审批。");
-				}
+			// 最后一个审核人员
+			if (!approvalUser.equals(examineUser.getString("leaderId")) && !approvalUser.equals(examineUser.getString("directorId"))){
+				return Result.errorMsg("当前审核人不是最后一个审核人员,无法转领导审批。");
 			}
-			cwjsPolicyInfoEntity.setApprovedStatus(2);
-			cwjsPolicyInfoEntity.setApprovedProgress("4aba62011120ac565c7f2b9f8f4aa96b");	//设置 boss 为审核人员
-			JSONObject wChatIdByUserId = mailLogMapper.getWChatIdByUserId("4aba62011120ac565c7f2b9f8f4aa96b");
-			StringBuilder text = new StringBuilder();
-			text.append("您有一条销售政策需要审核,该客户为:");
-			text.append(cwjsPolicyInfoEntity.getCompanyName());
-			text.append(",请及时登录助手平台-销售政策页面进行审核,谢谢!");
-			corpWexinUtils.sendMessageByWeChatId(wChatIdByUserId,text.toString());
-
-			CwjsPolicyApprovalLog policyApprovalLog = new CwjsPolicyApprovalLog();
-			policyApprovalLog.setPolicyId(id);
-			policyApprovalLog.setCreateUserId(userId);
-			policyApprovalLog.setApprovalStatus(2);//0-审核通过  1-审核不通过 2-转给领导
-			policyApprovalLog.setApprovalContent(approvalContent);
-			policyApprovalLogService.save(policyApprovalLog);
-
 
+			cwjsPolicyInfoService.automaticConveyBossExamine(cwjsPolicyInfo);
 		}
 
-
-
-
-
-		cwjsPolicyInfoService.updateById(cwjsPolicyInfoEntity);
-	 	return Result.successMsg("成功",cwjsPolicyInfoEntity);
+		cwjsPolicyInfoService.updateById(cwjsPolicyInfo);
+	 	return Result.successMsg(type ==  3 ? "审核拒绝" : "审核通过",cwjsPolicyInfo);
 	 }
 
 
@@ -278,70 +358,105 @@ public class CwjsPolicyInfoController {
 		if ("admin".equalsIgnoreCase(roleCode) || "finance".equalsIgnoreCase(roleCode) ){
 
 		}else if("saleDirector".equalsIgnoreCase(roleCode)){
-			//总监 看下属
+			//总监看下属
 			userIds = cwjsPolicyInfoService.getAllSubordinate(userId);
+			cwjsPolicyInfo.setSaleIds(userIds);
 
-		//法务
+			//分公司总经理
+		}else if("CompanyManager".equalsIgnoreCase(roleCode)){
+			//自己所属区域
+			//查询 用户 所属区域 公司主题id
+			List<Integer> subjectId = cwjsPolicyInfoService.getCompanySubjectByUserId(userId);
+			cwjsPolicyInfo.setCompanySubjectIds(subjectId);
+
+			//法务
 		}else if("legalAffairs".equalsIgnoreCase(roleCode)){
-			//法务 查看 华北
-			cwjsPolicyInfo.setCompanySubjectId(1);
+			//法务 查看
+			//cwjsPolicyInfo.setAdvancePay(0); //预付-否
+			//cwjsPolicyInfo.setCustomerFlag(0);// 老客户 -否
+
 		}else {
 			//查询 对应的销售或 助理
 			userIds = cwjsSaleAssistantInfoService.getCwSaleAndAssistantListStr(userId);
 			if (Check.isNull(userIds)){
 				userIds.add(userId);
 			}
-
+			cwjsPolicyInfo.setSaleIds(userIds);
 		}
-		cwjsPolicyInfo.setSaleIds(userIds);
+
+
 
 
         //查询政策
 		List<CwjsPolicyInfo> cwjsPolicyInfoList = cwjsPolicyInfoService.queryPageList(cwjsPolicyInfo);
 		if(Check.isNull(cwjsPolicyInfoList)){
-			return Result.successMsg("没有符合条件的政策,请重新选择。",null);
+			return Result.errorMsg("暂无政策。");
 		}
-
+		//时间 降序
+		Collections.sort(cwjsPolicyInfoList, Comparator.comparing(CwjsPolicyInfo::getCreateTime).reversed());
 
 		List<CwjsPolicyInfo> cwjsPolicyInfos = ListPageUtil.page(cwjsPolicyInfoList, pageSize, pageNo);
 
 		cwjsPolicyInfos.forEach(cwjsPolicy ->{
 			CwjsPolicyApprovalLog log = policyApprovalLogMapper.getOneByPolicyId(cwjsPolicy.getId(),1);	// 查询 被拒 审核意见 最新的一条
-			cwjsPolicy.setApprovalContent(Check.isNull(log) ? "暂无被拒意见" : log.getApprovalContent());
+			cwjsPolicy.setApprovalContent(Check.isNull(log) ? "" : log.getApprovalContent());
+
+			CwjsPolicyApprovalLog forwardContent = policyApprovalLogMapper.getOneByPolicyId(cwjsPolicy.getId(),2);	// 查询 转发领导的理由 最新的一条
+			cwjsPolicy.setTheForwardingBossContent(Check.isNull(forwardContent) ? "" : forwardContent.getApprovalContent());
 
-			CwjsPolicyApprovalLog bossContent = policyApprovalLogMapper.getOneByPolicyId(cwjsPolicy.getId(),2);	// 查询 转发领导的 审核意见 最新的一条
-			cwjsPolicy.setTheBossContent(Check.isNull(bossContent) ? "暂无老板审核意见" : bossContent.getApprovalContent());
+			CwjsPolicyApprovalLog bossContent = policyApprovalLogMapper.getBossOneByPolicyId(cwjsPolicy.getId());	// 查询 老板审核意见 最新的一条
+			if (!Check.isNull(bossContent)){
+				cwjsPolicy.setTheBossContent(StringUtils.equals("终审通过",bossContent.getApprovalContent()) ? "-" : bossContent.getApprovalContent());
+			}else {
+				cwjsPolicy.setTheBossContent("-");
+			}
 
-			CwjsPolicyApprovalLog legalContent = policyApprovalLogMapper.getOneByPolicyId(cwjsPolicy.getId(),11);	// 查询 法务 审核意见 最新的一条
-			cwjsPolicy.setLegalAffairsContent(Check.isNull(legalContent) ? "暂无法务审核意见" : legalContent.getApprovalContent());
+			CwjsPolicyApprovalLog legalContent = policyApprovalLogMapper.getOneByPolicyLegalInfo(cwjsPolicy.getId());	// 查询 法务 审核意见 最新的一条
+			cwjsPolicy.setLegalAffairsContent(Check.isNull(legalContent) ? "" : legalContent.getApprovalContent());
 
 
+			JSONObject examineUser = new JSONObject();
 			String directorUserId = "";
 			//主体为1 为 华北
-			if (cwjsPolicy.getCompanySubjectId() == 1){
+			if (cwjsPolicy.getCompanyId().equals("d57fecdcf7a94d009736d9c850731582")){
 				//查询 该销售 所属的审核人员
 				//华北审核人员 - 法务==>销售总监(销售上级)==>手动转领导/自动转领导
-				directorUserId = cwjsPolicyInfoMapper.getUserLeaderAndDirectorByRoleName(userId,"法务").getString("leaderId");
-
+				examineUser = cwjsPolicyInfoMapper.getUserLeaderAndDirectorByRoleName(cwjsPolicy.getSaleId(),"法务");
+				directorUserId = examineUser.getString("leaderId");
 			}else {
 				//查询 该销售 所属的审核人员
 				//华南审核人员 - 销售总监(销售上级) ==> 分公司经理 ==>转领导
-				directorUserId = cwjsPolicyInfoMapper.getUserLeaderAndDirectorByRoleName(userId,"分公司总经理").getString("directorId");
+				examineUser = cwjsPolicyInfoMapper.getUserLeaderAndDirectorByRoleName(cwjsPolicy.getSaleId(),"分公司总经理");
+				directorUserId = examineUser.getString("directorId");
 
 			}
 
 				//政策当前审核人 = 最后一个审核人 = 当前用户   && 状态不为3 审核通过  && 状态不为4 审核拒绝  ||  当前用户 不是老板
 				// 则显示 转领导审批
+				cwjsPolicy.setTheBossRight("no");
 				if(cwjsPolicy.getApprovedStatus() != 3 && cwjsPolicy.getApprovedStatus() != 4){
-					if (cwjsPolicy.getApprovedProgress().equals(directorUserId) && directorUserId.equals(userId)
-							&& !"80e747cdea6f41dbbc8cde23046fd4e0".equals(userId)){
-						cwjsPolicy.setTheBossRight("yes");
-					}
-				}else {
-					cwjsPolicy.setTheBossRight("no");
-				}
+					if (StringUtils.equals(cwjsPolicy.getApprovedProgress(),directorUserId) && directorUserId.equals(userId)
+							&& !"4aba62011120ac565c7f2b9f8f4aa96b".equals(userId)){
 
+						if(examineUser.getString("departName").contains("渠道")){
+							cwjsPolicy.setTheBossRight("yes");
+						}
 
+						if(examineUser.getString("departName").contains("销售")){
+							//华北
+							if (cwjsPolicy.getCompanyId().equals("d57fecdcf7a94d009736d9c850731582")){
+								//查询 是否符合自动转审条件
+								List<JSONObject> autoConveryList = cwjsPolicyInfoMapper.selAutoConveryInfo(cwjsPolicy.getAccountingPeriod(),cwjsPolicy.getMediaType(),
+										cwjsPolicy.getAdvancePay(),cwjsPolicy.getRebateType(),cwjsPolicy.getRebateRate());
+								if (Check.isNull(autoConveryList)){
+									cwjsPolicy.setTheBossRight("yes");
+								}
+							}else {
+								cwjsPolicy.setTheBossRight("yes");
+							}
+						}
+					}
+				}
 
 			StringBuilder stringBuilder = new StringBuilder();
 
@@ -356,11 +471,22 @@ public class CwjsPolicyInfoController {
 				}
 			}
 			//待审核
-			if (cwjsPolicy.getApprovedStatus() == 1 || cwjsPolicy.getApprovedStatus() == 2){
-				if(cwjsPolicy.getApprovedProgress().equals(userId)){
+			if (cwjsPolicy.getApprovedStatus() == 1){
+				if(StringUtils.equals(cwjsPolicy.getApprovedProgress(),userId)
+						|| (StringUtils.equals(cwjsPolicy.getApprovedProgress(),"legalAffairs") && StringUtils.equals(roleCode,"legalAffairs"))){
 					stringBuilder.append("审核通过").append("|").append("审核拒绝").append("|");
 				}
+
 			}
+			//待审核
+			if (cwjsPolicy.getApprovedStatus() == 2){
+				if(StringUtils.equals(cwjsPolicy.getApprovedProgress(),userId)){
+					stringBuilder.append("审核通过").append("|").append("审核拒绝").append("|");
+				}
+			}
+
+
+
 
 			stringBuilder.append("查看").append("|");
 			cwjsPolicy.setOperation(stringBuilder.deleteCharAt(stringBuilder.lastIndexOf("|")).toString());
@@ -445,35 +571,35 @@ public class CwjsPolicyInfoController {
 				return  Result.errorMsg("您选择的区域和公司主体系统不支持,请联系开发人员开放");
 			}
 			cwjsPolicyInfo.setCompanySubjectId(companySubjectId);
-			List<CwjsCompanyApprovalUser> cwjsCompanyApprovalUsers = companyApprovalUserMapper.queryByCompanySubjectId(companySubjectId);
-			if(Check.isNull(cwjsCompanyApprovalUsers)){
-				return Result.errorMsg("此业务线暂时无审核人员,提交审核无效,请联系开发人员添加此区域主体的审核人员");
-			}
-			//普通销售,新增都是1,审核进度的人都是等级为0的审核人id
-			cwjsCompanyApprovalUsers.forEach(cwjsCompanyApprovalUser -> {
-				if(cwjsCompanyApprovalUser.getLevel() == 0){
-					cwjsPolicyInfo.setApprovedStatus(1);
-					cwjsPolicyInfo.setApprovedProgress(cwjsCompanyApprovalUser.getApprovalUserId());
-				}
-			});
-			//如果满足有审核人员等于当前创建的人,
-			//当前用户 和 选择的销售(创建人) 相同
-			LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-			if(user.getId().equals(cwjsPolicyInfo.getCreateUserId())){
-				cwjsCompanyApprovalUsers.forEach(cwjsCompanyApprovalUser -> {
-					if(cwjsCompanyApprovalUser.getApprovalUserId().equalsIgnoreCase(cwjsPolicyInfo.getCreateUserId())){
-						CwjsCompanyApprovalUser approvalUserNext = companyApprovalUserMapper.queryByCompanySubjectIdAndLevel(companySubjectId, cwjsCompanyApprovalUser.getLevel()+1);
-						if(Check.isNull(approvalUserNext)){
-							cwjsPolicyInfo.setApprovedStatus(3);
-							cwjsPolicyInfo.setApprovedProgress(null);
-						}else{
-							cwjsPolicyInfo.setApprovedStatus(2);
-							cwjsPolicyInfo.setApprovedProgress(approvalUserNext.getApprovalUserId());
-						}
-					}
-				});
+
+
+			//查询销售角色
+			String roleCode = roleService.getRoleCodeByUserId(cwjsPolicyInfo.getSaleId());
+
+
+			//政策所属销售的部门 和 上级
+			JSONObject examineUser = cwjsPolicyInfoMapper.getUserLeaderAndDirectorByRoleName(cwjsPolicyInfo.getSaleId(),"分公司总经理");
+			String firstAudit = "";//第一次审核人
+
+			//普通销售,新增都是1,审核进度的人都是等级为0的审核人i
+			// 预付-否 && 老客户-否
+			if (cwjsPolicyInfo.getAdvancePay() == 0 && cwjsPolicyInfo.getCustomerFlag() == 0){
+				//第一次审核人 -- 法务(法务有多个用户 无法判断审核人 所以 法务审核人为 角色code legalAffairs 占位)
+				//firstAudit = examineUser.getString("directorId");
+				cwjsPolicyInfo.setApprovedStatus(1);
+				firstAudit = "legalAffairs";
+
+				//助理给销售总监创建
+			}else if (StringUtils.equals(roleCode,"saleDirector")){
+				//审核人是销售总监自己
+				firstAudit = cwjsPolicyInfo.getSaleId();
+			}else {
+				//销售的 上级
+				firstAudit = examineUser.getString("leaderId");
 			}
 
+			cwjsPolicyInfo.setApprovedStatus(1);
+			cwjsPolicyInfo.setApprovedProgress(firstAudit);
 
 
 			if(cwjsPolicyInfo.getAdvancePay() == 1){
@@ -484,6 +610,7 @@ public class CwjsPolicyInfoController {
 			SysUser sysUser = sysUserService.getById(cwjsPolicyInfo.getCreateUserId());
 			cwjsPolicyInfo.setCreateUserName(sysUser.getRealname());
 
+			cwjsPolicyInfo.setCreateTime(new Date());
 			cwjsPolicyInfoService.save(cwjsPolicyInfo);
 			JSONArray products = cwjsPolicyInfo.getPolicyProductName();
 			List<CwjsPolicyProduct> policyProductList = new ArrayList<>();
@@ -496,13 +623,37 @@ public class CwjsPolicyInfoController {
 				policyProductList.add(policyProduct);
 			});
 			cwjsPolicyProductService.saveBatch(policyProductList);
-			//先给first发企业微信 -- 先注释掉
-			JSONObject wChatIdByUserId = mailLogMapper.getWChatIdByUserId(cwjsPolicyInfo.getApprovedProgress());
-			StringBuilder text = new StringBuilder();
-			text.append("您有一条销售政策需要审核,该客户为:");
-			text.append(cwjsPolicyInfo.getCompanyName());
-			text.append(",请及时登录助手平台-销售政策页面进行审核,谢谢!");
-			corpWexinUtils.sendMessageByWeChatId(wChatIdByUserId,text.toString());
+
+
+			//发企业微信   法务有两个用户
+			if (StringUtils.equals(cwjsPolicyInfo.getApprovedProgress(),"legalAffairs")){
+				List<JSONObject> legalUserList = cwjsPolicyInfoService.getLegalAffairsUsers();
+				for (JSONObject jsonObject : legalUserList) {
+					JSONObject wChatIdByUserId = mailLogMapper.getWChatIdByUserId(jsonObject.getString("userId"));
+					StringBuilder text = new StringBuilder();
+					text.append("您有一条销售政策需要审核,该客户为:");
+					text.append(cwjsPolicyInfo.getCompanyName());
+					text.append(",请及时登录助手平台-销售政策页面进行审核,谢谢!");
+					corpWexinUtils.sendMessageByWeChatId(wChatIdByUserId,text.toString());
+				}
+			}else {
+				JSONObject wChatIdByUserId = mailLogMapper.getWChatIdByUserId(cwjsPolicyInfo.getApprovedProgress());
+				StringBuilder text = new StringBuilder();
+				text.append("您有一条销售政策需要审核,该客户为:");
+				text.append(cwjsPolicyInfo.getCompanyName());
+				text.append(",请及时登录助手平台-销售政策页面进行审核,谢谢!");
+				corpWexinUtils.sendMessageByWeChatId(wChatIdByUserId,text.toString());
+			}
+
+			//添加记录
+			CwjsPolicyApprovalLog policyApprovalLog = new CwjsPolicyApprovalLog();
+			policyApprovalLog.setPolicyId(cwjsPolicyInfo.getId());
+			policyApprovalLog.setCreateUserId(cwjsPolicyInfo.getCreateUserId());
+			policyApprovalLog.setApprovalStatus(0);
+			policyApprovalLog.setApprovalContent("创建政策");
+			policyApprovalLog.setCreateTime(new Date());
+			policyApprovalLogService.save(policyApprovalLog);
+
 			result.success("添加成功!");
 		} catch (Exception e) {
 			log.error(e.getMessage(),e);
@@ -550,7 +701,19 @@ public class CwjsPolicyInfoController {
 				cwjsPolicyInfo.setDianPayCompanyName(null);
 				cwjsPolicyInfo.setDianPayCompanyRebateRate(null);
 			}
+
+			cwjsPolicyInfo.setCreateUserName(cwjsPolicyInfoEntity.getCreateUserName());
 			cwjsPolicyInfoService.updatePolicyInfoById(cwjsPolicyInfo);
+
+			//添加记录
+			CwjsPolicyApprovalLog policyApprovalLog = new CwjsPolicyApprovalLog();
+			policyApprovalLog.setPolicyId(cwjsPolicyInfo.getId());
+			policyApprovalLog.setCreateUserId(cwjsPolicyInfo.getCreateUserId());
+			policyApprovalLog.setApprovalStatus(0);
+			policyApprovalLog.setApprovalContent("修改政策");
+			policyApprovalLog.setCreateTime(new Date());
+			policyApprovalLogService.save(policyApprovalLog);
+
 			result.success("修改成功!");
 		}
 		return result;
@@ -738,4 +901,17 @@ public class CwjsPolicyInfoController {
   	return Result.OK();
   }
 
-}
+
+	 @ApiOperation(value="查询政策审核记录", notes="查询政策审核记录")
+	 @GetMapping(value = "/getPolicyApprovalLogByPolicyId")
+	 public Result getPolicyApprovalLogByPolicyId(@RequestParam(name="policyId") Integer policyId) {
+		 return cwjsPolicyInfoService.getPolicyApprovalLogByPolicyId(policyId);
+	 }
+
+
+
+
+
+
+
+ }

+ 1 - 0
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/controller/CwjsSaleAssistantInfoController.java

@@ -76,6 +76,7 @@ public class CwjsSaleAssistantInfoController {
 															  HttpServletRequest req) {
 		Result<IPage<CwjsSaleAssistantInfo>> result = new Result<>();
 		QueryWrapper<CwjsSaleAssistantInfo> queryWrapper = QueryGenerator.initQueryWrapper(cwjsSaleAssistantInfo, req.getParameterMap());
+		queryWrapper.eq("del_flag", 0);
 		queryWrapper.orderByDesc("update_time");
 		Page<CwjsSaleAssistantInfo> page = new Page<CwjsSaleAssistantInfo>(pageNo, pageSize);
 		IPage<CwjsSaleAssistantInfo> pageList = cwjsSaleAssistantInfoService.page(page, queryWrapper);

+ 18 - 1
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/entity/CwjsPolicyInfo.java

@@ -51,6 +51,9 @@ public class CwjsPolicyInfo implements Serializable{
 	@Excel(name = "我司主体", width = 15)
     @ApiModelProperty(value = "我司主体")
 	private Integer companySubjectId;
+
+	@TableField(exist = false)
+	private String companyId;
 	/**集团简称*/
 	@Excel(name = "集团简称", width = 15)
     @ApiModelProperty(value = "集团简称")
@@ -65,6 +68,11 @@ public class CwjsPolicyInfo implements Serializable{
 	@Excel(name = "是否预付:0:否  1:是 ", width = 15)
     @ApiModelProperty(value = "是否预付:0:否  1:是 ")
 	private Integer advancePay;
+
+	/**是否老客户:0:否  1:是 */
+	@Excel(name = "是否老客户:0:否  1:是 ", width = 15)
+	@ApiModelProperty(value = "是否老客户:0:否  1:是 ")
+	private Integer customerFlag;
 	/**账期*/
 	@Excel(name = "账期", width = 15)
     @ApiModelProperty(value = "账期")
@@ -165,10 +173,19 @@ public class CwjsPolicyInfo implements Serializable{
 	/* 是否显示老板审批的 操作 yes显示 no 不显示*/
 	@TableField(exist = false)
 	private String theBossRight;
-	/* 给老板审核的理由*/
+	/* 老板审核的内容*/
 	@TableField(exist = false)
 	private String theBossContent;
+
+	/* 给老板审核的理由*/
+	@TableField(exist = false)
+	private String theForwardingBossContent;
 	/* 法务审核意见*/
 	@TableField(exist = false)
 	private String legalAffairsContent;
+
+
+	@TableField(exist = false)
+	private String loginUserId;
+
 }

+ 14 - 0
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/mapper/CwjsPolicyApprovalLogMapper.java

@@ -22,4 +22,18 @@ public interface CwjsPolicyApprovalLogMapper extends BaseMapper<CwjsPolicyApprov
      * @return
      */
     CwjsPolicyApprovalLog getOneByPolicyId(@Param("policyId") Integer policyId,@Param("status") Integer status);
+
+    /**
+     * 根据政策id 查询 法务最新审核意见
+     * @param policyId
+     * @return
+     */
+    CwjsPolicyApprovalLog getOneByPolicyLegalInfo(@Param("policyId") Integer policyId);
+
+    /**
+     * 根据政策id 查询 老板审核意见记录
+     * @param policyId
+     * @return
+     */
+    CwjsPolicyApprovalLog getBossOneByPolicyId(@Param("policyId") Integer policyId);
 }

+ 34 - 0
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/mapper/CwjsPolicyInfoMapper.java

@@ -1,10 +1,12 @@
 package org.jeecg.ctop.finance.policy.mapper;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
 import com.alibaba.fastjson.JSONObject;
 import org.apache.ibatis.annotations.Param;
+import org.elasticsearch.search.DocValueFormat;
 import org.jeecg.ctop.finance.policy.entity.CwjsPolicyInfo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
@@ -40,6 +42,38 @@ public interface CwjsPolicyInfoMapper extends BaseMapper<CwjsPolicyInfo> {
 
     //查询用户所属公司及区域 以及 上级领导 和 分公司负责人
     JSONObject getUserLeaderAndDirectorByRoleName(@Param("userId") String userId,@Param("roleName") String roleName);
+    JSONObject getUserLeaderByUserId(@Param("userId") String userId);
+
+    /**
+     * 查询 自动转审条件
+     * @param accountingPeriod 账期
+     * @param mediaType 媒体类型 1-头条 2-快手 3-千川 4-UD 5-阿里内广 6-快手服务商 7-磁力金牛 8-头条内广
+     * @param advancePay  是否预付:0:否  1:是'
+     * @param rebateType 返点类型 返点类型:0:返现  1:返货   2:返现+返货 3-服务费
+     * @param rebateRate 返点比例
+     * @return
+     */
+    List<JSONObject> selAutoConveryInfo(@Param("accountingPeriod") String accountingPeriod,
+                                        @Param("mediaType") Integer mediaType,
+                                        @Param("advancePay") Integer advancePay,
+                                        @Param("rebateType") Integer rebateType,
+                                        @Param("rebateRate") BigDecimal rebateRate
+                                        );
+
+
+
+    //查询 政策审核记录
+     List<JSONObject> getPolicyApprovalLogByPolicyId(@Param("policyId") Integer policyId);
+
+     //查询 用户所属公司主题id
+     List<Integer> getCompanySubjectByUserId(@Param("userId") String userId);
+
+     //查询 法务人员
+     List<JSONObject> getLegalAffairsUsers();
+
+
+
+
 
 
 }

+ 35 - 1
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/mapper/xml/CwjsPolicyApprovalLogMapper.xml

@@ -3,12 +3,46 @@
 <mapper namespace="org.jeecg.ctop.finance.policy.mapper.CwjsPolicyApprovalLogMapper">
 
 
-    <!-- 根据政策id 查询 审核意见记录  -->
+    <!-- 根据政策id 查询 审核意见记录  手动转给领导的审核意见 不包含自动转 -->
     <select id="getOneByPolicyId" resultType="org.jeecg.ctop.finance.policy.entity.CwjsPolicyApprovalLog">
         select * from ctop_cwjs_policy_approval_log
         where policy_id = #{policyId}
           and approval_status = #{status}
+        and approval_content != '转审领导'
         order by create_time desc
         LIMIT 1
     </select>
+
+    <!-- 根据政策id 查询 法务最新审核意见  -->
+    <select id="getOneByPolicyLegalInfo" resultType="org.jeecg.ctop.finance.policy.entity.CwjsPolicyApprovalLog">
+        SELECT
+            l.*
+        FROM
+            ctop_cwjs_policy_approval_log l
+                LEFT JOIN sys_user_role ur ON l.create_user_id = ur.user_id
+                LEFT JOIN sys_role r ON r.id = ur.role_id
+        WHERE
+            r.role_name = '法务'
+          AND l.policy_id = #{policyId}
+          and l.approval_content is NOT NULL
+        ORDER BY
+            l.create_time DESC
+            LIMIT 1
+    </select>
+
+
+
+    <!-- 根据政策id 查询 老板审核意见记录   -->
+    <select id="getBossOneByPolicyId" resultType="org.jeecg.ctop.finance.policy.entity.CwjsPolicyApprovalLog">
+        select * from ctop_cwjs_policy_approval_log
+        where policy_id = #{policyId}
+          and create_user_id = '4aba62011120ac565c7f2b9f8f4aa96b'
+        order by create_time desc
+            LIMIT 1
+    </select>
+
+
+
+
+
 </mapper>

+ 155 - 6
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/mapper/xml/CwjsPolicyInfoMapper.xml

@@ -7,7 +7,9 @@
     <select id="selectPolicyInfos" resultType="org.jeecg.ctop.finance.policy.entity.CwjsPolicyInfo">
         select t1.policy_product_name as productName,t2.* ,
                (select u.realname from sys_user u where u.id = t2.sale_id) as saleName,
-                sub.company_subject_name CompanySubjectName
+                sub.company_subject_name CompanySubjectName,
+               sub.area_info as areaInfo,
+        sub.company_id as companyId
         from ctop_cwjs_policy_product t1
             LEFT JOIN ctop_cwjs_policy_info t2 on t1.policy_id = t2.id
         LEFT JOIN ctop_cwjs_company_subject sub on sub.id = t2.company_subject_id
@@ -18,6 +20,8 @@
         <if test="dianPayCompanyName != null and dianPayCompanyName != ''">and t2.dian_pay_company_name like concat(concat('%',#{dianPayCompanyName}),'%')</if>
         <if test="mediaType != null">and t2.media_type = #{mediaType}</if>
         <if test="rebateType != null">and t2.rebate_type = #{rebateType}</if>
+        <if test="advancePay != null">and t2.advance_pay = #{advancePay}</if>
+        <if test="customerFlag != null">and t2.customer_flag = #{customerFlag}</if>
 
 
         <if test="saleIds != null and saleIds.size() > 0">
@@ -36,8 +40,16 @@
           and t2.approved_progress = #{approvedProgress}
         </if>
 
-        <if test="companySubjectId != null and companySubjectId != ''">
-          and t2.company_subject_id = #{companySubjectId}
+         <if test="saleId != null and saleId != ''">
+          and t2.sale_id = #{saleId}
+        </if>
+
+        <if test="companySubjectIds != null and companySubjectIds.size() > 0">
+            and (t2.company_subject_id in
+            <foreach item="item" index="index" collection="companySubjectIds" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+                )
         </if>
 
 
@@ -52,7 +64,7 @@
         and ((#{policyStartDate} &lt;= t2.policy_start_date and #{policyEndDate} &gt;= t2.policy_start_date)
         or (#{policyStartDate} &gt;= t2.policy_start_date and #{policyStartDate} &lt;= t2.policy_end_date))
         </if>
-        order by t2.create_time desc
+        order by t2.create_time DESC, t2.id DESC
     </select>
 
     <select id="getAllSale" resultType="com.alibaba.fastjson.JSONObject">
@@ -142,6 +154,7 @@
              group_abbreviation = #{groupAbbreviation},
              approved_progress = #{approvedProgress},
              advance_pay = #{advancePay},
+             customer_flag = #{customerFlag},
              accounting_period = #{accountingPeriod},
              rebate_type = #{rebateType},
              rebate_rate = #{rebateRate},
@@ -249,7 +262,8 @@
             a.leader_name leaderName,
             b.realname directorName,
             b.role_code directorRoleCode,
-            b.user_id directorId
+            b.user_id directorId,
+            a.depart_name departName
         FROM
             (
                 SELECT
@@ -257,10 +271,12 @@
                     c.company_name,
                     c.nick_name,
                     u.leader_id,
-                    u.leader_name
+                    u.leader_name,
+                    d.depart_name
                 FROM
                     `user_company` c
                         LEFT JOIN sys_user u on c.user_id = u.id
+                        LEFT JOIN sys_depart d on d.org_code = u.org_code
                 WHERE
                     user_id = #{userId}
             ) a LEFT JOIN
@@ -285,6 +301,139 @@
             limit 1
     </select>
 
+    <!-- 查询用户上级 以及所在部门 -->
+    <select id="getUserLeaderByUserId" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+            u.leader_id leaderId,
+            u.leader_name leaderName,
+            d.depart_name  departName
+        FROM
+          sys_user u,
+          sys_depart d
+          where u.org_code= d.org_code
+          and u.id = #{userId}
+            limit 1
+    </select>
+
+
+
+    <!-- 查询 自动转审条件 -->
+    <select id="selAutoConveryInfo" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT * FROM `ctop_cwjs_auto_convery_condition`
+        WHERE 1=1
+        and del_flag = 0
+        and (accounting_period &lt;= #{accountingPeriod})
+        or (
+        media_type = #{mediaType}
+        and advance_pay = #{advancePay}
+        and rebate_type = #{rebateType}
+        and rebate_rate &lt; #{rebateRate}
+        )
+    </select>
+
+
+
+
+    <!-- 查询 政策审核记录 -->
+    <select id="getPolicyApprovalLogByPolicyId" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+            t.*,
+            IFNULL( IF ( t.userid = 'legalAffairs', '法务人员', u.realname ), t.create_user_name ) userName,
+            IF
+                ( t.userId = 'legalAffairs', '法务', r.role_name ) roleName,
+            IF(t.createTime is NULL or t.createTime ='' ,1,10) sort
+        FROM
+            (
+                (SELECT
+                    l.id,
+                    l.policy_id policyId,
+                    l.approval_status approvalStatus,
+                    CASE
+                        l.approval_status
+                        WHEN 1 THEN
+                            '审核拒绝'
+                        WHEN 2 THEN
+                            '转审领导'
+                        WHEN 3 THEN
+                            '老板审核' ELSE l.approval_content
+                        END AS approvalContent,
+                    l.create_user_id userId,
+                    p.create_user_name,
+                    l.create_time createTime
+                FROM
+                    `jeecg-boot`.`ctop_cwjs_policy_approval_log` l
+                        LEFT JOIN `jeecg-boot`.ctop_cwjs_policy_info p ON l.policy_id = p.id
+                WHERE
+                    l.policy_id = #{policyId})
+                UNION
+                (SELECT
+                    p.id,
+                    p.id policyId,
+                    '0' approvalStatus,
+                    CASE
+                        p.approved_status
+                        WHEN 1 THEN
+                            '待审核'
+                        WHEN 2 THEN
+                            '待审核'
+                        WHEN 3 THEN
+                            '审核完成'
+                        WHEN 4 THEN
+                            '待提交' ELSE '-'
+                        END AS approvalContent,
+                    IF(p.approved_status = 4 , p.create_user_id, p.approved_progress ) userId,
+                    p.create_user_name,
+                    '' createTime
+                FROM
+                    ctop_cwjs_policy_info p
+                WHERE
+                    p.id = #{policyId})
+            ) t
+                LEFT JOIN `jeecg-boot`.sys_user u ON t.userid = u.id
+                LEFT JOIN `jeecg-boot`.sys_user_role ur ON ur.user_id = u.id
+                LEFT JOIN `jeecg-boot`.sys_role r ON r.id = ur.role_id
+        ORDER BY
+                 sort DESC,createTime
+
+    </select>
+
+
+
+
+
+    <!-- 查询 用户所属公司主题id -->
+    <select id="getCompanySubjectByUserId" resultType="java.lang.Integer">
+        SELECT
+            s.id subjectId
+        FROM
+            user_company c
+                LEFT JOIN ctop_cwjs_company_subject s ON c.company_id = s.company_id
+                AND s.del_flag = 0
+        WHERE
+            user_id = #{userId}
+
+    </select>
+
+
+    <!-- 查询 法务人员 -->
+    <select id="getLegalAffairsUsers" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+            r.role_name,
+            r.role_code,
+            ur.user_id userId,
+            u.realname
+        FROM
+            sys_role r
+                LEFT JOIN sys_user_role ur ON r.id = ur.role_id
+                LEFT JOIN sys_user u ON u.id = ur.user_id
+        WHERE
+            r.role_name = '法务'
+          AND u.`status` = 1
+          AND u.del_flag = 0
+    </select>
+
+
+
 
 
 

+ 2 - 2
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/mapper/xml/CwjsSaleAssistantInfoMapper.xml

@@ -115,7 +115,7 @@
         WHERE
         s.del_flag = 0
         <if test="userId !=null and userId != ''">
-            AND s.sale_id = #{userId} OR s.assistant_id = #{userId}
+            AND (s.sale_id = #{userId} OR s.assistant_id = #{userId})
         </if>
         UNION
         SELECT
@@ -125,7 +125,7 @@
         WHERE
         s.del_flag = 0
         <if test="userId !=null and userId != ''">
-            AND s.sale_id = #{userId} OR s.assistant_id = #{userId}
+            AND (s.sale_id = #{userId} OR s.assistant_id = #{userId})
         </if>
             )
     </select>

+ 15 - 0
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/service/ICwjsPolicyInfoService.java

@@ -2,6 +2,8 @@ package org.jeecg.ctop.finance.policy.service;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import io.swagger.models.auth.In;
+import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.entity.SysUser;
 import org.jeecg.ctop.finance.policy.entity.CwjsPolicyInfo;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -32,4 +34,17 @@ public interface ICwjsPolicyInfoService extends IService<CwjsPolicyInfo> {
     boolean isExistCwjsPolicyInfo(CwjsPolicyInfo policyInfo);
 
     void updatePolicyInfoById(CwjsPolicyInfo policyInfo);
+
+
+    //自动转老板审核
+    void automaticConveyBossExamine(CwjsPolicyInfo policyInfo);
+
+    Result getPolicyApprovalLogByPolicyId(Integer policyId);
+
+    List<Integer> getCompanySubjectByUserId(String userId);
+
+    List<JSONObject> getLegalAffairsUsers();
+
+
+
 }

+ 70 - 0
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/policy/service/impl/CwjsPolicyInfoServiceImpl.java

@@ -1,10 +1,15 @@
 package org.jeecg.ctop.finance.policy.service.impl;
 
+import cn.com.ctop.common.module.mapper.MailLogMapper;
 import cn.com.ctop.common.module.mapper.SysUserMapper;
+import cn.com.ctop.common.module.utils.CorpWexinUtils;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
+import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.entity.SysUser;
+import org.jeecg.common.util.DateUtils;
+import org.jeecg.ctop.finance.policy.entity.CwjsPolicyApprovalLog;
 import org.jeecg.ctop.finance.policy.entity.CwjsPolicyInfo;
 import org.jeecg.ctop.finance.policy.mapper.CwjsPolicyInfoMapper;
 import org.jeecg.ctop.finance.policy.service.ICwjsPolicyInfoService;
@@ -28,6 +33,15 @@ public class CwjsPolicyInfoServiceImpl extends ServiceImpl<CwjsPolicyInfoMapper,
     @Resource
     CwjsPolicyInfoMapper policyInfoMapper;
 
+    @Resource
+    private MailLogMapper mailLogMapper;
+
+    @Resource
+    private CorpWexinUtils corpWexinUtils;
+
+    @Resource
+    private CwjsPolicyApprovalLogServiceImpl policyApprovalLogService;
+
     /**
      *
      * @description: 查看政策列表
@@ -100,6 +114,7 @@ public class CwjsPolicyInfoServiceImpl extends ServiceImpl<CwjsPolicyInfoMapper,
 
     @Autowired
     private SysUserMapper userMapper;
+
     @Override
     public List<JSONObject> getAllSubordinate2(String userId){
         List<SysUser> allList = userMapper.selectAllUser();
@@ -157,4 +172,59 @@ public class CwjsPolicyInfoServiceImpl extends ServiceImpl<CwjsPolicyInfoMapper,
     public void updatePolicyInfoById(CwjsPolicyInfo policyInfo){
         policyInfoMapper.updatePolicyInfoById(policyInfo);
     }
+
+
+
+    @Override
+    public void automaticConveyBossExamine(CwjsPolicyInfo cwjsPolicyInfo) {
+        cwjsPolicyInfo.setApprovedStatus(2);
+        cwjsPolicyInfo.setApprovedProgress("4aba62011120ac565c7f2b9f8f4aa96b");	//设置 boss 为审核人员
+        JSONObject wChatIdByUserId = mailLogMapper.getWChatIdByUserId("4aba62011120ac565c7f2b9f8f4aa96b");
+        StringBuilder text = new StringBuilder();
+        text.append("您有一条销售政策需要审核,该客户为:");
+        text.append(cwjsPolicyInfo.getCompanyName());
+        text.append(",请及时登录助手平台-销售政策页面进行审核,谢谢!");
+        corpWexinUtils.sendMessageByWeChatId(wChatIdByUserId,text.toString());
+        CwjsPolicyApprovalLog policyApprovalLog = new CwjsPolicyApprovalLog();
+        policyApprovalLog.setPolicyId(cwjsPolicyInfo.getId());
+        policyApprovalLog.setCreateUserId(cwjsPolicyInfo.getLoginUserId());
+        policyApprovalLog.setApprovalStatus(2);//0-审核通过  1-审核不通过 2-转给领导
+        policyApprovalLog.setApprovalContent(Check.isNull(cwjsPolicyInfo.getApprovalContent()) ? "转审领导" : cwjsPolicyInfo.getApprovalContent());
+        policyApprovalLog.setCreateTime(new Date());
+        policyApprovalLogService.save(policyApprovalLog);
+    }
+
+    /**
+     * 查询 政策审核记录
+     * @param policyId
+     * @return
+     */
+    @Override
+    public Result getPolicyApprovalLogByPolicyId(Integer policyId) {
+        List<JSONObject> policyApprovalList = policyInfoMapper.getPolicyApprovalLogByPolicyId(policyId);
+        //不显示审核意见
+        for (JSONObject object : policyApprovalList) {
+            if (object.getString("approvalContent").length() > 4){
+                object.put("approvalContent","审核"+(object.getString("approvalStatus").equals("0") ? "成功" : "失败"));
+            }
+        }
+
+        return Result.successMsg("政策审核记录查询成功",policyApprovalList);
+    }
+
+    @Override
+    public List<Integer> getCompanySubjectByUserId(String userId) {
+        return policyInfoMapper.getCompanySubjectByUserId(userId);
+    }
+
+
+    @Override
+    public List<JSONObject> getLegalAffairsUsers() {
+        return policyInfoMapper.getLegalAffairsUsers();
+    }
+
+
+
+
+
 }

+ 16 - 0
jeecg-boot-finance/src/main/java/org/jeecg/ctop/finance/settlement/service/serviceImpl/ReportSettlementServiceImpl.java

@@ -25,9 +25,11 @@ import org.jeecg.common.system.entity.SysUser;
 import org.jeecg.common.system.vo.LoginUser;
 import org.jeecg.common.util.DateUtils;
 import org.jeecg.ctop.finance.policy.entity.CwjsCompanySubject;
+import org.jeecg.ctop.finance.policy.entity.CwjsPolicyApprovalLog;
 import org.jeecg.ctop.finance.policy.entity.CwjsPolicyInfo;
 import org.jeecg.ctop.finance.policy.entity.CwjsPolicyProduct;
 import org.jeecg.ctop.finance.policy.mapper.CwjsCompanySubjectMapper;
+import org.jeecg.ctop.finance.policy.mapper.CwjsPolicyApprovalLogMapper;
 import org.jeecg.ctop.finance.policy.mapper.CwjsPolicyInfoMapper;
 import org.jeecg.ctop.finance.policy.mapper.CwjsPolicyProductMapper;
 import org.jeecg.ctop.finance.policy.service.ICreateSheetService;
@@ -882,6 +884,9 @@ public class ReportSettlementServiceImpl implements IReportSettlementService {
     @Resource
     private CwjsPolicyProductMapper cwjsPolicyProductMapper;
 
+    @Resource
+    private CwjsPolicyApprovalLogMapper policyApprovalLogMapper;
+
     @Override
     public void cwjsPRofit(CwjsPolicyInfo cwjsPolicyInfo) {
         // 获取两个日期之间 所有的 时间 年-月-日
@@ -908,6 +913,17 @@ public class ReportSettlementServiceImpl implements IReportSettlementService {
                 cwjsProfitMapper.replaceCwjsSlettementProfit(reportList);
             }
         }
+
+        //添加记录
+        CwjsPolicyApprovalLog policyApprovalLog = new CwjsPolicyApprovalLog();
+        policyApprovalLog.setPolicyId(cwjsPolicyInfo.getId());
+        policyApprovalLog.setCreateUserId(cwjsPolicyInfo.getLoginUserId());
+        policyApprovalLog.setApprovalStatus(0);
+        policyApprovalLog.setApprovalContent(Check.isNull(cwjsPolicyInfo.getApprovalContent()) ? "终审通过" : cwjsPolicyInfo.getApprovalContent());
+        policyApprovalLogMapper.insert(policyApprovalLog);
+
+
+
     }
 
     @Resource

+ 171 - 0
jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/controller/ManagerSaleValueController.java

@@ -0,0 +1,171 @@
+package org.jeecg.ctop.material.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.ctop.material.constants.Check;
+import org.jeecg.ctop.material.constants.ExportExcelUtils;
+import org.jeecg.ctop.material.entity.ManagerSaleValue;
+import org.jeecg.ctop.material.service.IManagerSaleValueService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 分公司总经理&销售总监阶段性目标值
+ *
+ * @author jeecg-boot
+ * @version V1.0
+ * @date 2022-04-14
+ */
+@Slf4j
+@Api(tags = "分公司总经理&销售总监阶段性目标值")
+@RestController
+@RequestMapping("/manager/sale")
+public class ManagerSaleValueController {
+    @Autowired
+    private IManagerSaleValueService managerSaleValueService;
+
+    /**
+     * 查询人员权限和公司
+     */
+    @GetMapping(value = "/getCompany")
+    public Result<Object> getCompany(String userId) {
+        if (Check.isNull(userId)) {
+            return Result.error("缺少参数");
+        }
+        try {
+            return managerSaleValueService.getCompany(userId);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return Result.error("查询失败");
+        }
+    }
+
+
+    /**
+     * 查询当日消耗 + 月度消耗
+     */
+    @GetMapping(value = "/getDayAndMonthlyCharges")
+    public Result<Object> getDayAndMonthlyCharges(String userId, String mediaId, String companyId) {
+        if (Check.isNull(userId) || Check.isNull(mediaId) || Check.isNull(companyId)) {
+            return Result.error("缺少参数");
+        }
+        try {
+            return managerSaleValueService.getDayAndMonthlyCharges(userId, mediaId, companyId);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return Result.error("查询失败");
+        }
+    }
+
+    /**
+     * 设置本月消耗完成度
+     */
+    @PostMapping(value = "/setUpManagerSaleValue")
+    public Result<Object> setUpManagerSaleValue(@RequestBody ManagerSaleValue sale) {
+        if (Check.isNull(sale.getCompanyId()) || Check.isNull(sale.getMediaId()) || Check.isNull(sale.getUserId()) || (Check.isNull(sale.getWeeklyGoalValue()) && Check.isNull(sale.getMonthlyGoalValue()))) {
+            return Result.error("缺少参数");
+        }
+        try {
+            managerSaleValueService.setUpManagerSaleValue(sale);
+            return Result.ok("success");
+        } catch (Exception e) {
+            e.printStackTrace();
+            return Result.error("修改失败");
+        }
+    }
+
+    /**
+     * 查询home页消耗+平台消耗
+     */
+    @GetMapping(value = "/getHomeCharges")
+    public Result<Object> getHomeCharges(String userId, String mediaId, String companyId, String startTime, String endTime) {
+        if (Check.isNull(userId) || Check.isNull(mediaId) || Check.isNull(companyId) || Check.isNull(startTime) || Check.isNull(endTime)) {
+            return Result.error("缺少参数");
+        }
+        try {
+            return managerSaleValueService.getHomeCharges(userId, mediaId, companyId, startTime, endTime);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return Result.error("查询失败");
+        }
+    }
+
+    /**
+     * 项目消耗排行列表
+     */
+    @GetMapping(value = "/getProjectChargeTop")
+    public Result<Object> getProjectChargeTop(String userId, String mediaId, String companyId, String startTime, String endTime, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                              @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
+        if (Check.isNull(userId) || Check.isNull(mediaId) || Check.isNull(companyId) || Check.isNull(startTime) || Check.isNull(endTime)) {
+            return Result.error("缺少参数");
+        }
+        try {
+            PageInfo page = managerSaleValueService.getProjectChargeTop(userId, mediaId, companyId, startTime, endTime, pageNo, pageSize);
+            return Result.ok(page);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return Result.error("查询失败", e.getMessage());
+        }
+    }
+
+    /**
+     * 项目消耗排行列表
+     */
+    @GetMapping(value = "/getProjectChargeExcel")
+    public void getProjectChargeExcel(HttpServletResponse response, String userId, String mediaId, String companyId, String startTime, String endTime, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                      @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
+        try {
+
+            PageInfo page = managerSaleValueService.getProjectChargeTop(userId, mediaId, companyId, startTime, endTime, pageNo, 9999999);
+            List<JSONObject> list = page.getList();
+            List<List<Object>> excelList = new ArrayList<>();
+            if (!list.isEmpty()) {
+                list.forEach(data -> {
+                    List<Object> temp = new ArrayList<>();
+                    temp.add(data.getLong("projectId"));
+                    temp.add(data.getString("projectName"));
+                    temp.add(data.getString("saleName"));
+                    temp.add(data.getString("chargeRoi"));
+                    temp.add(data.getString("realCharge"));
+                    temp.add(data.getString("jlCharge"));
+                    excelList.add(temp);
+                });
+            }
+            List<String> titles = new ArrayList<>();
+            titles.add(0, "项目名称");
+            titles.add(1, "销售");
+            titles.add(2, "消耗");
+            titles.add(3, "消耗环比");
+            titles.add(4, "现金消耗");
+            titles.add(5, "激励消耗");
+
+            OutputStream os = response.getOutputStream();
+            ExportExcelUtils eeu = new ExportExcelUtils();
+            XSSFWorkbook workbook = new XSSFWorkbook();
+            String[] headers = titles.toArray(new String[titles.size()]);
+            eeu.exportExcelForAttendance(workbook, 0, "项目消耗", headers, excelList);
+            workbook.write(os);
+            os.flush();
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("查询失败", e.getMessage());
+        }
+    }
+
+
+}

+ 55 - 0
jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/entity/ManagerSaleValue.java

@@ -0,0 +1,55 @@
+package org.jeecg.ctop.material.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.jeecgframework.poi.excel.annotation.Excel;
+
+/**
+ * 分公司总经理&销售总监阶段性目标值
+ * @author jeecg-boot
+ * @date   2022-04-14
+ * @version V1.0
+ */
+@Data
+@TableName("sys_manager_sale_value")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="sys_manager_sale_value对象", description="分公司总经理&销售总监阶段性目标值")
+public class ManagerSaleValue {
+    
+	/**id*/
+	@TableId(type = IdType.UUID)
+    @ApiModelProperty(value = "id")
+	private String id;
+	/**经理id*/
+	@Excel(name = "经理id", width = 15)
+    @ApiModelProperty(value = "经理id")
+	private String userId;
+	/**公司id*/
+	@Excel(name = "公司id", width = 15)
+    @ApiModelProperty(value = "公司id")
+	private String companyId;
+	/**媒体,1头条,2快手*/
+	@Excel(name = "媒体,1头条,2快手", width = 15)
+    @ApiModelProperty(value = "媒体,1头条,2快手")
+	private Integer mediaId;
+	/**快手消耗目标值*/
+	@Excel(name = "快手消耗目标值", width = 15)
+    @ApiModelProperty(value = "快手消耗目标值")
+	private String weeklyGoalValue;
+	/**快手消耗目标值*/
+	@Excel(name = "快手消耗目标值", width = 15)
+    @ApiModelProperty(value = "快手消耗目标值")
+	private String monthlyGoalValue;
+}

+ 80 - 0
jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/mapper/ManagerSaleValueMapper.java

@@ -0,0 +1,80 @@
+package org.jeecg.ctop.material.mapper;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.ctop.material.entity.ManagerSaleValue;
+
+import java.util.List;
+
+/**
+ * 分公司总经理&销售总监阶段性目标值
+ *
+ * @author jeecg-boot
+ * 2022-04-14
+ * @version V1.0
+ */
+public interface ManagerSaleValueMapper extends BaseMapper<ManagerSaleValue> {
+
+
+    /**
+     * =----------------------------------------------------------------------------------------------------------------=
+     */
+    String getRoleCodeByUserId(@Param("userId") String userId);
+
+    List<JSONObject> queryUserCompany(@Param("userId") String userId);
+
+    String getUserNameById(@Param("userId") String userId);
+
+    List<JSONObject> queryList();
+
+    List<String> querySaleDirctorItsTeamMember(@Param("userId") String userId);
+
+    List<Long> getCompanyAccountIds(@Param("companyId") String companyId, @Param("mediaId") String mediaId);
+
+    /**
+     * -----------------------------------------------------
+     */
+
+    JSONObject queryTtTodayCharge(@Param("statDay") String statDay, @Param("hour") Integer hour, @Param("accountIds") List<Long> accountIds);
+
+    String queryTtManydaysTotalCharge(@Param("startDay") String startDay, @Param("endDay") String endDay, @Param("accountIds") List<Long> accountIds);
+
+    JSONObject queryTtRealCharged(@Param("lastMonthFirstday") String lastMonthFirstday, @Param("monthFirstday") String monthFirstday, @Param("statDay") String statDay, @Param("accountIds") List<Long> accountIds);
+
+
+    JSONObject queryKsTodayCharge(@Param("statDay") String statDay, @Param("hour") Integer hour, @Param("accountIds") List<Long> accountIds);
+
+    String queryKsManydaysTotalCharge(@Param("startDay") String startDay, @Param("endDay") String endDay, @Param("accountIds") List<Long> accountIds);
+
+    JSONObject queryKsRealCharged(@Param("lastMonthFirstday") String lastMonthFirstday, @Param("monthFirstday") String monthFirstday, @Param("statDay") String statDay, @Param("accountIds") List<Long> accountIds);
+
+    Long getWeekly(@Param("userId") String userId, @Param("companyId") String companyId, @Param("mediaId") String mediaId);
+
+    Long getMonthly(@Param("userId") String userId, @Param("companyId") String companyId, @Param("mediaId") String mediaId);
+
+    List<Long> querySalesDirectorAccountIds(@Param("companyId") String companyId, @Param("mediaId") String mediaId, @Param("userIds") List<String> saleTeaMber);
+
+    List<JSONObject> queryKsHourList(@Param("statDay") String statDay, @Param("accountIds") List<Long> accountIds);
+
+    List<JSONObject> queryTtHourList(@Param("statDay") String statDay, @Param("accountIds") List<Long> accountIds);
+
+    JSONObject queryTtManydaysChargeAndRoi(@Param("startTime") String startTime, @Param("endTime") String endTime, @Param("lastTimeStart") String lastTimeStart, @Param("lastTimeEnd") String lastTimeEnd, @Param("accountIds") List<Long> accountIds);
+
+    List<JSONObject> queryTtManydaysCharge(@Param("startTime") String startTime, @Param("endTime") String endTime, @Param("accountIds") List<Long> accountIds);
+
+    JSONObject queryKsManydaysChargeAndRoi(@Param("startTime") String startTime, @Param("endTime") String endTime, @Param("lastTimeStart") String lastTimeStart, @Param("lastTimeEnd") String lastTimeEnd, @Param("accountIds") List<Long> accountIds);
+
+    List<JSONObject> queryKsManydaysCharge(@Param("startTime") String startTime, @Param("endTime") String endTime, @Param("accountIds") List<Long> accountIds);
+
+    List<Long> querySalesDirectorProjectIds(@Param("companyId") String companyId, @Param("mediaId") String mediaId, @Param("userIds") List<String> saleTeaMber);
+
+    Long queryKsHourProjectTopTotal(@Param("projectIds") List<Long> projectIds, @Param("startTime") String startTime, @Param("endTime") String endTime);
+
+    List<JSONObject> queryKsHourProjectTop(@Param("projectIds") List<Long> projectIds, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("days") Long days);
+
+    Long queryTtHourProjectTopTotal(@Param("projectIds") List<Long> projectIds, @Param("startTime") String startTime, @Param("endTime") String endTime);
+
+    List<JSONObject> queryTtHourProjectTop(@Param("projectIds") List<Long> projectIds, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("days") Long days);
+
+}

+ 556 - 0
jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/mapper/xml/ManagerSaleValueMapper.xml

@@ -0,0 +1,556 @@
+<?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="org.jeecg.ctop.material.mapper.ManagerSaleValueMapper">
+
+    <select id="getRoleCodeByUserId" resultType="java.lang.String">
+        select c.role_code
+        from `jeecg-boot`.sys_user a
+                 left join `jeecg-boot`.sys_user_role b on a.id = b.user_id
+                 left join `jeecg-boot`.sys_role c on b.role_id = c.id
+        where a.id = #{userId} LIMIT 1
+    </select>
+
+
+    <select id="queryUserCompany" resultType="com.alibaba.fastjson.JSONObject">
+        select company_id as 'companyId',company_name as 'companyName'
+        from `jeecg-boot`.user_company
+        where user_id = #{userId}
+    </select>
+
+    <select id="getUserNameById" resultType="String">
+        select realname
+        from `jeecg-boot`.sys_user
+        where id = #{userId}
+    </select>
+
+    <select id="queryList" resultType="com.alibaba.fastjson.JSONObject">
+        select company_id as 'companyId',company_name as 'companyName'
+        from `jeecg-boot`.sys_manager_company
+    </select>
+
+    <select id="querySaleDirctorItsTeamMember" resultType="String">
+        select user_id as 'userId'
+        from `application`.app_user_manage
+        where manage_id = #{userId}
+    </select>
+
+
+    <select id="getCompanyAccountIds" resultType="Long">
+        SELECT t1.account_id
+        FROM `jeecg-boot`.ctop_user_allocation t1
+        LEFT JOIN `jeecg-boot`.user_company t2 ON t1.user_id = t2.user_id
+        WHERE t2.company_id = #{companyId}
+        <if test='mediaId ==2'>
+            AND (media_id = 2 or media_id = 4)
+        </if>
+        <if test='mediaId ==1'>
+            AND (media_id = 1 or media_id = 3)
+        </if>
+        and t1.account_status = 0
+        GROUP BY t1.account_id
+    </select>
+
+
+    <select id="queryKsTodayCharge" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT IFNULL(t.charge, 0.00) as 'totalCharge', CONCAT(
+        CAST(IFNULL(ROUND((t.charge - y.charge) / y.charge * 100, 2), 0) as CHAR), '%') as 'chargeRoi'
+        FROM (
+        SELECT sum(charge) as 'charge'
+        FROM application.kuaishou_account_report_hourly_dw
+        WHERE account_id in
+        <foreach collection="accountIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        and stat_date = DATE_FORMAT(#{statDay}, '%Y%m%d')
+        <if test="hour !=null">
+            AND hour &lt;= #{hour}
+        </if>
+        ) t
+        LEFT JOIN
+        (
+        SELECT sum(charge) as 'charge'
+        FROM application.kuaishou_account_report_hourly_dw
+        WHERE account_id in
+        <foreach collection="accountIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        and stat_date = DATE_FORMAT(DATE_ADD(#{statDay},INTERVAL -1 day), '%Y%m%d')
+        <if test="hour !=null">
+            AND hour &lt;= #{hour}
+        </if>
+        ) y on 1 = 1
+    </select>
+
+    <select id="queryTtTodayCharge" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT IFNULL(t.charge, 0.00) as 'totalCharge', CONCAT(
+        CAST(IFNULL(ROUND((t.charge - tt.charge) / tt.charge * 100, 2), 0) as CHAR), '%') as 'chargeRoi'
+        FROM (
+        SELECT sum(cost) as 'charge'
+        FROM application.bytedance_advertiser_report_hourly_dw
+        WHERE account_id in
+        <foreach collection="accountIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        and stat_datetime = DATE_FORMAT(#{statDay}, '%Y%m%d')
+        <if test="hour !=null">
+            AND hour &lt;= #{hour}
+        </if>
+        ) t
+        LEFT JOIN
+        (
+        SELECT sum(cost) as 'charge'
+        FROM application.bytedance_advertiser_report_hourly_dw
+        WHERE account_id in
+        <foreach collection="accountIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        and stat_datetime = DATE_FORMAT(DATE_ADD(#{statDay},INTERVAL -1 day), '%Y%m%d')
+        <if test="hour !=null">
+            AND hour &lt;= #{hour}
+        </if>
+        ) tt on 1 = 1
+    </select>
+
+    <select id="queryTtManydaysTotalCharge" resultType="String">
+        SELECT IFNULL(sum(cost), 0.00)
+        FROM application.bytedance_advertiser_report_daily_dw
+        WHERE account_id in
+        <foreach collection="accountIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        and stat_datetime >= DATE_FORMAT(#{startDay}, '%Y%m%d')
+        and stat_datetime &lt; DATE_FORMAT(#{endDay}, '%Y%m%d')
+    </select>
+
+    <select id="queryTtManydaysCharge" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT DATE_FORMAT(stat_datetime,'%Y-%m-%d') as 'statDate', IFNULL(sum(cost), 0.00) as 'charge'
+        FROM application.bytedance_advertiser_report_daily_dw
+        WHERE account_id in
+        <foreach collection="accountIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        and stat_datetime >= DATE_FORMAT(#{startTime}, '%Y%m%d')
+        and stat_datetime &lt;= DATE_FORMAT(#{endTime}, '%Y%m%d')
+        GROUP BY stat_datetime
+        order by stat_datetime
+    </select>
+
+    <select id="queryKsManydaysCharge" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT DATE_FORMAT(stat_date,'%Y-%m-%d') as 'statDate', IFNULL(sum(charge), 0.00) as 'charge'
+        FROM application.kuaishou_account_report_daily_dw
+        WHERE account_id in
+        <foreach collection="accountIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        and stat_date >= DATE_FORMAT(#{startTime}, '%Y%m%d')
+        and stat_date &lt;= DATE_FORMAT(#{endTime}, '%Y%m%d')
+        GROUP BY stat_date
+        order by stat_date
+    </select>
+
+    <select id="queryKsManydaysTotalCharge" resultType="String">
+        SELECT IFNULL(sum(charge), 0.00)
+        FROM application.kuaishou_account_report_daily_dw
+        WHERE account_id in
+        <foreach collection="accountIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        and stat_date >= DATE_FORMAT(#{startDay}, '%Y%m%d')
+        and stat_date &lt; DATE_FORMAT(#{endDay}, '%Y%m%d')
+    </select>
+
+    <select id="queryKsRealCharged" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+        IFNULL( thisMonth.realCharged, 0.00) AS 'realCharged',
+        CONCAT( CAST( IFNULL( ROUND(( thisMonth.realCharged - lastMonth.realCharged ) / lastMonth.realCharged *
+        100,2),0) AS CHAR),'%') AS 'realChargedRoi'
+        FROM
+        (
+        SELECT
+        IFNULL( sum( real_charged_in_yuan ), 0.00 ) AS 'realCharged'
+        FROM
+        application.app_kuaishou_agent_report_d
+        WHERE
+        account_id IN
+        <foreach collection="accountIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        AND stat_date >= DATE_FORMAT( #{monthFirstday}, '%Y%m%d' )
+        AND stat_date &lt;= DATE_FORMAT( #{statDay}, '%Y%m%d' )
+        ) thisMonth
+        LEFT JOIN (
+        SELECT
+        IFNULL( sum( real_charged_in_yuan ), 0.00 ) AS 'realCharged'
+        FROM
+        application.app_kuaishou_agent_report_d
+        WHERE
+        account_id IN
+        <foreach collection="accountIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        AND stat_date >= DATE_FORMAT(#{lastMonthFirstday}, '%Y%m%d' )
+        AND stat_date &lt; DATE_FORMAT(#{monthFirstday}, '%Y%m%d' )
+        ) lastMonth ON 1=1
+    </select>
+
+    <select id="queryTtRealCharged" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+        IFNULL( thisMonth.realCharged, 0.00) AS 'realCharged',
+        CONCAT( CAST( IFNULL( ROUND(( thisMonth.realCharged - lastMonth.realCharged ) / lastMonth.realCharged *
+        100,2),0) AS CHAR),'%') AS 'realChargedRoi'
+        FROM
+        (
+        SELECT
+        IFNULL( sum( cash_cost ), 0.00 ) AS 'realCharged'
+        FROM
+        application.app_bytedance_agent_report_d
+        WHERE
+        account_id IN
+        <foreach collection="accountIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        AND stat_datetime >= DATE_FORMAT( #{monthFirstday}, '%Y%m%d' )
+        AND stat_datetime &lt;= DATE_FORMAT( #{statDay}, '%Y%m%d' )
+        ) thisMonth
+        LEFT JOIN (
+        SELECT
+        IFNULL( sum( cash_cost ), 0.00 ) AS 'realCharged'
+        FROM
+        application.app_bytedance_agent_report_d
+        WHERE
+        account_id IN
+        <foreach collection="accountIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        AND stat_datetime >= DATE_FORMAT(#{lastMonthFirstday}, '%Y%m%d' )
+        AND stat_datetime &lt; DATE_FORMAT(#{monthFirstday}, '%Y%m%d' )
+        ) lastMonth ON 1=1
+    </select>
+
+
+    <select id="getWeekly" resultType="Long">
+        SELECT IFNULL(weekly_goal_value, 0)
+        FROM `jeecg-boot`.sys_manager_sale_value
+        WHERE manage_id = #{userId}
+          AND media_id = #{mediaId}
+          AND company_id = #{companyId}
+    </select>
+    <select id="getMonthly" resultType="Long">
+        SELECT IFNULL(monthly_goal_value, 0)
+        FROM `jeecg-boot`.sys_manager_sale_value
+        WHERE manage_id = #{userId}
+          AND media_id = #{mediaId}
+          AND company_id = #{companyId}
+    </select>
+
+    <select id="querySalesDirectorAccountIds" resultType="Long">
+        SELECT
+        t1.account_id
+        FROM
+        `jeecg-boot`.ctop_user_allocation t1
+        LEFT JOIN `jeecg-boot`.user_company t2 ON t1.user_id = t2.user_id
+        WHERE
+        t1.account_status = 0
+        AND t2.company_id = #{companyId}
+        AND project_id IN (
+        SELECT DISTINCT
+        t1.project_id AS projectId
+        FROM
+        `jeecg-boot`.ctop_project_member t1
+        LEFT JOIN `jeecg-boot`.ctop_project t2 ON t1.project_id = t2.id
+        WHERE t1.user_id IN
+        <foreach collection="userIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        <if test='mediaId ==2'>
+            AND (t2.media_id = 2 or t2.media_id = 4)
+        </if>
+        <if test='mediaId ==1'>
+            AND (t2.media_id = 1 or t2.media_id = 3)
+        </if>
+        AND t1.project_name IS NOT NULL
+        AND t1.project_name != ''
+        )
+        GROUP BY
+        t1.account_id
+    </select>
+
+    <select id="querySalesDirectorProjectIds" resultType="Long">
+        SELECT DISTINCT
+        t1.project_id
+        FROM
+        `jeecg-boot`.ctop_project_member t1
+        LEFT JOIN `jeecg-boot`.ctop_project t2 ON t1.project_id = t2.id
+        WHERE t2.company_id =#{companyId}
+        <if test='userIds !=null and userIds.size() > 0'>
+            AND t1.user_id IN
+            <foreach collection="userIds" item="id" separator=","
+                     open="(" close=")">
+                #{id}
+            </foreach>
+        </if>
+        <if test='mediaId ==2'>
+            AND (t2.media_id = 2 or t2.media_id = 4)
+        </if>
+        <if test='mediaId ==1'>
+            AND (t2.media_id = 1 or t2.media_id = 3)
+        </if>
+        AND t1.project_name IS NOT NULL
+        AND t1.project_name != ''
+    </select>
+
+
+    <select id="queryKsHourList" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT hour,sum(charge) as 'charge'
+        FROM application.kuaishou_account_report_hourly_dw
+        WHERE account_id in
+        <foreach collection="accountIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        and stat_date = DATE_FORMAT(#{statDay}, '%Y%m%d' )
+        GROUP BY hour
+        ORDER BY hour
+    </select>
+
+    <select id="queryTtHourList" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT hour,sum(cost) as 'charge'
+        FROM application.bytedance_advertiser_report_hourly_dw
+        WHERE account_id in
+        <foreach collection="accountIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        and stat_datetime = DATE_FORMAT(#{statDay}, '%Y%m%d' )
+        GROUP BY hour
+        ORDER BY hour
+    </select>
+
+
+    <select id="queryTtManydaysChargeAndRoi" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+        IFNULL( this.charge, 0.00) AS 'charge',
+        CONCAT( CAST( IFNULL( ROUND(( this.charge - last.charge ) / last.charge* 100,2),0) AS CHAR),'%') AS
+        'chargeRoi'
+        FROM
+        (
+        SELECT
+        IFNULL( sum(cost), 0.00 ) AS 'charge'
+        FROM
+        application.bytedance_advertiser_report_daily_dw
+        WHERE
+        account_id IN
+        <foreach collection="accountIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        AND stat_datetime >= DATE_FORMAT(#{startTime}, '%Y%m%d' )
+        AND stat_datetime &lt;= DATE_FORMAT(#{endTime}, '%Y%m%d' )
+        ) this
+        LEFT JOIN (
+        SELECT
+        IFNULL( sum(cost), 0.00 ) AS 'charge'
+        FROM
+        application.bytedance_advertiser_report_daily_dw
+        WHERE
+        account_id IN
+        <foreach collection="accountIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        AND stat_datetime >= DATE_FORMAT( #{lastTimeStart}, '%Y%m%d' )
+        AND stat_datetime &lt;= DATE_FORMAT( #{lastTimeEnd}, '%Y%m%d' )
+        ) last ON 1=1
+    </select>
+
+
+    <select id="queryKsManydaysChargeAndRoi" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+        IFNULL( this.charge, 0.00) AS 'charge',
+        CONCAT( CAST( IFNULL( ROUND(( this.charge - last.charge ) / last.charge* 100,2),0) AS CHAR),'%') AS
+        'chargeRoi'
+        FROM
+        (
+        SELECT
+        IFNULL( sum(charge), 0.00 ) AS 'charge'
+        FROM
+        application.kuaishou_account_report_daily_dw
+        WHERE
+        account_id IN
+        <foreach collection="accountIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        AND stat_date >= DATE_FORMAT(#{startTime}, '%Y%m%d' )
+        AND stat_date &lt;= DATE_FORMAT(#{endTime}, '%Y%m%d' )
+        ) this
+        LEFT JOIN (
+        SELECT
+        IFNULL( sum(charge), 0.00 ) AS 'charge'
+        FROM
+        application.kuaishou_account_report_daily_dw
+        WHERE
+        account_id IN
+        <foreach collection="accountIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        AND stat_date >= DATE_FORMAT( #{lastTimeStart}, '%Y%m%d' )
+        AND stat_date &lt;= DATE_FORMAT( #{lastTimeEnd}, '%Y%m%d' )
+        ) last ON 1=1
+    </select>
+
+
+    <select id="queryKsHourProjectTopTotal" resultType="Long">
+        SELECT count(1)
+        FROM
+        (select 1 from application.kuaishou_account_report_hourly_dw t1
+        where t1.project_id in
+        <foreach collection="projectIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        and t1.stat_date >= DATE_FORMAT(#{startTime}, '%Y%m%d')
+        and t1.stat_date &lt;= DATE_FORMAT(#{endTime}, '%Y%m%d')
+        GROUP BY project_id
+        ) t
+    </select>
+
+    <select id="queryTtHourProjectTopTotal" resultType="Long">
+        SELECT count(1)
+        FROM
+        (select 1 from application.bytedance_advertiser_report_hourly_dw t1
+        where t1.project_id in
+        <foreach collection="projectIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        and t1.stat_datetime >= DATE_FORMAT(#{startTime}, '%Y%m%d')
+        and t1.stat_datetime &lt;= DATE_FORMAT(#{endTime}, '%Y%m%d')
+        GROUP BY project_id
+        ) t
+    </select>
+
+    <select id="queryKsHourProjectTop" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+        t1.project_id as 'projectId',
+        t1.project_name as 'projectName',
+        ( SELECT realname FROM `jeecg-boot`.sys_user us WHERE us.id = t1.sale_id ) AS 'saleName',
+        SUM( t1.charge ) AS 'charge',
+        CONCAT( CAST( IFNULL( ROUND(( t1.charge - t3.charge ) / t3.charge * 100, 2 ), 0.00 ) AS CHAR ), '%' ) AS
+        'chargeRoi',
+        IFNULL(t2.realCharge,0.00) AS 'realCharge',
+        IFNULL(t2.jlCharge,0.00) AS 'jlCharge'
+        FROM
+        application.kuaishou_account_report_hourly_dw t1
+        LEFT JOIN(
+        SELECT project_id,
+        SUM(real_charged_in_yuan) as 'realCharge',
+        SUM(direct_rebate_real_charged_in_yuan) as 'jlCharge'
+        FROM application.app_kuaishou_agent_report_d
+        WHERE
+        project_id IN
+        <foreach collection="projectIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        AND stat_date >= DATE_FORMAT(#{startTime}, '%Y%m%d' )
+        AND stat_date &lt;= DATE_FORMAT(#{endTime}, '%Y%m%d' )
+        GROUP BY project_id
+        )t2 ON t1.project_id = t2.project_id
+        LEFT JOIN (
+        SELECT project_id, SUM( charge ) AS 'charge' FROM application.kuaishou_account_report_hourly_dw WHERE project_id
+        IN
+        <foreach collection="projectIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        AND stat_date >= DATE_FORMAT(DATE_ADD(#{startTime}, INTERVAL - ${days} DAY ), '%Y%m%d' )
+        AND stat_date &lt;= DATE_FORMAT(DATE_ADD(#{endTime}, INTERVAL - ${days} DAY ), '%Y%m%d' )
+        GROUP BY project_id ) t3 ON
+        t1.project_id = t3.project_id
+        WHERE
+        t1.project_id IN
+        <foreach collection="projectIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        AND stat_date >= DATE_FORMAT(#{startTime}, '%Y%m%d' )
+        AND stat_date &lt;= DATE_FORMAT(#{endTime}, '%Y%m%d' )
+        GROUP BY
+        t1.project_id
+        ORDER BY
+        SUM( t1.charge ) DESC
+
+    </select>
+
+
+    <select id="queryTtHourProjectTop" resultType="com.alibaba.fastjson.JSONObject">
+        SELECT
+        t1.project_id as 'projectId',
+        t1.project_name as 'projectName',
+        ( SELECT realname FROM `jeecg-boot`.sys_user us WHERE us.id = t1.sale_id ) AS 'saleName',
+        SUM( t1.cost ) AS 'charge',
+        CONCAT( CAST( IFNULL( ROUND(( t1.cost - t3.charge ) / t3.charge * 100, 2 ), 0 ) AS CHAR ), '%' ) AS
+        'chargeRoi',
+        IFNULL(t2.realCharge,0.00) AS 'realCharge',
+        IFNULL(t2.jlCharge,0.00) AS 'jlCharge'
+        FROM
+        application.bytedance_advertiser_report_hourly_dw t1
+        LEFT JOIN(
+        SELECT project_id,
+        SUM(cash_cost) as 'realCharge',
+        SUM(grants_cost) AS 'jlCharge'
+        FROM application.app_bytedance_agent_report_d
+        WHERE
+        project_id IN
+        <foreach collection="projectIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        AND stat_datetime >= DATE_FORMAT(#{startTime}, '%Y%m%d' )
+        AND stat_datetime &lt;= DATE_FORMAT(#{endTime}, '%Y%m%d' )
+        GROUP BY project_id
+        )t2 ON t1.project_id = t2.project_id
+        LEFT JOIN (
+        SELECT project_id, SUM( cost ) AS 'charge' FROM application.bytedance_advertiser_report_hourly_dw WHERE
+        project_id
+        IN
+        <foreach collection="projectIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        AND stat_datetime >= DATE_FORMAT(DATE_ADD(#{startTime}, INTERVAL - ${days} DAY ), '%Y%m%d' )
+        AND stat_datetime &lt;= DATE_FORMAT(DATE_ADD(#{endTime}, INTERVAL - ${days} DAY ), '%Y%m%d' )
+        GROUP BY project_id ) t3 ON
+        t1.project_id = t3.project_id
+        WHERE
+        t1.project_id IN
+        <foreach collection="projectIds" item="id" separator=","
+                 open="(" close=")">
+            #{id}
+        </foreach>
+        AND t1.stat_datetime >= DATE_FORMAT(#{startTime}, '%Y%m%d' )
+        AND t1.stat_datetime &lt;= DATE_FORMAT(#{endTime}, '%Y%m%d' )
+        GROUP BY
+        t1.project_id
+        ORDER BY
+        SUM( t1.cost ) DESC
+
+    </select>
+
+
+</mapper>

+ 28 - 0
jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/service/IManagerSaleValueService.java

@@ -0,0 +1,28 @@
+package org.jeecg.ctop.material.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.pagehelper.PageInfo;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.ctop.material.entity.ManagerSaleValue;
+
+import java.text.ParseException;
+
+/**
+ * 分公司总经理&销售总监阶段性目标值
+ *
+ * @author jeecg-boot
+ * 2022-04-14
+ * @version V1.0
+ */
+public interface IManagerSaleValueService extends IService<ManagerSaleValue> {
+
+    Result<Object> getCompany(String userId);
+
+    Result<Object> getDayAndMonthlyCharges(String userId, String mediaId, String companyId) throws ParseException;
+
+    void setUpManagerSaleValue(ManagerSaleValue sale) throws Exception;
+
+    Result<Object> getHomeCharges(String userId, String mediaId, String companyId,String startTime,String endTime) throws ParseException;
+
+    PageInfo getProjectChargeTop(String userId, String mediaId, String companyId, String startTime, String endTime, Integer pageNo, Integer pageSize) throws Exception;
+}

+ 381 - 0
jeecg-boot-material-view/src/main/java/org/jeecg/ctop/material/service/impl/ManagerSaleValueServiceImpl.java

@@ -0,0 +1,381 @@
+package org.jeecg.ctop.material.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.util.DateUtils;
+import org.jeecg.ctop.material.constants.Check;
+import org.jeecg.ctop.material.entity.ManagerSaleValue;
+import org.jeecg.ctop.material.mapper.ManagerSaleValueMapper;
+import org.jeecg.ctop.material.service.IManagerSaleValueService;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * 分公司总经理&销售总监阶段性目标值
+ *
+ * @author jeecg-boot
+ * 2022-04-14
+ * @version V1.0
+ */
+@Service
+public class ManagerSaleValueServiceImpl extends ServiceImpl<ManagerSaleValueMapper, ManagerSaleValue> implements IManagerSaleValueService {
+
+
+    @Override
+    public Result<Object> getCompany(String userId) {
+        String roleCode = baseMapper.getRoleCodeByUserId(userId);
+        List<JSONObject> companies = new ArrayList<>();
+        if ("admin".equals(roleCode)) {
+            return Result.ok(baseMapper.queryList());
+        } else if ("saleDirector".equals(roleCode) || "CompanyManager".equals(roleCode)) {
+            String name = baseMapper.getUserNameById(userId);
+            if ("丁兆明".equals(name)) {
+                companies = baseMapper.queryList();
+                List<JSONObject> companie = new ArrayList<>();
+                for (JSONObject company : companies) {
+                    String companyId = company.getString("companyId");
+                    //丁兆明可以查看 骄阳和华北的2个公司
+                    if ("5e46b5dea3d740eeb8ff1a2895015a4b".equals(companyId) || "d57fecdcf7a94d009736d9c850731582".equals(companyId)) {
+                        companie.add(company);
+                    }
+                }
+                return Result.ok(companie);
+            }
+            return Result.ok(baseMapper.queryUserCompany(userId));
+        } else {
+            return Result.error("角色权限不足");
+        }
+    }
+
+    @Override
+    public Result<Object> getDayAndMonthlyCharges(String userId, String mediaId, String companyId) throws ParseException {
+        Result<Object> result = new Result<>();
+        String roleCode = baseMapper.getRoleCodeByUserId(userId);
+        Long weekly = baseMapper.getWeekly(userId, companyId, mediaId);
+        Long monthly = baseMapper.getMonthly(userId, companyId, mediaId);
+        //销售总监
+        if ("saleDirector".equals(roleCode)) {
+            //丁兆明特殊处理
+            if ("b161b7d9793942f980dbfe8c931cd1b0".equals(userId) || "228c45f913924639bf20c79ce5dadb16".equals(userId)) {
+                //账户集合
+                List<Long> accountIds = baseMapper.getCompanyAccountIds(companyId, mediaId);
+                JSONObject data = getManagerData(accountIds, userId, mediaId, companyId);
+                data.put("weeklyGoalValue", weekly);
+                data.put("monthlyGoalValue", monthly);
+                return Result.ok(data);
+            }
+            //查询销售总监及旗下的人员 集
+            List<String> saleTeaMber = baseMapper.querySaleDirctorItsTeamMember(userId);
+            if (Check.isNull(saleTeaMber)) {
+                saleTeaMber = Arrays.asList(userId);
+                return Result.error("未查询到人员!");
+            }
+            //账户集合
+            List<Long> accountIds = baseMapper.querySalesDirectorAccountIds(companyId, mediaId, saleTeaMber);
+            if (Check.isNull(accountIds)) {
+                return Result.error("未查询到账户!");
+            }
+            JSONObject data = getManagerData(accountIds, userId, mediaId, companyId);
+            data.put("weeklyGoalValue", weekly);
+            data.put("monthlyGoalValue", monthly);
+            result = Result.ok(data);
+            //分公司总经理
+        } else if ("CompanyManager".equals(roleCode)) {
+            //账户集合
+            List<Long> accountIds = baseMapper.getCompanyAccountIds(companyId, mediaId);
+            JSONObject data = getManagerData(accountIds, userId, mediaId, companyId);
+            data.put("weeklyGoalValue", weekly);
+            data.put("monthlyGoalValue", monthly);
+            result = Result.ok(data);
+        } else {
+            result = Result.error("该用户角色权限不足!");
+        }
+
+        return result;
+    }
+
+    private JSONObject getManagerData(List<Long> accountIds, String userId, String mediaId, String companyId) throws ParseException {
+        //当天日期
+        String statDay = DateUtils.date2Str();
+        //当前小时数
+        Integer hour = DateUtils.getHour(DateUtils.formatDateTime());
+        //本周一
+        String weekFirstDay = DateUtils.getdateFromWeek(1);
+        //本月第一天
+        String monthFirstday = DateUtils.dateformat(DateUtils.initDateByMonth(), DateUtils.WEB_FORMAT);
+        //前月第一天
+        String lastMonthFirstday = DateUtils.lastMonthFirstDay(DateUtils.WEB_FORMAT);
+
+        JSONObject result = null;
+        String weekCharge = null;
+        //1 头条
+        if ("1".equals(mediaId)) {
+            //查询当日消耗 + 环比
+            result = baseMapper.queryTtTodayCharge(statDay, hour, accountIds);
+            //周消耗
+            weekCharge = baseMapper.queryTtManydaysTotalCharge(weekFirstDay, statDay, accountIds);
+            //月消耗
+            String monthCharge = baseMapper.queryTtManydaysTotalCharge(monthFirstday, statDay, accountIds);
+            result.put("weekCharge", getBigDecimalVal(weekCharge, result.getBigDecimal("totalCharge")));
+            result.put("monthCharge", getBigDecimalVal(weekCharge, result.getBigDecimal("totalCharge")));
+            //现金消耗 + 环比ROI
+            JSONObject realCharged = baseMapper.queryTtRealCharged(lastMonthFirstday, monthFirstday, statDay, accountIds);
+            result.put("realCharged", realCharged.getBigDecimal("realCharged"));
+            result.put("realChargedRoi", realCharged.getString("realChargedRoi"));
+        } else if ("2".equals(mediaId)) {
+            result = baseMapper.queryKsTodayCharge(statDay, hour, accountIds);
+            //周消耗
+            weekCharge = baseMapper.queryKsManydaysTotalCharge(weekFirstDay, statDay, accountIds);
+            //月消耗
+            String monthCharge = baseMapper.queryKsManydaysTotalCharge(monthFirstday, statDay, accountIds);
+            result.put("weekCharge", getBigDecimalVal(weekCharge, result.getBigDecimal("totalCharge")));
+            result.put("monthCharge", getBigDecimalVal(weekCharge, result.getBigDecimal("totalCharge")));
+            //现金消耗 + 环比ROI
+            JSONObject realCharged = baseMapper.queryKsRealCharged(lastMonthFirstday, monthFirstday, statDay, accountIds);
+            result.put("realCharged", realCharged.getBigDecimal("realCharged"));
+            result.put("realChargedRoi", realCharged.getString("realChargedRoi"));
+        }
+        result.put("weeklyGoalValue", baseMapper.getWeekly(userId, companyId, mediaId));
+        result.put("monthlyGoalValue", baseMapper.getMonthly(userId, companyId, mediaId));
+        return result;
+    }
+
+
+    private BigDecimal getBigDecimalVal(String afterCharge, BigDecimal todayCharge) {
+        BigDecimal charge = new BigDecimal(afterCharge);
+        return todayCharge.add(charge);
+    }
+
+
+    @Override
+    public void setUpManagerSaleValue(ManagerSaleValue sale) throws Exception {
+        QueryWrapper<ManagerSaleValue> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("company_id", sale.getCompanyId());
+        queryWrapper.eq("media_id", sale.getMediaId());
+        queryWrapper.eq("manage_id", sale.getUserId());
+        ManagerSaleValue one = this.getOne(queryWrapper);
+        if (Check.isNull(one)) {
+            sale.setId(UUID.randomUUID().toString().replace("-", ""));
+            this.save(sale);
+        } else {
+            if (!Check.isNull(sale.getWeeklyGoalValue())) {
+                one.setWeeklyGoalValue(sale.getWeeklyGoalValue());
+            }
+            if (!Check.isNull(sale.getMonthlyGoalValue())) {
+                one.setMonthlyGoalValue(sale.getMonthlyGoalValue());
+            }
+            this.updateById(one);
+        }
+    }
+
+    @Override
+    public Result<Object> getHomeCharges(String userId, String mediaId, String companyId, String startTime, String endTime) throws ParseException {
+        String roleCode = baseMapper.getRoleCodeByUserId(userId);
+
+        List<Long> compayAllAccountIds = baseMapper.getCompanyAccountIds(companyId, mediaId);
+        JSONObject data = null;
+        //销售总监
+        if ("saleDirector".equals(roleCode)) {
+            //丁兆明特殊处理
+            if ("b161b7d9793942f980dbfe8c931cd1b0".equals(userId) || "228c45f913924639bf20c79ce5dadb16".equals(userId)) {
+                if (startTime.equals(endTime)) {
+                    data = getDailyCharges(null, compayAllAccountIds, userId, mediaId, companyId, startTime);
+                } else {
+                    data = getManyDaysCharges(null, compayAllAccountIds, userId, mediaId, companyId, startTime, endTime);
+                }
+                return Result.ok(data);
+            }
+            //查询销售总监及旗下的人员 集
+            List<String> saleTeaMber = baseMapper.querySaleDirctorItsTeamMember(userId);
+            if (Check.isNull(saleTeaMber)) {
+                saleTeaMber = Arrays.asList(userId);
+            }
+            //账户集合
+            List<Long> accountIds = baseMapper.querySalesDirectorAccountIds(companyId, mediaId, saleTeaMber);
+            if (Check.isNull(accountIds)) {
+                return Result.error("未查询到账户!");
+            }
+            if (startTime.equals(endTime)) {
+                //消耗数据
+                data = getDailyCharges(compayAllAccountIds, accountIds, userId, mediaId, companyId, startTime);
+
+            } else {
+                data = getManyDaysCharges(compayAllAccountIds, accountIds, userId, mediaId, companyId, startTime, endTime);
+
+            }
+            //分公司总经理
+        } else if ("CompanyManager".equals(roleCode)) {
+            if (startTime.equals(endTime)) {
+                data = getDailyCharges(null, compayAllAccountIds, userId, mediaId, companyId, startTime);
+            } else {
+                data = getManyDaysCharges(null, compayAllAccountIds, userId, mediaId, companyId, startTime, endTime);
+            }
+        } else {
+            return Result.error("该用户角色权限不足!");
+        }
+        return Result.ok(data);
+    }
+
+    private JSONObject getManyDaysCharges(List<Long> compayAllAccountIds, List<Long> accountIds, String userId, String mediaId, String companyId, String startTime, String endTime) throws ParseException {
+        Map<String, String> map = DateUtils.getStartEndTime(startTime, endTime);
+
+        //下个周期的开始时间
+        String lastTimeStart = map.get("lastTimeStart");
+        //下个周期的结束时间
+        String lastTimeEnd = map.get("lastTimeEnd");
+
+        JSONObject result = null;
+        //1 头条
+        if ("1".equals(mediaId)) {
+            //查询 消耗 + 环比
+            result = baseMapper.queryTtManydaysChargeAndRoi(startTime, endTime, lastTimeStart, lastTimeEnd, accountIds);
+            List<JSONObject> list = baseMapper.queryTtManydaysCharge(startTime, endTime, accountIds);
+            result.put("list", list);
+            //平台消耗
+            if (compayAllAccountIds == null) {
+                result.put("platformCharge", result.getString("charge"));
+                result.put("platformChargeRoi", result.getString("chargeRoi"));
+            } else {
+                JSONObject ptdata = baseMapper.queryTtManydaysChargeAndRoi(startTime, endTime, lastTimeStart, lastTimeEnd, compayAllAccountIds);
+                result.put("platformCharge", ptdata.getString("charge"));
+                result.put("platformChargeRoi", ptdata.getString("chargeRoi"));
+            }
+        } else if ("2".equals(mediaId)) {
+            result = baseMapper.queryKsManydaysChargeAndRoi(startTime, endTime, lastTimeStart, lastTimeEnd, accountIds);
+            List<JSONObject> list = baseMapper.queryKsManydaysCharge(startTime, endTime, accountIds);
+            result.put("list", list);
+            //平台消耗
+            if (compayAllAccountIds == null) {
+                result.put("platformCharge", result.getString("charge"));
+                result.put("platformChargeRoi", result.getString("chargeRoi"));
+            } else {
+                JSONObject ptdata = baseMapper.queryKsManydaysChargeAndRoi(startTime, endTime, lastTimeStart, lastTimeEnd, compayAllAccountIds);
+                result.put("platformCharge", ptdata.getString("charge"));
+                result.put("platformChargeRoi", ptdata.getString("chargeRoi"));
+            }
+        }
+        return result;
+    }
+
+
+    private JSONObject getDailyCharges(List<Long> compayAllAccountIds, List<Long> accountIds, String userId, String mediaId, String companyId, String date) throws ParseException {
+        //当前小时数
+        Integer hour = DateUtils.getHour(DateUtils.formatDateTime());
+        if (!date.equals(DateUtils.date2Str())) {
+            hour = null;
+        }
+        JSONObject result = null;
+        //1 头条
+        if ("1".equals(mediaId)) {
+            //查询当日消耗 + 环比
+            result = baseMapper.queryTtTodayCharge(date, hour, accountIds);
+            List<JSONObject> list = baseMapper.queryTtHourList(date, accountIds);
+            result.put("list", list);
+            //平台消耗
+            if (compayAllAccountIds == null) {
+                result.put("platformCharge", result.getString("totalCharge"));
+                result.put("platformChargeRoi", result.getString("chargeRoi"));
+            } else {
+                JSONObject ptdata = baseMapper.queryTtTodayCharge(date, hour, compayAllAccountIds);
+                result.put("platformCharge", ptdata.getString("totalCharge"));
+                result.put("platformChargeRoi", ptdata.getString("chargeRoi"));
+            }
+        } else if ("2".equals(mediaId)) {
+            result = baseMapper.queryKsTodayCharge(date, hour, accountIds);
+            List<JSONObject> list = baseMapper.queryKsHourList(date, accountIds);
+            result.put("list", list);
+            //平台消耗
+            if (compayAllAccountIds == null) {
+                result.put("platformCharge", result.getString("totalCharge"));
+                result.put("platformChargeRoi", result.getString("chargeRoi"));
+            } else {
+                JSONObject ptdata = baseMapper.queryKsTodayCharge(date, hour, compayAllAccountIds);
+                result.put("platformCharge", ptdata.getString("totalCharge"));
+                result.put("platformChargeRoi", ptdata.getString("chargeRoi"));
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public PageInfo getProjectChargeTop(String userId, String mediaId, String companyId, String startTime, String endTime, Integer pageNo, Integer pageSize) throws Exception {
+        String roleCode = baseMapper.getRoleCodeByUserId(userId);
+        List<Long> compayAllAccountIds = baseMapper.getCompanyAccountIds(companyId, mediaId);
+        JSONObject data = null;
+        //销售总监
+        if ("saleDirector".equals(roleCode)) {
+            //丁兆明特殊处理
+            if ("b161b7d9793942f980dbfe8c931cd1b0".equals(userId) || "228c45f913924639bf20c79ce5dadb16".equals(userId)) {
+                List<Long> projectIds = baseMapper.querySalesDirectorProjectIds(companyId, mediaId, null);
+                if (startTime.equals(endTime)) {
+                    return getProjectDailyCharges(projectIds, mediaId, startTime, null, pageNo, pageSize);
+                } else {
+                    return getProjectDailyCharges(projectIds, mediaId, startTime, endTime, pageNo, pageSize);
+                }
+            }
+            //查询销售总监及旗下的人员 集
+            List<String> saleTeaMber = baseMapper.querySaleDirctorItsTeamMember(userId);
+            if (Check.isNull(saleTeaMber)) {
+                saleTeaMber = Arrays.asList(userId);
+            }
+            //账户集合
+            List<Long> projectIds = baseMapper.querySalesDirectorProjectIds(companyId, mediaId, saleTeaMber);
+            if (Check.isNull(projectIds)) {
+                throw new Exception("未查询到账户!");
+            }
+            if (startTime.equals(endTime)) {
+                return getProjectDailyCharges(projectIds, mediaId, startTime, null, pageNo, pageSize);
+            } else {
+                return getProjectDailyCharges(projectIds, mediaId, startTime, endTime, pageNo, pageSize);
+            }
+            //分公司总经理
+        } else if ("CompanyManager".equals(roleCode)) {
+            List<Long> projectIds = baseMapper.querySalesDirectorProjectIds(companyId, mediaId, null);
+            if (startTime.equals(endTime)) {
+                return getProjectDailyCharges(projectIds, mediaId, startTime, null, pageNo, pageSize);
+            } else {
+                return getProjectDailyCharges(projectIds, mediaId, startTime, endTime, pageNo, pageSize);
+            }
+        } else {
+            throw new Exception("该用户角色权限不足!");
+        }
+    }
+
+    private PageInfo getProjectDailyCharges(List<Long> projectIds, String mediaId, String startTime, String endTime, Integer pageNo, Integer pageSize) throws ParseException {
+        Long days = 1L;
+        if (endTime == null) {
+            endTime = startTime;
+        } else {
+            days = DateUtils.getDiscrepantDays(startTime, endTime) + 1;
+        }
+
+        //1 头条
+        if ("1".equals(mediaId)) {
+            Long total = baseMapper.queryTtHourProjectTopTotal(projectIds, startTime, endTime);
+            PageHelper.startPage(pageNo, pageSize, false);
+            List<JSONObject> list = baseMapper.queryTtHourProjectTop(projectIds, startTime, endTime, days);
+            PageInfo pageInfo = new PageInfo(list);
+            pageInfo.setTotal(total);
+            return pageInfo;
+        } else if ("2".equals(mediaId)) {
+            Long total = baseMapper.queryKsHourProjectTopTotal(projectIds, startTime, endTime);
+            PageHelper.startPage(pageNo, pageSize, false);
+            List<JSONObject> list = baseMapper.queryKsHourProjectTop(projectIds, startTime, endTime, days);
+            PageInfo pageInfo = new PageInfo(list);
+            pageInfo.setTotal(total);
+            return pageInfo;
+        }
+        return null;
+    }
+}