硕顺crm后台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

412 lines
17 KiB

<?php
namespace addons\qingdong\model;
use think\Db;
use think\Exception;
use think\Model;
use traits\model\SoftDelete;
/**
* 表单
*/
class Form extends Model {
use SoftDelete;
const LEADS_TYPE = 'leads';
const CUSTOMER_TYPE = 'customer';
const CONTACTS_TYPE = 'contacts';
const CONTRACT_TYPE = 'contract';
const RECEIVABLES_TYPE = 'examine';
const BUSINESS_TYPE = 'business';
const SIGNIN_TYPE = 'signin';
// 表名,不含前缀
protected $name = 'qingdong_form';
// 自动写入时间戳字段
protected $autoWriteTimestamp = 'int';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
protected $deleteTime = 'deletetime';
public function getUpdatetimeAttr($value){
return date('Y-m-d H:i',$value);
}
public static function getDataValue($type,$info=[]){
$data=self::where(['type'=>$type])->value('data');
if($data){
$form = json_decode($data,true)['data'];
foreach($form as $k=>$v){
$form[$k]['data_value'] ='';
if($info){
$form[$k]['data_value'] = isset($info[$v['id']]) ? $info[$v['id']] : '';
if(array_key_exists($v['id'],$info) && isset($info[$v['id']])){
if($v['component'] == 'select'){
if(isset($v['config']['multiple']) && $v['config']['multiple'] == true){
if(is_array($info[$v['id']])){
$selectArrInfo = [];
foreach($info[$v['id']] as $ks=>$vs){
$selectArrInfo[$vs] = $vs;
}
$form[$k]['data_value'] = $selectArrInfo;
}else{
$selectArr = explode(',',$info[$v['id']]);
$selectArrInfo = [];
foreach($selectArr as $ks=>$vs){
$selectArrInfo[$vs] = $vs;
}
$form[$k]['data_value'] = $selectArrInfo;
}
}
}
}
}
}
return $form;
}else{
return [];
}
}
public static function getDataDetail($type,$params)
{
$form = Form::getDataValue($type);
foreach($form as $k=>$v){
if($v['component'] == 'uploadImage' || $v['component'] == 'uploadFile'){
$params[$v['id'].'_str'] = NULL;
if(key_exists($v['id'],$params)){
if(isset($params[$v['id']]) && $params[$v['id']]){
$whereT['id'] = array('in',$params[$v['id']]);
$fileinfo = File::where($whereT)->field('id,name,file_path,save_name')->select();
$fileinfo=collection($fileinfo)->toArray();
$params[$v['id']] = $fileinfo;
if($fileinfo){
$fileinfodata = '';
foreach($fileinfo as $kss=>$vss){
$fileinfodata = $vss['save_name'].','.$fileinfodata;
}
$params[$v['id'].'_str'] = rtrim($fileinfodata,',')?:NULL;
}
}
}
}
}
return $params;
}
/**
*获取form表单的NameID
*/
public static function getFromNameId($type){
$data=self::getDataValue($type);
$result=[];
foreach ($data as $v){
$result[$v['config']['label']]=$v['id'];
}
return $result;
}
/**
* 更新提交表单内容
* @param $type string 类型
* @param $params array 提交内容
* @return mixed
*/
public static function updateFormParams($type, $params)
{
$form = Form::getDataValue($type);
foreach ($form as $k => $v) {
if ($v['component'] == 'uploadImage' || $v['component'] == 'uploadFile') {
if (key_exists($v['id'], $params)) {
if ($params[$v['id']]) {
$filearr = explode(',', $params[$v['id']]);
$files = '';
if ($filearr) {
foreach ($filearr as $ks => $vs) {
$files = File::where(array('file_path' => $vs))
->order('id desc')->value('id') . ',' . $files;
}
$params[$v['id']] = rtrim($files, ',');
}
}
}
} elseif ($v['component'] == 'select') {
if (isset($v['config']['multiple']) && $v['config']['multiple'] == true) {
if (key_exists($v['id'], $params)) {
if ($params[$v['id']]) {
$params[$v['id']] = implode(',', $params[$v['id']]);
}
}
}
} elseif ($v['component'] == 'checkbox') {
if(isset($params[$v['id']])){
$params[$v['id']] = implode(',', $params[$v['id']]);
}
}
}
return $params;
}
/**
* 获取model
* @param $type
* @return Contacts|Contract|Customer|Leads|Receivables
*/
public function getTypeModel($type){
switch ($type){
case 'leads'://线索
$model=new Leads();
break;
case 'customer'://客户
$model=new Customer();
break;
case 'contract'://合同
$model=new Contract();
break;
case 'contacts'://联系人
$model=new Contacts();
break;
case 'examine'://回款
case 'receivabels'://回款
$model=new Receivables();
break;
case self::BUSINESS_TYPE://回款
$model=new Business();
break;
default:
$model=NULL;
}
return $model;
}
/**
* 更新表单
*/
public function updateForm($id, $data)
{
$row = self::get($id);
$fields = json_decode($data, true);
(new Field())->setFormField($row['type'], $fields['data']);
$insertFormField = [];
$model=$this->getTypeModel($row['type']);
if(!empty($model)){
$tableFields=$model->getTableFields();
}
$addParams=[];
$updateParams=[];
foreach ($fields['data'] as $k => &$d) {
if(isset($d['showInfoType'])){
unset($d['showInfoType']);
}
$content = $d['config']['content'] ?? [];
$label = [];
foreach ($content as $c) {
if (isset($c['label'])) {
$label[] = $c['label'];
} else {
$label[] = $c['value'];
}
}
$name = $d['config']['label'] ?? '';
$infoType = isset($d['config']['infoType']) ? $d['config']['infoType'] : 'additional';// additional附加信息 main 主要信息
if ($infoType == 'main' && !empty($model)) {
if (!in_array($d['id'], $tableFields)) {
$addParams[] = $d;
} else {
$updateParams[] = $d;
}
}
$value = $d['config']['value'] ?? '';
if (is_array($value)) {
$value = implode(',', $value);
}
$insertFormField[] = [
'types' => $row['type'],
'types_id' => 0,//分类ID(审批等)
'field' => $d['id'],//字段名
'name' => $name,//标识名
'form_type' => $d['component'],//字段类型
'default_value' => $value,//默认值
'is_unique' => isset($d['config']['only']) ? ($d['config']['only'] ? 1 : 0) : '',//是否唯一
'is_null' => ($d['config']['required'] ?? NULL) ? 1 : 0,//是否必填
'input_tips' => $d['config']['placeholder'] ?? '',//提示文字
'setting' => implode('|', $label),//设置
'order_id' => $k,//排序ID
'info_type' => $infoType,//信息类型
'operating' => $d['config']['is_delete'] ? 0 : 3,//0改删,1改,2删,3无
'list_show' => isset($d['config']['listShow']) ? ($d['config']['listShow'] ? 1 : 0) :0,//列表显示(1是,0否)
'add_show' => isset($d['config']['addShow']) ? ($d['config']['addShow'] ? 1 : 0) :0,//添加显示(1是,0否)
'createtime' => time(),
'updatetime' => time()
];
}
$errorMessage = [];
//新增
if ($addParams) {
if (! $this->createData($row['type'], $addParams)) {
$errorMessage[] = $this->getError();
}
}
//编辑
if ($updateParams) {
if (! $this->updateData($row['type'],$updateParams)) {
$errorMessage[] = $this->getError();
}
}
if ($errorMessage) {
throw new Exception(implode(';', $errorMessage));
}
$formFieldModel = new FormField();
$formFieldModel->where(['types'=>$row['type']])->delete();
if(!$formFieldModel->allowField(true)->saveAll($insertFormField)){
throw new Exception('添加表单字段失败');
}
return (new self())->save(['data' => json_encode($fields,JSON_UNESCAPED_UNICODE)], ['id' => $id]);
}
/**
* 创建字段
*/
public function createData($types, $param){
$model=$this->getTypeModel($types);
$tablename=$model->getTable();
$maxlength = '255';
$defaultvalue = "DEFAULT NULL";
//根据字段类型,创建字段
$error_message=[];
foreach ($param as $d){
$default_value = $d['config']['value'] ?? '';
if (is_array($default_value)) {
$default_value = implode(',', $default_value);
}
$name= $d['config']['label'] ?? '';
switch ($d['component']) {
case 'Rate' ://评分
case 'input' ://输入框
case 'Cascader' ://区域选择框
$queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` VARCHAR( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '".$name."'";
break;
case 'radio' ://单选框
case 'select' ://下拉选择框
case 'checkbox' ://多选框
$defaultvalue = $default_value ? "DEFAULT '".$default_value."'" : '';
$queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` VARCHAR( ".$maxlength." ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ".$defaultvalue." COMMENT '".$name."'";
break;
case 'textarea' ://文本框
$queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` TEXT COMMENT '".$name."'";
break;
case 'input-number' ://数字框
$defaultvalue = abs(intval($default_value)) > 2147483647 ? 2147483647 : intval($default_value);
$maxlength = 18;
$queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."`int(11) DEFAULT '".$defaultvalue."' COMMENT '".$name."'";
break;
case 'DatePicker' ://日期选择框
$queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` DATE ".$defaultvalue." COMMENT '".$name."'";
break;
case 'TimePicker' ://时间选择框
$defaultvalue = "DEFAULT NULL";
$queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` DATETIME ".$defaultvalue." COMMENT '".$name."'";
break;
case 'uploadImage' ://图片上传
case 'uploadFile' ://文件上传
$queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` VARCHAR ( ".$maxlength." ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '".$name."' ";
break;
default :
$maxlength = 255;
$queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` VARCHAR( ".$maxlength." ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ".$defaultvalue." COMMENT '".$name."'";
break;
}
$resData = Db::execute($queryStr);
if ($resData === false) {
$this->where(['field_id' => $this->field_id])->delete();
$error_message[] = $name.',添加失败';
}
}
if ($error_message) {
$this->error = implode(';',$error_message);
return false;
}
return true;
}
/**
* 修改字段
*/
public function updateData($types, $param)
{
$model=$this->getTypeModel($types);
$tablename = $model->getTable();
$maxlength = '255';
$defaultvalue = "DEFAULT NULL";
//根据字段类型,创建字段
$error_message=[];
foreach ($param as $d) {
$default_value = $d['config']['value'] ?? '';
if (is_array($default_value)) {
$default_value = implode(',', $default_value);
}
$name = $d['config']['label'] ?? '';
switch ($d['component']) {
case 'Rate' ://评分
case 'input' ://输入框
case 'Cascader' ://区域选择框
$queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `" . $d['id'] . "` VARCHAR( 255 ) COMMENT '" . $name . "'";
break;
case 'radio' ://单选框
case 'select' ://下拉选择框
case 'checkbox' ://多选框
$defaultvalue = $default_value ? "DEFAULT '" . $default_value . "'" : '';
$queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `" . $d['id'] . "` VARCHAR( " . $maxlength . " ) " . $defaultvalue . " COMMENT '" . $name . "'";
break;
case 'textarea' ://文本框
$queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `" . $d['id'] . "` TEXT COMMENT '" . $name . "'";
break;
case 'input-number' ://数字框
$defaultvalue = abs(intval($default_value)) > 2147483647 ? 2147483647 : intval($default_value);
$maxlength = 18;
$queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `" . $d['id'] . "`decimal(" . $maxlength . ",2) DEFAULT '" . $defaultvalue . "' COMMENT '" . $name . "'";
break;
case 'DatePicker' ://日期选择框
$queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `" . $d['id'] . "` DATE " . $defaultvalue . " COMMENT '" . $name . "'";
break;
case 'TimePicker' ://时间选择框
$defaultvalue = "DEFAULT NULL";
$queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `" . $d['id'] . "` DATETIME " . $defaultvalue . " COMMENT '" . $name . "'";
break;
case 'uploadImage' ://图片上传
case 'uploadFile' ://文件上传
$queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `" . $d['id'] . "` VARCHAR ( " . $maxlength . " ) COMMENT '" . $name . "' ";
break;
default :
$maxlength = 255;
$queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `" . $d['id'] . "` VARCHAR( " . $maxlength . " ) COMMENT '" . $name . "'";
break;
}
$resData = Db::execute($queryStr);
if ($resData === false) {
$this->where(['field_id' => $this->field_id])->delete();
$error_message[] = $name . ',添加失败';
}
}
if ($error_message) {
$this->error = implode(';', $error_message);
return false;
}
return true;
}
}