自主开发悟空crm增加 公文管理功能 二次开发代码披露

2023-10-27

1、招聘需求
在这里插入图片描述
2、审核刚刚创建的招聘需求内容
在这里插入图片描述
3、编辑内容
在这里插入图片描述
4、简历管理
在这里插入图片描述
5、面试记录时间轴
在这里插入图片描述
6、offer管理
在这里插入图片描述

<?php
namespace app\hrm\model;
use app\admin\controller\ApiCommon;
use app\admin\model\User;
use app\admin\traits\FieldVerificationTrait;
use think\Db;
use app\admin\model\Common;
use think\response\Json;

class Offer extends Common
{
    use FieldVerificationTrait;

	protected $name = 'hrm_offer';
    protected $createTime = 'create_time';
    protected $updateTime = 'update_time';
	protected $autoWriteTimestamp = true;
    private $statusArr = ['0'=>'待审核','1'=>'审核中','2'=>'审核通过','3'=>'已拒绝','4'=>'已撤回','5'=>'未提交','6'=>'已作废', '7'=>'正常'];

	protected $type = [
		// 'next_time' => 'timestamp',
	];

	/**
     * [getDataList list]
     * @author Michael_xu
     * @param     [string]                   $map [查询条件]
     * @param     [number]                   $page     [当前页数]
     * @param     [number]                   $limit    [每页数量]
     * @return    [array]                    [description]
     */		
	public function getDataList($request)
    {
        $userModel = new \app\admin\model\User();
        
        # 格式化参数
        $request    = $this->fmtRequest( $request );
        $requestMap = $request['map'] ? : [];

        # 普通筛选
        $searchMap = [];
        

        # 排序
        // if ($order_type && $order_field && $order_field != 'owner_user_structure_name') {
        //     $order = $fieldModel->getOrderByFormtype('crm_customer','customer',$order_field,$order_type);
        // } else {
            $order = 'offer.update_time desc';
        // }

    	$list = db('hrm_offer')->alias('offer')
                ->where($map)
                ->where($searchMap)
                ->limit($request['offset'], $request['length'])
                // ->field($indexField)
                ->orderRaw($order)
                ->select();

        $totalRow = db('hrm_offer')->alias('offer')
                ->where($map)
                ->where($searchMap)
                ->count();

        foreach($list as $key=>$row){
            $list[$key]['create_time_txt'] = date('Y-m-d H:i:s', $row['create_time']);

            $nParentId_name = db('crm_customer')->where(['customer_id' => $row['nParentId']])->value('name');
            $nParentId_info = [
                'customer_id' => $row['nParentId'],
                'name' => $nParentId_name,
            ];
            $list[$key]['nParentId_name'] = $nParentId_name;

            $nUserId_name = db('admin_user')->where(['id' => $row['nUserId']])->value('realname');
            $list[$key]['nUserId_name'] = $nUserId_name;
            

            $list[$key]['check_status_info'] = $this->statusArr[$row['check_status']];
            $list[$key]['create_user_id_info'] = isset($row['create_user_id']) ? $userModel->getUserById($row['create_user_id']) : [];
        }

        $data = [];
        $data['list'] = $list ? : [];
        $data['totalRow'] = $totalRow ? : 0;
        return $data;
    }

    public function getDataById($id = '', $userId = 0, $model='')
    {  
        $dataInfo = db('hrm_offer')->where(['id' => $id])->find();
        if (!$dataInfo) {
            $this->error = '数据不存在或已删除';
            return false;
        }

        $dataInfo['nParentId_name'] = db('crm_customer')->where(['customer_id' => $dataInfo['nParentId']])->value('name');

        $dataInfo['create_time_txt'] = date('Y-m-d H:i:s', $dataInfo['create_time']);
        $dataInfo['zpzyId_name'] = db('admin_user')->where(['id' => $dataInfo['zpzyId']])->value('realname');
        return $dataInfo;
    }

