微信支付开发-后台统计工厂实现

news2024/11/24 16:04:30

一、数据库设计图

二、后端统计工厂逻辑

        1、统计父抽象类

                a、StatisticsHandle.php

        2、统计工厂通道类

                a、StatisticsFactory.php

        3、查询实现类

                a、答题统计(Answer.php)

三、后端统计工厂代码实现

        1、统计父抽象类(StatisticsHandle.php)

<?php
/**
 * 统计父抽象类
 * User: 龙哥·三年风水
 * Date: 2024/9/11
 * Time: 10:07
 */
namespace Statistics;
abstract class StatisticsHandle
{
    /**
     * 获取统计列表
     * User: 龙哥·三年风水
     * Date: 2024/9/11
     * Time: 10:31
     * @ param $param 参数
     * @ return mixed
     */

    protected abstract function getList($param);

    /**
     * 获取统计详情
     * User: 龙哥·三年风水
     * Date: 2024/9/11
     * Time: 10:31
     * @ param $id 编号
     * @ return mixed
     */

    protected abstract function getInfo($id);

    /**
     * 导出统计信息
     * User: 龙哥·三年风水
     * Date: 2024/9/11
     * Time: 10:32
     * @ return mixed
     */
    protected abstract function exportInfo($param);
}

        2、统计工厂通道类(StatisticsFactory.php)

<?php
/**
 * 统计工厂选择类
 * User: 龙哥·三年风水
 * Date: 2024/9/11
 * Time: 10:12
 */
namespace Statistics;
use app\BaseError;
use Statistics\statistics\Answer;

class StatisticsFactory
{
    protected static $instance = null;//缓存实例
    protected $channelType = 0;//通道类型

    /**
     * 初始化参数
     * @ param $types 类型选择
     */

    public function __construct($channelType){
        $this->channelType = $channelType;
    }

    /**
     * 通道选择器
     * User: 龙哥·三年风水
     * Date: 2024/9/11
     * Time: 10:39
     * @ return null
     */
    public function statisticsHandle(){
        switch ((int)$this->channelType){
            case 1: //可疑网址查询

                break;
            case 2: //银行卡查询

                break;
            case 3: //人员被骗风险查询

                break;
            case 4: //答题记录查询
                self::$instance = new Answer();
                break;
            default:
                self::$instance = null;
                throw new BaseError("未设置任何通道",50000,200);
                break;
        }
        return self::$instance;
    }
}

        3、答题统计查询实现(Answer.php)

<?php
/**
 * 答题记录查询控制
 * User: 龙哥·三年风水
 * Date: 2024/9/11
 * Time: 10:29
 */
namespace Statistics\statistics;
use Statistics\StatisticsHandle;
use app\BaseError;
use app\model\anxun\shuziren\StatisticsAnswer as ASSAModel;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use Upload\UploadFactory;
class Answer extends StatisticsHandle
{
    //初始化使用的
    public function __construct(){
    }


    /**
     * 获取统计列表
     * User: 龙哥·三年风水
     * Date: 2024/9/11
     * Time: 10:31
     * @ return mixed
     */

    public function getList($param){
        // TODO: Implement getList() method.
        $where = [];
        if(!empty($param['digitized_human_name']))$where[] = ['digitized_human_name','like','%'.$param['digitized_human_name'].'%'];
        if(!empty($param['involved_date']))$where[] = ['involved_date','=',$param['involved_date']];
        if(!empty($param['id_card']))$where[] = ['id_card','=',$param['id_card']];
        $resList = ASSAModel::getList($where,'id,digitized_human_name,correct_rate,error_rate,id_card,create_time',[$param['currentPage'], $param['currentSize']]);
        $list  =  $resList['info'];
        $res['list'] = $list;
        $res['meat'] = $resList['page'];
        return $res;
    }


    /**
     * 获取统计详情
     * User: 龙哥·三年风水
     * Date: 2024/9/11
     * Time: 10:31
     * @ return mixed
     */

    public function getInfo($id){
        // TODO: Implement getInfo() method.
        $data = ASSAModel::dataFind(['id' => $id],'id,digitized_human_name,correct_rate,error_rate,id_card,create_time',true);
        return $data;
    }


    /**
     * 导出统计信息
     * User: 龙哥·三年风水
     * Date: 2024/9/11
     * Time: 10:32
     * @ return mixed
     */

