From a5d565ca976d5166b34be9d7cd6e8b199934b328 Mon Sep 17 00:00:00 2001 From: mx <1289317512@qq.com> Date: Wed, 6 Nov 2024 15:40:16 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E7=BB=9F=E8=AE=A1=E5=92=8C?= =?UTF-8?q?=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pusong/web/controller/AuthController.java | 32 ++- .../common/mybatis/annotation/DataColumn.java | 8 + .../common/mybatis/enums/DataScopeType.java | 10 +- .../handler/PlusDataPermissionHandler.java | 10 +- .../business/controller/HomeController.java | 51 ++-- .../domain/vo/home/ChannelAmountVo.java | 5 + .../domain/vo/home/ChannelPayInfo.java | 4 + .../business/domain/vo/home/DataAmountVo.java | 16 ++ .../domain/vo/home/RenewalInfoVo.java | 13 + .../domain/vo/home/ReturnMoneyInfoVo.java | 10 + .../business/domain/vo/home/SalasVo.java | 61 +++++ .../domain/vo/home/UserAmountInfoVo.java | 40 +++ .../business/domain/vo/home/UserAmountVo.java | 46 ++++ .../vo/home/UserContractAmountInfo.java | 6 + .../domain/vo/home/UserContractAmountVo.java | 80 ++++-- .../business/mapper/PsContractInfoMapper.java | 11 +- .../business/mapper/PsCustomInfoMapper.java | 3 +- .../pusong/business/mapper/PsHomeMapper.java | 52 ++++ .../pusong/business/service/HomeService.java | 6 +- .../impl/ApproverAbstractServiceImpl.java | 7 +- .../approver/impl/StopAccountServiceImpl.java | 8 + .../service/impl/HomeServiceImpl.java | 240 +++++++++++++----- .../impl/PsCompanyInfoServiceImpl.java | 7 +- .../mapper/business/PsContractInfoMapper.xml | 34 ++- .../mapper/business/PsHomeMapper.xml | 68 +++++ .../main/java/com/pusong/system/RoleEnum.java | 5 +- .../system/SysNoticeController.java | 12 +- .../com/pusong/system/domain/SysNotice.java | 5 +- .../pusong/system/domain/bo/SysNoticeBo.java | 20 +- .../pusong/system/domain/vo/SysNoticeVo.java | 30 ++- .../pusong/system/mapper/SysNoticeMapper.java | 4 + .../system/service/ISysNoticeService.java | 2 +- .../service/impl/SysNoticeServiceImpl.java | 16 +- .../mapper/system/SysNoticeMapper.xml | 4 + 34 files changed, 767 insertions(+), 159 deletions(-) create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/SalasVo.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/UserAmountVo.java create mode 100644 pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsHomeMapper.java create mode 100644 pusong-modules/pusong-business/src/main/resources/mapper/business/PsHomeMapper.xml diff --git a/pusong-admin/src/main/java/com/pusong/web/controller/AuthController.java b/pusong-admin/src/main/java/com/pusong/web/controller/AuthController.java index f02d7a3..9d3b848 100644 --- a/pusong-admin/src/main/java/com/pusong/web/controller/AuthController.java +++ b/pusong-admin/src/main/java/com/pusong/web/controller/AuthController.java @@ -4,7 +4,15 @@ import cn.dev33.satoken.annotation.SaIgnore; import cn.hutool.core.codec.Base64; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.pusong.business.domain.PsContractInfo; import com.pusong.common.core.utils.*; +import com.pusong.system.RoleEnum; +import com.pusong.system.domain.SysNotice; +import com.pusong.system.domain.vo.SysNoticeVo; +import com.pusong.system.mapper.SysNoticeMapper; import com.pusong.web.service.IAuthStrategy; import com.pusong.web.service.SysRegisterService; import jakarta.servlet.http.HttpServletRequest; @@ -44,6 +52,7 @@ import org.springframework.web.bind.annotation.*; import java.net.URL; import java.nio.charset.StandardCharsets; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -70,7 +79,7 @@ public class AuthController { private final ISysSocialService socialUserService; private final ISysClientService clientService; private final ScheduledExecutorService scheduledExecutorService; - + private final SysNoticeMapper sysNoticeMapper; /** * 登录方法 @@ -104,10 +113,23 @@ public class AuthController { Long userId = LoginHelper.getUserId(); scheduledExecutorService.schedule(() -> { - WebSocketMessageDto dto = new WebSocketMessageDto(); - dto.setMessage("欢迎登录pusong-vue-plus后台管理系统"); - dto.setSessionKeys(List.of(userId)); - WebSocketUtils.publishMessage(dto); +// WebSocketMessageDto dto = new WebSocketMessageDto(); +// dto.setMessage("欢迎登录pusong-vue-plus后台管理系统"); +// dto.setSessionKeys(List.of(userId)); +// WebSocketUtils.publishMessage(dto); + WebSocketMessageDto dto; + QueryWrapper queryWrapper = new QueryWrapper() + .in( "rec_uid", userId); + List sysNotices = sysNoticeMapper.selectList(queryWrapper); + for (SysNotice sysNotice : sysNotices) { + dto = new WebSocketMessageDto(); +// dto.setMessage(sysNotice.getNoticeContent()); + SysNoticeVo vo = MapstructUtils.convert(sysNotice, SysNoticeVo.class); + dto.setMessage(JsonUtils.toJsonString(vo)); + dto.setSessionKeys(List.of(userId)); + WebSocketUtils.publishMessage(dto); + } + }, 3, TimeUnit.SECONDS); return R.ok(loginVo); } diff --git a/pusong-common/pusong-common-mybatis/src/main/java/com/pusong/common/mybatis/annotation/DataColumn.java b/pusong-common/pusong-common-mybatis/src/main/java/com/pusong/common/mybatis/annotation/DataColumn.java index df6e2bc..f9bf2fa 100644 --- a/pusong-common/pusong-common-mybatis/src/main/java/com/pusong/common/mybatis/annotation/DataColumn.java +++ b/pusong-common/pusong-common-mybatis/src/main/java/com/pusong/common/mybatis/annotation/DataColumn.java @@ -1,5 +1,7 @@ package com.pusong.common.mybatis.annotation; +import com.pusong.common.mybatis.enums.DataScopeType; + import java.lang.annotation.*; /** @@ -25,4 +27,10 @@ public @interface DataColumn { */ String[] value() default "dept_id"; + /** + * 仅这个有效 + * @return + */ + DataScopeType dataScopeType() default DataScopeType.NULL; + } diff --git a/pusong-common/pusong-common-mybatis/src/main/java/com/pusong/common/mybatis/enums/DataScopeType.java b/pusong-common/pusong-common-mybatis/src/main/java/com/pusong/common/mybatis/enums/DataScopeType.java index a3753af..3591469 100644 --- a/pusong-common/pusong-common-mybatis/src/main/java/com/pusong/common/mybatis/enums/DataScopeType.java +++ b/pusong-common/pusong-common-mybatis/src/main/java/com/pusong/common/mybatis/enums/DataScopeType.java @@ -21,7 +21,7 @@ import com.pusong.common.mybatis.helper.DataPermissionHelper; @Getter @AllArgsConstructor public enum DataScopeType { - + NULL("-1", "", ""), /** * 全部数据权限 */ @@ -45,7 +45,13 @@ public enum DataScopeType { /** * 仅本人数据权限 */ - SELF("5", " #{#userName} = #{#user.userId} ", " 1 = 0 "); + SELF("5", " #{#userName} = #{#user.userId} ", " 1 = 0 "), + + /** + * 财务合同部门及以下数据 + */ + CAIWU_HETONG("6", " #{#deptName} = #{#user.deptId} ", " 1 = 0 ") + ; private final String code; diff --git a/pusong-common/pusong-common-mybatis/src/main/java/com/pusong/common/mybatis/handler/PlusDataPermissionHandler.java b/pusong-common/pusong-common-mybatis/src/main/java/com/pusong/common/mybatis/handler/PlusDataPermissionHandler.java index 9d4eafa..8f7e76f 100644 --- a/pusong-common/pusong-common-mybatis/src/main/java/com/pusong/common/mybatis/handler/PlusDataPermissionHandler.java +++ b/pusong-common/pusong-common-mybatis/src/main/java/com/pusong/common/mybatis/handler/PlusDataPermissionHandler.java @@ -122,17 +122,21 @@ public class PlusDataPermissionHandler { } // 全部数据权限直接返回 if (type == DataScopeType.ALL) { - return ""; +// return ""; + continue; } boolean isSuccess = false; for (DataColumn dataColumn : dataColumns) { + if (type == DataScopeType.CAIWU_HETONG && DataScopeType.CAIWU_HETONG != dataColumn.dataScopeType()){ + continue; + } + if (dataColumn.key().length != dataColumn.value().length) { throw new ServiceException("角色数据范围异常 => key与value长度不匹配"); } // 不包含 key 变量 则不处理 if (!StringUtils.containsAny(type.getSqlTemplate(), - Arrays.stream(dataColumn.key()).map(key -> "#" + key).toArray(String[]::new) - )) { + Arrays.stream(dataColumn.key()).map(key -> "#" + key).toArray(String[]::new))) { continue; } // 设置注解变量 key 为表达式变量 value 为变量值 diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/controller/HomeController.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/controller/HomeController.java index cc10af9..736d87c 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/controller/HomeController.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/controller/HomeController.java @@ -36,6 +36,7 @@ import java.util.Map; @RequiredArgsConstructor @RestController @RequestMapping("/business/home") +@SaIgnore public class HomeController extends BaseController { private final HomeService homeService; @@ -96,19 +97,19 @@ public class HomeController extends BaseController { * @return */ @GetMapping("/getUserContractAndPayInfo") - public R> getUserContractAndPayInfo(@RequestParam() Integer type){ - return R.ok(homeService.getUserContractAndPayInfo(type)); + public R getUserContractAndPayInfo(@RequestParam() Integer type, @RequestParam() Boolean isCaiwu){ + return R.ok(homeService.getUserContractAndPayInfo(type, isCaiwu)); + } + /** + * 首页大盘数据:人员成交数据列表 + * @param type 1本月 2上月 3本季度 4本年 5所有 + * @return + */ + @SaCheckPermission("business:salary:list") + @GetMapping("/getUserContractAmounts") + public R> getUserContractAmounts(@RequestParam() Integer type, @RequestParam() Long deptId) { + return R.ok(homeService.getUserContractAmountsByDeptId(type,deptId));//缺少已回款未回款金额 } -// /** -// * 首页大盘数据:人员成交数据列表 -// * @param type 1本月 2上月 3本季度 4本年 5所有 -// * @return -// */ -// @SaCheckPermission("business:salary:list") -// @GetMapping("/getUserContractAmounts") -// public R> getUserContractAmounts(@RequestParam() Integer type, @RequestParam() Long deptId) { -// return R.ok(homeService.getUserContractAmountsByDeptId(type,deptId));?//缺少已回款未回款金额 -// } /** * 首页大盘数据:人员转介绍成交数据列表 @@ -117,21 +118,21 @@ public class HomeController extends BaseController { */ @SaCheckPermission("business:salary:list") @GetMapping("/getUserContractSourceAmounts") - public R> getUserContractSourceAmounts(@RequestParam() Integer type, @RequestParam() Long deptId){ - return R.ok(homeService.getUserContractSourceAmountsByDeptId(type,deptId));//缺少已回款未回款金额 + public R getUserContractSourceAmounts(@RequestParam() Integer type, @RequestParam() Boolean isCaiwu){ + return R.ok(homeService.getUserContractSourceAmountsByDeptId(type, isCaiwu));//缺少已回款未回款金额 } -// /** -// * 首页大盘数据:销售个人数据 -// * @param type 1本月 2上月 3本季度 4本年 5所有 -// * @return -// */ -// @SaCheckPermission("business:salary:list") -// @GetMapping("/channelByUser") -// public R channelByUser(@RequestParam() Integer type) { -// return R.ok(homeService.byChannel(type,2)); -// } + /** + * 首页大盘数据:销售个人数据 + * @param type 1本月 2上月 3本季度 4本年 5所有 + * @return + */ + @SaCheckPermission("business:salary:list") + @GetMapping("/channelByUser") + public R channelByUser(@RequestParam() Integer type) { + return R.ok(homeService.byChannel(type,2)); + } /** * 首页大盘数据:任务完成情况 * @param type 1本月 2上月 3本季度 4本年 5所有 @@ -158,7 +159,7 @@ public class HomeController extends BaseController { * @return */ @GetMapping("/salasData") - public R> salasData(@RequestParam() Integer type) { + public R salasData(@RequestParam() Integer type) { return R.ok(homeService.salasData(type)); } } diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/ChannelAmountVo.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/ChannelAmountVo.java index 647d785..cd9df0e 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/ChannelAmountVo.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/ChannelAmountVo.java @@ -28,6 +28,11 @@ public class ChannelAmountVo { */ private BigDecimal all; + /** + * 总roi + */ + private BigDecimal roi; + /** * 各渠道成交金额 */ diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/ChannelPayInfo.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/ChannelPayInfo.java index 7881eca..b932cd8 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/ChannelPayInfo.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/ChannelPayInfo.java @@ -33,4 +33,8 @@ public class ChannelPayInfo { */ private BigDecimal money; + /** + * 成本 + */ + private BigDecimal cost; } diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/DataAmountVo.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/DataAmountVo.java index a0c94de..3b0fe33 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/DataAmountVo.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/DataAmountVo.java @@ -30,4 +30,20 @@ public class DataAmountVo { * 未回款金额 */ private BigDecimal unPayMoney; + + + /** + * 项目成本 + */ + private BigDecimal cost; + + /** + * 投入 + */ + private BigDecimal investCapital; + + /** + * roi + */ + private BigDecimal roi; } diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/RenewalInfoVo.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/RenewalInfoVo.java index 517276d..831c0cd 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/RenewalInfoVo.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/RenewalInfoVo.java @@ -22,6 +22,11 @@ public class RenewalInfoVo { */ private Integer contractNum; + /** + * 到期合同总额 + */ + private BigDecimal contractAmount; + /** * 已续费合同总数 */ @@ -41,6 +46,14 @@ public class RenewalInfoVo { */ private BigDecimal unPayMoney; + /** + * 已回款客户占比 + */ + private String customPer; + /** + * 未回款客户占比 + */ + private String unPaycustomPer; /** * 已回款金额占比 */ diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/ReturnMoneyInfoVo.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/ReturnMoneyInfoVo.java index 99c636b..c070ea2 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/ReturnMoneyInfoVo.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/ReturnMoneyInfoVo.java @@ -21,6 +21,16 @@ public class ReturnMoneyInfoVo { * 当月合同总数 */ private Integer contractNum; + + /** + * 当月合同总数 + */ + private Integer returnContractNum; + /** + * 当月合同总数 + */ + private Integer noContractNum; + /** * 当月合同回款金额 */ diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/SalasVo.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/SalasVo.java new file mode 100644 index 0000000..f40c001 --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/SalasVo.java @@ -0,0 +1,61 @@ +package com.pusong.business.domain.vo.home; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +@Data +public class SalasVo { + + /** + * 当前时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm") + private Date currentDate = new Date(); + /** + * 统计范围 + */ + private String dateStr; + + /** + * 公海数量 + */ + private int gonghaiNum; + + /** + * 没有回访记录的客户(待跟进客户) + */ + private int noCallbackRecordNum; + + /** + * 有回访记录的客户(回访客户数) + */ + private int callbackRecordNum; + + /** + * 生成合同数 + */ + private int contractNum; + + /** + * 已成交总额 + */ + private BigDecimal sumContractAmount; + + /** + * 已回款金额 + */ + private BigDecimal payContractAmount; + + /** + * 未回款金额 + */ + private BigDecimal unPayContractAmount; + +} diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/UserAmountInfoVo.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/UserAmountInfoVo.java index 076e4e8..dc2db60 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/UserAmountInfoVo.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/UserAmountInfoVo.java @@ -33,6 +33,46 @@ public class UserAmountInfoVo { */ private BigDecimal unPaySumAmount=new BigDecimal(0); + /** + * 托管类型合同总金额 类型号:4 + */ + private BigDecimal tuoGuanAmount = new BigDecimal(0); + /** + * 续费类型合同总金额 + */ + private BigDecimal xuFeiAmount = new BigDecimal(0); + /** + * 软件定制类型合同总金额 类型号:9 + */ + private BigDecimal softwareDevAmount = new BigDecimal(0); + /** + * 其他类型合同总金额 + */ + private BigDecimal otherAmount = new BigDecimal(0); + /** + * 转介绍的合同金额 + */ + private BigDecimal jieShaoAmount = new BigDecimal(0); + + /** + * 与其他人合同金额的占比 + */ + private String amountPer; + + + public void addTuoGuanAmount(BigDecimal amount){ + tuoGuanAmount=tuoGuanAmount.add(amount); + } + public void addXuFeiAmount(BigDecimal amount){ + xuFeiAmount=xuFeiAmount.add(amount); + } + public void addSoftwareDevAmount(BigDecimal amount){ + softwareDevAmount=softwareDevAmount.add(amount); + } + public void addOtherAmount(BigDecimal amount) { + otherAmount=otherAmount.add(amount); + } + public void addContractNum(){ contractNum++; } diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/UserAmountVo.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/UserAmountVo.java new file mode 100644 index 0000000..c24df3d --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/UserAmountVo.java @@ -0,0 +1,46 @@ +package com.pusong.business.domain.vo.home; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.*; + +@Data +public class UserAmountVo { + + /** + * 当前时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm") + private Date currentDate = new Date(); + /** + * 统计范围 + */ + private String dateStr; + /** + * 成交总金额 + */ + private BigDecimal all; + + + + + + + /** + * 各人员成交金额 + */ + private Collection userAmountList; + + + /** + * 转介绍总计数据 + */ + private UserContractAmountVo daPan; + /** + * 转介绍 + */ + private Collection zjsList; + +} diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/UserContractAmountInfo.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/UserContractAmountInfo.java index f7c2d75..48d1b00 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/UserContractAmountInfo.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/UserContractAmountInfo.java @@ -38,4 +38,10 @@ public class UserContractAmountInfo { * 已付款金额 */ private BigDecimal payedMoney; + + /** + * 与其他人合同金额的占比 + */ + private String amountPer; } + diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/UserContractAmountVo.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/UserContractAmountVo.java index 37147b2..35e1b7c 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/UserContractAmountVo.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/domain/vo/home/UserContractAmountVo.java @@ -16,22 +16,56 @@ public class UserContractAmountVo { * 用户名字 */ private String nickName; - /** - * 与其他人合同金额的占比 - */ - private String amountPer; - /** - * 转介绍合同数量 - */ - private Integer jieShaoContractNum = 0; + /** * 转介绍合同金额占比 */ private String jieShaoPer; + /** + * 其他合同金额占比 + */ + private String otherPer; /** * 用户所有合同总金额 */ private BigDecimal sumAmount = new BigDecimal(0); + + /** + * 转介绍的合同金额 + */ + private BigDecimal jieShaoAmount = new BigDecimal(0); + + /** + * 其他类型合同总金额 + */ + private BigDecimal otherAmount = new BigDecimal(0); + /** + * 转介绍合同数量 + */ + private Integer jieShaoContractNum = 0; + /** + * 其他合同数量 + */ + private Integer otherContractNum = 0; + + /** + * 已支付总金额 + */ + private BigDecimal jsPayedSumAmount=new BigDecimal(0); + private BigDecimal otherPayedSumAmount=new BigDecimal(0); + /** + * 未支付金额 + */ + private BigDecimal jsUnPaySumAmount=new BigDecimal(0); + private BigDecimal otherUnPaySumAmount=new BigDecimal(0); + + /** + * 与其他人合同金额的占比 + */ + private String amountPer; + + + /** * 托管类型合同总金额 类型号:4 */ @@ -44,14 +78,8 @@ public class UserContractAmountVo { * 软件定制类型合同总金额 类型号:9 */ private BigDecimal softwareDevAmount = new BigDecimal(0); - /** - * 其他类型合同总金额 - */ - private BigDecimal otherAmount = new BigDecimal(0); - /** - * 转介绍的合同金额 - */ - private BigDecimal jieShaoAmount = new BigDecimal(0); + + public void addSumAmount(BigDecimal amount){ sumAmount=sumAmount.add(amount); @@ -74,4 +102,24 @@ public class UserContractAmountVo { public void addJieShaoContractNum() { jieShaoContractNum++; } + public void addOtherContractNum() { + otherContractNum++; + } + + public void addJsPayedSumAmount(BigDecimal amount){ + if(amount==null){return;} + jsPayedSumAmount = jsPayedSumAmount.add(amount); + } + public void addJsUnPayedSumAmount(BigDecimal amount){ + if(amount==null){return;} + jsUnPaySumAmount = jsUnPaySumAmount.add(amount); + } + public void addOtherPayedSumAmount(BigDecimal amount){ + if(amount==null){return;} + otherPayedSumAmount = otherPayedSumAmount.add(amount); + } + public void addOtherUnPayedSumAmount(BigDecimal amount){ + if(amount==null){return;} + otherUnPaySumAmount = otherUnPaySumAmount.add(amount); + } } diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsContractInfoMapper.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsContractInfoMapper.java index 72554f3..7a6e52b 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsContractInfoMapper.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsContractInfoMapper.java @@ -11,10 +11,12 @@ import com.pusong.business.domain.vo.PsContractInfoVo; import com.pusong.business.domain.vo.PsCustomInfoVo; import com.pusong.business.domain.vo.PsSalaryContractVo; import com.pusong.business.domain.vo.home.ChannelPayInfo; +import com.pusong.business.domain.vo.home.SalasVo; import com.pusong.business.domain.vo.home.UserContractAmountInfo; import com.pusong.common.mybatis.annotation.DataColumn; import com.pusong.common.mybatis.annotation.DataPermission; import com.pusong.common.mybatis.core.mapper.BaseMapperPlus; +import com.pusong.common.mybatis.enums.DataScopeType; import org.apache.ibatis.annotations.Param; import java.time.LocalDate; @@ -31,7 +33,8 @@ public interface PsContractInfoMapper extends BaseMapperPlus selectPageContractList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); @@ -49,9 +52,9 @@ public interface PsContractInfoMapper extends BaseMapperPlus querySalaryListByCodes(@Param(Constants.WRAPPER) Wrapper queryWrapper); List> homePageReturnMoneyInfo(@Param("queryParam") Map queryParam); - List getUserContractSourceAmountsByDeptId(@Param("queryParam") Map queryParam); + List getUserContractSourceAmountsByDeptId(@Param("queryParam") Map queryParam, @Param(Constants.WRAPPER) Wrapper queryWrapper); List getUserContractTypeAmountsByDeptId(@Param("queryParam") Map queryParam); - List getUserContractAndPayInfo(@Param("queryParam") Map queryParam); + List getUserContractAndPayInfo(@Param("queryParam") Map queryParam, @Param(Constants.WRAPPER) Wrapper queryWrapper); //首页查询各个渠道成交的合同 @@ -62,7 +65,5 @@ public interface PsContractInfoMapper extends BaseMapperPlus byChannelUser(@Param(Constants.WRAPPER) Wrapper queryWrapper); - List selectRenewalContract(@Param(Constants.WRAPPER) Wrapper queryWrapper); - } diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsCustomInfoMapper.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsCustomInfoMapper.java index 6645326..76a4bce 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsCustomInfoMapper.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsCustomInfoMapper.java @@ -10,6 +10,7 @@ import com.pusong.business.domain.vo.PsCustomerRecordVo; import com.pusong.common.mybatis.annotation.DataColumn; import com.pusong.common.mybatis.annotation.DataPermission; import com.pusong.common.mybatis.core.mapper.BaseMapperPlus; +import com.pusong.common.mybatis.enums.DataScopeType; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -29,7 +30,7 @@ public interface PsCustomInfoMapper extends BaseMapperPlus selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper); @DataPermission({ - @DataColumn(key = "deptName", value = "info.create_dept"), + @DataColumn(key = "deptName", value = "info.create_dept", dataScopeType = DataScopeType.CAIWU_HETONG), @DataColumn(key = "userName", value = "info.custom_manager") }) Page selectPageCustomerList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsHomeMapper.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsHomeMapper.java new file mode 100644 index 0000000..a4d37a3 --- /dev/null +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/mapper/PsHomeMapper.java @@ -0,0 +1,52 @@ +package com.pusong.business.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.pusong.business.domain.PsContractInfo; +import com.pusong.business.domain.PsSalary; +import com.pusong.business.domain.PsSalaryContract; +import com.pusong.business.domain.vo.PsContractBusinessVo; +import com.pusong.business.domain.vo.PsContractInfoVo; +import com.pusong.business.domain.vo.home.ChannelPayInfo; +import com.pusong.business.domain.vo.home.SalasVo; +import com.pusong.business.domain.vo.home.UserContractAmountInfo; +import com.pusong.common.mybatis.annotation.DataColumn; +import com.pusong.common.mybatis.annotation.DataPermission; +import com.pusong.common.mybatis.core.mapper.BaseMapperPlus; +import com.pusong.common.mybatis.enums.DataScopeType; +import org.apache.ibatis.annotations.Param; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; + + +public interface PsHomeMapper extends BaseMapperPlus { + List selectRenewalContract(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + int selectGonghaiNum(@Param("queryParam") Map queryParam); + + @DataPermission({ + @DataColumn(key = "userName", value = "cus.custom_manager") + }) + int selectCallbackRecordNum(@Param("queryParam") Map queryParam); + + + @DataPermission({ + @DataColumn(key = "userName", value = "cus.custom_manager") + }) + int selectNoCallbackRecordNum(@Param("queryParam") Map queryParam); + + + @DataPermission({ + @DataColumn(key = "userName", value = "info.custom_manager") + }) + SalasVo selectContractNumAndAmount(@Param("queryParam") Map queryParam); + + + @DataPermission({ + @DataColumn(key = "userName", value = "info.custom_manager") + }) + BigDecimal selectSumPayContractAmount(@Param("queryParam") Map queryParam); +} diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/HomeService.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/HomeService.java index 1458811..4cca5ee 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/HomeService.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/HomeService.java @@ -16,9 +16,9 @@ public interface HomeService { ReturnMoneyInfoVo returnMoney(Integer type); RenewalInfoVo renewal(Integer type); - List getUserContractSourceAmountsByDeptId(Integer type,Long deptId); + UserAmountVo getUserContractSourceAmountsByDeptId(Integer type, boolean isCaiwu); List getUserContractAmountsByDeptId(Integer type, Long deptId); - Collection getUserContractAndPayInfo(Integer type); + UserAmountVo getUserContractAndPayInfo(Integer type, boolean isCaiwu); /** * 首页大盘数据:各渠道成交 * @param type @@ -43,5 +43,5 @@ public interface HomeService { * @param type * @return */ - Map salasData(Integer type); + SalasVo salasData(Integer type); } diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/approver/impl/ApproverAbstractServiceImpl.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/approver/impl/ApproverAbstractServiceImpl.java index cedd21b..72f0362 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/approver/impl/ApproverAbstractServiceImpl.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/approver/impl/ApproverAbstractServiceImpl.java @@ -25,6 +25,7 @@ import com.pusong.common.core.utils.DateUtils; import com.pusong.common.core.utils.StringUtils; import com.pusong.common.mybatis.core.page.PageQuery; import com.pusong.common.satoken.utils.LoginHelper; +import com.pusong.system.RoleEnum; import com.pusong.system.domain.bo.SysNoticeBo; import com.pusong.system.service.ISysNoticeService; import jakarta.annotation.PostConstruct; @@ -86,7 +87,11 @@ public abstract class ApproverAbstractServiceImpl implements ApproverService { LoginUser loginUser = LoginHelper.getLoginUser(); - noticeService.sendNotice(SysNoticeBo.getWaitApplyInstance(loginUser.getNickname(), approverType().getMenuEnum())); + if (approverType() == ApproverTypeEnum.STOPACCOUNT){ + noticeService.sendNotice(SysNoticeBo.getWaitApplyInstance(loginUser.getNickname(), RoleEnum.stopacc2.getCode())); + }else{ + noticeService.sendNotice(SysNoticeBo.getWaitApplyInstance(loginUser.getNickname(), approverType().getMenuEnum())); + } } protected abstract ApproverTypeEnum approverType(); diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/approver/impl/StopAccountServiceImpl.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/approver/impl/StopAccountServiceImpl.java index 3ed9f8e..e3d7a16 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/approver/impl/StopAccountServiceImpl.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/approver/impl/StopAccountServiceImpl.java @@ -22,8 +22,11 @@ import com.pusong.business.service.IPsContractInfoService; import com.pusong.common.core.utils.DateUtils; import com.pusong.common.core.utils.StringUtils; import com.pusong.common.mybatis.core.page.PageQuery; +import com.pusong.system.RoleEnum; import com.pusong.system.domain.bo.SysNoticeBo; +import com.pusong.system.domain.vo.SysUserVo; import com.pusong.system.service.ISysNoticeService; +import com.pusong.system.service.ISysUserService; import jakarta.annotation.Resource; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -53,6 +56,8 @@ public class StopAccountServiceImpl extends ApproverAbstractServiceImpl { private final IPsCompanyInfoService psCompanyInfoService; private final ISysNoticeService noticeService; + + private final ISysUserService userService; @Override public void success(PsApproverRecord psApproverRecord) { if (ApproverStepEnum.INIT.getCode().equals(psApproverRecord.getUpdateData())){ @@ -62,6 +67,9 @@ public class StopAccountServiceImpl extends ApproverAbstractServiceImpl { PsCompanyInfoVo psCompanyInfoVo = psCompanyInfoService.queryById(Long.valueOf(psApproverRecord.getBusinessId())); noticeService.sendNotice(SysNoticeBo.getStopAccount1Instance(psApproverRecord.getCreateBy(), psCompanyInfoVo.getCompanyName())); + + SysUserVo sysUserVo = userService.selectUserById(psApproverRecord.getCreateBy()); + noticeService.sendNotice(SysNoticeBo.getWaitApplyInstance(sysUserVo.getNickName(), RoleEnum.stopacc1.getCode())); return; } if (ApproverStepEnum.CW_APPLY.getCode().equals(psApproverRecord.getUpdateData())){ diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/HomeServiceImpl.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/HomeServiceImpl.java index c33be30..720e856 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/HomeServiceImpl.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/HomeServiceImpl.java @@ -16,6 +16,7 @@ import com.pusong.business.mapper.*; import com.pusong.business.service.HomeService; import com.pusong.common.core.constant.CacheNames; import com.pusong.common.core.utils.DateUtils; +import com.pusong.system.RoleEnum; import com.pusong.system.domain.bo.SysDictDataBo; import com.pusong.system.domain.vo.SysDictDataVo; import com.pusong.system.service.ISysDictDataService; @@ -38,7 +39,7 @@ import java.util.stream.Collectors; public class HomeServiceImpl implements HomeService { private static final Logger log = LoggerFactory.getLogger(HomeServiceImpl.class); - + private final PsHomeMapper psHomeMapper; private final PsContractInfoMapper psContractInfoMapper; private final PsContractPayMapper payMapper; private final PsTaskMainMapper taskMainMapper; @@ -47,7 +48,7 @@ public class HomeServiceImpl implements HomeService { private final ISysDictDataService dictDataService; private final PsContractBusinessMapper psContractBusinessMapper; - + private final PsCustomInfoMapper psCustomInfoMapper; /** * 查询成交总金额 @@ -61,7 +62,7 @@ public class HomeServiceImpl implements HomeService { LocalDate endDate = (LocalDate)mapParam.get("endDate"); String date = (String)mapParam.get("date"); - log.info("查询日期:{}到{}",startDate,endDate); + log.info("查询日期:{}到{}", startDate, endDate); List list = psContractInfoMapper.selectList(Wrappers.lambdaQuery() .select(PsContractInfo::getContractCode, PsContractInfo::getIsDue, PsContractInfo::getContractAmount) .ne(PsContractInfo::getIsCancel, CommonStatusEnum.SUCCESS.getCode()) @@ -122,12 +123,12 @@ public class HomeServiceImpl implements HomeService { switch (type){ case 1://本月 startDate = now.withDayOfMonth(1); - date =startDate.format(df); + date = startDate.format(df); break; case 2: //上月 startDate = now.minusMonths(1).withDayOfMonth(1); endDate = now.withDayOfMonth(1); - date =startDate.format(df); + date = startDate.format(df); break; case 3: //本季度 int month = (now.getMonthValue()-1) / 3 * 3 + 1; @@ -163,6 +164,8 @@ public class HomeServiceImpl implements HomeService { //当月合同款总数 BigDecimal sumMoney= new BigDecimal(0); + //回款合同数 + Integer payNum = 0; //当月已支付合同金额 BigDecimal payMoney=new BigDecimal(0); //当月合同总数 @@ -193,14 +196,21 @@ public class HomeServiceImpl implements HomeService { String contractCode=m.get("contract_code").toString(); if(repeatNum.get(contractCode)==null){ repeatNum.put(contractCode,1); - sumMoney=sumMoney.add((BigDecimal) m.get("contract_amount")); + sumMoney = sumMoney.add((BigDecimal) m.get("contract_amount")); contractNum++; + + if(businessType.equals("1")){ + payMoney = payMoney.add(money); + payNum++; + } } } ReturnMoneyInfoVo res = new ReturnMoneyInfoVo(); res.setDateStr(date); res.setContractNum(contractNum); + res.setReturnContractNum(payNum); + res.setNoContractNum(contractNum - payNum); res.setSumMoney(sumMoney); res.setPayMoney(payMoney); res.setUnPayMoney(sumMoney.subtract(payMoney)); @@ -217,47 +227,69 @@ public class HomeServiceImpl implements HomeService { String date = (String)mapParam.get("date"); QueryWrapper wrapper = new QueryWrapper() + .select("company_id", "contract_code", "sum(business_amount) as business_amount") .eq("business_type", "2") .between("end_date", startDate, endDate) + .ge(startDate != null,"end_date", startDate) + .le(endDate != null,"end_date", endDate) .groupBy("company_id") .groupBy("contract_code"); //到期的合同 List expireContact = psContractBusinessMapper.selectList(wrapper); + if (expireContact.isEmpty()){ + RenewalInfoVo renewalInfoVo = new RenewalInfoVo(); + renewalInfoVo.setContractNum(expireContact.size()); + renewalInfoVo.setContractAmount(new BigDecimal("0")); + renewalInfoVo.setRenewalContractNum(0); + renewalInfoVo.setUnRenewalContractNum(0); + renewalInfoVo.setPayMoney(new BigDecimal("0")); + renewalInfoVo.setUnPayMoney(new BigDecimal("0")); + renewalInfoVo.setDateStr(date); + renewalInfoVo.setPayMoneyPer("100"); + renewalInfoVo.setUnPayMoneyPer("0"); + return renewalInfoVo; + } List companyIds = expireContact.stream().map(PsContractBusiness::getCompanyId).toList(); List contractCodeList = expireContact.stream().map(PsContractBusiness::getContractCode).toList(); //总到期金额 BigDecimal sumExpireAmount = expireContact.stream().map(PsContractBusiness::getBusinessAmount).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); QueryWrapper contractWrapper = new QueryWrapper() - .between("apply_date", startDate, endDate) + .ge(startDate != null,"apply_date", startDate) + .le(endDate != null,"apply_date", endDate) .eq("con.is_due", 1) .in("cc.company_id", companyIds) .notIn("cc.contract_code", contractCodeList); //已续费的合同 - List renewalContact = psContractInfoMapper.selectRenewalContract(contractWrapper); + List renewalContact = psHomeMapper.selectRenewalContract(contractWrapper); //总已续费金额 BigDecimal sumRenewalAmount = renewalContact.stream().map(PsContractBusinessVo::getBusinessAmount).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); RenewalInfoVo renewalInfoVo = new RenewalInfoVo(); renewalInfoVo.setContractNum(expireContact.size()); + renewalInfoVo.setContractAmount(sumExpireAmount); renewalInfoVo.setRenewalContractNum(renewalContact.size()); renewalInfoVo.setUnRenewalContractNum(contractCodeList.size() - renewalContact.size()); renewalInfoVo.setPayMoney(sumRenewalAmount); renewalInfoVo.setUnPayMoney(sumExpireAmount.subtract(sumRenewalAmount)); renewalInfoVo.setDateStr(date); + + renewalInfoVo.setCustomPer(new BigDecimal(renewalContact.size()).divide(new BigDecimal(expireContact.size()), 2, BigDecimal.ROUND_UP).toString()); + renewalInfoVo.setUnPaycustomPer(new BigDecimal(100).subtract(new BigDecimal(renewalInfoVo.getCustomPer())).toString()); + renewalInfoVo.setPayMoneyPer(renewalInfoVo.getPayMoney().divide(sumExpireAmount, 2, BigDecimal.ROUND_UP).toString()); renewalInfoVo.setUnPayMoneyPer(renewalInfoVo.getUnPayMoney().divide(sumExpireAmount, 2, BigDecimal.ROUND_UP).toString()); return renewalInfoVo; } - private String contractSource="转介绍"; + private String contractSource = "转介绍"; /** * 按人员成交【转介绍】列表,根据部门获取 * @param type - * @param deptId + * @param isCaiwu * @return */ - public List getUserContractSourceAmountsByDeptId(Integer type, Long deptId){ + public UserAmountVo getUserContractSourceAmountsByDeptId(Integer type, boolean isCaiwu){ Map mapParam = this.getDate(type); LocalDate startDate = (LocalDate)mapParam.get("startDate"); LocalDate endDate = (LocalDate)mapParam.get("endDate"); @@ -268,13 +300,21 @@ public class HomeServiceImpl implements HomeService { queryParam.put("endDate",endDate); queryParam.put("contractStatus",ContractStatusEnum.INIT.getCode()); queryParam.put("isCancel",CommonStatusEnum.SUCCESS.getCode()); - queryParam.put("deptId",deptId); + queryParam.put("payStatus", PayStatusEnum.SUCCESS.getCode()); - List list = psContractInfoMapper.getUserContractSourceAmountsByDeptId(queryParam); + QueryWrapper queryWrapper = new QueryWrapper() + .in(isCaiwu, "role.role_key", Arrays.asList(RoleEnum.caiwu)) + .in(!isCaiwu, "role.role_key", Arrays.asList(RoleEnum.xiaoshou)); + + List list = psContractInfoMapper.getUserContractSourceAmountsByDeptId(queryParam, queryWrapper); Map res = new HashMap<>(); +// BigDecimal sumPayAmount = new BigDecimal(0); //记录合同编码,防止重复 Map repeatContractCode = new HashMap<>(); - for(UserContractAmountInfo obj:list){ + + UserContractAmountVo daPan = new UserContractAmountVo(); + + for(UserContractAmountInfo obj : list){ UserContractAmountVo vo=res.get(obj.getUserId()); if(vo==null){ vo=new UserContractAmountVo(); @@ -286,42 +326,64 @@ public class HomeServiceImpl implements HomeService { if(repeatContractCode.get(obj.getContractCode())==null){ repeatContractCode.put(obj.getContractCode(),obj.getContractCode()); vo.addSumAmount(obj.getContractAmount()); + daPan.addSumAmount(obj.getContractAmount()); + if(contractSource.equals(obj.getCustomSource())){ + vo.addJieShaoAmount(obj.getContractAmount()); + vo.addJieShaoContractNum(); + daPan.addJieShaoAmount(obj.getContractAmount()); + daPan.addJieShaoContractNum(); + }else { + vo.addOtherAmount(obj.getContractAmount()); + vo.addOtherContractNum(); + daPan.addOtherAmount(obj.getContractAmount()); + daPan.addOtherContractNum(); + } } //判断是否为转介绍合同 if(contractSource.equals(obj.getCustomSource())){ - vo.addJieShaoAmount(obj.getContractAmount()); - vo.addJieShaoContractNum(); + daPan.addJsPayedSumAmount(obj.getPayedMoney()); + vo.addJsPayedSumAmount(obj.getPayedMoney()); }else { - vo.addOtherAmount(obj.getContractAmount()); + daPan.addOtherPayedSumAmount(obj.getPayedMoney()); + vo.addOtherPayedSumAmount(obj.getPayedMoney()); } - } - //构建表格第一行数据 - UserContractAmountVo title= new UserContractAmountVo(); - title.setNickName("总计"); - title.setDateStr(date); - title.setOtherAmount(null); - title.setSoftwareDevAmount(null); - title.setTuoGuanAmount(null); - title.setXuFeiAmount(null); + } + //计算未付款金额 + res.values().forEach(v->{ + v.setJsUnPaySumAmount(v.getSumAmount().subtract(v.getJsPayedSumAmount())); + }); //按总金额降序处理 - List listData=res.values().stream().sorted( + List listData = res.values().stream().sorted( Comparator.comparing(UserContractAmountVo::getSumAmount,Comparator.reverseOrder())).collect(Collectors.toList()); - for (UserContractAmountVo v:listData) { - title.addSumAmount(v.getSumAmount()); - } //计算转介绍金额占比 - for (UserContractAmountVo v:listData) { + for (UserContractAmountVo v : listData) { if(!BigDecimal.ZERO.equals(v.getJieShaoAmount())) { v.setJieShaoPer(v.getJieShaoAmount().multiply(new BigDecimal("100.0")).divide(v.getSumAmount(), 2, RoundingMode.HALF_UP).toPlainString() + "%"); }else { v.setJieShaoPer("0.00%"); } } - listData.add(0,title); - return listData; + if (BigDecimal.ZERO.equals(daPan.getSumAmount())){ + daPan.setJieShaoPer("0%"); + daPan.setOtherPer("0%"); + }else{ + daPan.setJieShaoPer(daPan.getJieShaoAmount().multiply(new BigDecimal("100.0")).divide(daPan.getSumAmount(), 2, RoundingMode.HALF_UP).toPlainString() + "%"); + daPan.setOtherPer(daPan.getOtherAmount().multiply(new BigDecimal("100.0")).divide(daPan.getSumAmount(), 2, RoundingMode.HALF_UP).toPlainString() + "%"); + } + + + BigDecimal sumAmount = list.stream().map(UserContractAmountInfo::getContractAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + + + UserAmountVo userAmountVo = new UserAmountVo(); + userAmountVo.setZjsList(listData); + userAmountVo.setDateStr(date); + userAmountVo.setAll(sumAmount); + userAmountVo.setDaPan(daPan); + return userAmountVo; } /** * 按人员成交数据列表,根据部门获取 @@ -378,7 +440,6 @@ public class HomeServiceImpl implements HomeService { if(obj.getIsDue()!=null&&obj.getIsDue().equals("1")){ vo.addXuFeiAmount(obj.getContractAmount()); } - } //构建表格第一行数据 @@ -415,43 +476,92 @@ public class HomeServiceImpl implements HomeService { * @param type * @return */ - public Collection getUserContractAndPayInfo(Integer type){ + public UserAmountVo getUserContractAndPayInfo(Integer type, boolean isCaiwu){ Map mapParam = this.getDate(type); LocalDate startDate = (LocalDate)mapParam.get("startDate"); LocalDate endDate = (LocalDate)mapParam.get("endDate"); String date = (String)mapParam.get("date"); Map queryParam=new HashMap<>(); - queryParam.put("startDate",startDate); - queryParam.put("endDate",endDate); - queryParam.put("contractStatus",ContractStatusEnum.INIT.getCode()); - queryParam.put("isCancel",CommonStatusEnum.SUCCESS.getCode()); - queryParam.put("payStatus",PayStatusEnum.SUCCESS.getCode()); + queryParam.put("startDate", startDate); + queryParam.put("endDate", endDate); + queryParam.put("contractStatus", ContractStatusEnum.INIT.getCode()); + queryParam.put("isCancel", CommonStatusEnum.SUCCESS.getCode()); + queryParam.put("payStatus", PayStatusEnum.SUCCESS.getCode()); - List list=psContractInfoMapper.getUserContractAndPayInfo(queryParam); - Map resMap=new HashMap<>(); - for (UserContractAmountInfo obj:list) { - Long userId=obj.getUserId(); - UserAmountInfoVo vo= resMap.get(userId); - if(vo==null){ - vo=new UserAmountInfoVo(); + QueryWrapper queryWrapper = new QueryWrapper() + .in(isCaiwu, "role.role_key", Arrays.asList(RoleEnum.caiwu)) + .in(!isCaiwu, "role.role_key", Arrays.asList(RoleEnum.xiaoshou)); + List list = psContractInfoMapper.getUserContractAndPayInfo(queryParam, queryWrapper); + Map resMap = new HashMap<>(); + //记录合同编码,防止重复 + Map repeatContractCode = new HashMap<>(); + for (UserContractAmountInfo obj : list) { + Long userId = obj.getUserId(); + UserAmountInfoVo vo = resMap.get(userId); + if(vo == null){ + vo = new UserAmountInfoVo(); vo.setUserId(userId); vo.setNickName(obj.getNickName()); vo.setDateStr(date); resMap.put(userId, vo); } //累计合同数量 - if(obj.getContractCode()!=null&&obj.getContractCode().length()>0){ + if(obj.getContractCode() != null && obj.getContractCode().length() > 0){ vo.addContractNum(); } - vo.addSumAmount(obj.getContractAmount()); vo.addPayedSumAmount(obj.getPayedMoney()); + + + if(repeatContractCode.get(obj.getContractCode())==null){ + repeatContractCode.put(obj.getContractCode(),obj.getContractCode()); + vo.addSumAmount(obj.getContractAmount()); + } + + //托管合同金额累计 + if(obj.getBusinessType() != null && obj.getBusinessType().equals("4")){ +// vo.addTuoGuanAmount(obj.getContractAmount()); + } else { + //软件开发合同金额累计 + if (obj.getBusinessType() != null && obj.getBusinessType().equals("9")) { + vo.addSoftwareDevAmount(obj.getContractAmount()); + } else { + //其他合同金额累计 + if (obj.getIsDue() == null || obj.getIsDue().equals("0")) { + vo.addOtherAmount(obj.getContractAmount()); + } + } + } + //续签合同金额累计 + if(obj.getIsDue()!=null&&obj.getIsDue().equals("1")){ + vo.addXuFeiAmount(obj.getContractAmount()); + } } + //计算未付款金额 resMap.values().forEach(v->{ v.setUnPaySumAmount(v.getSumAmount().subtract(v.getPayedSumAmount())); }); - return resMap.values(); + + //按总金额降序处理 + List listData = resMap.values().stream().sorted( + Comparator.comparing(UserAmountInfoVo::getSumAmount,Comparator.reverseOrder())).collect(Collectors.toList()); + + BigDecimal sumAmount = list.stream().map(UserContractAmountInfo::getContractAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); + //计算金额占比 + for (UserAmountInfoVo v : listData) { + if(!v.getSumAmount().equals(BigDecimal.ZERO)) { + v.setAmountPer(v.getSumAmount().multiply(new BigDecimal("100.0")).divide(sumAmount, 2, RoundingMode.HALF_UP).toPlainString() + "%"); + }else { + v.setAmountPer("0.00%"); + } + } + + UserAmountVo userAmountVo = new UserAmountVo(); + userAmountVo.setUserAmountList(resMap.values()); + userAmountVo.setDateStr(date); + userAmountVo.setAll(sumAmount); + return userAmountVo; } @@ -463,7 +573,7 @@ public class HomeServiceImpl implements HomeService { */ @Cacheable(cacheNames = CacheNames.HOME_C, key = "#type+'_'+#dateType") public ChannelAmountVo byChannel(Integer type,Integer dateType){ - Map mapParam = dateType == 1?this.getDate(type):this.getDateByUser(type); + Map mapParam = dateType == 1 ? this.getDate(type) : this.getDateByUser(type); LocalDate startDate = (LocalDate)mapParam.get("startDate"); LocalDate endDate = (LocalDate)mapParam.get("endDate"); String date = (String)mapParam.get("date"); @@ -510,6 +620,7 @@ public class HomeServiceImpl implements HomeService { data.setPayMoney(paymoney); data.setUnPayMoney(unpaymoney); data.setType(item); + data.setCost(payList.isEmpty() ? BigDecimal.ZERO : payList.get(0).getCost()); channelList.add(data); } res.setChannelList(channelList); @@ -598,20 +709,27 @@ public class HomeServiceImpl implements HomeService { * @param type * @return */ - public Map salasData(Integer type){ + public SalasVo salasData(Integer type){ Map mapParam = this.getDateByUser(type); LocalDate startDate = (LocalDate)mapParam.get("startDate"); LocalDate endDate = (LocalDate)mapParam.get("endDate"); String date = (String)mapParam.get("date"); - - - - - //返回map - Map map = new HashMap<>(); - map.put("dateStr",date);// - map.put("currentDate", DateUtils.parseDateToStr("yyyy-MM-dd HH:mm",new Date()));//当前时间 - return null; + Map queryParam = new HashMap<>(); + queryParam.put("startDate",startDate); + queryParam.put("endDate",endDate); + SalasVo salasVo = psHomeMapper.selectContractNumAndAmount(queryParam); + salasVo.setGonghaiNum(psHomeMapper.selectGonghaiNum(queryParam)); + salasVo.setCallbackRecordNum(psHomeMapper.selectCallbackRecordNum(queryParam)); + salasVo.setNoCallbackRecordNum(psHomeMapper.selectNoCallbackRecordNum(queryParam)); + salasVo.setPayContractAmount(psHomeMapper.selectSumPayContractAmount(queryParam)); + if (salasVo.getSumContractAmount() == null){ + salasVo.setUnPayContractAmount(new BigDecimal(0)); + }else { + salasVo.setUnPayContractAmount(salasVo.getSumContractAmount().subtract(salasVo.getPayContractAmount() == null ? new BigDecimal(0) : salasVo.getPayContractAmount())); + } + salasVo.setDateStr(date); + salasVo.setCurrentDate(new Date()); + return salasVo; } public static Map getDateByUser(Integer type){ diff --git a/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/PsCompanyInfoServiceImpl.java b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/PsCompanyInfoServiceImpl.java index 94d4502..5bdc2ee 100644 --- a/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/PsCompanyInfoServiceImpl.java +++ b/pusong-modules/pusong-business/src/main/java/com/pusong/business/service/impl/PsCompanyInfoServiceImpl.java @@ -161,11 +161,10 @@ public class PsCompanyInfoServiceImpl implements IPsCompanyInfoService { LoginUser user = LoginHelper.getLoginUser(); for (RoleDTO role : user.getRoles()) { DataScopeType type = DataScopeType.findCode(role.getDataScope()); - if (type == DataScopeType.ALL) { - continue; + if (type == DataScopeType.SELF){ + followUserSql += " and fsu.user_id = " + user.getUserId(); + break; } - followUserSql += " and fsu.user_id = " + user.getUserId(); - break; } lqw.exists(StringUtils.isNotBlank(followUserSql), "select 1 from sys_user fsu LEFT JOIN ps_company_follow cf on com.id = cf.company_id where fsu.user_id = cf.user_id " + followUserSql); diff --git a/pusong-modules/pusong-business/src/main/resources/mapper/business/PsContractInfoMapper.xml b/pusong-modules/pusong-business/src/main/resources/mapper/business/PsContractInfoMapper.xml index 73d9a2f..cb8c427 100644 --- a/pusong-modules/pusong-business/src/main/resources/mapper/business/PsContractInfoMapper.xml +++ b/pusong-modules/pusong-business/src/main/resources/mapper/business/PsContractInfoMapper.xml @@ -132,7 +132,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" pay.money as payedMoney FROM sys_user u LEFT JOIN ps_contract_info info on - u.user_id=info.custom_manager + u.user_id = info.custom_manager + inner join sys_user_role ur on ur.user_id = u.user_id + inner join sys_role role on role.role_id = ur.role_id and info.apply_date >= #{queryParam.startDate} @@ -146,6 +148,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" info.contract_code=pay.contract_code and pay.pay_status=#{queryParam.payStatus} and pay.del_flag=0 + + ${ew.getCustomSqlSegment} @@ -156,8 +160,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" IFNULL(info.contract_amount,0) as contractAmount, info.is_due as isDue, info.contract_code as contractCode, - cus.custom_source as customSource + cus.custom_source as customSource, + pay.money as payedMoney FROM sys_user u + inner join sys_user_role ur on ur.user_id = u.user_id + inner join sys_role role on role.role_id = ur.role_id LEFT JOIN ps_contract_info info on u.user_id=info.custom_manager and info.contract_status != #{queryParam.contractStatus} @@ -171,7 +178,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" LEFT JOIN ps_custom_info cus on info.custom_id=cus.id - WHERE u.dept_id=#{queryParam.deptId} + LEFT JOIN ps_contract_pay pay on info.contract_code = pay.contract_code + and pay.pay_status = #{queryParam.payStatus} and pay.del_flag = 0 + ${ew.getCustomSqlSegment} @@ -207,10 +216,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" info.contract_code, info.contract_amount, pay.business_type, - pay.money + pay.money, + ( + select sum(sc.cost) from ps_contract_business_detail bd + left join ps_salary_config sc on sc.service_project = bd.business_project and sc.del_flag = 0 + where bd.contract_code = info.contract_code and sc.post_id = up.post_id + ) cost from ps_contract_info info - left join ps_custom_info cus on info.custom_id = cus.id + left join ps_custom_info cus on info.custom_id = cus.id left join ps_contract_pay pay on info.contract_code = pay.contract_code + left join sys_user_post up on up.user_id = info.custom_manager + - + diff --git a/pusong-modules/pusong-business/src/main/resources/mapper/business/PsHomeMapper.xml b/pusong-modules/pusong-business/src/main/resources/mapper/business/PsHomeMapper.xml new file mode 100644 index 0000000..e7535fe --- /dev/null +++ b/pusong-modules/pusong-business/src/main/resources/mapper/business/PsHomeMapper.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + diff --git a/pusong-modules/pusong-system/src/main/java/com/pusong/system/RoleEnum.java b/pusong-modules/pusong-system/src/main/java/com/pusong/system/RoleEnum.java index 571ae66..98388b5 100644 --- a/pusong-modules/pusong-system/src/main/java/com/pusong/system/RoleEnum.java +++ b/pusong-modules/pusong-system/src/main/java/com/pusong/system/RoleEnum.java @@ -19,8 +19,9 @@ public enum RoleEnum { nqzxry("nqzxry","内勤执行人员"), caiwu("caiwu","财务"), zongcai("zongcai","总裁"), - topmanage("topmanage","总经理") - + topmanage("topmanage","总经理"), + stopacc1("stopaccount","停止代账1"), + stopacc2("cwstopaccount","停止代账2") ; private String code; diff --git a/pusong-modules/pusong-system/src/main/java/com/pusong/system/controller/system/SysNoticeController.java b/pusong-modules/pusong-system/src/main/java/com/pusong/system/controller/system/SysNoticeController.java index 77060a1..e5069be 100644 --- a/pusong-modules/pusong-system/src/main/java/com/pusong/system/controller/system/SysNoticeController.java +++ b/pusong-modules/pusong-system/src/main/java/com/pusong/system/controller/system/SysNoticeController.java @@ -73,9 +73,17 @@ public class SysNoticeController extends BaseController { @Log(title = "通知公告", businessType = BusinessType.UPDATE) @PutMapping public R edit(@Validated @RequestBody SysNoticeBo notice) { - return toAjax(noticeService.updateNotice(notice)); + if (notice.getNoticeId() != null){ + return toAjax( noticeService.updateNotice(notice)); + }else{ + return toAjax(noticeService.readed(notice.getNoticeIds())); + } + } + @Log(title = "公告已读", businessType = BusinessType.UPDATE) + @GetMapping("/readed") + public R readed(String noticeIds) { + return toAjax(noticeService.readed(noticeIds)); } - /** * 删除通知公告 * diff --git a/pusong-modules/pusong-system/src/main/java/com/pusong/system/domain/SysNotice.java b/pusong-modules/pusong-system/src/main/java/com/pusong/system/domain/SysNotice.java index 8e0bc85..5d03d93 100644 --- a/pusong-modules/pusong-system/src/main/java/com/pusong/system/domain/SysNotice.java +++ b/pusong-modules/pusong-system/src/main/java/com/pusong/system/domain/SysNotice.java @@ -64,5 +64,8 @@ public class SysNotice extends TenantEntity { */ private int jumpType; - + /** + * 0未读 1已读 + */ + private int readed; } diff --git a/pusong-modules/pusong-system/src/main/java/com/pusong/system/domain/bo/SysNoticeBo.java b/pusong-modules/pusong-system/src/main/java/com/pusong/system/domain/bo/SysNoticeBo.java index 3589c3a..6a28998 100644 --- a/pusong-modules/pusong-system/src/main/java/com/pusong/system/domain/bo/SysNoticeBo.java +++ b/pusong-modules/pusong-system/src/main/java/com/pusong/system/domain/bo/SysNoticeBo.java @@ -26,6 +26,10 @@ import java.util.List; @AutoMapper(target = SysNotice.class, reverseConvertGenerate = false) public class SysNoticeBo extends BaseEntity { + /** + * 公告ID + */ + private String noticeIds; /** * 公告ID */ @@ -82,7 +86,10 @@ public class SysNoticeBo extends BaseEntity { * 跳转类型 */ private int jumpType; - + /** + * 0未读 1已读 + */ + private int readed; public static SysNoticeBo getGonghaiInstance(){ SysNoticeBo noticeBo = new SysNoticeBo(); @@ -488,5 +495,14 @@ public class SysNoticeBo extends BaseEntity { noticeBo.setJumpType(0); return noticeBo; } - + public static SysNoticeBo getWaitApplyInstance(String applyUserName, String roleKey){ + SysNoticeBo noticeBo = new SysNoticeBo(); + noticeBo.setNoticeType("1"); + noticeBo.setNoticeTitle("通知"); + noticeBo.setStatus("0"); + noticeBo.setNoticeContent("【"+ applyUserName +"】提交的【停止代账审批】待你审批!"); + noticeBo.setRecRole(Arrays.asList(roleKey)); + noticeBo.setJumpType(0); + return noticeBo; + } } diff --git a/pusong-modules/pusong-system/src/main/java/com/pusong/system/domain/vo/SysNoticeVo.java b/pusong-modules/pusong-system/src/main/java/com/pusong/system/domain/vo/SysNoticeVo.java index 225afde..5553573 100644 --- a/pusong-modules/pusong-system/src/main/java/com/pusong/system/domain/vo/SysNoticeVo.java +++ b/pusong-modules/pusong-system/src/main/java/com/pusong/system/domain/vo/SysNoticeVo.java @@ -1,5 +1,6 @@ package com.pusong.system.domain.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import com.pusong.common.translation.annotation.Translation; import com.pusong.common.translation.constant.TransConstant; import com.pusong.system.domain.SysNotice; @@ -52,22 +53,31 @@ public class SysNoticeVo implements Serializable { /** * 备注 */ - private String remark; +// private String remark; - /** - * 创建者 - */ - private Long createBy; +// /** +// * 创建者 +// */ +// private Long createBy; - /** - * 创建人名称 - */ - @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "createBy") - private String createByName; +// /** +// * 创建人名称 +// */ +// @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "createBy") +// private String createByName; /** * 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; + /** + * 跳转类型 + */ + private int jumpType; + /** + * 0未读 1已读 + */ + private int readed; } diff --git a/pusong-modules/pusong-system/src/main/java/com/pusong/system/mapper/SysNoticeMapper.java b/pusong-modules/pusong-system/src/main/java/com/pusong/system/mapper/SysNoticeMapper.java index 6288f39..36273da 100644 --- a/pusong-modules/pusong-system/src/main/java/com/pusong/system/mapper/SysNoticeMapper.java +++ b/pusong-modules/pusong-system/src/main/java/com/pusong/system/mapper/SysNoticeMapper.java @@ -1,8 +1,11 @@ package com.pusong.system.mapper; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; import com.pusong.common.mybatis.core.mapper.BaseMapperPlus; import com.pusong.system.domain.SysNotice; import com.pusong.system.domain.vo.SysNoticeVo; +import org.apache.ibatis.annotations.Param; /** * 通知公告表 数据层 @@ -10,5 +13,6 @@ import com.pusong.system.domain.vo.SysNoticeVo; * @author Lion Li */ public interface SysNoticeMapper extends BaseMapperPlus { + Integer updateBatchReaded(@Param(Constants.WRAPPER) Wrapper queryWrapper); } diff --git a/pusong-modules/pusong-system/src/main/java/com/pusong/system/service/ISysNoticeService.java b/pusong-modules/pusong-system/src/main/java/com/pusong/system/service/ISysNoticeService.java index e4e28ab..dd7c6c2 100644 --- a/pusong-modules/pusong-system/src/main/java/com/pusong/system/service/ISysNoticeService.java +++ b/pusong-modules/pusong-system/src/main/java/com/pusong/system/service/ISysNoticeService.java @@ -49,7 +49,7 @@ public interface ISysNoticeService { * @return 结果 */ int updateNotice(SysNoticeBo bo); - + int readed(String ids); /** * 删除公告信息 * diff --git a/pusong-modules/pusong-system/src/main/java/com/pusong/system/service/impl/SysNoticeServiceImpl.java b/pusong-modules/pusong-system/src/main/java/com/pusong/system/service/impl/SysNoticeServiceImpl.java index 6781254..a0260b0 100644 --- a/pusong-modules/pusong-system/src/main/java/com/pusong/system/service/impl/SysNoticeServiceImpl.java +++ b/pusong-modules/pusong-system/src/main/java/com/pusong/system/service/impl/SysNoticeServiceImpl.java @@ -1,6 +1,7 @@ package com.pusong.system.service.impl; import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -10,6 +11,7 @@ import com.pusong.common.core.domain.R; import com.pusong.common.core.service.DictService; import com.pusong.common.core.utils.MapstructUtils; import com.pusong.common.core.utils.StringUtils; +import com.pusong.common.json.utils.JsonUtils; import com.pusong.common.mybatis.core.page.PageQuery; import com.pusong.common.mybatis.core.page.TableDataInfo; import com.pusong.common.websocket.dto.WebSocketMessageDto; @@ -149,9 +151,10 @@ public class SysNoticeServiceImpl implements ISysNoticeService { insertData.add(sysNoticeBo); } } - + SysNoticeVo vo = MapstructUtils.convert(bo, SysNoticeVo.class); WebSocketMessageDto webSocketMessage = new WebSocketMessageDto(); - webSocketMessage.setMessage(bo.getNoticeContent()); +// webSocketMessage.setMessage(bo.getNoticeContent()); + webSocketMessage.setMessage(JsonUtils.toJsonString(vo)); webSocketMessage.setSessionKeys(uids); WebSocketUtils.publishMessage(webSocketMessage); @@ -169,7 +172,14 @@ public class SysNoticeServiceImpl implements ISysNoticeService { SysNotice notice = MapstructUtils.convert(bo, SysNotice.class); return baseMapper.updateById(notice); } - + @Override + public int readed(String ids) { + String[] idArr = ids.split(","); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.in("notice_id", idArr); + baseMapper.updateBatchReaded(queryWrapper); + return 1; + } /** * 删除公告对象 * diff --git a/pusong-modules/pusong-system/src/main/resources/mapper/system/SysNoticeMapper.xml b/pusong-modules/pusong-system/src/main/resources/mapper/system/SysNoticeMapper.xml index 4e6824b..5a9e0f5 100644 --- a/pusong-modules/pusong-system/src/main/resources/mapper/system/SysNoticeMapper.xml +++ b/pusong-modules/pusong-system/src/main/resources/mapper/system/SysNoticeMapper.xml @@ -3,5 +3,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +