(cfeatrm): 新增业绩分析、客户分析和排名分析功能- 新增业绩分析相关VO类和控制器方法
- 新增客户分析相关VO类和控制器方法- 新增排名分析相关VO类和控制器方法 - 修改首页统计接口,增加与昨日数据的对比 - 在合同和回款表中添加昨日数据字段 -优化业绩统计查询SQL
This commit is contained in:
parent
3f5b1e143b
commit
a9b29c5f7a
@ -91,8 +91,7 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter {
|
|||||||
}
|
}
|
||||||
// 构建登录用户
|
// 构建登录用户
|
||||||
return new LoginUser().setId(accessToken.getUserId()).setUserType(accessToken.getUserType())
|
return new LoginUser().setId(accessToken.getUserId()).setUserType(accessToken.getUserType())
|
||||||
.setTenantId(accessToken.getTenantId()).setScopes(accessToken.getScopes())
|
.setTenantId(accessToken.getTenantId()).setScopes(accessToken.getScopes());
|
||||||
.setInfo(accessToken.getUserInfo()); // 额外的用户信息;
|
|
||||||
} catch (ServiceException serviceException) {
|
} catch (ServiceException serviceException) {
|
||||||
// 校验 Token 不通过时,考虑到一些接口是无需登录的,所以直接返回 null 即可
|
// 校验 Token 不通过时,考虑到一些接口是无需登录的,所以直接返回 null 即可
|
||||||
return null;
|
return null;
|
||||||
|
@ -0,0 +1,62 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.controller.admin.crmanalysis;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.*;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.crmanalysis.AchievementService;
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.validation.Valid;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
|
|
||||||
|
|
||||||
|
@Tag(name = "管理后台 - 业绩分析")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/crm/analysis-achievement")
|
||||||
|
@Validated
|
||||||
|
public class AchievementController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private AchievementService achievementService;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@GetMapping("/depts")
|
||||||
|
@Operation(summary = "获得部门业绩分析")
|
||||||
|
public CommonResult<List<DeptAchieveVO>> getDeptsAchievement(@Valid AchievementPageReqVO pageReqVO) {
|
||||||
|
List<DeptAchieveVO> deptAchieveRespVOS = achievementService.getDeptAchieve(pageReqVO);
|
||||||
|
return success(deptAchieveRespVOS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/user")
|
||||||
|
@Operation(summary = "获得员工业绩分析")
|
||||||
|
public CommonResult<PageResult<UserAchieveVO>> getAchievementPage(@Valid AchievementPageReqVO pageReqVO) {
|
||||||
|
return success(achievementService.getAchievementPage(pageReqVO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/completion")
|
||||||
|
@Operation(summary = "获得业绩完成度")
|
||||||
|
public CommonResult<List<CompletionVO>> getAchievementCompletion(@RequestParam(name = "relation",defaultValue = "my",required=false) String relation) {
|
||||||
|
return success(achievementService.getCompletion(relation));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@GetMapping("/sales")
|
||||||
|
@Operation(summary = "销售简报")
|
||||||
|
public CommonResult<List<SalesVO>> getSales(@RequestParam(name = "relation",defaultValue = "my",required=false) String relation) {
|
||||||
|
return success(achievementService.getSales(relation));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,67 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.controller.admin.crmanalysis;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.AchievementPageReqVO;
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.CustomerLevelVO;
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.UserRecordVO;
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.UserVolumeVO;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.crmanalysis.CustomerService;
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.validation.Valid;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
|
|
||||||
|
|
||||||
|
@Tag(name = "管理后台 - 客户分析")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/crm/analysis-customer")
|
||||||
|
@Validated
|
||||||
|
public class CustomerController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CustomerService customerService;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@GetMapping("/level")
|
||||||
|
@Operation(summary = "获得客户等级分析")
|
||||||
|
public CommonResult<CustomerLevelVO> getCustomerLevel() {
|
||||||
|
return success(customerService.getCustomerLevel());
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/source")
|
||||||
|
@Operation(summary = "获得客户来源分析")
|
||||||
|
public CommonResult<CustomerLevelVO> getCustomerSource() {
|
||||||
|
return success(customerService.getCustomerSource());
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/industry")
|
||||||
|
@Operation(summary = "获得客户行业分析")
|
||||||
|
public CommonResult<CustomerLevelVO> getCustomerIndustry() {
|
||||||
|
return success(customerService.getCustomerIndustry());
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/volume")
|
||||||
|
@Operation(summary = "获得客户量分析")
|
||||||
|
public CommonResult<PageResult<UserVolumeVO>> getAchievementPage(@Valid AchievementPageReqVO pageReqVO) {
|
||||||
|
return success(customerService.getCustomerVolume(pageReqVO));
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/record")
|
||||||
|
@Operation(summary = "获得跟进分析")
|
||||||
|
public CommonResult<PageResult<UserRecordVO>> getRecord(@Valid AchievementPageReqVO pageReqVO) {
|
||||||
|
return success(customerService.getRecord(pageReqVO));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.controller.admin.crmanalysis;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.ContractVO;
|
||||||
|
import cn.iocoder.yudao.module.crm.service.crmanalysis.RankService;
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
|
||||||
|
|
||||||
|
|
||||||
|
@Tag(name = "管理后台 - 排名分析")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/crm/analysis-rank")
|
||||||
|
@Validated
|
||||||
|
public class RankController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private RankService rankService;
|
||||||
|
|
||||||
|
|
||||||
|
@GetMapping("/contract")
|
||||||
|
@Operation(summary = "获得合同排名")
|
||||||
|
public CommonResult<List<ContractVO>> getContractRank() {
|
||||||
|
return success(rankService.getContractRank());
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/receivables")
|
||||||
|
@Operation(summary = "获得回款排名")
|
||||||
|
public CommonResult<List<ContractVO>> getRecevablesRank() {
|
||||||
|
return success(rankService.getReceivablesRank());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.ToString;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||||
|
|
||||||
|
|
||||||
|
@Schema(description = "管理后台 - 业绩目标分页 Request VO")
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@ToString(callSuper = true)
|
||||||
|
public class AchievementPageReqVO extends PageParam {
|
||||||
|
|
||||||
|
@Schema(description = "名称", example = "赵六")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
|
||||||
|
@Schema(description = "添加时间")
|
||||||
|
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||||
|
private LocalDateTime[] createTime;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
@Schema(description = "管理后台 - 业绩完成度 Response VO")
|
||||||
|
@Data
|
||||||
|
public class CompletionVO {
|
||||||
|
|
||||||
|
@Schema(description = "时间")
|
||||||
|
private String time;
|
||||||
|
|
||||||
|
@Schema(description = "目标金额")
|
||||||
|
private BigDecimal targetPrice;
|
||||||
|
|
||||||
|
@Schema(description = "成交金额")
|
||||||
|
private BigDecimal successPrice;
|
||||||
|
|
||||||
|
@Schema(description = "成交数量")
|
||||||
|
private Long successCount;
|
||||||
|
|
||||||
|
@Schema(description = "平均客单价")
|
||||||
|
private BigDecimal perPrice;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
@Schema(description = "管理后台 - 合同与回款 Response VO")
|
||||||
|
@Data
|
||||||
|
public class ContractVO {
|
||||||
|
|
||||||
|
@Schema(description = "编号", example = "1024")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Schema(description = "用户名称")
|
||||||
|
private String nickname;
|
||||||
|
|
||||||
|
@Schema(description = "数量")
|
||||||
|
private Long count;
|
||||||
|
|
||||||
|
@Schema(description = "金额")
|
||||||
|
private BigDecimal money;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Schema(description = "管理后台 - 客户分析 Response VO")
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
public class CustomerLevelVO {
|
||||||
|
|
||||||
|
@Schema(description = "等级")
|
||||||
|
private List<String> data;
|
||||||
|
|
||||||
|
@Schema(description = "所有客户")
|
||||||
|
private List<Long> allCustomer;
|
||||||
|
|
||||||
|
@Schema(description = "成交客户")
|
||||||
|
private List<Long> dealCustomer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
@Schema(description = "管理后台 - 部门业绩信息 Response VO")
|
||||||
|
@Data
|
||||||
|
public class DeptAchieveVO {
|
||||||
|
|
||||||
|
@Schema(description = "部门编号", example = "1024")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "yshop")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@Schema(description = "父部门 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||||
|
private Long parentId;
|
||||||
|
|
||||||
|
@Schema(description = "合同数量")
|
||||||
|
private Long contractCount;
|
||||||
|
|
||||||
|
@Schema(description = "合同金额")
|
||||||
|
private BigDecimal contractMoney;
|
||||||
|
|
||||||
|
@Schema(description = "回款金额")
|
||||||
|
private BigDecimal receivablesMoney;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Schema(description = "管理后台 - 销售简报 Response VO")
|
||||||
|
@Data
|
||||||
|
public class SalesVO {
|
||||||
|
|
||||||
|
@Schema(description = "时间")
|
||||||
|
private String time;
|
||||||
|
|
||||||
|
@Schema(description = "新增线索")
|
||||||
|
private Long cluesCount;
|
||||||
|
|
||||||
|
@Schema(description = "新增客户")
|
||||||
|
private Long customerCount;
|
||||||
|
|
||||||
|
@Schema(description = "新增商机")
|
||||||
|
private Long businessCount;
|
||||||
|
|
||||||
|
@Schema(description = "新增合同")
|
||||||
|
private Long contractCount;
|
||||||
|
|
||||||
|
@Schema(description = "新增回款")
|
||||||
|
private Long receivablesCount;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
@Schema(description = "管理后台 - 用户业绩分析信息 Response VO")
|
||||||
|
@Data
|
||||||
|
public class UserAchieveVO {
|
||||||
|
|
||||||
|
@Schema(description = "用户编号", example = "1024")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Schema(description = "用户名称")
|
||||||
|
private String nickname;
|
||||||
|
|
||||||
|
@Schema(description = "合同数量")
|
||||||
|
private Long contractCount;
|
||||||
|
|
||||||
|
@Schema(description = "合同金额")
|
||||||
|
private BigDecimal contractMoney;
|
||||||
|
|
||||||
|
@Schema(description = "回款金额")
|
||||||
|
private BigDecimal receivablesMoney;
|
||||||
|
|
||||||
|
@Schema(description = "线索数量")
|
||||||
|
private Long cluesCount;
|
||||||
|
|
||||||
|
@Schema(description = "转客数量")
|
||||||
|
private Long cluesToCustomerCount;
|
||||||
|
|
||||||
|
@Schema(description = "转客比率")
|
||||||
|
private String cluesToCustomerPer;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Schema(description = "管理后台 - 跟进分析信息 Response VO")
|
||||||
|
@Data
|
||||||
|
public class UserRecordVO {
|
||||||
|
|
||||||
|
@Schema(description = "用户编号", example = "1024")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Schema(description = "用户名称")
|
||||||
|
private String nickname;
|
||||||
|
|
||||||
|
@Schema(description = "数量")
|
||||||
|
private Long totalCount;
|
||||||
|
|
||||||
|
@Schema(description = "客户数量")
|
||||||
|
private Long customerCount;
|
||||||
|
|
||||||
|
@Schema(description = "商机数量")
|
||||||
|
private Long businessCount;
|
||||||
|
|
||||||
|
@Schema(description = "线索数量")
|
||||||
|
private Long cluesCount;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Schema(description = "管理后台 - 客户量分析信息 Response VO")
|
||||||
|
@Data
|
||||||
|
public class UserVolumeVO {
|
||||||
|
|
||||||
|
@Schema(description = "用户编号", example = "1024")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Schema(description = "用户名称")
|
||||||
|
private String nickname;
|
||||||
|
|
||||||
|
@Schema(description = "客户增量")
|
||||||
|
private Long customerCount;
|
||||||
|
|
||||||
|
@Schema(description = "成交数量")
|
||||||
|
private Long successCount;
|
||||||
|
|
||||||
|
@Schema(description = "成交比率")
|
||||||
|
private String successPer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -8,6 +8,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
|||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
@ -24,8 +25,8 @@ public class CrmIndexController {
|
|||||||
|
|
||||||
@GetMapping("/getCount")
|
@GetMapping("/getCount")
|
||||||
@Operation(summary = "首页统计")
|
@Operation(summary = "首页统计")
|
||||||
public CommonResult<CrmIndexRespVO> getCount() {
|
public CommonResult<CrmIndexRespVO> getCount(@RequestParam(name = "relation",defaultValue = "my",required=false) String relation) {
|
||||||
return success(crmIndexService.getIndexCount());
|
return success(crmIndexService.getIndexCount(relation));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -13,27 +13,75 @@ public class BrieCountVO {
|
|||||||
@Schema(description = "新增商机")
|
@Schema(description = "新增商机")
|
||||||
private Long count01;
|
private Long count01;
|
||||||
|
|
||||||
|
@Schema(description = "昨日新增商机")
|
||||||
|
private Long count001;
|
||||||
|
|
||||||
|
@Schema(description = "较昨日比率")
|
||||||
|
private String per001;
|
||||||
|
|
||||||
@Schema(description = "新增线索")
|
@Schema(description = "新增线索")
|
||||||
private Long count02;
|
private Long count02;
|
||||||
|
|
||||||
|
@Schema(description = "昨日新增线索")
|
||||||
|
private Long count002;
|
||||||
|
|
||||||
|
@Schema(description = "较昨日比率")
|
||||||
|
private String per002;
|
||||||
|
|
||||||
@Schema(description = "新增客户")
|
@Schema(description = "新增客户")
|
||||||
private Long count03;
|
private Long count03;
|
||||||
|
|
||||||
|
@Schema(description = "昨日新增客户")
|
||||||
|
private Long count003;
|
||||||
|
|
||||||
|
@Schema(description = "较昨日比率")
|
||||||
|
private String per003;
|
||||||
|
|
||||||
@Schema(description = "新增跟进")
|
@Schema(description = "新增跟进")
|
||||||
private Long count04;
|
private Long count04;
|
||||||
|
|
||||||
|
@Schema(description = "昨日新增跟进")
|
||||||
|
private Long count004;
|
||||||
|
|
||||||
|
@Schema(description = "较昨日比率")
|
||||||
|
private String per004;
|
||||||
|
|
||||||
@Schema(description = "新增合同")
|
@Schema(description = "新增合同")
|
||||||
private Long count05;
|
private Long count05;
|
||||||
|
|
||||||
|
@Schema(description = "昨日新增合同")
|
||||||
|
private Long count005;
|
||||||
|
|
||||||
|
@Schema(description = "较昨日比率")
|
||||||
|
private String per005;
|
||||||
|
|
||||||
@Schema(description = "合同金额")
|
@Schema(description = "合同金额")
|
||||||
private BigDecimal count06;
|
private BigDecimal count06;
|
||||||
|
|
||||||
|
@Schema(description = "昨日合同金额")
|
||||||
|
private BigDecimal count006;
|
||||||
|
|
||||||
|
@Schema(description = "较昨日比率")
|
||||||
|
private String per006;
|
||||||
|
|
||||||
@Schema(description = "回款金额")
|
@Schema(description = "回款金额")
|
||||||
private BigDecimal count07;
|
private BigDecimal count07;
|
||||||
|
|
||||||
|
@Schema(description = "昨日回款金额")
|
||||||
|
private BigDecimal count007;
|
||||||
|
|
||||||
|
@Schema(description = "较昨日比率")
|
||||||
|
private String per007;
|
||||||
|
|
||||||
@Schema(description = "新增联系人")
|
@Schema(description = "新增联系人")
|
||||||
private Long count08;
|
private Long count08;
|
||||||
|
|
||||||
|
@Schema(description = "昨日新增联系人")
|
||||||
|
private Long count008;
|
||||||
|
|
||||||
|
@Schema(description = "较昨日比率")
|
||||||
|
private String per008;
|
||||||
|
|
||||||
@Schema(description = "客户成交量")
|
@Schema(description = "客户成交量")
|
||||||
private Long count09;
|
private Long count09;
|
||||||
|
|
||||||
|
@ -135,4 +135,6 @@ public class CrmContractDO extends BaseDO {
|
|||||||
@TableField(exist = false)
|
@TableField(exist = false)
|
||||||
private BigDecimal count06;
|
private BigDecimal count06;
|
||||||
|
|
||||||
|
@TableField(exist = false)
|
||||||
|
private BigDecimal count006;
|
||||||
}
|
}
|
||||||
|
@ -100,4 +100,7 @@ public class CrmContractReceivablesDO extends BaseDO {
|
|||||||
|
|
||||||
@TableField(exist = false)
|
@TableField(exist = false)
|
||||||
private BigDecimal count07;
|
private BigDecimal count07;
|
||||||
|
|
||||||
|
@TableField(exist = false)
|
||||||
|
private BigDecimal count007;
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|||||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.ContractVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.crmcontract.vo.CrmContractPageReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.crmcontract.vo.CrmContractPageReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.crmcontract.vo.CrmContractRespVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.crmcontract.vo.CrmContractRespVO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.crmcontract.CrmContractDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.crmcontract.CrmContractDO;
|
||||||
@ -13,6 +14,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
|||||||
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
import org.apache.ibatis.annotations.Select;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -54,4 +56,9 @@ public interface CrmContractMapper extends BaseMapperX<CrmContractDO> {
|
|||||||
.orderByDesc(CrmContractDO::getId));
|
.orderByDesc(CrmContractDO::getId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Select("select any_value(t.id) as id,COUNT(t.id) AS count,SUM(t.money) AS money,t1.nickname AS nickname from crm_contract t " +
|
||||||
|
"LEFT JOIN system_users t1 ON (t1.id = t.order_admin_id) " +
|
||||||
|
"where t.deleted=0 GROUP BY t.order_admin_id ORDER BY any_value(money) DESC limit 10")
|
||||||
|
List<ContractVO> selectContractTop();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -3,16 +3,14 @@ package cn.iocoder.yudao.module.crm.dal.mysql.crmcontractreceivables;
|
|||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.ContractVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.crmcontractreceivables.vo.CrmContractReceivablesPageReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.crmcontractreceivables.vo.CrmContractReceivablesPageReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.crmcontractreceivables.vo.CrmContractReceivablesRespVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.crmcontractreceivables.vo.CrmContractReceivablesRespVO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.crmcontract.CrmContractDO;
|
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.crmcontractreceivables.CrmContractReceivablesDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.crmcontractreceivables.CrmContractReceivablesDO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.crmcustomer.CrmCustomerDO;
|
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
import org.apache.ibatis.annotations.Select;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -48,4 +46,9 @@ public interface CrmContractReceivablesMapper extends BaseMapperX<CrmContractRec
|
|||||||
.orderByDesc(CrmContractReceivablesDO::getId));
|
.orderByDesc(CrmContractReceivablesDO::getId));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Select("select any_value(t.id) as id,COUNT(t.id) AS count,SUM(t.money) AS money,t1.nickname AS nickname from crm_contract_receivables t " +
|
||||||
|
"LEFT JOIN system_users t1 ON (t1.id = t.order_admin_id) " +
|
||||||
|
"where t.deleted=0 GROUP BY t.order_admin_id ORDER BY any_value(money) DESC limit 10")
|
||||||
|
List<ContractVO> selectReceivablesTop();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -229,8 +229,6 @@ public class CrmAchievementServiceImpl implements CrmAchievementService {
|
|||||||
Date starTime = new Date();
|
Date starTime = new Date();
|
||||||
Date endTime = new Date();
|
Date endTime = new Date();
|
||||||
Calendar calendar = Calendar.getInstance();
|
Calendar calendar = Calendar.getInstance();
|
||||||
System.out.println("a:" + year);
|
|
||||||
System.out.println("b:" + month);
|
|
||||||
if (month == 0) {
|
if (month == 0) {
|
||||||
//全年
|
//全年
|
||||||
calendar.set(year, 1, 1);
|
calendar.set(year, 1, 1);
|
||||||
@ -257,9 +255,6 @@ public class CrmAchievementServiceImpl implements CrmAchievementService {
|
|||||||
.eqIfPresent(CrmAchievementDO::getYear, year));
|
.eqIfPresent(CrmAchievementDO::getYear, year));
|
||||||
|
|
||||||
|
|
||||||
System.out.println("年开始:" + DateUtil.formatDateTime(starTime));
|
|
||||||
System.out.println("年结束:" + DateUtil.formatDateTime(endTime));
|
|
||||||
|
|
||||||
List<CrmContractDO> crmContractDOS = contractMapper.selectList(new LambdaQueryWrapper<CrmContractDO>()
|
List<CrmContractDO> crmContractDOS = contractMapper.selectList(new LambdaQueryWrapper<CrmContractDO>()
|
||||||
.in(CrmContractDO::getOwnerUserId, userIds)
|
.in(CrmContractDO::getOwnerUserId, userIds)
|
||||||
.eq(CrmContractDO::getCheckStatus, ContractStatusEnum.STATUS_2.getValue())
|
.eq(CrmContractDO::getCheckStatus, ContractStatusEnum.STATUS_2.getValue())
|
||||||
|
@ -0,0 +1,46 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.service.crmanalysis;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 业绩目标 Service 接口
|
||||||
|
*
|
||||||
|
* @author yshop
|
||||||
|
*/
|
||||||
|
public interface AchievementService {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得用户业绩分析
|
||||||
|
* @param pageReqVO 分页查询
|
||||||
|
* @return 业绩目标分页
|
||||||
|
*/
|
||||||
|
PageResult<UserAchieveVO> getAchievementPage(AchievementPageReqVO pageReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取部门业绩分析
|
||||||
|
* @param pageReqVO
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<DeptAchieveVO> getDeptAchieve(AchievementPageReqVO pageReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取业绩完成度
|
||||||
|
* @param relation
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<CompletionVO> getCompletion(String relation);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 销售简报
|
||||||
|
* @param relation
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<SalesVO> getSales(String relation);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,380 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.service.crmanalysis;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import cn.hutool.core.util.NumberUtil;
|
||||||
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||||
|
import cn.iocoder.yudao.framework.common.enums.ShopCommonEnum;
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
|
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.*;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.crmachievement.CrmAchievementDO;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.crmbusiness.CrmBusinessDO;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.crmclues.CrmCluesDO;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.crmcontract.CrmContractDO;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.crmcontractreceivables.CrmContractReceivablesDO;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.crmcustomer.CrmCustomerDO;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmachievement.CrmAchievementMapper;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmbusiness.CrmBusinessMapper;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmclues.CrmCluesMapper;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmcontract.CrmContractMapper;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmcontractreceivables.CrmContractReceivablesMapper;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmcustomer.CrmCustomerMapper;
|
||||||
|
import cn.iocoder.yudao.module.hrm.enums.CluesStatusEnum;
|
||||||
|
import cn.iocoder.yudao.module.hrm.enums.ContractStatusEnum;
|
||||||
|
import cn.iocoder.yudao.module.hrm.enums.FlowStepEnum;
|
||||||
|
import cn.iocoder.yudao.module.hrm.enums.RelationEnum;
|
||||||
|
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||||
|
import cn.iocoder.yudao.module.system.api.dept.dto.DeptApiDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.dept.dto.DeptApiVO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||||
|
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserApiVO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserPageApiDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 业绩目标 Service 实现类
|
||||||
|
*
|
||||||
|
* @author yshop
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@Validated
|
||||||
|
public class AchievementServiceImpl implements AchievementService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CrmAchievementMapper achievementMapper;
|
||||||
|
@Resource
|
||||||
|
private DeptApi deptApi;
|
||||||
|
@Resource
|
||||||
|
private AdminUserApi adminUserApi;
|
||||||
|
@Resource
|
||||||
|
private CrmContractMapper contractMapper;
|
||||||
|
@Resource
|
||||||
|
private CrmContractReceivablesMapper contractReceivablesMapper;
|
||||||
|
@Resource
|
||||||
|
private CrmCustomerMapper customerMapper;
|
||||||
|
@Resource
|
||||||
|
private CrmBusinessMapper businessMapper;
|
||||||
|
@Resource
|
||||||
|
private CrmCluesMapper crmCluesMapper;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PageResult<UserAchieveVO> getAchievementPage(AchievementPageReqVO pageReqVO) {
|
||||||
|
AdminUserPageApiDTO dto = new AdminUserPageApiDTO();
|
||||||
|
dto.setUsername(pageReqVO.getName());
|
||||||
|
dto.setPageNo(pageReqVO.getPageNo());
|
||||||
|
dto.setPageSize(pageReqVO.getPageSize());
|
||||||
|
PageResult<AdminUserApiVO> pageResult = adminUserApi.getUserPage(dto).getCheckedData();
|
||||||
|
PageResult<UserAchieveVO> pageResult1 = BeanUtils.toBean(pageResult, UserAchieveVO.class);
|
||||||
|
pageResult1.getList().forEach(v -> {
|
||||||
|
LambdaQueryWrapperX<CrmContractDO> wrapperX = new LambdaQueryWrapperX<>();
|
||||||
|
wrapperX.eq(CrmContractDO::getOwnerUserId, v.getId())
|
||||||
|
.eq(CrmContractDO::getCheckStatus, ContractStatusEnum.STATUS_2.getValue())
|
||||||
|
.betweenIfPresent(CrmContractDO::getCreateTime, pageReqVO.getCreateTime());
|
||||||
|
v.setContractCount(contractMapper.selectCount(wrapperX));
|
||||||
|
List<CrmContractDO> crmContractDOS = contractMapper.selectList(wrapperX);
|
||||||
|
BigDecimal contractMoney = crmContractDOS
|
||||||
|
.stream()
|
||||||
|
.map(CrmContractDO::getMoney)
|
||||||
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
v.setContractMoney(contractMoney);
|
||||||
|
List<CrmContractReceivablesDO> crmContractReceivablesDOS = contractReceivablesMapper
|
||||||
|
.selectList(new LambdaQueryWrapperX<CrmContractReceivablesDO>()
|
||||||
|
.eq(CrmContractReceivablesDO::getOwnerUserId, v.getId())
|
||||||
|
.eq(CrmContractReceivablesDO::getCheckStatus, ContractStatusEnum.STATUS_2.getValue())
|
||||||
|
.betweenIfPresent(CrmContractReceivablesDO::getCreateTime, pageReqVO.getCreateTime()));
|
||||||
|
BigDecimal receivablesMoney = crmContractReceivablesDOS
|
||||||
|
.stream()
|
||||||
|
.map(CrmContractReceivablesDO::getMoney)
|
||||||
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
v.setReceivablesMoney(receivablesMoney);
|
||||||
|
|
||||||
|
LambdaQueryWrapperX<CrmCluesDO> wrapperX2 = new LambdaQueryWrapperX<>();
|
||||||
|
wrapperX2.eq(CrmCluesDO::getOwnerUserId, v.getId())
|
||||||
|
.betweenIfPresent(CrmCluesDO::getCreateTime, pageReqVO.getCreateTime());
|
||||||
|
Long cluesCount = crmCluesMapper.selectCount(wrapperX2);
|
||||||
|
v.setCluesCount(cluesCount);
|
||||||
|
|
||||||
|
wrapperX2.eq(CrmCluesDO::getStatus, CluesStatusEnum.STATUS_1.getValue());
|
||||||
|
Long cluesToCustomerCount = crmCluesMapper.selectCount(wrapperX2);
|
||||||
|
v.setCluesToCustomerCount(cluesToCustomerCount);
|
||||||
|
String per = "0";
|
||||||
|
if (cluesCount > 0) {
|
||||||
|
per = NumberUtil.round(NumberUtil.div(cluesToCustomerCount, cluesCount), 2)
|
||||||
|
.multiply(new BigDecimal("100")).toString();
|
||||||
|
}
|
||||||
|
v.setCluesToCustomerPer(per);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
return pageResult1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<DeptAchieveVO> getDeptAchieve(AchievementPageReqVO pageReqVO) {
|
||||||
|
List<DeptApiVO> list = deptApi.getDeptList(new DeptApiDTO().setStatus(CommonStatusEnum.ENABLE.getStatus())).getCheckedData();
|
||||||
|
List<DeptAchieveVO> achieveRespVOS = BeanUtils.toBean(list, DeptAchieveVO.class);
|
||||||
|
achieveRespVOS.forEach(vo -> {
|
||||||
|
List<AdminUserRespDTO> adminUserRespDTOS = adminUserApi.getUserListByDeptIds(CollUtil.newArrayList(vo.getId())).getCheckedData();
|
||||||
|
List<Long> ids = CollUtil.newArrayList(-1L);
|
||||||
|
if (!adminUserRespDTOS.isEmpty()) {
|
||||||
|
ids = adminUserRespDTOS.stream().map(AdminUserRespDTO::getId).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
LambdaQueryWrapperX<CrmContractDO> wrapperX = new LambdaQueryWrapperX<>();
|
||||||
|
wrapperX.inIfPresent(CrmContractDO::getOwnerUserId, ids)
|
||||||
|
.eq(CrmContractDO::getCheckStatus, ContractStatusEnum.STATUS_2.getValue())
|
||||||
|
.betweenIfPresent(CrmContractDO::getCreateTime, pageReqVO.getCreateTime());
|
||||||
|
List<CrmContractDO> crmContractDOS = contractMapper.selectList(wrapperX);
|
||||||
|
BigDecimal contractMoney = crmContractDOS
|
||||||
|
.stream()
|
||||||
|
.map(CrmContractDO::getMoney)
|
||||||
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
BigDecimal receivablesMoney = crmContractDOS
|
||||||
|
.stream()
|
||||||
|
.map(CrmContractDO::getReturnMoney)
|
||||||
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
|
||||||
|
vo.setContractCount(Long.valueOf(crmContractDOS.size()));
|
||||||
|
vo.setContractMoney(contractMoney);
|
||||||
|
vo.setReceivablesMoney(receivablesMoney);
|
||||||
|
});
|
||||||
|
return achieveRespVOS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<CompletionVO> getCompletion(String relation) {
|
||||||
|
Integer year = DateUtil.year(new Date());
|
||||||
|
List<Long> userIds = new ArrayList<>();
|
||||||
|
Long userId = SecurityFrameworkUtils.getLoginUserId();
|
||||||
|
if (RelationEnum.MY.getValue().equals(relation)) {
|
||||||
|
userIds.add(userId);
|
||||||
|
} else if (RelationEnum.SUB.getValue().equals(relation)) {
|
||||||
|
userIds = adminUserApi.getUserListBySubordinateIds(userId).getData();
|
||||||
|
}
|
||||||
|
//合同目标
|
||||||
|
List<CrmAchievementDO> crmAchievementDO = achievementMapper.selectList(new LambdaQueryWrapperX<CrmAchievementDO>()
|
||||||
|
.eq(CrmAchievementDO::getType, FlowStepEnum.TYPE_2.getValue())
|
||||||
|
.in(CrmAchievementDO::getTypeId, userIds)
|
||||||
|
.eqIfPresent(CrmAchievementDO::getConfig, ShopCommonEnum.ACH_1.getValue())
|
||||||
|
.eqIfPresent(CrmAchievementDO::getYear, year));
|
||||||
|
|
||||||
|
List<CompletionVO> completionVOS = new ArrayList<>();
|
||||||
|
int i = 1;
|
||||||
|
while (i <= 12) {
|
||||||
|
BigDecimal targetPrice = BigDecimal.ZERO;
|
||||||
|
BigDecimal successPrice = BigDecimal.ZERO;
|
||||||
|
Long successCount = 0L;
|
||||||
|
BigDecimal perPrice = BigDecimal.ZERO;
|
||||||
|
String time = "" + year;
|
||||||
|
if (i < 10) {
|
||||||
|
time = time + "-0" + i;
|
||||||
|
} else {
|
||||||
|
time = time + "-" + i;
|
||||||
|
}
|
||||||
|
CompletionVO completionVO = new CompletionVO();
|
||||||
|
completionVO.setTime(time);
|
||||||
|
switch (i) {
|
||||||
|
case 1: {
|
||||||
|
if (crmAchievementDO != null) {
|
||||||
|
targetPrice = crmAchievementDO
|
||||||
|
.stream()
|
||||||
|
.map(CrmAchievementDO::getJanuary)
|
||||||
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 2: {
|
||||||
|
if (crmAchievementDO != null) {
|
||||||
|
targetPrice = crmAchievementDO
|
||||||
|
.stream()
|
||||||
|
.map(CrmAchievementDO::getFebruary)
|
||||||
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 3: {
|
||||||
|
if (crmAchievementDO != null) {
|
||||||
|
targetPrice = crmAchievementDO
|
||||||
|
.stream()
|
||||||
|
.map(CrmAchievementDO::getMarch)
|
||||||
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 4: {
|
||||||
|
if (crmAchievementDO != null) {
|
||||||
|
targetPrice = crmAchievementDO
|
||||||
|
.stream()
|
||||||
|
.map(CrmAchievementDO::getApril)
|
||||||
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 5: {
|
||||||
|
if (crmAchievementDO != null) {
|
||||||
|
targetPrice = crmAchievementDO
|
||||||
|
.stream()
|
||||||
|
.map(CrmAchievementDO::getMay)
|
||||||
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 6: {
|
||||||
|
if (crmAchievementDO != null) {
|
||||||
|
targetPrice = crmAchievementDO
|
||||||
|
.stream()
|
||||||
|
.map(CrmAchievementDO::getJune)
|
||||||
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 7: {
|
||||||
|
if (crmAchievementDO != null) {
|
||||||
|
targetPrice = crmAchievementDO
|
||||||
|
.stream()
|
||||||
|
.map(CrmAchievementDO::getJuly)
|
||||||
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 8: {
|
||||||
|
if (crmAchievementDO != null) {
|
||||||
|
targetPrice = crmAchievementDO
|
||||||
|
.stream()
|
||||||
|
.map(CrmAchievementDO::getAugust)
|
||||||
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 9: {
|
||||||
|
if (crmAchievementDO != null) {
|
||||||
|
targetPrice = crmAchievementDO
|
||||||
|
.stream()
|
||||||
|
.map(CrmAchievementDO::getSeptember)
|
||||||
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 10: {
|
||||||
|
if (crmAchievementDO != null) {
|
||||||
|
targetPrice = crmAchievementDO
|
||||||
|
.stream()
|
||||||
|
.map(CrmAchievementDO::getOctober)
|
||||||
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 11: {
|
||||||
|
if (crmAchievementDO != null) {
|
||||||
|
targetPrice = crmAchievementDO
|
||||||
|
.stream()
|
||||||
|
.map(CrmAchievementDO::getNovember)
|
||||||
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 12: {
|
||||||
|
if (crmAchievementDO != null) {
|
||||||
|
targetPrice = crmAchievementDO
|
||||||
|
.stream()
|
||||||
|
.map(CrmAchievementDO::getDecember)
|
||||||
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Date starTime = new Date();
|
||||||
|
Date endTime = new Date();
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
//某个月
|
||||||
|
calendar.set(year, i - 1, 1);
|
||||||
|
starTime = DateUtil.beginOfMonth(calendar.getTime());
|
||||||
|
endTime = DateUtil.endOfMonth(calendar.getTime());
|
||||||
|
|
||||||
|
LambdaQueryWrapper<CrmContractDO> wrapper = new LambdaQueryWrapper<>();
|
||||||
|
wrapper.in(CrmContractDO::getOwnerUserId, userIds)
|
||||||
|
.eq(CrmContractDO::getCheckStatus, ContractStatusEnum.STATUS_2.getValue())
|
||||||
|
.between(CrmContractDO::getOrderTime, starTime, endTime);
|
||||||
|
List<CrmContractDO> crmContractDOS = contractMapper.selectList(wrapper);
|
||||||
|
|
||||||
|
if (!crmContractDOS.isEmpty()) {
|
||||||
|
successPrice = crmContractDOS
|
||||||
|
.stream()
|
||||||
|
.map(CrmContractDO::getMoney)
|
||||||
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
||||||
|
successCount = Long.valueOf(crmContractDOS.size());
|
||||||
|
|
||||||
|
if (successCount > 0) {
|
||||||
|
perPrice = NumberUtil.round(NumberUtil.div(successPrice, successCount), 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
completionVO.setSuccessPrice(successPrice);
|
||||||
|
completionVO.setSuccessCount(successCount);
|
||||||
|
completionVO.setTargetPrice(targetPrice);
|
||||||
|
completionVO.setPerPrice(perPrice);
|
||||||
|
completionVOS.add(completionVO);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return completionVOS;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SalesVO> getSales(String relation) {
|
||||||
|
Integer year = DateUtil.year(new Date());
|
||||||
|
List<Long> userIds = new ArrayList<>();
|
||||||
|
Long userId = SecurityFrameworkUtils.getLoginUserId();
|
||||||
|
if (RelationEnum.MY.getValue().equals(relation)) {
|
||||||
|
userIds.add(userId);
|
||||||
|
} else if (RelationEnum.SUB.getValue().equals(relation)) {
|
||||||
|
userIds = adminUserApi.getUserListBySubordinateIds(userId).getData();
|
||||||
|
}
|
||||||
|
List<SalesVO> salesVOS = new ArrayList<>();
|
||||||
|
int i = 1;
|
||||||
|
while (i <= 12) {
|
||||||
|
String time = "" + year;
|
||||||
|
if (i < 10) {
|
||||||
|
time = time + "-0" + i;
|
||||||
|
} else {
|
||||||
|
time = time + "-" + i;
|
||||||
|
}
|
||||||
|
SalesVO salesVO = new SalesVO();
|
||||||
|
salesVO.setTime(time);
|
||||||
|
|
||||||
|
Date starTime = new Date();
|
||||||
|
Date endTime = new Date();
|
||||||
|
Calendar calendar = Calendar.getInstance();
|
||||||
|
//某个月
|
||||||
|
calendar.set(year, i - 1, 1);
|
||||||
|
starTime = DateUtil.beginOfMonth(calendar.getTime());
|
||||||
|
endTime = DateUtil.endOfMonth(calendar.getTime());
|
||||||
|
|
||||||
|
Long cluesCount = crmCluesMapper.selectCount(new LambdaQueryWrapper<CrmCluesDO>()
|
||||||
|
.in(CrmCluesDO::getOwnerUserId, userIds)
|
||||||
|
.between(CrmCluesDO::getCreateTime, starTime, endTime));
|
||||||
|
Long customerCount = customerMapper.selectCount(new LambdaQueryWrapper<CrmCustomerDO>()
|
||||||
|
.in(CrmCustomerDO::getOwnerUserId, userIds)
|
||||||
|
.between(CrmCustomerDO::getCreateTime, starTime, endTime));
|
||||||
|
Long businessCount = businessMapper.selectCount(new LambdaQueryWrapper<CrmBusinessDO>()
|
||||||
|
.in(CrmBusinessDO::getOwnerUserId, userIds)
|
||||||
|
.between(CrmBusinessDO::getCreateTime, starTime, endTime));
|
||||||
|
Long contractCount = contractMapper.selectCount(new LambdaQueryWrapper<CrmContractDO>()
|
||||||
|
.in(CrmContractDO::getOwnerUserId, userIds)
|
||||||
|
.between(CrmContractDO::getOrderTime, starTime, endTime));
|
||||||
|
Long receivablesCount = contractReceivablesMapper.selectCount(new LambdaQueryWrapper<CrmContractReceivablesDO>()
|
||||||
|
.in(CrmContractReceivablesDO::getOwnerUserId, userIds)
|
||||||
|
.between(CrmContractReceivablesDO::getReturnTime, starTime, endTime));
|
||||||
|
salesVO.setCluesCount(contractCount);
|
||||||
|
salesVO.setCustomerCount(customerCount);
|
||||||
|
salesVO.setBusinessCount(businessCount);
|
||||||
|
salesVO.setContractCount(contractCount);
|
||||||
|
salesVO.setReceivablesCount(receivablesCount);
|
||||||
|
salesVOS.add(salesVO);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return salesVOS;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,49 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.service.crmanalysis;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.AchievementPageReqVO;
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.CustomerLevelVO;
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.UserRecordVO;
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.UserVolumeVO;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 客户分析 Service 接口
|
||||||
|
*
|
||||||
|
* @author yshop
|
||||||
|
*/
|
||||||
|
public interface CustomerService {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 客户级别分析
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
CustomerLevelVO getCustomerLevel();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 客户来源分析
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
CustomerLevelVO getCustomerSource();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 客户行业分析
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
CustomerLevelVO getCustomerIndustry();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得客户量分析
|
||||||
|
* @param pageReqVO 分页查询
|
||||||
|
*/
|
||||||
|
PageResult<UserVolumeVO> getCustomerVolume(AchievementPageReqVO pageReqVO);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获得跟进分析
|
||||||
|
* @param pageReqVO 分页查询
|
||||||
|
*/
|
||||||
|
PageResult<UserRecordVO> getRecord(AchievementPageReqVO pageReqVO);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,191 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.service.crmanalysis;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.NumberUtil;
|
||||||
|
import cn.iocoder.yudao.framework.common.enums.ShopCommonEnum;
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.AchievementPageReqVO;
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.CustomerLevelVO;
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.UserRecordVO;
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.UserVolumeVO;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.crmcustomer.CrmCustomerDO;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.dataobject.crmrecord.CrmRecordDO;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmachievement.CrmAchievementMapper;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmclues.CrmCluesMapper;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmcontract.CrmContractMapper;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmcontractreceivables.CrmContractReceivablesMapper;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmcustomer.CrmCustomerMapper;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmrecord.CrmRecordMapper;
|
||||||
|
import cn.iocoder.yudao.module.hrm.enums.TypesEnum;
|
||||||
|
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
|
||||||
|
import cn.iocoder.yudao.module.system.api.dict.DictDataApi;
|
||||||
|
import cn.iocoder.yudao.module.system.api.dict.dto.DictDataRespDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||||
|
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserApiVO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserPageApiDTO;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 客户分析 Service 实现类
|
||||||
|
*
|
||||||
|
* @author yshop
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@Validated
|
||||||
|
public class CustomerServiceImpl implements CustomerService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CrmAchievementMapper achievementMapper;
|
||||||
|
@Resource
|
||||||
|
private DeptApi deptApi;
|
||||||
|
@Resource
|
||||||
|
private DictDataApi dictDataApi;
|
||||||
|
@Resource
|
||||||
|
private CrmContractMapper contractMapper;
|
||||||
|
@Resource
|
||||||
|
private CrmContractReceivablesMapper contractReceivablesMapper;
|
||||||
|
@Resource
|
||||||
|
private CrmCluesMapper crmCluesMapper;
|
||||||
|
@Resource
|
||||||
|
private AdminUserApi adminUserApi;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CrmCustomerMapper customerMapper;
|
||||||
|
@Resource
|
||||||
|
private CrmRecordMapper crmRecordMapper;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CustomerLevelVO getCustomerLevel() {
|
||||||
|
List<DictDataRespDTO> list = dictDataApi.getDictDataList("customer_level").getCheckedData();
|
||||||
|
List<Long> allCustomer = new ArrayList<>();
|
||||||
|
List<Long> dealCustomer = new ArrayList<>();
|
||||||
|
|
||||||
|
list.forEach(v -> {
|
||||||
|
LambdaQueryWrapper<CrmCustomerDO> wrapper = new LambdaQueryWrapper<>();
|
||||||
|
wrapper.eq(CrmCustomerDO::getLevel, v.getValue());
|
||||||
|
Long all = customerMapper.selectCount(wrapper);
|
||||||
|
wrapper.eq(CrmCustomerDO::getDealStatus, ShopCommonEnum.IS_STATUS_1.getValue());
|
||||||
|
Long deal = customerMapper.selectCount(wrapper);
|
||||||
|
allCustomer.add(all);
|
||||||
|
dealCustomer.add(deal);
|
||||||
|
});
|
||||||
|
List<String> data = list.stream().map(DictDataRespDTO::getLabel).collect(Collectors.toList());
|
||||||
|
|
||||||
|
return CustomerLevelVO.builder().data(data).allCustomer(allCustomer).dealCustomer(dealCustomer).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CustomerLevelVO getCustomerSource() {
|
||||||
|
List<DictDataRespDTO> list = dictDataApi.getDictDataList("customer_source").getCheckedData();
|
||||||
|
|
||||||
|
List<Long> allCustomer = new ArrayList<>();
|
||||||
|
List<Long> dealCustomer = new ArrayList<>();
|
||||||
|
|
||||||
|
list.forEach(v -> {
|
||||||
|
LambdaQueryWrapper<CrmCustomerDO> wrapper = new LambdaQueryWrapper<>();
|
||||||
|
wrapper.eq(CrmCustomerDO::getSource, v.getValue());
|
||||||
|
Long all = customerMapper.selectCount(wrapper);
|
||||||
|
wrapper.eq(CrmCustomerDO::getDealStatus, ShopCommonEnum.IS_STATUS_1.getValue());
|
||||||
|
Long deal = customerMapper.selectCount(wrapper);
|
||||||
|
allCustomer.add(all);
|
||||||
|
dealCustomer.add(deal);
|
||||||
|
});
|
||||||
|
List<String> data = list.stream().map(DictDataRespDTO::getLabel).collect(Collectors.toList());
|
||||||
|
|
||||||
|
return CustomerLevelVO.builder().data(data).allCustomer(allCustomer).dealCustomer(dealCustomer).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CustomerLevelVO getCustomerIndustry() {
|
||||||
|
List<DictDataRespDTO> list = dictDataApi.getDictDataList("customer_industry").getCheckedData();
|
||||||
|
List<Long> allCustomer = new ArrayList<>();
|
||||||
|
List<Long> dealCustomer = new ArrayList<>();
|
||||||
|
|
||||||
|
list.forEach(v -> {
|
||||||
|
LambdaQueryWrapper<CrmCustomerDO> wrapper = new LambdaQueryWrapper<>();
|
||||||
|
wrapper.eq(CrmCustomerDO::getIndustry, v.getValue());
|
||||||
|
Long all = customerMapper.selectCount(wrapper);
|
||||||
|
wrapper.eq(CrmCustomerDO::getDealStatus, ShopCommonEnum.IS_STATUS_1.getValue());
|
||||||
|
Long deal = customerMapper.selectCount(wrapper);
|
||||||
|
allCustomer.add(all);
|
||||||
|
dealCustomer.add(deal);
|
||||||
|
});
|
||||||
|
List<String> data = list.stream().map(DictDataRespDTO::getLabel).collect(Collectors.toList());
|
||||||
|
|
||||||
|
return CustomerLevelVO.builder().data(data).allCustomer(allCustomer).dealCustomer(dealCustomer).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PageResult<UserVolumeVO> getCustomerVolume(AchievementPageReqVO pageReqVO) {
|
||||||
|
AdminUserPageApiDTO dto = new AdminUserPageApiDTO();
|
||||||
|
dto.setUsername(pageReqVO.getName());
|
||||||
|
dto.setPageNo(pageReqVO.getPageNo());
|
||||||
|
dto.setPageSize(pageReqVO.getPageSize());
|
||||||
|
PageResult<AdminUserApiVO> pageResult = adminUserApi.getUserPage(dto).getCheckedData();
|
||||||
|
PageResult<UserVolumeVO> pageResult1 = BeanUtils.toBean(pageResult, UserVolumeVO.class);
|
||||||
|
pageResult1.getList().forEach(v -> {
|
||||||
|
LambdaQueryWrapperX<CrmCustomerDO> wrapperX = new LambdaQueryWrapperX<>();
|
||||||
|
wrapperX.eq(CrmCustomerDO::getOwnerUserId, v.getId())
|
||||||
|
.betweenIfPresent(CrmCustomerDO::getCreateTime, pageReqVO.getCreateTime());
|
||||||
|
Long customerCount = customerMapper.selectCount(wrapperX);
|
||||||
|
wrapperX.eq(CrmCustomerDO::getDealStatus, ShopCommonEnum.IS_STATUS_1.getValue());
|
||||||
|
Long successCount = customerMapper.selectCount(wrapperX);
|
||||||
|
|
||||||
|
v.setCustomerCount(customerCount);
|
||||||
|
v.setSuccessCount(successCount);
|
||||||
|
|
||||||
|
String per = "0";
|
||||||
|
if (customerCount > 0) {
|
||||||
|
per = NumberUtil.round(NumberUtil.div(successCount, customerCount), 2)
|
||||||
|
.multiply(new BigDecimal("100")).toString();
|
||||||
|
}
|
||||||
|
v.setSuccessPer(per);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
return pageResult1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PageResult<UserRecordVO> getRecord(AchievementPageReqVO pageReqVO) {
|
||||||
|
AdminUserPageApiDTO dto = new AdminUserPageApiDTO();
|
||||||
|
dto.setUsername(pageReqVO.getName());
|
||||||
|
dto.setPageNo(pageReqVO.getPageNo());
|
||||||
|
dto.setPageSize(pageReqVO.getPageSize());
|
||||||
|
PageResult<AdminUserApiVO> pageResult = adminUserApi.getUserPage(dto).getCheckedData();
|
||||||
|
PageResult<UserRecordVO> pageResult1 = BeanUtils.toBean(pageResult, UserRecordVO.class);
|
||||||
|
pageResult1.getList().forEach(v -> {
|
||||||
|
LambdaQueryWrapperX<CrmRecordDO> wrapperX = new LambdaQueryWrapperX<>();
|
||||||
|
wrapperX.eq(CrmRecordDO::getCreator, v.getId())
|
||||||
|
.betweenIfPresent(CrmRecordDO::getCreateTime, pageReqVO.getCreateTime());
|
||||||
|
Long totalCount = crmRecordMapper.selectCount(wrapperX);
|
||||||
|
|
||||||
|
wrapperX.eq(CrmRecordDO::getTypes, TypesEnum.CUSTOMER.getValue());
|
||||||
|
Long customerCount = crmRecordMapper.selectCount(wrapperX);
|
||||||
|
|
||||||
|
wrapperX.eq(CrmRecordDO::getTypes, TypesEnum.BUSINESS.getValue());
|
||||||
|
Long businessCount = crmRecordMapper.selectCount(wrapperX);
|
||||||
|
|
||||||
|
wrapperX.eq(CrmRecordDO::getTypes, TypesEnum.CLUES.getValue());
|
||||||
|
Long cluesCount = crmRecordMapper.selectCount(wrapperX);
|
||||||
|
|
||||||
|
v.setTotalCount(totalCount);
|
||||||
|
v.setCustomerCount(customerCount);
|
||||||
|
v.setBusinessCount(businessCount);
|
||||||
|
v.setCluesCount(cluesCount);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
return pageResult1;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.service.crmanalysis;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.ContractVO;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 排行分析 Service 接口
|
||||||
|
*
|
||||||
|
* @author yshop
|
||||||
|
*/
|
||||||
|
public interface RankService {
|
||||||
|
|
||||||
|
|
||||||
|
List<ContractVO> getContractRank();
|
||||||
|
|
||||||
|
List<ContractVO> getReceivablesRank();
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
package cn.iocoder.yudao.module.crm.service.crmanalysis;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.module.crm.controller.admin.crmanalysis.vo.ContractVO;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmcontract.CrmContractMapper;
|
||||||
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmcontractreceivables.CrmContractReceivablesMapper;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 排行分析 Service 实现类
|
||||||
|
*
|
||||||
|
* @author yshop
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@Validated
|
||||||
|
public class RankServiceImpl implements RankService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private CrmContractMapper contractMapper;
|
||||||
|
@Resource
|
||||||
|
private CrmContractReceivablesMapper contractReceivablesMapper;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ContractVO> getContractRank() {
|
||||||
|
return contractMapper.selectContractTop();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<ContractVO> getReceivablesRank() {
|
||||||
|
return contractReceivablesMapper.selectReceivablesTop();
|
||||||
|
}
|
||||||
|
}
|
@ -151,6 +151,9 @@ public class CrmCluesServiceImpl implements CrmCluesService {
|
|||||||
if (crmCluesDO == null) {
|
if (crmCluesDO == null) {
|
||||||
throw exception(CLUES_NOT_EXISTS);
|
throw exception(CLUES_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
|
if(CluesStatusEnum.STATUS_1.getValue().equals(crmCluesDO.getStatus())){
|
||||||
|
throw exception(new ErrorCode(202411160,"已经转化成客户!"));
|
||||||
|
}
|
||||||
createReqVO.setId(null);
|
createReqVO.setId(null);
|
||||||
CrmCustomerDO customerDO = BeanUtils.toBean(createReqVO, CrmCustomerDO.class);
|
CrmCustomerDO customerDO = BeanUtils.toBean(createReqVO, CrmCustomerDO.class);
|
||||||
customerDO.setOwnerUserId(SecurityFrameworkUtils.getLoginUserId());
|
customerDO.setOwnerUserId(SecurityFrameworkUtils.getLoginUserId());
|
||||||
|
@ -117,7 +117,6 @@ public class CrmContractServiceImpl implements CrmContractService {
|
|||||||
//处理客户
|
//处理客户
|
||||||
CrmCustomerDO crmCustomerDO = customerMapper.selectById(createReqVO.getCustomerId());
|
CrmCustomerDO crmCustomerDO = customerMapper.selectById(createReqVO.getCustomerId());
|
||||||
|
|
||||||
|
|
||||||
// 插入
|
// 插入
|
||||||
CrmContractDO contract = BeanUtils.toBean(createReqVO, CrmContractDO.class);
|
CrmContractDO contract = BeanUtils.toBean(createReqVO, CrmContractDO.class);
|
||||||
contract.setOwnerUserId(SecurityFrameworkUtils.getLoginUserId());
|
contract.setOwnerUserId(SecurityFrameworkUtils.getLoginUserId());
|
||||||
@ -130,10 +129,10 @@ public class CrmContractServiceImpl implements CrmContractService {
|
|||||||
createContractProductList(contract.getId(), createReqVO.getContractProducts());
|
createContractProductList(contract.getId(), createReqVO.getContractProducts());
|
||||||
|
|
||||||
//更新审核
|
//更新审核
|
||||||
updateAfter(contract.getId());
|
// updateAfter(contract.getId());
|
||||||
|
|
||||||
//插入日志
|
//插入日志
|
||||||
crmOperatelogService.createLog("添加合同", 0L, contract.getId(), 0L);
|
// crmOperatelogService.createLog("添加合同", 0L, contract.getId(), 0L);
|
||||||
|
|
||||||
//todo 站内信通知 审批
|
//todo 站内信通知 审批
|
||||||
|
|
||||||
@ -392,7 +391,6 @@ public class CrmContractServiceImpl implements CrmContractService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void createContractProductList(Long contractId, List<CrmContractProductDO> list) {
|
private void createContractProductList(Long contractId, List<CrmContractProductDO> list) {
|
||||||
|
|
||||||
List<StoreProductAttrValueApiVO> storeProductAttrValueList = new ArrayList<>();
|
List<StoreProductAttrValueApiVO> storeProductAttrValueList = new ArrayList<>();
|
||||||
if (CollUtil.isNotEmpty(list)) {
|
if (CollUtil.isNotEmpty(list)) {
|
||||||
List<Long> productIds = list.stream().map(CrmContractProductDO::getProductId).collect(Collectors.toList());
|
List<Long> productIds = list.stream().map(CrmContractProductDO::getProductId).collect(Collectors.toList());
|
||||||
@ -402,23 +400,22 @@ public class CrmContractServiceImpl implements CrmContractService {
|
|||||||
.setUniques(productAttrUnique)).getCheckedData();
|
.setUniques(productAttrUnique)).getCheckedData();
|
||||||
}
|
}
|
||||||
Map<String, List<StoreProductAttrValueApiVO>> map = storeProductAttrValueList.stream().collect(Collectors.groupingBy(a -> a.getProductId() + "_" + a.getUnique()));
|
Map<String, List<StoreProductAttrValueApiVO>> map = storeProductAttrValueList.stream().collect(Collectors.groupingBy(a -> a.getProductId() + "_" + a.getUnique()));
|
||||||
|
|
||||||
list.forEach(o -> {
|
list.forEach(o -> {
|
||||||
o.setContractId(contractId);
|
o.setContractId(contractId);
|
||||||
//库存处理
|
//库存处理
|
||||||
List<StoreProductAttrValueApiVO> storeProductAttrValueApiVOS = map.get(o.getProductId() + "_" + o.getProductAttrUnique());
|
List<StoreProductAttrValueApiVO> storeProductAttrValueApiVOS = map.get(o.getProductId() + "_" + o.getProductAttrUnique());
|
||||||
|
|
||||||
Integer count = 0;
|
int count = 0;
|
||||||
if (CollUtil.isNotEmpty(storeProductAttrValueApiVOS)) {
|
if (CollUtil.isNotEmpty(storeProductAttrValueApiVOS)) {
|
||||||
count = storeProductAttrValueApiVOS.size();
|
count = storeProductAttrValueApiVOS.stream().mapToInt(StoreProductAttrValueApiVO::getStock).sum();
|
||||||
}
|
}
|
||||||
if (NumberUtil.compare(count, o.getNums()) < 0) {
|
if (NumberUtil.compare(count, o.getNums()) < 0) {
|
||||||
throw exception(new ErrorCode(202408250, "该商品ID:" + o.getProductId() + "库存不足"));
|
throw exception(new ErrorCode(202408250, "该商品ID:" + o.getProductId() + "库存不足"));
|
||||||
}
|
}
|
||||||
|
// TODO: 2024/11/21 这里的库存扣件完后 - 如果审批不通过 库存退回
|
||||||
this.decProductStock(o.getNums(), o.getProductId(), o.getProductAttrUnique());
|
this.decProductStock(o.getNums(), o.getProductId(), o.getProductAttrUnique());
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
contractProductMapper.insertBatch(list);
|
contractProductMapper.insertBatch(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,6 +9,6 @@ import cn.iocoder.yudao.module.crm.controller.admin.crmindex.vo.CrmIndexRespVO;
|
|||||||
*/
|
*/
|
||||||
public interface CrmIndexService {
|
public interface CrmIndexService {
|
||||||
|
|
||||||
CrmIndexRespVO getIndexCount();
|
CrmIndexRespVO getIndexCount(String relation);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package cn.iocoder.yudao.module.crm.service.crmindex;
|
package cn.iocoder.yudao.module.crm.service.crmindex;
|
||||||
|
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import cn.hutool.core.util.NumberUtil;
|
||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||||
import cn.iocoder.yudao.framework.common.enums.ShopCommonEnum;
|
import cn.iocoder.yudao.framework.common.enums.ShopCommonEnum;
|
||||||
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
||||||
@ -12,7 +13,6 @@ import cn.iocoder.yudao.module.crm.dal.dataobject.crmcontract.CrmContractDO;
|
|||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.crmcontractreceivables.CrmContractReceivablesDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.crmcontractreceivables.CrmContractReceivablesDO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.crmcustomer.CrmCustomerDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.crmcustomer.CrmCustomerDO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.crmcustomercontacts.CrmCustomerContactsDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.crmcustomercontacts.CrmCustomerContactsDO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.crminvoice.CrmInvoiceDO;
|
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.crmrecord.CrmRecordDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.crmrecord.CrmRecordDO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.mysql.crmbusiness.CrmBusinessMapper;
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmbusiness.CrmBusinessMapper;
|
||||||
import cn.iocoder.yudao.module.crm.dal.mysql.crmclues.CrmCluesMapper;
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmclues.CrmCluesMapper;
|
||||||
@ -20,11 +20,11 @@ import cn.iocoder.yudao.module.crm.dal.mysql.crmcontract.CrmContractMapper;
|
|||||||
import cn.iocoder.yudao.module.crm.dal.mysql.crmcontractreceivables.CrmContractReceivablesMapper;
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmcontractreceivables.CrmContractReceivablesMapper;
|
||||||
import cn.iocoder.yudao.module.crm.dal.mysql.crmcustomer.CrmCustomerMapper;
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmcustomer.CrmCustomerMapper;
|
||||||
import cn.iocoder.yudao.module.crm.dal.mysql.crmcustomercontacts.CrmCustomerContactsMapper;
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmcustomercontacts.CrmCustomerContactsMapper;
|
||||||
import cn.iocoder.yudao.module.crm.dal.mysql.crminvoice.CrmInvoiceMapper;
|
|
||||||
import cn.iocoder.yudao.module.crm.dal.mysql.crmrecord.CrmRecordMapper;
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmrecord.CrmRecordMapper;
|
||||||
import cn.iocoder.yudao.module.product.api.storeproduct.StoreProductApi;
|
import cn.iocoder.yudao.module.hrm.enums.RelationEnum;
|
||||||
import cn.iocoder.yudao.module.system.api.notice.NoticeApi;
|
import cn.iocoder.yudao.module.system.api.notice.NoticeApi;
|
||||||
import cn.iocoder.yudao.module.system.api.notice.dto.NoticeDTO;
|
import cn.iocoder.yudao.module.system.api.notice.dto.NoticeDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@ -32,7 +32,9 @@ import org.springframework.validation.annotation.Validated;
|
|||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 商机 Service 实现类
|
* 商机 Service 实现类
|
||||||
@ -46,10 +48,6 @@ public class CrmIndexServiceImpl implements CrmIndexService {
|
|||||||
@Resource
|
@Resource
|
||||||
private CrmBusinessMapper businessMapper;
|
private CrmBusinessMapper businessMapper;
|
||||||
@Resource
|
@Resource
|
||||||
private StoreProductApi storeProductApi;
|
|
||||||
@Resource
|
|
||||||
private CrmInvoiceMapper crmInvoiceMapper;
|
|
||||||
@Resource
|
|
||||||
private CrmCustomerMapper customerMapper;
|
private CrmCustomerMapper customerMapper;
|
||||||
@Resource
|
@Resource
|
||||||
private CrmCluesMapper crmCluesMapper;
|
private CrmCluesMapper crmCluesMapper;
|
||||||
@ -63,50 +61,52 @@ public class CrmIndexServiceImpl implements CrmIndexService {
|
|||||||
private CrmCustomerContactsMapper customerContactsMapper;
|
private CrmCustomerContactsMapper customerContactsMapper;
|
||||||
@Resource
|
@Resource
|
||||||
private NoticeApi noticeApi;
|
private NoticeApi noticeApi;
|
||||||
|
@Resource
|
||||||
|
private AdminUserApi adminUserApi;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CrmIndexRespVO getIndexCount() {
|
public CrmIndexRespVO getIndexCount(String relation) {
|
||||||
Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
|
// Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
|
||||||
Date todayStart = DateUtil.beginOfDay(new Date());
|
// Date todayStart = DateUtil.beginOfDay(new Date());
|
||||||
Date todayEnd = DateUtil.endOfDay(new Date());
|
// Date todayEnd = DateUtil.endOfDay(new Date());
|
||||||
Date day30 = DateUtil.offsetDay(new Date(), 30);
|
// Date day30 = DateUtil.offsetDay(new Date(),30);
|
||||||
|
//
|
||||||
Long followCustomerCount = customerMapper.selectCount(new LambdaQueryWrapper<CrmCustomerDO>()
|
// Long followCustomerCount = customerMapper.selectCount(new LambdaQueryWrapper<CrmCustomerDO>()
|
||||||
.between(CrmCustomerDO::getNextTime, todayStart, todayEnd).eq(CrmCustomerDO::getOwnerUserId, loginUserId));
|
// .between(CrmCustomerDO::getNextTime,todayStart,todayEnd).eq(CrmCustomerDO::getOwnerUserId,loginUserId));
|
||||||
Long followBusinessCount = businessMapper.selectCount(new LambdaQueryWrapper<CrmBusinessDO>()
|
// Long followBusinessCount = businessMapper.selectCount(new LambdaQueryWrapper<CrmBusinessDO>()
|
||||||
.between(CrmBusinessDO::getNextTime, todayStart, todayEnd).eq(CrmBusinessDO::getOwnerUserId, loginUserId));
|
// .between(CrmBusinessDO::getNextTime,todayStart,todayEnd).eq(CrmBusinessDO::getOwnerUserId,loginUserId));
|
||||||
Long followCluesCount = crmCluesMapper.selectCount(new LambdaQueryWrapper<CrmCluesDO>()
|
// Long followCluesCount = crmCluesMapper.selectCount(new LambdaQueryWrapper<CrmCluesDO>()
|
||||||
.between(CrmCluesDO::getNextTime, todayStart, todayEnd).eq(CrmCluesDO::getOwnerUserId, loginUserId));
|
// .between(CrmCluesDO::getNextTime,todayStart,todayEnd).eq(CrmCluesDO::getOwnerUserId,loginUserId));
|
||||||
Long contractDueCount = contractMapper.selectCount(new LambdaQueryWrapper<CrmContractDO>()
|
// Long contractDueCount = contractMapper.selectCount(new LambdaQueryWrapper<CrmContractDO>()
|
||||||
.between(CrmContractDO::getEndTime, todayStart, day30).eq(CrmContractDO::getOwnerUserId, loginUserId));
|
// .between(CrmContractDO::getEndTime,todayStart,day30).eq(CrmContractDO::getOwnerUserId,loginUserId));
|
||||||
Long customerDueCount = 0L;
|
// Long customerDueCount = 0L;
|
||||||
Long contractReturnCount = contractMapper.selectCount(new LambdaQueryWrapper<CrmContractDO>()
|
// Long contractReturnCount = contractMapper.selectCount(new LambdaQueryWrapper<CrmContractDO>()
|
||||||
.eq(CrmContractDO::getOwnerUserId, loginUserId).apply("money > return_money"));
|
// .eq(CrmContractDO::getOwnerUserId,loginUserId).apply("money > return_money"));
|
||||||
Long myInvoiceCount = crmInvoiceMapper.selectCount(new LambdaQueryWrapper<CrmInvoiceDO>()
|
// Long myInvoiceCount = crmInvoiceMapper.selectCount(new LambdaQueryWrapper<CrmInvoiceDO>()
|
||||||
.eq(CrmInvoiceDO::getCreator, loginUserId));
|
// .eq(CrmInvoiceDO::getCreator,loginUserId));
|
||||||
Long productCount = storeProductApi.selectCount().getCheckedData();
|
// Long productCount = storeProductMapper.selectCount();
|
||||||
|
//
|
||||||
Long contractCheckCount = contractMapper.selectCount(new LambdaQueryWrapper<CrmContractDO>()
|
// Long contractCheckCount = contractMapper.selectCount(new LambdaQueryWrapper<CrmContractDO>()
|
||||||
.apply("FIND_IN_SET ('" + loginUserId + "',flow_admin_id)"));
|
// .apply( "FIND_IN_SET ('" + loginUserId + "',flow_admin_id)"));
|
||||||
Long receivablesCheckCount = contractReceivablesMapper.selectCount(new LambdaQueryWrapper<CrmContractReceivablesDO>()
|
// Long receivablesCheckCount = contractReceivablesMapper.selectCount(new LambdaQueryWrapper<CrmContractReceivablesDO>()
|
||||||
.apply("FIND_IN_SET ('" + loginUserId + "',flow_admin_id)"));
|
// .apply( "FIND_IN_SET ('" + loginUserId + "',flow_admin_id)"));
|
||||||
Long invoiceCheckCount = crmInvoiceMapper.selectCount(new LambdaQueryWrapper<CrmInvoiceDO>()
|
// Long invoiceCheckCount = crmInvoiceMapper.selectCount(new LambdaQueryWrapper<CrmInvoiceDO>()
|
||||||
.apply("FIND_IN_SET ('" + loginUserId + "',flow_admin_id)"));
|
// .apply( "FIND_IN_SET ('" + loginUserId + "',flow_admin_id)"));
|
||||||
|
|
||||||
return CrmIndexRespVO.builder()
|
return CrmIndexRespVO.builder()
|
||||||
.followCustomerCount(followCustomerCount)
|
// .followCustomerCount(followCustomerCount)
|
||||||
.followBusinessCount(followBusinessCount)
|
// .followBusinessCount(followBusinessCount)
|
||||||
.followCluesCount(followCluesCount)
|
// .followCluesCount(followCluesCount)
|
||||||
.contractDueCount(contractDueCount)
|
// .contractDueCount(contractDueCount)
|
||||||
.customerDueCount(customerDueCount)
|
// .customerDueCount(customerDueCount)
|
||||||
.contractReturnCount(contractReturnCount)
|
// .contractReturnCount(contractReturnCount)
|
||||||
.myInvoiceCount(myInvoiceCount)
|
// .myInvoiceCount(myInvoiceCount)
|
||||||
.productCount(productCount)
|
// .productCount(productCount)
|
||||||
.contractCheckCount(contractCheckCount)
|
// .contractCheckCount(contractCheckCount)
|
||||||
.receivablesCheckCount(receivablesCheckCount)
|
// .receivablesCheckCount(receivablesCheckCount)
|
||||||
.invoiceCheckCount(invoiceCheckCount)
|
// .invoiceCheckCount(invoiceCheckCount)
|
||||||
.brieCountVO(getBrieCount())
|
.brieCountVO(getBrieCount(relation))
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -116,39 +116,142 @@ public class CrmIndexServiceImpl implements CrmIndexService {
|
|||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private BrieCountVO getBrieCount() {
|
private BrieCountVO getBrieCount(String relation) {
|
||||||
Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
|
Long loginUserId = SecurityFrameworkUtils.getLoginUserId();
|
||||||
Date todayStart = DateUtil.beginOfDay(new Date());
|
Date todayStart = DateUtil.beginOfDay(new Date());
|
||||||
Date todayEnd = DateUtil.endOfDay(new Date());
|
Date todayEnd = DateUtil.endOfDay(new Date());
|
||||||
|
|
||||||
|
Date yesterdayStart = DateUtil.beginOfDay(DateUtil.yesterday());
|
||||||
|
Date yesterdayEnd = DateUtil.endOfDay(DateUtil.yesterday());
|
||||||
|
|
||||||
|
List<Long> ids = new ArrayList<>();
|
||||||
|
Long adminId = SecurityFrameworkUtils.getLoginUserId();
|
||||||
|
if (RelationEnum.MY.getValue().equals(relation)) {
|
||||||
|
ids.add(adminId);
|
||||||
|
} else if (RelationEnum.SUB.getValue().equals(relation)) {
|
||||||
|
ids = adminUserApi.getUserListBySubordinateIds(adminId).getCheckedData();
|
||||||
|
}
|
||||||
|
|
||||||
Long count01 = businessMapper.selectCount(new LambdaQueryWrapper<CrmBusinessDO>()
|
Long count01 = businessMapper.selectCount(new LambdaQueryWrapper<CrmBusinessDO>()
|
||||||
.between(CrmBusinessDO::getCreateTime, todayStart, todayEnd).eq(CrmBusinessDO::getCreator, loginUserId));
|
.in(!ids.isEmpty(), CrmBusinessDO::getOwnerUserId, ids)
|
||||||
|
.between(CrmBusinessDO::getCreateTime, todayStart, todayEnd));
|
||||||
|
Long count001 = businessMapper.selectCount(new LambdaQueryWrapper<CrmBusinessDO>()
|
||||||
|
.in(!ids.isEmpty(), CrmBusinessDO::getOwnerUserId, ids)
|
||||||
|
.between(CrmBusinessDO::getCreateTime, yesterdayStart, yesterdayEnd));
|
||||||
|
String per001 = "0";
|
||||||
|
if (count001 > 0) {
|
||||||
|
per001 = NumberUtil.div(NumberUtil.sub(count01, count001), count001, 2)
|
||||||
|
.multiply(new BigDecimal("100")).toString();
|
||||||
|
}
|
||||||
|
|
||||||
Long count02 = crmCluesMapper.selectCount(new LambdaQueryWrapper<CrmCluesDO>()
|
Long count02 = crmCluesMapper.selectCount(new LambdaQueryWrapper<CrmCluesDO>()
|
||||||
.between(CrmCluesDO::getCreateTime, todayStart, todayEnd).eq(CrmCluesDO::getCreator, loginUserId));
|
.in(!ids.isEmpty(), CrmCluesDO::getOwnerUserId, ids)
|
||||||
|
.between(CrmCluesDO::getCreateTime, todayStart, todayEnd));
|
||||||
|
Long count002 = crmCluesMapper.selectCount(new LambdaQueryWrapper<CrmCluesDO>()
|
||||||
|
.in(!ids.isEmpty(), CrmCluesDO::getOwnerUserId, ids)
|
||||||
|
.between(CrmCluesDO::getCreateTime, yesterdayStart, yesterdayEnd));
|
||||||
|
String per002 = "0";
|
||||||
|
if (count002 > 0) {
|
||||||
|
per002 = NumberUtil.div(NumberUtil.sub(count02, count002), count002, 2)
|
||||||
|
.multiply(new BigDecimal("100")).toString();
|
||||||
|
}
|
||||||
|
|
||||||
Long count03 = customerMapper.selectCount(new LambdaQueryWrapper<CrmCustomerDO>()
|
Long count03 = customerMapper.selectCount(new LambdaQueryWrapper<CrmCustomerDO>()
|
||||||
.between(CrmCustomerDO::getCreateTime, todayStart, todayEnd).eq(CrmCustomerDO::getCreator, loginUserId));
|
.in(!ids.isEmpty(), CrmCustomerDO::getOwnerUserId, ids)
|
||||||
|
.between(CrmCustomerDO::getCreateTime, todayStart, todayEnd));
|
||||||
|
Long count003 = customerMapper.selectCount(new LambdaQueryWrapper<CrmCustomerDO>()
|
||||||
|
.in(!ids.isEmpty(), CrmCustomerDO::getOwnerUserId, ids)
|
||||||
|
.between(CrmCustomerDO::getCreateTime, yesterdayStart, yesterdayEnd));
|
||||||
|
String per003 = "0";
|
||||||
|
if (count003 > 0) {
|
||||||
|
per003 = NumberUtil.div(NumberUtil.sub(count03, count003), count003, 2)
|
||||||
|
.multiply(new BigDecimal("100")).toString();
|
||||||
|
}
|
||||||
|
|
||||||
Long count04 = crmRecordMapper.selectCount(new LambdaQueryWrapper<CrmRecordDO>()
|
Long count04 = crmRecordMapper.selectCount(new LambdaQueryWrapper<CrmRecordDO>()
|
||||||
.between(CrmRecordDO::getCreateTime, todayStart, todayEnd).eq(CrmRecordDO::getCreator, loginUserId));
|
.in(!ids.isEmpty(), CrmRecordDO::getCreator, ids)
|
||||||
|
.between(CrmRecordDO::getCreateTime, todayStart, todayEnd));
|
||||||
|
Long count004 = crmRecordMapper.selectCount(new LambdaQueryWrapper<CrmRecordDO>()
|
||||||
|
.in(!ids.isEmpty(), CrmRecordDO::getCreator, ids)
|
||||||
|
.between(CrmRecordDO::getCreateTime, yesterdayStart, yesterdayEnd));
|
||||||
|
String per004 = "0";
|
||||||
|
if (count004 > 0) {
|
||||||
|
per004 = NumberUtil.div(NumberUtil.sub(count04, count004), count004, 2)
|
||||||
|
.multiply(new BigDecimal("100")).toString();
|
||||||
|
}
|
||||||
|
|
||||||
Long count05 = contractMapper.selectCount(new LambdaQueryWrapper<CrmContractDO>()
|
Long count05 = contractMapper.selectCount(new LambdaQueryWrapper<CrmContractDO>()
|
||||||
.between(CrmContractDO::getCreateTime, todayStart, todayEnd).eq(CrmContractDO::getCreator, loginUserId));
|
.in(!ids.isEmpty(), CrmContractDO::getOwnerUserId, ids)
|
||||||
|
.between(CrmContractDO::getCreateTime, todayStart, todayEnd));
|
||||||
|
Long count005 = contractMapper.selectCount(new LambdaQueryWrapper<CrmContractDO>()
|
||||||
|
.in(!ids.isEmpty(), CrmContractDO::getOwnerUserId, ids)
|
||||||
|
.between(CrmContractDO::getCreateTime, yesterdayStart, yesterdayEnd));
|
||||||
|
String per005 = "0";
|
||||||
|
if (count005 > 0) {
|
||||||
|
per005 = NumberUtil.div(NumberUtil.sub(count05, count005), count005, 2)
|
||||||
|
.multiply(new BigDecimal("100")).toString();
|
||||||
|
}
|
||||||
|
|
||||||
QueryWrapper<CrmContractDO> queryWrapper06 = new QueryWrapper<>();
|
QueryWrapper<CrmContractDO> queryWrapper06 = new QueryWrapper<>();
|
||||||
queryWrapper06.select("sum(money) as count06");
|
queryWrapper06.select("sum(money) as count06");
|
||||||
queryWrapper06.eq("to_days(create_time)", "to_days(now())");
|
queryWrapper06.eq("to_days(create_time)", "to_days(now())");
|
||||||
|
queryWrapper06.in(!ids.isEmpty(), "owner_user_id", ids);
|
||||||
CrmContractDO crmContractDO = contractMapper.selectOne(queryWrapper06);
|
CrmContractDO crmContractDO = contractMapper.selectOne(queryWrapper06);
|
||||||
BigDecimal count06 = BigDecimal.ZERO;
|
BigDecimal count06 = BigDecimal.ZERO;
|
||||||
if (crmContractDO != null) {
|
if (crmContractDO != null) {
|
||||||
count06 = crmContractDO.getCount06();
|
count06 = crmContractDO.getCount06();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QueryWrapper<CrmContractDO> queryWrapper006 = new QueryWrapper<>();
|
||||||
|
queryWrapper006.select("sum(money) as count006");
|
||||||
|
queryWrapper006.eq("to_days(now())-to_days(create_time)", 1);
|
||||||
|
queryWrapper006.in(!ids.isEmpty(), "owner_user_id", ids);
|
||||||
|
CrmContractDO crmContractDO006 = contractMapper.selectOne(queryWrapper006);
|
||||||
|
BigDecimal count006 = BigDecimal.ZERO;
|
||||||
|
if (crmContractDO006 != null) {
|
||||||
|
count006 = crmContractDO006.getCount006();
|
||||||
|
}
|
||||||
|
String per006 = "0";
|
||||||
|
if (count006.compareTo(BigDecimal.ZERO) > 0) {
|
||||||
|
per006 = NumberUtil.div(NumberUtil.sub(count06, count006), count006, 2)
|
||||||
|
.multiply(new BigDecimal("100")).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
QueryWrapper<CrmContractReceivablesDO> queryWrapper07 = new QueryWrapper<>();
|
QueryWrapper<CrmContractReceivablesDO> queryWrapper07 = new QueryWrapper<>();
|
||||||
queryWrapper07.select("sum(money) as count07");
|
queryWrapper07.select("sum(money) as count07");
|
||||||
queryWrapper06.eq("to_days(create_time)", "to_days(now())");
|
queryWrapper07.eq("to_days(create_time)", "to_days(now())");
|
||||||
CrmContractReceivablesDO crmContractReceivablesDO = contractReceivablesMapper.selectOne(queryWrapper07);
|
CrmContractReceivablesDO crmContractReceivablesDO = contractReceivablesMapper.selectOne(queryWrapper07);
|
||||||
BigDecimal count07 = BigDecimal.ZERO;
|
BigDecimal count07 = BigDecimal.ZERO;
|
||||||
if (crmContractDO != null) {
|
if (crmContractDO != null) {
|
||||||
count07 = crmContractReceivablesDO.getCount07();
|
count07 = crmContractReceivablesDO.getCount07();
|
||||||
}
|
}
|
||||||
|
QueryWrapper<CrmContractReceivablesDO> queryWrapper007 = new QueryWrapper<>();
|
||||||
|
queryWrapper007.select("sum(money) as count007");
|
||||||
|
queryWrapper007.eq("to_days(now())-to_days(create_time)", 1);
|
||||||
|
CrmContractReceivablesDO crmContractReceivablesDO007 = contractReceivablesMapper.selectOne(queryWrapper007);
|
||||||
|
BigDecimal count007 = BigDecimal.ZERO;
|
||||||
|
if (crmContractReceivablesDO007 != null) {
|
||||||
|
count007 = crmContractReceivablesDO007.getCount007();
|
||||||
|
}
|
||||||
|
String per007 = "0";
|
||||||
|
if (count007.compareTo(BigDecimal.ZERO) > 0) {
|
||||||
|
per007 = NumberUtil.div(NumberUtil.sub(count07, count007), count007, 2)
|
||||||
|
.multiply(new BigDecimal("100")).toString();
|
||||||
|
}
|
||||||
|
|
||||||
Long count08 = customerContactsMapper.selectCount(new LambdaQueryWrapper<CrmCustomerContactsDO>()
|
Long count08 = customerContactsMapper.selectCount(new LambdaQueryWrapper<CrmCustomerContactsDO>()
|
||||||
.between(CrmCustomerContactsDO::getCreateTime, todayStart, todayEnd)
|
.in(!ids.isEmpty(), CrmCustomerContactsDO::getOwnerUserId, ids)
|
||||||
.eq(CrmCustomerContactsDO::getCreator, loginUserId));
|
.between(CrmCustomerContactsDO::getCreateTime, todayStart, todayEnd));
|
||||||
|
Long count008 = customerContactsMapper.selectCount(new LambdaQueryWrapper<CrmCustomerContactsDO>()
|
||||||
|
.in(!ids.isEmpty(), CrmCustomerContactsDO::getOwnerUserId, ids)
|
||||||
|
.between(CrmCustomerContactsDO::getCreateTime, yesterdayStart, yesterdayEnd));
|
||||||
|
String per008 = "0";
|
||||||
|
if (count008 > 0) {
|
||||||
|
per008 = NumberUtil.div(NumberUtil.sub(count08, count008), count008, 2)
|
||||||
|
.multiply(new BigDecimal("100")).toString();
|
||||||
|
}
|
||||||
|
|
||||||
Long count09 = customerMapper.selectCount(new LambdaQueryWrapper<CrmCustomerDO>()
|
Long count09 = customerMapper.selectCount(new LambdaQueryWrapper<CrmCustomerDO>()
|
||||||
.between(CrmCustomerDO::getDealTime, todayStart, todayEnd)
|
.between(CrmCustomerDO::getDealTime, todayStart, todayEnd)
|
||||||
.eq(CrmCustomerDO::getDealStatus, ShopCommonEnum.IS_STATUS_1.getValue())
|
.eq(CrmCustomerDO::getDealStatus, ShopCommonEnum.IS_STATUS_1.getValue())
|
||||||
@ -169,16 +272,15 @@ public class CrmIndexServiceImpl implements CrmIndexService {
|
|||||||
.setStatus(CommonStatusEnum.ENABLE.getStatus())
|
.setStatus(CommonStatusEnum.ENABLE.getStatus())
|
||||||
.setBeginTime(todayStart)
|
.setBeginTime(todayStart)
|
||||||
.setEndTime(todayEnd)).getCheckedData();
|
.setEndTime(todayEnd)).getCheckedData();
|
||||||
|
|
||||||
return BrieCountVO.builder()
|
return BrieCountVO.builder()
|
||||||
.count01(count01)
|
.count01(count01).count001(count001).per001(per001)
|
||||||
.count02(count02)
|
.count02(count02).count002(count002).per002(per002)
|
||||||
.count03(count03)
|
.count03(count03).count003(count003).per003(per003)
|
||||||
.count04(count04)
|
.count04(count04).count004(count004).per004(per004)
|
||||||
.count05(count05)
|
.count05(count05).count005(count005).per005(per005)
|
||||||
.count06(count06)
|
.count06(count06).count006(count006).per006(per006)
|
||||||
.count07(count07)
|
.count07(count07).count007(count007).per007(per007)
|
||||||
.count08(count08)
|
.count08(count08).count008(count008).per008(per008)
|
||||||
.count09(count09)
|
.count09(count09)
|
||||||
.count10(count10)
|
.count10(count10)
|
||||||
.count11(count11)
|
.count11(count11)
|
||||||
|
@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.crm.service.crminvoice;
|
|||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.iocoder.yudao.framework.common.enums.ShopCommonEnum;
|
import cn.iocoder.yudao.framework.common.enums.ShopCommonEnum;
|
||||||
|
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
||||||
import cn.iocoder.yudao.framework.common.exception.ErrorCode;
|
import cn.iocoder.yudao.framework.common.exception.ErrorCode;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||||
@ -23,6 +24,8 @@ import cn.iocoder.yudao.module.crm.dal.mysql.crmflow.CrmFlowStepMapper;
|
|||||||
import cn.iocoder.yudao.module.crm.dal.mysql.crmflowlog.CrmFlowLogMapper;
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmflowlog.CrmFlowLogMapper;
|
||||||
import cn.iocoder.yudao.module.crm.dal.mysql.crminvoice.CrmInvoiceMapper;
|
import cn.iocoder.yudao.module.crm.dal.mysql.crminvoice.CrmInvoiceMapper;
|
||||||
import cn.iocoder.yudao.module.hrm.enums.*;
|
import cn.iocoder.yudao.module.hrm.enums.*;
|
||||||
|
import cn.iocoder.yudao.module.system.api.mail.MailSendApi;
|
||||||
|
import cn.iocoder.yudao.module.system.api.mail.dto.MailSendSingleReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -35,7 +38,9 @@ import org.springframework.validation.annotation.Validated;
|
|||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*;
|
import static cn.iocoder.yudao.module.hrm.enums.ErrorCodeConstants.*;
|
||||||
@ -66,6 +71,8 @@ public class CrmInvoiceServiceImpl implements CrmInvoiceService {
|
|||||||
private RedissonClient redissonClient;
|
private RedissonClient redissonClient;
|
||||||
@Resource
|
@Resource
|
||||||
private CrmFlowLogMapper crmFlowLogMapper;
|
private CrmFlowLogMapper crmFlowLogMapper;
|
||||||
|
@Resource
|
||||||
|
private MailSendApi mailSendApi;
|
||||||
|
|
||||||
private static final String LOCK_KEY = "invoice:check:lock";
|
private static final String LOCK_KEY = "invoice:check:lock";
|
||||||
|
|
||||||
@ -294,5 +301,13 @@ public class CrmInvoiceServiceImpl implements CrmInvoiceService {
|
|||||||
crmContractDO.setInvoiceMoney(money);
|
crmContractDO.setInvoiceMoney(money);
|
||||||
contractMapper.updateById(crmContractDO);
|
contractMapper.updateById(crmContractDO);
|
||||||
|
|
||||||
|
//发送邮件
|
||||||
|
if(StrUtil.isNotEmpty(updateObj.getFiles()) && StrUtil.isNotEmpty(updateObj.getEmail())){
|
||||||
|
Map<String, Object> templateParams = new HashMap<>();
|
||||||
|
templateParams.put("files",updateObj.getFiles());
|
||||||
|
mailSendApi.sendSingleMail(new MailSendSingleReqDTO()
|
||||||
|
.setMail(updateObj.getEmail()).setUserId(updateObj.getCustomerId()).setUserType(UserTypeEnum.CUSTOMER.getValue())
|
||||||
|
.setTemplateCode("invoice-send").setTemplateParams(templateParams));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,14 @@
|
|||||||
package cn.iocoder.yudao.module.crm.service.crmoperatelog;
|
package cn.iocoder.yudao.module.crm.service.crmoperatelog;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||||
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
||||||
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
||||||
import cn.iocoder.yudao.module.crm.controller.admin.crmoperatelog.vo.CrmOperatelogPageReqVO;
|
import cn.iocoder.yudao.module.crm.controller.admin.crmoperatelog.vo.CrmOperatelogPageReqVO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.dataobject.crmoperatelog.CrmOperatelogDO;
|
import cn.iocoder.yudao.module.crm.dal.dataobject.crmoperatelog.CrmOperatelogDO;
|
||||||
import cn.iocoder.yudao.module.crm.dal.mysql.crmoperatelog.CrmOperatelogMapper;
|
import cn.iocoder.yudao.module.crm.dal.mysql.crmoperatelog.CrmOperatelogMapper;
|
||||||
|
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
|
||||||
|
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
|
||||||
@ -22,10 +25,19 @@ public class CrmOperatelogServiceImpl implements CrmOperatelogService {
|
|||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private CrmOperatelogMapper crmOperatelogMapper;
|
private CrmOperatelogMapper crmOperatelogMapper;
|
||||||
|
@Resource
|
||||||
|
private AdminUserApi adminUserApi;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createLog(String title, Long customerId, Long contractId, Long receivableId) {
|
public void createLog(String title, Long customerId, Long contractId, Long receivableId) {
|
||||||
|
String nickname = "";
|
||||||
|
if (SecurityFrameworkUtils.getLoginUser() != null) {
|
||||||
|
CommonResult<AdminUserRespDTO> result = adminUserApi.getUser(SecurityFrameworkUtils.getLoginUser().getId());
|
||||||
|
if (result.isSuccess() && result.getCheckedData() != null) {
|
||||||
|
nickname = result.getCheckedData().getNickname();
|
||||||
|
}
|
||||||
|
}
|
||||||
CrmOperatelogDO crmOperatelogDO = CrmOperatelogDO.builder()
|
CrmOperatelogDO crmOperatelogDO = CrmOperatelogDO.builder()
|
||||||
.title(title)
|
.title(title)
|
||||||
.customerId(customerId)
|
.customerId(customerId)
|
||||||
@ -34,8 +46,8 @@ public class CrmOperatelogServiceImpl implements CrmOperatelogService {
|
|||||||
.ip(ServletUtils.getClientIP())
|
.ip(ServletUtils.getClientIP())
|
||||||
.useragent(ServletUtils.getUserAgent())
|
.useragent(ServletUtils.getUserAgent())
|
||||||
.url(ServletUtils.getUrl())
|
.url(ServletUtils.getUrl())
|
||||||
.nickname(SecurityFrameworkUtils.getLoginUser().getInfo().get("nickname"))
|
.nickname(nickname)
|
||||||
.username(SecurityFrameworkUtils.getLoginUser().getInfo().get("nickname"))
|
.username(nickname)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
crmOperatelogMapper.insert(crmOperatelogDO);
|
crmOperatelogMapper.insert(crmOperatelogDO);
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
from crm_contract as a
|
from crm_contract as a
|
||||||
left join crm_customer as t3 on t3.id = a.customer_id
|
left join crm_customer as t3 on t3.id = a.customer_id
|
||||||
left join system_users as t1 on a.order_admin_id = t1.id
|
left join system_users as t1 on a.order_admin_id = t1.id
|
||||||
left join system_users as t2 on a.creator = t1.id
|
left join system_users as t2 on a.creator = t2.id
|
||||||
<where>
|
<where>
|
||||||
a.deleted = 0
|
a.deleted = 0
|
||||||
and t1.deleted = 0
|
and t1.deleted = 0
|
||||||
|
@ -31,7 +31,7 @@ public class StoreProductAttrValueApiImpl implements StoreProductAttrValueApi {
|
|||||||
public CommonResult<List<StoreProductAttrValueApiVO>> getStoreProductAttrValueList(StoreProductAttrValueApiDTO dto) {
|
public CommonResult<List<StoreProductAttrValueApiVO>> getStoreProductAttrValueList(StoreProductAttrValueApiDTO dto) {
|
||||||
List<StoreProductAttrValueDO> list = storeProductAttrValueService.list(new LambdaQueryWrapper<StoreProductAttrValueDO>()
|
List<StoreProductAttrValueDO> list = storeProductAttrValueService.list(new LambdaQueryWrapper<StoreProductAttrValueDO>()
|
||||||
.in(CollUtil.isNotEmpty(dto.getProductIds()), StoreProductAttrValueDO::getProductId, dto.getProductIds())
|
.in(CollUtil.isNotEmpty(dto.getProductIds()), StoreProductAttrValueDO::getProductId, dto.getProductIds())
|
||||||
.eq(CollUtil.isNotEmpty(dto.getUniques()), StoreProductAttrValueDO::getUnique, dto.getUniques())
|
.in(CollUtil.isNotEmpty(dto.getUniques()), StoreProductAttrValueDO::getUnique, dto.getUniques())
|
||||||
);
|
);
|
||||||
List<StoreProductAttrValueApiVO> result = BeanUtil.copyToList(list, StoreProductAttrValueApiVO.class);
|
List<StoreProductAttrValueApiVO> result = BeanUtil.copyToList(list, StoreProductAttrValueApiVO.class);
|
||||||
return CommonResult.success(result);
|
return CommonResult.success(result);
|
||||||
|
@ -115,5 +115,5 @@ public interface AdminUserApi {
|
|||||||
|
|
||||||
@GetMapping(PREFIX + "/getUserListBySubordinateIds")
|
@GetMapping(PREFIX + "/getUserListBySubordinateIds")
|
||||||
@Operation(summary = "获取当前部门以及下级部门所有人员(负责人)")
|
@Operation(summary = "获取当前部门以及下级部门所有人员(负责人)")
|
||||||
CommonResult<List<Long>> getUserListBySubordinateIds(Long adminId);
|
CommonResult<List<Long>> getUserListBySubordinateIds(@RequestParam(name = "adminId") Long adminId);
|
||||||
}
|
}
|
||||||
|
@ -11,12 +11,12 @@ import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataPage
|
|||||||
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataRespVO;
|
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataRespVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataSaveReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataSaveReqVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataSimpleRespVO;
|
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.data.DictDataSimpleRespVO;
|
||||||
|
import cn.iocoder.yudao.module.system.controller.app.dict.vo.AppDictDataVO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO;
|
||||||
import cn.iocoder.yudao.module.system.service.dict.DictDataService;
|
import cn.iocoder.yudao.module.system.service.dict.DictDataService;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.Parameter;
|
import io.swagger.v3.oas.annotations.Parameter;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
@ -101,4 +101,12 @@ public class DictDataController {
|
|||||||
BeanUtils.toBean(list, DictDataRespVO.class));
|
BeanUtils.toBean(list, DictDataRespVO.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/type")
|
||||||
|
@Operation(summary = "根据字典类型查询字典数据信息")
|
||||||
|
@Parameter(name = "type", description = "字典类型", required = true, example = "common_status")
|
||||||
|
public CommonResult<List<AppDictDataVO>> getDictDataListByType(@RequestParam("type") String type) {
|
||||||
|
List<DictDataDO> list = dictDataService.getDictDataList(
|
||||||
|
CommonStatusEnum.ENABLE.getStatus(), type);
|
||||||
|
return success(BeanUtils.toBean(list, AppDictDataVO.class));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
package cn.iocoder.yudao.module.system.controller.app.dict.vo;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class AppDictDataVO {
|
||||||
|
|
||||||
|
@Schema(description = "字典数据编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Schema(description = "字典标签", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
|
||||||
|
@JsonProperty("name")
|
||||||
|
private String label;
|
||||||
|
|
||||||
|
@Schema(description = "字典值", requiredMode = Schema.RequiredMode.REQUIRED, example = "iocoder")
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
@Schema(description = "字典类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "sys_common_sex")
|
||||||
|
private String dictType;
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user