    public function exportInfo($param){
        // TODO: Implement exportInfo() method.
        $where = [];
        if(!empty($param['digitized_human_name']))$where[] = ['digitized_human_name','like','%'.$param['digitized_human_name'].'%'];
        if(!empty($param['involved_date']))$where[] = ['involved_date','=',$param['involved_date']];
        if(!empty($param['id_card']))$where[] = ['id_card','=',$param['id_card']];
        $list = ASSAModel::getAll($where,'digitized_human_name,correct_rate,error_rate,id_card,create_time','create_time DESC');
        if(!$list)throw new BaseError('暂无可导出',50000,200);
        // 处理标题
        $title = ['机器人名称', '正确题数', '错误题数','身份证号','参与时间'];
        $filename = '答题参与记录';
        $spreadsheet = new Spreadsheet();
        $spreadsheet->getDefaultStyle()->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER); //设置水平默认对齐方式
        $spreadsheet->getDefaultStyle()->getAlignment()->setVertical(Alignment::VERTICAL_CENTER); //设置垂直默认对齐方式
        $sheet = $spreadsheet->getActiveSheet();
        $everyDay = date('Y-m-d', time()). '_' .uniqid();
        foreach ($title as $key => $value) {
            $sheet->setCellValueByColumnAndRow($key+1, 1, $value);
        }
        $row = 2;
        foreach ($list as $item) {
            $column = 1;
            foreach ($item as $k => $value) {
                $sheet->setCellValueByColumnAndRow($column, $row, $value);
                $column++;
            }
            $row++;
        }
        $savename = '/storage/'.$filename . '_' . $everyDay . '.xlsx';
        $object = date('Y-m-d',time()).'/' . $filename . '_' . $everyDay . '.xlsx';
        $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
        $writer->save('.' . $savename);
        $UploadFactory = new UploadFactory();
        $uploadHandle = $UploadFactory->getUploadHandle();
        $res = $uploadHandle->uploadFile($object,'.' . $savename);
        $data['url'] = $res;
        $filePath = app()->getRuntimePath() . $savename;
        @unlink($filePath);
        return $data;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2142784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于密码的大模型安全治理的思考

文章目录 前言一、大模型发展现状1.1 大模型技术的发展历程1.2 大模型技术的产业发展二、大模型安全政策与标准现状2.1 国外大模型安全政策与标准2.2 我国大模型安全政策与标准前言 随着大模型技术的迅速发展和广泛应用,其安全性问题日益凸显。密码学作为网络空间安全的核心技…

Linux搭建邮箱服务器(简易版)

本章是上一文档的简易版本搭建方式更为快速简洁&#xff08;只需要两条命令即可搭建&#xff09;&#xff0c;如果想了解更详细一些可以看我上一文档 Linux接发邮件mailx_linux mailx o365-CSDN博客文章浏览阅读857次&#xff0c;点赞25次&#xff0c;收藏19次。本文详细描述了…

计算机组成原理-3.1储存系统

现代结构 1.储存器的层次结构 辅存的数据要调入主存后才能被CUP&#xff0c;与操作系统的进程进行联动 运行速度&#xff1a;CPU>寄存器>Cache>主存>磁盘>磁盘和光盘 主存-辅存:实现了虚拟系统&#xff0c;解决了主存容量不够的问题。 Cache-主存&#xff1a…

二叉树的前中后序遍历(递归法)( 含leetcode上三道【前中后序】遍历题目)

文章目录 深入理解递归思想递归三要素 leetcode上三道题目&#xff1a;144.二叉树的前序遍历145.二叉树的后序遍历94.二叉树的中序遍历 深入理解递归思想 这次我们要好好谈一谈递归&#xff0c;为什么很多同学看递归算法都是“一看就会&#xff0c;一写就废”。 主要是对递归…

宝塔部署python项目

宝塔部署-python项目文章浏览阅读559次&#xff0c;点赞11次&#xff0c;收藏9次。在添加项目后&#xff0c;选择项目所在的路径&#xff0c;然后命令行启动主py文件。具体先看项目日志&#xff0c;根据日志在环境管理处下载包。首先下载项目需要的python版本。_宝塔部署python…

Typora安装,使用,图片加载全流程!!!

文章目录 前言&#xff1a;安装&#xff1a;破解&#xff1a;使用typora&#xff1a;关于CSDN加载不出图片&#xff1a;创建OSS&#xff1a;设置PicGo&#xff1a; 前言&#xff1a; ​ Typora是一款非常流行的Markdown编辑器&#xff0c;简单来说就是可以方便我们写博客。拿我…

禁忌搜索算法(TS算法)求解实例---旅行商问题 (TSP)

目录 一、采用TS求解 TSP二、 旅行商问题2.1 实际例子&#xff1a;求解 6 个城市的 TSP2.2 **求解该问题的代码**2.3 代码运行过程截屏2.4 代码运行结果截屏&#xff08;后续和其他算法进行对比&#xff09; 三、 如何修改代码&#xff1f;3.1 减少城市坐标&#xff0c;如下&am…

论文阅读: SigLit | SigLip |Sigmoid Loss for Language Image Pre-Training

论文地址&#xff1a;https://arxiv.org/pdf/2303.15343 项目地址&#xff1a;https://github.com/google-research/big_vision 发表时间&#xff1a;2023年3月27日 我们提出了一种用于语言图像预训练&#xff08;SigLIP&#xff09;的简单成对 Sigmoid 损失。与使用 softmax …

Redis 篇-初步了解 Redis 持久化、Redis 主从集群、Redis 哨兵集群、Redis 分片集群

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 分布式缓存概述 2.0 Redis 持久化 2.1 RDB 持久化 2.1.1 RDB 的 fork 原理 2.2 AOF 持久化 2.3 RDB 与 AOF 之间的区别 3.0 Redis 主从集群 3.1 搭建主从集群 3.2…

new/delete和malloc/free到底有什么区别

new和malloc 文章目录 new和malloc前言一、属性上的区别二、使用上的区别三、内存位置的区别四、返回类型的区别五、分配失败的区别六、扩张内存的区别七、系统调度过程的区别总结 前言 new和malloc的知识点&#xff0c;作为一个嵌入式工程师是必须要了解清楚的。new和malloc的…

驱动器磁盘未格式化危机:专业数据恢复实战指南

认识危机&#xff1a;驱动器中的磁盘未被格式化 在日常的数字生活中&#xff0c;我们时常依赖于各种存储设备来保存重要的文件、照片、视频等数据。然而&#xff0c;当某一天你尝试访问某个驱动器或外接硬盘时&#xff0c;突然弹出的“驱动器中的磁盘未被格式化。您想现在格式…

【CSS in Depth 2 精译_032】5.4 Grid 网格布局的显示网格与隐式网格(上)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

利用语义搜索和混合查询策略提升RAG系统的准确性

人工智能咨询培训老师叶梓 转载标明出处 在构建基于大模型&#xff08;LLM&#xff09;的生成式问答系统&#xff08;Generative Q&A&#xff09;时&#xff0c;检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;方法被广泛采用。RAG通过结合检索…

Gin渲染

HTML渲染 【示例1】 首先定义一个存放模板文件的 templates文件夹&#xff0c;然后在其内部按照业务分别定义一个 posts 文件夹和一个 users 文件夹。 posts/index.tmpl {{define "posts/index.tmpl"}} <!DOCTYPE html> <html lang"en">&…

【网络通信基础与实践第二讲】包括互联网概述、互联网发展的三个阶段、互联网的组成、计算机网络的体系结构

一、互联网概述 计算机网络是由若干节点&#xff08;node&#xff09;和连接这些节点的链路&#xff08;link&#xff09;组成。 网络之间还可以通过路由器互联起来&#xff0c;这就构成了一个覆盖范围更大的计算机网络。这样的网络称为互联网。 网络把许多计算机连接在一起…

『功能项目』制作提示主角升级面板【56】

我们打开上一篇55事件中心处理怪物死亡的项目&#xff0c; 本章做的事情是制作提示主角升级的界面&#xff0c;当主角升级时就会被显示出来点击确认即可消失 首先在unity编辑场景制作 在确认按钮对象上添加事件 点击Button将Panel添加至事件框选 在事件函数中选择gameobject.S…

【图像拼接】基于SIFT/SURF特征算法的图像拼接,matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于SIFT/SURF特征算法的图像拼接&#xff0c;用matlab实现。 一、案例背景和算法介…

[C#学习笔记]Newtonsoft.Json

视频地址&#xff1a;分享一些Newtonsoft.Json的实用功能与技巧_哔哩哔哩_bilibili 强烈推荐学习C#和WPF的朋友关注此UP&#xff0c;知识点巨多&#xff0c;讲解透彻&#xff01; 一、JsonSerializerSettings 1.1 自动缩进-Formatting 使用Formatting.None进行序列化 var …

流媒体之RTMP协议(其四)

欢迎诸位来阅读在下的博文~ 在这里&#xff0c;在下会不定期发表一些浅薄的知识和经验&#xff0c;望诸位能与在下多多交流&#xff0c;共同努力&#xff01; 江山如画&#xff0c;客心如若&#xff0c;欢迎到访&#xff0c;一展风采 文章目录 前期博客参考书籍一、PTMP简介二…

MyBatis的配置文件详解

01-MyBatis的配置文件详解 创建的接口和xml文件的名字最好写一样的要不然会出问题,然后和接口名相同的xml文件在resources下创建个和接口相同文件夹把xml文件放进去,而且resources下的创建的文件夹需要一级一级的创键,比如:cn创建完,创建tulingxue,然后再创建mapper文件夹才行…