    /**
     * 创建主表信息
     * @author Michael_xu
     * @param  
     * @return                            
     */ 
    public function createData($param)
    {
        unset($param['excel']);

        if(is_array($param['nParentId'])){
            $param['nParentId'] = $param['nParentId'][0]['customer_id'];
        }else{
            $param['nParentId'] = $param['nParentId'];
        }

        // 数据验证
        $validateResult = $this->fieldDataValidate($param, 'hrm_offer', $userId);
        if (!empty($validateResult)) {
            $this->error = $validateResult;
            return false;
        }

        if ($this->data($param)->allowField(true)->isUpdate(false)->save()) {
            $data['id'] = $this->id;
            $data['zpzw'] = $param['zpzw'];

            return $data;
        } else {
            $this->error = '添加失败';
            return false;
        }           
    }
    
    /**
     * 编辑客户主表信息
     * @author Michael_xu
     * @param  
     * @return                            
     */
    public function updateDataById($param, $id = '')
    {
        $dataInfo = $this->get($id);
        if (!$dataInfo) {
            $this->error = '数据不存在或已删除';
            return false;
        }
        $id = !empty($param['id']) ? $param['id'] : $id;

        // 数据权限判断
        if(isset($param['nParentId'])){
            if(is_array($param['nParentId'])){
                $param['nParentId'] = $param['nParentId'][0]['customer_id'];
            }else{
                $param['nParentId'] = $param['nParentId'];
            }
        }

        // 数据验证
        $validateResult = $this->fieldDataValidate($param, 'hrm_offer', $user_id, $id);
        if (!empty($validateResult)) {
            $this->error = $validateResult;
            return false;
        }

        // 修改数据
        if ($this->update($param, ['id' => $id], true)) {
            $data['id'] = $id;
            
            // 修改记录
            // updateActionLog($user_id, 'crm_customer', $customer_id, $dataInfo->data, $param);
            // RecordActionLog($user_id, 'crm_customer', 'update',$dataInfo['name'], $dataInfo->data, $param);
            
            return $data;
        } else {
            $this->error = '编辑失败';
            return false;
        }
    }
    
    
    /**
     * 导出数据处理
     */
    public function exportHandle($list, $field_list, $type = '')
    {
        foreach ($list as &$val) {
            foreach ($field_list as $field) {
                switch ($field['field']) {
                    case 'jjcdId':
                        $val[$field['field']] = [
                            1 => '加急',
                            2 => '紧急',
                            3 => '正常',
                            4 => '一般',
                            5 => '暂停'
                        ][$val[$field['field']]];
                        break;
                    case 'is_zt':
                        $val[$field['field']] = [
                            0 => '等待审核',
                            1 => '审核中',
                            2 => '通过',
                            3 => '驳回'
                        ][$val[$field['field']]];
                        break;
                }
            }
        }
        return $list;
    }
}

