From 01ec29029700787c01c2bb0ea96b2b7005ee1fad Mon Sep 17 00:00:00 2001 From: yinq Date: Mon, 8 Jun 2026 17:07:22 +0800 Subject: [PATCH] =?UTF-8?q?1.1.64=20=E9=94=80=E5=94=AE=E5=90=88=E5=90=8C?= =?UTF-8?q?=E4=BB=AA=E8=A1=A8=E7=9B=98=E6=8E=A5=E5=8F=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SalesContractDashboardController.java | 35 +++++++++ .../domain/bo/SalesContractDashboardBo.java | 20 +++++ .../domain/vo/SalesContractDashboardVo.java | 47 ++++++++++++ .../mapper/SalesContractDashboardMapper.java | 27 +++++++ .../ISalesContractDashboardService.java | 15 ++++ .../impl/ErpContractOrderServiceImpl.java | 9 +-- .../SalesContractDashboardServiceImpl.java | 68 +++++++++++++++++ .../oa/erp/SalesContractDashboardMapper.xml | 75 +++++++++++++++++++ 8 files changed, 291 insertions(+), 5 deletions(-) create mode 100644 ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/SalesContractDashboardController.java create mode 100644 ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/SalesContractDashboardBo.java create mode 100644 ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/SalesContractDashboardVo.java create mode 100644 ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/SalesContractDashboardMapper.java create mode 100644 ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/ISalesContractDashboardService.java create mode 100644 ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/SalesContractDashboardServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/SalesContractDashboardMapper.xml diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/SalesContractDashboardController.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/SalesContractDashboardController.java new file mode 100644 index 00000000..3fbbf784 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/controller/SalesContractDashboardController.java @@ -0,0 +1,35 @@ +package org.dromara.oa.erp.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.oa.erp.domain.bo.SalesContractDashboardBo; +import org.dromara.oa.erp.domain.vo.SalesContractDashboardVo; +import org.dromara.oa.erp.service.ISalesContractDashboardService; +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; + +/** + * 销售合同仪表盘 + * 前端访问路由地址为:/oa/erp/salesContractDashboard + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/erp/salesContractDashboard") +public class SalesContractDashboardController extends BaseController { + + private final ISalesContractDashboardService salesContractDashboardService; + + /** + * 查询销售合同仪表盘数据 + */ + @SaCheckPermission("oa/erp:salesContractDashboard:query") + @GetMapping("/data") + public R getDashboardData(SalesContractDashboardBo bo) { + return R.ok(salesContractDashboardService.queryDashboard(bo)); + } +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/SalesContractDashboardBo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/SalesContractDashboardBo.java new file mode 100644 index 00000000..ef6f77f7 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/bo/SalesContractDashboardBo.java @@ -0,0 +1,20 @@ +package org.dromara.oa.erp.domain.bo; + +import lombok.Data; + +/** + * 销售合同仪表盘业务对象 + */ +@Data +public class SalesContractDashboardBo { + + /** + * 合同签订开始日期(yyyy-MM-dd) + */ + private String beginDate; + + /** + * 合同签订结束日期(yyyy-MM-dd) + */ + private String endDate; +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/SalesContractDashboardVo.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/SalesContractDashboardVo.java new file mode 100644 index 00000000..a983357c --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/domain/vo/SalesContractDashboardVo.java @@ -0,0 +1,47 @@ +package org.dromara.oa.erp.domain.vo; + +import lombok.Data; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * 销售合同仪表盘视图对象 + */ +@Data +public class SalesContractDashboardVo { + + /** 成交总额 */ + private BigDecimal totalTransactionAmount; + + /** 本周新签合同额 */ + private BigDecimal weeklyNewContractAmount; + + /** 业务方向销售额占比 */ + private List businessDirectionRatios = new ArrayList<>(); + + /** 成交额客户分布 */ + private List customerTransactionDistribution = new ArrayList<>(); + + /** 销售合同额排行 */ + private List salesContractRanking = new ArrayList<>(); + + /** 业务方向名称 / 通用名称 */ + private String name; + + /** 业务方向金额 / 通用数值 */ + private BigDecimal value; + + /** 客户名称 */ + private String customerName; + + /** 客户成交额 */ + private BigDecimal amount; + + /** 销售人员名称 */ + private String salespersonName; + + /** 销售合同金额 */ + private BigDecimal contractAmount; +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/SalesContractDashboardMapper.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/SalesContractDashboardMapper.java new file mode 100644 index 00000000..4eec86c0 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/mapper/SalesContractDashboardMapper.java @@ -0,0 +1,27 @@ +package org.dromara.oa.erp.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.oa.erp.domain.vo.SalesContractDashboardVo; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 销售合同仪表盘 Mapper + */ +public interface SalesContractDashboardMapper { + + BigDecimal selectTotalTransactionAmount(@Param("beginDate") String beginDate, + @Param("endDate") String endDate); + + BigDecimal selectWeeklyNewContractAmount(); + + List selectBusinessDirectionRatios(@Param("beginDate") String beginDate, + @Param("endDate") String endDate); + + List selectCustomerTransactionDistribution(@Param("beginDate") String beginDate, + @Param("endDate") String endDate); + + List selectSalesContractRanking(@Param("beginDate") String beginDate, + @Param("endDate") String endDate); +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/ISalesContractDashboardService.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/ISalesContractDashboardService.java new file mode 100644 index 00000000..e52ea8ef --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/ISalesContractDashboardService.java @@ -0,0 +1,15 @@ +package org.dromara.oa.erp.service; + +import org.dromara.oa.erp.domain.bo.SalesContractDashboardBo; +import org.dromara.oa.erp.domain.vo.SalesContractDashboardVo; + +/** + * 销售合同仪表盘 Service + */ +public interface ISalesContractDashboardService { + + /** + * 查询仪表盘数据 + */ + SalesContractDashboardVo queryDashboard(SalesContractDashboardBo bo); +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractOrderServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractOrderServiceImpl.java index a7dcd524..13d2059f 100644 --- a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractOrderServiceImpl.java +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/ErpContractOrderServiceImpl.java @@ -66,11 +66,7 @@ import org.springframework.stereotype.Service; import org.apache.dubbo.config.annotation.DubboReference; import java.math.BigDecimal; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import cn.hutool.core.map.MapUtil; @@ -387,6 +383,9 @@ public class ErpContractOrderServiceImpl implements IErpContractOrderService { contractPatch.setSignatureAppendix(bo.getOssId().trim()); // contractPatch.setContractDeptId(bo.getDeptId()); contractPatch.setContractStatus(OAStatusEnum.ACTIVATE.getStatus()); + if (StringUtils.isNull(contractInfoVo.getContractDate())){ + contractPatch.setContractDate(new Date()); + } } contractInfoMapper.updateById(contractPatch); } diff --git a/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/SalesContractDashboardServiceImpl.java b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/SalesContractDashboardServiceImpl.java new file mode 100644 index 00000000..33b1e2b6 --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/java/org/dromara/oa/erp/service/impl/SalesContractDashboardServiceImpl.java @@ -0,0 +1,68 @@ +package org.dromara.oa.erp.service.impl; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.service.DictService; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.oa.erp.domain.bo.SalesContractDashboardBo; +import org.dromara.oa.erp.domain.vo.SalesContractDashboardVo; +import org.dromara.oa.erp.mapper.SalesContractDashboardMapper; +import org.dromara.oa.erp.service.ISalesContractDashboardService; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; + +/** + * 销售合同仪表盘 Service 实现 + */ +@RequiredArgsConstructor +@Service +public class SalesContractDashboardServiceImpl implements ISalesContractDashboardService { + + private static final String BUSINESS_DIRECTION_DICT = "business_direction"; + + private final SalesContractDashboardMapper dashboardMapper; + private final DictService dictService; + + @Override + public SalesContractDashboardVo queryDashboard(SalesContractDashboardBo bo) { + String beginDate = bo.getBeginDate(); + String endDate = bo.getEndDate(); + if (StringUtils.isBlank(beginDate) || StringUtils.isBlank(endDate)) { + int year = LocalDate.now().getYear(); + beginDate = year + "-01-01"; + endDate = year + "-12-31"; + } + + SalesContractDashboardVo dashboardVo = new SalesContractDashboardVo(); + dashboardVo.setTotalTransactionAmount(defaultAmount( + dashboardMapper.selectTotalTransactionAmount(beginDate, endDate))); + dashboardVo.setWeeklyNewContractAmount(defaultAmount( + dashboardMapper.selectWeeklyNewContractAmount())); + + List directionRatios = + dashboardMapper.selectBusinessDirectionRatios(beginDate, endDate); + directionRatios.forEach(item -> item.setName(resolveBusinessDirectionName(item.getName()))); + dashboardVo.setBusinessDirectionRatios(directionRatios); + + dashboardVo.setCustomerTransactionDistribution( + dashboardMapper.selectCustomerTransactionDistribution(beginDate, endDate)); + dashboardVo.setSalesContractRanking( + dashboardMapper.selectSalesContractRanking(beginDate, endDate)); + + return dashboardVo; + } + + private BigDecimal defaultAmount(BigDecimal amount) { + return amount == null ? BigDecimal.ZERO : amount; + } + + private String resolveBusinessDirectionName(String businessDirection) { + if (StringUtils.isBlank(businessDirection) || "unknown".equals(businessDirection)) { + return "未分类"; + } + String label = dictService.getDictLabel(BUSINESS_DIRECTION_DICT, businessDirection); + return StringUtils.isNotBlank(label) ? label : businessDirection; + } +} diff --git a/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/SalesContractDashboardMapper.xml b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/SalesContractDashboardMapper.xml new file mode 100644 index 00000000..95e54d0f --- /dev/null +++ b/ruoyi-modules/ruoyi-oa/src/main/resources/mapper/oa/erp/SalesContractDashboardMapper.xml @@ -0,0 +1,75 @@ + + + + + + + t.del_flag = '0' + AND t.contract_status = '5' + AND t.contract_date IS NOT NULL + + + + + + AND DATE(t.contract_date) >= #{beginDate} + + + AND DATE(t.contract_date) <= #{endDate} + + + + + + + + + + + + +