diff --git a/cds-fontend-2025.V1/src/service/api/statistics/statistics.ts b/cds-fontend-2025.V1/src/service/api/statistics/statistics.ts new file mode 100644 index 0000000..b91b74c --- /dev/null +++ b/cds-fontend-2025.V1/src/service/api/statistics/statistics.ts @@ -0,0 +1,28 @@ +import { request } from '@/service/request'; + +/** 获取营销用户卡片数据 */ +export function getMktCardData(startDate: string,endDate: string) { + return request({ + url: '/common/statistics/getMktCardData', + method: 'get', + params: {startDate,endDate} + }); +} + +/** 获取营销用户line数据 */ +export function getMktLineData(startDate: string,endDate: string) { + return request({ + url: '/common/statistics/getMktLineData', + method: 'get', + params: {startDate,endDate} + }); +} + +/** 获取营销用户pie数据 */ +export function getMktPieData(startDate: string,endDate: string) { + return request({ + url: '/common/statistics/getMktPieData', + method: 'get', + params: {startDate,endDate} + }); +} diff --git a/cds-fontend-2025.V1/src/typings/Statistics.ts b/cds-fontend-2025.V1/src/typings/Statistics.ts new file mode 100644 index 0000000..8b75eb9 --- /dev/null +++ b/cds-fontend-2025.V1/src/typings/Statistics.ts @@ -0,0 +1,8 @@ +export interface MktCardData { + key: string; + title: string; + value: number; + unit: string; + color: CardColor; + icon: string; +} diff --git a/cds-fontend-2025.V1/src/typings/api/mps.private-test3.api.d.ts b/cds-fontend-2025.V1/src/typings/api/mps.private-test3.api.d.ts index 79037be..854e88a 100644 --- a/cds-fontend-2025.V1/src/typings/api/mps.private-test3.api.d.ts +++ b/cds-fontend-2025.V1/src/typings/api/mps.private-test3.api.d.ts @@ -1,37 +1,44 @@ /** - * namespace Mps + * Namespace Api * - * backend api module: "Mps" + * All backend api type */ -namespace Mps { +declare namespace Api { + + /** + * namespace Mps + * + * backend api module: "Mps" + */ + namespace Mps { /** private test3 */ type PrivateTest3 = Common.CommonRecord<{ - /** 主键 */ - dataId: CommonType.IdType; - /** 营销人员营销号 */ - userId: CommonType.IdType; - /** 客户身份证号 */ - custId: CommonType.IdType; - /** 客户姓名 */ - custName: string; - /** 客户账号/卡号 */ - custAcctNo: string; - /** 客户联系电话 */ - custPhoneNo: string; - /** 核对标志(0未核对 1核对通过 9核对失败) */ - checkFlag: string; - /** 核对时间 */ - checkTime: string; - /** 核对人员(人工核对时) */ - checkUser: string; - /** 核对方式(0系统 1人工 2其他1 3其他2 4其他3) */ - checkType: string; - /** 核对结果 */ - checkMsg: string; - /** 租户编号 */ - tenantId: CommonType.IdType; - /** 删除标志(0代表存在 1代表删除) */ - delFlag: string; + /** 主键 */ + dataId: CommonType.IdType; + /** 营销人员营销号 */ + userId: CommonType.IdType; + /** 客户身份证号 */ + custId: CommonType.IdType; + /** 客户姓名 */ + custName: string; + /** 客户账号/卡号 */ + custAcctNo: string; + /** 客户联系电话 */ + custPhoneNo: string; + /** 核对标志(0未核对 1核对通过 9核对失败) */ + checkFlag: string; + /** 核对时间 */ + checkTime: string; + /** 核对人员(人工核对时) */ + checkUser: string; + /** 核对方式(0系统 1人工 2其他1 3其他2 4其他3) */ + checkType: string; + /** 核对结果 */ + checkMsg: string; + /** 租户编号 */ + tenantId: CommonType.IdType; + /** 删除标志(0代表存在 1代表删除) */ + delFlag: string; }>; /** private test3 search params */ @@ -49,7 +56,7 @@ namespace Mps { | 'checkType' | 'checkMsg' > & - Api.Common.CommonSearchParams + Api.Common.CommonSearchParams >; /** private test3 operate params */ @@ -72,4 +79,5 @@ namespace Mps { /** private test3 list */ type PrivateTest3List = Api.Common.PaginatingQueryRecord; + } } diff --git a/cds-fontend-2025.V1/src/views/home/index.vue b/cds-fontend-2025.V1/src/views/home/index.vue index dfcd940..9f29c98 100644 --- a/cds-fontend-2025.V1/src/views/home/index.vue +++ b/cds-fontend-2025.V1/src/views/home/index.vue @@ -1,58 +1,102 @@ diff --git a/cds-fontend-2025.V1/src/views/home/modules/card-data-mkt.vue b/cds-fontend-2025.V1/src/views/home/modules/card-data-mkt.vue new file mode 100644 index 0000000..e6ee422 --- /dev/null +++ b/cds-fontend-2025.V1/src/views/home/modules/card-data-mkt.vue @@ -0,0 +1,299 @@ + + + + + diff --git a/cds-fontend-2025.V1/src/views/home/modules/card-data.vue b/cds-fontend-2025.V1/src/views/home/modules/card-data.vue index 5910470..565d99d 100644 --- a/cds-fontend-2025.V1/src/views/home/modules/card-data.vue +++ b/cds-fontend-2025.V1/src/views/home/modules/card-data.vue @@ -22,7 +22,7 @@ interface CardData { const cardData = computed(() => [ { key: 'visitCount', - title: $t('page.home.visitCount'), + title: '总计件量', value: 9725, unit: '', color: { @@ -33,9 +33,9 @@ const cardData = computed(() => [ }, { key: 'turnover', - title: $t('page.home.turnover'), - value: 1026, - unit: '$', + title: '总计价额', + value: 1026.12, + unit: '¥', color: { start: '#865ec0', end: '#5144b4' @@ -44,8 +44,8 @@ const cardData = computed(() => [ }, { key: 'downloadCount', - title: $t('page.home.downloadCount'), - value: 970925, + title: '产品种类', + value: 16, unit: '', color: { start: '#56cdf3', @@ -55,8 +55,8 @@ const cardData = computed(() => [ }, { key: 'dealCount', - title: $t('page.home.dealCount'), - value: 9527, + title: '客户数量', + value: 66, unit: '', color: { start: '#fcbc25', @@ -97,6 +97,7 @@ function getGradientColor(color: CardData['color']) { :prefix="item.unit" :start-value="1" :end-value="item.value" + :decimals="item.key === 'turnover' ? 2 : 0" class="text-30px text-white dark:text-dark" /> diff --git a/cds-fontend-2025.V1/src/views/home/modules/line-chart-mkt.vue b/cds-fontend-2025.V1/src/views/home/modules/line-chart-mkt.vue new file mode 100644 index 0000000..b74143c --- /dev/null +++ b/cds-fontend-2025.V1/src/views/home/modules/line-chart-mkt.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/cds-fontend-2025.V1/src/views/home/modules/pie-chart-mkt.vue b/cds-fontend-2025.V1/src/views/home/modules/pie-chart-mkt.vue new file mode 100644 index 0000000..ea2e366 --- /dev/null +++ b/cds-fontend-2025.V1/src/views/home/modules/pie-chart-mkt.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/cds-platform-2025.V1/ruoyi-admin/src/main/resources/application-dev.yml b/cds-platform-2025.V1/ruoyi-admin/src/main/resources/application-dev.yml index 657ab3d..54cab14 100644 --- a/cds-platform-2025.V1/ruoyi-admin/src/main/resources/application-dev.yml +++ b/cds-platform-2025.V1/ruoyi-admin/src/main/resources/application-dev.yml @@ -105,7 +105,7 @@ spring.data: # 数据库索引 database: 0 # redis 密码必须配置 -# password: 123456 + password: 123456 # 连接超时时间 timeout: 10s # 是否开启ssl diff --git a/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/mps/mapper/MpsPrivateEbankNewMapper.java b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/mps/mapper/MpsPrivateEbankNewMapper.java index b5191d6..d1cbb9b 100644 --- a/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/mps/mapper/MpsPrivateEbankNewMapper.java +++ b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/mps/mapper/MpsPrivateEbankNewMapper.java @@ -21,6 +21,11 @@ import java.util.List; */ public interface MpsPrivateEbankNewMapper extends BaseMapperPlus { + /*@DataPermission({ + @DataColumn(key = "deptName", value = "create_dept"), + @DataColumn(key = "userName", value = "create_by") + })*/ + @DataPermission({ @DataColumn(key = "deptName", value = "create_dept"), @DataColumn(key = "userName", value = "create_by") diff --git a/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/statistics/controller/StatisticsController.java b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/statistics/controller/StatisticsController.java new file mode 100644 index 0000000..52f365b --- /dev/null +++ b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/statistics/controller/StatisticsController.java @@ -0,0 +1,132 @@ +package org.dromara.statistics.controller; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.statistics.domain.vo.MktCardVo; +import org.dromara.statistics.domain.vo.MktLineVo; +import org.dromara.statistics.domain.vo.MktPieVo; +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 java.math.BigDecimal; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +/** + * 统计分析控制器 + * + * 数据 按需根据业务表自行计算,目前为mock数据 + * + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/common/statistics") +public class StatisticsController { + + // 日期格式化器 + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("MM/dd"); + private static final DateTimeFormatter FULL_DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + // 营销人员卡片数据 + @GetMapping("/getMktCardData") + public R getMktCardData(String startDate, String endDate) { + System.out.println(startDate + " " + endDate); + MktCardVo mktCardVo = new MktCardVo(); + mktCardVo.setMpsCount(1765); // 总计件量 + mktCardVo.setMpsAmt(new BigDecimal(1026.12)); // 总计价额 + mktCardVo.setBusiCount(16); // 产品种类 + mktCardVo.setCustomerCount(66); // 客户数量 + return R.ok(mktCardVo); + } + + // 营销线图数据接口 + @GetMapping("/getMktLineData") + public R getMktLineData(String startDate, String endDate) { + System.out.println("获取线图数据: " + startDate + " 至 " + endDate); + + // 解析日期范围 + LocalDate start = LocalDate.parse(startDate, FULL_DATE_FORMATTER); + LocalDate end = LocalDate.parse(endDate, FULL_DATE_FORMATTER); + + // 生成日期列表 + List dates = new ArrayList<>(); + List yoyData = new ArrayList<>(); // 同比数据 + List momData = new ArrayList<>(); // 环比数据 + + // 随机数生成器 + Random random = new Random(); + double baseValue = 1000 + random.nextInt(2000); // 基础值范围1000-3000 + + // 遍历日期范围 + for (LocalDate date = start; !date.isAfter(end); date = date.plusDays(1)) { + // 添加格式化日期 (MM/dd) + dates.add(date.format(DATE_FORMATTER)); + + // 生成模拟数据 - 基于基础值波动 + double dailyBase = baseValue * (0.9 + 0.2 * random.nextDouble()); + + // 同比数据:较去年同期的变化 + double yoyValue = dailyBase * (0.8 + 0.4 * random.nextDouble()); + + // 环比数据:较前一日的变化 + double momValue = dailyBase * (0.85 + 0.3 * random.nextDouble()); + + yoyData.add(Math.round(yoyValue * 100.0) / 100.0); + momData.add(Math.round(momValue * 100.0) / 100.0); + + // 更新基础值用于下一天 + baseValue = dailyBase * (0.95 + 0.1 * random.nextDouble()); + } + + // 创建返回对象 + MktLineVo lineVo = new MktLineVo(); + lineVo.setDates(dates); + lineVo.setYoyData(yoyData); + lineVo.setMomData(momData); + + return R.ok(lineVo); + } + + // 营销饼图数据接口 + @GetMapping("/getMktPieData") + public R> getPieData(String startDate, String endDate) { + System.out.println("获取饼图数据: " + startDate + " 至 " + endDate); + + // 创建模拟数据 + List data = new ArrayList<>(); + + // 产品类型及其基础值 + String[] productTypes = {"智E通", "社保类", "公积金", "代收付"}; + int[] baseValues = {20, 10, 40, 30}; + + // 计算日期范围天数 + LocalDate start = LocalDate.parse(startDate); + LocalDate end = LocalDate.parse(endDate); + long days = ChronoUnit.DAYS.between(start, end) + 1; + + // 根据天数调整比例 (最大不超过2倍) + double multiplier = Math.min(1 + days / 30.0, 2.0); + + // 生成模拟数据 + Random random = new Random(); + for (int i = 0; i < productTypes.length; i++) { + MktPieVo item = new MktPieVo(); + item.setName(productTypes[i]); + + // 基础值乘以倍数,并添加随机波动 + int value = (int) Math.round(baseValues[i] * multiplier * (0.9 + 0.2 * random.nextDouble())); + item.setValue(value); + + data.add(item); + } + + return R.ok(data); + } +} diff --git a/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/statistics/domain/bo/MktCardBo.java b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/statistics/domain/bo/MktCardBo.java new file mode 100644 index 0000000..a0d7f29 --- /dev/null +++ b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/statistics/domain/bo/MktCardBo.java @@ -0,0 +1,21 @@ +package org.dromara.statistics.domain.bo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +@Data +public class MktCardBo { + + /** + * 开始日期 + */ + private String startDate; + + /** + * 截止日期 + */ + private String endDate; + +} diff --git a/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/statistics/domain/vo/MktCardVo.java b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/statistics/domain/vo/MktCardVo.java new file mode 100644 index 0000000..fd3f35b --- /dev/null +++ b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/statistics/domain/vo/MktCardVo.java @@ -0,0 +1,29 @@ +package org.dromara.statistics.domain.vo; + +import lombok.Data; +import java.math.BigDecimal; + +@Data +public class MktCardVo { + + /** + * 总计件量 + */ + private int mpsCount; + + /** + * 总计价额 + */ + private BigDecimal mpsAmt; + + /** + * 产品种类(营销产品的种类数量) + */ + private int busiCount; + + /** + * 客户数量(服务客户数量) + */ + private int customerCount; + +} diff --git a/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/statistics/domain/vo/MktLineVo.java b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/statistics/domain/vo/MktLineVo.java new file mode 100644 index 0000000..2d5e4c3 --- /dev/null +++ b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/statistics/domain/vo/MktLineVo.java @@ -0,0 +1,26 @@ +package org.dromara.statistics.domain.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 营销线图数据VO + */ +@Data +public class MktLineVo { + /** + * 日期列表 (格式: MM/dd) + */ + private List dates; + + /** + * 同比数据 (与去年同期比较) + */ + private List yoyData; + + /** + * 环比数据 (与前一日比较) + */ + private List momData; +} diff --git a/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/statistics/domain/vo/MktPieVo.java b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/statistics/domain/vo/MktPieVo.java new file mode 100644 index 0000000..93e8b5b --- /dev/null +++ b/cds-platform-2025.V1/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/statistics/domain/vo/MktPieVo.java @@ -0,0 +1,21 @@ +package org.dromara.statistics.domain.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 营销线图数据VO + */ +@Data +public class MktPieVo { + /** + * 产品名称 + */ + private String name; + + /** + * 产品数量/占比值 + */ + private Integer value; +}