7、用户的offer管理的详情资料
在这里插入图片描述
8、简历分类
![在这里插入图片描述](https://img-blog.csdnimg.cn/562ac2b1de9e4b8f8752de9b6caf6bd8.png
9、面试状态
在这里插入图片描述

<?php
namespace app\hrm\controller;

use app\admin\controller\ApiCommon;
use phpDocumentor\Reflection\Types\False_;
use think\Cache;
use think\Hook;
use think\Request;
use think\Db;

class Resume extends ApiCommon
{
    /**
     * 用于判断权限
     * @permission 无限制
     * @allow 登录用户可访问
     * @other 其他根据系统设置
     **/
    public function _initialize()
    {
        $action = [
            'permission' => ['exceldownload', 'setfollow', 'delete', 'left', 'remind'],
            'allow' => ['read', 'system', 'count', 'poolauthority', 'level']
        ];
        Hook::listen('check_auth', $action);
        $request = Request::instance();
        $a = strtolower($request->action());
        if (!in_array($a, $action['permission'])) {
            parent::_initialize();
        } else {
            $param = Request::instance()->param();
            $this->param = $param;
        }
    }

    /**
     * 列表
     * @return
     * @author Michael_xu
     */
    public function index()
    {
        $model = model('Resume');
        $param = $this->param;
        $userInfo = $this->userInfo;
        $param['user_id'] = $userInfo['id'];
        $data = $model->getDataList($param);
        return resultArray(['data' => $data]);
    }

    /**
     * 面试提醒
     * @return
     * @author Michael_xu
     */
    public function remind()
    {

        $data = model('Resume')->alias('r')
                ->join('(select msztId,nParentId,update_time,msrq,sjian,msrqsjian,from_unixtime(msrqsjian,"%Y-%m-%d %H:%i:%s") msrqsjian_txt from 5kcrm_hrm_miansjl where id in (select max(id) from 5kcrm_hrm_miansjl group by nParentId)) ms', 'ms.nParentId=r.id', 'right')
                ->field('r.id, r.xm, r.classId, ms.*')
                ->where('ms.msrq',date('Y-m-d'))
                ->order('ms.msrqsjian desc')
                // ->where('ms.msztId', 154)
                ->where('ms.msztId', 'in', [150,151])
                ->select();
        return resultArray(['data' => $data]);
    }

    /**
     * 详情
     * @param
     * @return
     * @author Michael_xu
     */
    public function read()
    {
        $model = model('Resume');
        $param = $this->param;
        $userInfo = $this->userInfo;
        $data = $model->getDataById($param['id'], $userInfo['id']);
        if (!$data) {
            return resultArray(['error' => $model->getError()]);
        }
        return resultArray(['data' => $data]);
    }

    /**
     * 添加
     * @param
     * @return
     * @author Michael_xu
     */
    public function save()
    {
        $model = model('Resume');
        $param = $this->param;
        $userInfo = $this->userInfo;
        $param['nUserId'] = $userInfo['id'];
        if ($res = $model->createData($param)) {
            return resultArray(['data' => $res]);
        } else {
            return resultArray(['error' => $model->getError()]);
        }
    }

    /**
     * 编辑
     * @param
     * @return
     * @author Michael_xu
     */
    public function update()
    {
        $model = model('Resume');
        $param = $this->param;
        $userInfo = $this->userInfo;
        //数据详情
        $data = $model->getDataById($param['id']);
        if (!$data) {
            return resultArray(['error' => $model->getError()]);
        }

        if ($model->updateDataById($param, $param['id'])) {
            return resultArray(['data' => '编辑成功']);
        } else {
            return resultArray(['error' => $model->getError()]);
        }
    }

    /**
     * 删除客户
     * @param
     * @return
     * @author Michael_xu
     */
    public function delete()
    {
        $model = model('Resume');
        $param = $this->param;
        $userInfo = $this->userInfo;

        // $permission = checkPerByAction('hrm', 'resume', 'delete');
        // if ($permission == false) {
        //     return resultArray(['error' => '无权操作']);
        // }
        
        $delIds = $param['id'];

        if ($delIds) {
            $delRes = $model->delDatas($delIds);
            if (!$delRes) {
                return resultArray(['error' => $model->getError()]);
            }
        }
        
        return resultArray(['data' => '删除成功']);
    }
    
    /**
     * 导入
     * @param
     * @return
     * @author Michael_xu
     */
    public function excelImport(){
        set_time_limit(0);
        $model = model('Resume');
        $param = $this->param;
        $userInfo = $this->userInfo;
        $param['nUserId'] = $userInfo['id'];
        
        // $rename;
        $jlwjs = $param['jlwj'];
        if(!$jlwjs){
            return resultArray(['error' => '请上传简历']);
        }
        
        foreach ($param['jlwj'] as $key=>$v){
            $param['xm'] = substr($v['name'], 0, strpos($v['name'], '.'));
            $param['jlwj'] = [$v];
            $model->createData($param);
        }
        
        return resultArray(['data' => true]);


    /**
     * 导出
     * @param
     * @return
     * @author Michael_xu
     */
    public function excelExport()
    {
        $param = $this->param;
        $userInfo = $this->userInfo;
        $param['user_id'] = $userInfo['id'];
        $action_name = '导出';
        $excelModel = new \app\admin\model\Excel();
        // 导出的字段列表
        $fieldModel = new \app\admin\model\Field();
        $field_list = $param['fieldList'];
        // 文件名
        $file_name = '简介_' . date('Ymd');

        $model = model('Resume');
        $temp_file = $param['temp_file'];
        unset($param['temp_file']);
        $page = $param['page'] ?: 1;
        unset($param['page']);
        unset($param['export_queue_index']);
        RecordActionLog($userInfo['id'], 'hrm_resume', 'excelexport', $action_name, '', '', '导出简介');
        return $excelModel->batchExportCsv($file_name, $temp_file, $field_list, $page, function ($page, $limit) use ($model, $param, $field_list) {
            $param['page'] = $page;
            $param['limit'] = $limit;
            $data = $model->getDataList($param);
            $data['list'] = $model->exportHandle($data['list'], $field_list, 'hrm_resume');
            return $data;
        });

    }

    /**
     * 客户清单
     * @return
     * @author Michael_xu
     */
    public function left()
    {
        $model = model('Resume');
        $customerModel = model('\app\crm\model\Customer');
        $param = $this->param;
        $customer_id = $model->column('nParentId');
        
        $where = [
            'deal_status' => '已成交',
        ];
        $data = $customerModel
            ->where($where)
            ->whereOr('customer_id','in',$customer_id)
            ->field('customer_id, name')
            ->select();
        return resultArray(['data' => $data]);
    }

}

二次开发 技术交流 QQ扫一扫

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自主开发悟空crm增加 公文管理功能 二次开发代码披露 的相关文章

  • com.rabbitmq.client.ShutdownSignalException: connection error;连接rabbitMQ失败

    com rabbitmq client ShutdownSignalException connection error 连接rabbitMQ失败 大概率原因是权限不足 rabbitmqctl set permissions p admin
  • 51单片机-LED篇

    目录 准备工作 点亮一个LED灯 写程序 烧录 LED闪烁 延时代码Delay500ms 烧录 LED流水灯 代码 对LED流水灯代码进行优化 增加复用性 延时代码 代码 准备工作 使用到的单片机是普中51单片机 使用到的软件是Keil u
  • 写作副业怎么弄?写文章的副业应该怎么做?

    现在越来越流行 斜杠青年 这个词了 人们总是希望在做好本职工作的基础上 还能够有另外一份获取收入的工作 也就是 副业 而在 副业 的众多选项里 很多人都看好 写作 这一项 但是 当我们普通人想要开启写作之路 赚取副业收入的时候 具体应该怎么
  • 用户友好性检测

    我们一般通过三个指标来检验一个网站是否对于用户友好 这三个指标分别是 链接的可用性 访问速度体验和查找信息的便捷度 一 链接的可用性 试想 一个访问者来到你的网站 点击一个超级链接 却发现浏览器只返回一个错误404 页面 如果网页中不可用链
  • Unity3D 引擎学习2022资料整理(二)

    Utils C APR Apache Portable Runtime 另一个跨平台的实用函数库 Apache2 0 官网 C Algorithms 一个常用算法和数据结构的集合 官网 CPL The Common Pipeline Lib
  • edge浏览器受信任_Edge 浏览器如何添加信任站点

    Microsoft Edge 无法添加信任站点 组策略没有批量设置 只能逐条设置 然后从DC推到所向域内客户端 如果你是用Site to Zone Assignment List Enabled策略或来设置信任站点的话 客户端确实无法手动添
  • OpenHarmony之docker容器的基本用法

    Docker使用示例 docker移植至OpenHarmony的过程可参考 https blog 51cto com u 14601312 5692202 下面以rk3568 OpenHarmony为例 介绍一下如何进行容器制作 导入及使用
  • 一招解决报错:pyassimp.errors.AssimpError: assimp library not found

    文章目录 1 问题描述 2 原因分析 3 解决方法 1 问题描述 在使用pip install pyassimp安装pyassimp库后 调用时会出现错误 File root anaconda3 envs kgn lib python3 8
  • qt5.12.10 在linux(国产系统)的源码编译、移植问题记录

    1 概述 Qt版本 Qt5 12 10 Qt 官网下载地址 Qt官网 路径 Qt5 12 10源码目录目录下下载 qt everywhere src 5 12 10 tar xz 编译平台 方德 其余架构亦可考 2 编译源码记录 1 下载源
  • Flutter 最常出现的错误

    哔哩哔哩漫画APP实践Flutter也有大半年时间了 我针对线上收集到的错误进行分析 挑选出了一些有一般代表性的错误 列在本文 可供实践 Flutter 的初学者们作为一点参考 典型错误一 无法掌握的Future 典型错误信息 NoSuch
  • spring boot 实现注解+自定义配置多数据库

    spring boot 实现注解 自定义配置多数据库 配置多数据库 注解 AOP maven依赖 多数据源配置 代码实现 存在问题 配置多数据库 注解 AOP 你好 这是你第一次使用 Markdown编辑器 所展示的欢迎页 如果你想学习如何
  • shell编程(六) : [shell基础] 基本shell脚本

    接上一篇文章Linux shell编程 五 Linux文件权限管理 三 Linux shell 脚本编程基础 了解了Linux系统和命令行的基础知识 是时候开始编程了 3 1 基本shell脚本 shell脚本的关键在于输入多个命令并处理每
  • Google-Guava-EventBus源码解读

    Guava是Google开源的一个Java基础类库 它在Google内部被广泛使用 Guava提供了很多功能模块比如 集合 并发库 缓存等 EventBus是其中的一个module 本篇结合EventBus源码来谈谈它的设计与实现 概要 首
  • 基础算法题——奇怪的分式(避免小数运算)

    奇怪的分式 上小学的时候 小明经常自己发明新算法 一次 老师出的题目是 1 4 乘以 8 5 小明居然把分子拼接在一起 分母拼接在一起 答案是 18 45 参见图1 png 老师刚想批评他 转念一想 这个答案凑巧也对啊 真是见鬼 对于分子
  • 强大的.NET反编译工具Reflector及插件

    刚接触 net 时就听说 Reflector这个强大反编译工具呢 只是一直没有去使用他 今天update跟我说Reflector如何 如何有用 用的如何 如何爽 还得意的说反编译了不少DLL 本来本人对新鲜事就非常有兴趣 听他这么一说 决定
  • Oracle 存储过程 与 函数 区别

    定义 存储过程 Stored Procedure 是一组为了完成特定功能的SQL 语句集 经编译后存储在数据库中 用户通过指定存储过程的名字并给出参数 如果该存储过程 带有参数 来执行它 存储过程是数据库中的一个重要对象 任何一个设计良好的
  • video-05-videojs编写(全屏、非全屏)自定义控件!!!!

    兄弟们 看到这里 你马上就可以自定义控件了 想想是不是都激动啊 但是这篇文章重在思路及简单实现 仔细看 目录 一 控件分类 二 实现方案 方案二最好 2 1 方案1 只能实现非全屏控件 2 1 1 思路 2 1 2 效果 2 1 3 代码

随机推荐

  • Ableton Live 10 Suite v10.1.42 WiN-MAC 音乐制作宿主软件

    Ableton Live 10 是一个专业的电子音乐制作 现场表演宿主软件 使用 Ableton Live 10 的新设备创造更大胆的声音 通过大量的工作流程改进保持在流程中 使用 Push 可以在远离计算机的地方做更多事情 使用精选库构建
  • Vue中$event的用法

    因为在Vue API文档里 event的用法找不到 所以我自己总结了一下 通常的用法是用来获取当前元素的最新值 event target value div div
  • 七牛云linux命令行工具(qshell)

    qshell下载 wget http devtools qiniu com qshell linux x64 v2 4 2 zip 解压zip 安装 qshell 解压 qshell包 unzip qshell zip 剪辑到 home 文
  • TCP的拥塞控制算法

    前言 防止过多的数据注入网络中 这样可以使网络中的路由器或链路不会过载 若出现拥塞而不进行控制 整个网络的吞吐量将随输入负荷的增大而下降 当输入的负载到达一定程度 吞吐量不会增加 即一部分网络资源会丢失掉 网络的吞吐量维持在其所能控制的最大
  • expiringmap 设置key 过期时间

  • 新方案unity配表工具

    工具下载 网盘链接 工具结构 针对每张表格生成一个表格类 其中默认包含一个list和字典类型参数记录表格数据 初始化项目时将list中的数据转为按id索引的dictionary 用于访问数据 额外包含一个同名Temp后缀的类 记录表格的字段
  • Session详解,学习Session(包含底层分析和使用)

    什么是session session在网络应用中称为 会话控制 是服务器为了保存用户状态而创建的一个特殊的对象 简而言之 session就是一个对象 用于存储信息 session和cookie的比较 cookie保存在客户端 session
  • C# 数据库存储过程的讲解应用

    在使用VS 2012 SQL Server做简单的销售系统中 通常会遇到一些使用存储过程的情况 那究竟什么是存储过程 它的好处是什么呢 如果在SQL Server中创建一个存储过程 C 中怎样联系存储过程呢 一 存储过程 存储过程 Stor
  • C++类和对象上篇

    面向过程和面向对象的初步认识 C语言是面向过程的 关注点在于过程 分析出求解问题的步骤 通过函数调用逐步解决问题 C 是面向对象的 关注点在于对象 将一件事拆分成不同的对象 靠对象之间的交互完成 我们就外卖系统来看看面向过程和面向对象之间的
  • RabbitMQ提示错误:java.net.SocketException socket closed

    RabbitMQ提示错误 java net SocketException socket closed问题 原因是配置的用户权限问题 rabbitmq包括很多种权限 需要把在项目中配置的账户修改为management类型 权限规则 http
  • flutter开发实战-MethodChannel实现flutter与iOS双向通信

    div class markdown views div
  • 对于cin提取输入流遇到空格的问题

    引子老谭CPP教材 流提取符 gt gt 从流中提取数据时通常跳过流中的空格 tab键换行符等空白字符 P430页倒数第10行 13 3 1 cin流 用cin gt gt 读取数据时遇到空白字符 包括空格 tab键和回车 作为终止字符 P
  • Eigen学习教程(三)

    Eigen学习教程 三 3 稠密线性问题与分解 本节说明了如何求解线性系统 计算各种分解 例如LU QR SVD 本征分解 阅读此节后 请不要错过我们的密集矩阵分解目录 基本线性求解 Ax b 该解决方案 可将各种分解之间进行选择 取决于你
  • 计算机英特尔显卡在哪找,Win10英特尔显卡设置在哪里 英特尔核芯显卡控制面板六大功能详解...

    Win10系统用户体验相比以前的系统更好 有些用户为了让显卡发挥作用 会在win10里设置显卡功能 显卡设置在哪里 显卡控制面板 显卡控制面板有Intel AMD NVADIA三种 我们通过显卡的控制面板进行显卡更为高级的设置 这时我们就需
  • MATLAB快速入门(一)

    一 简介 本篇参考官方入门文档编写 前提准备 MATLAB 二 快速入门 一 1 桌面基础知识 启动 MATLAB 时 桌面会以默认布局显示 桌面包括下列面板 当前文件夹 访问您的文件 命令行窗口 在命令行中输入命令 由提示符 gt gt
  • c++--标准模板库(STL)

    要看懂STL相关 必须了解c 模板 目录 STL是什么 c 标准模板库包含三个组件 算法 迭代器 迭代器的种类 示例程序 容器 常用的容器 编程练习 string 字符串容器 vector 向量 list 双向链表容器 queue 队列容器
  • Excel 的那些事儿啊

    RIGHT 函数 功能 可以对数值 字符串 进行截取 是从后面开始截取的 语法 RIGHT 截取的数值 截取的个数 使用 例如我们想提前 ID 列中数值的后面的数字 可以使用该函数 1 书写函数 RGIHT A3 3 对 A3 单元格进行截
  • mysql中on duplicate key update用法(批量操作数据、存在更新,不存在则新增),附mybatis配置

    1 应用场景 日常开发中 对于一个数据想做到存在即更新 不存在则新增 通常的做法是先查询数据库中是否存在对应的数据 如果存在就使用更新的方法 不存在就使用新增的方法 如果是单个数据 倒也没什么问题 但如果是批量数据的话 会消耗大量的资源来进
  • 字符串截取之substring_index

    substring index str delim count str 要处理的字符串 delim 分隔符 count 计数 例子 str www wikidm cn substring index str 1 结果是 www substr
  • 自主开发悟空crm增加 公文管理功能 二次开发代码披露

    1 招聘需求 2 审核刚刚创建的招聘需求内容 3 编辑内容 4 简历管理 5 面试记录时间轴 6 offer管理