123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516 |
- <?php
- namespace addons\qingdongams\model;
- use app\admin\model\AuthGroup;
- 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 = 'qingdongams_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;
- }
- }
- }
- }else if($v['component'] == 'customer'){//客户
- if(isset($params[$v['id']]) && $params[$v['id']]){
- $params[$v['id']]= Customer::where(['id'=>$params[$v['id']] ])->field('id,name')->find();
- }
- }else if($v['component'] == 'contact'){//联系人
- if(isset($params[$v['id']]) && $params[$v['id']]){
- $params[$v['id']]= Contacts::where(['id'=>$params[$v['id']] ])->field('id,name')->find();
- }
- }else if($v['component'] == 'contract'){//合同
- if(isset($params[$v['id']]) && $params[$v['id']]){
- $params[$v['id']]= Contract::where(['id'=>$params[$v['id']] ])->field('id,name')->find();
- }
- }else if($v['component'] == 'business'){//商机
- if(isset($params[$v['id']]) && $params[$v['id']]){
- $params[$v['id']]= Business::where(['id'=>$params[$v['id']] ])->field('id,name')->find();
- }
- }else if($v['component'] == 'staff'){//员工
- if(isset($params[$v['id']]) && $params[$v['id']]){
- $params[$v['id']]= Staff::where(['id'=>$params[$v['id']] ])->field('id,name')->find();
- }
- }else if($v['component'] == 'department'){//部门
- if(isset($params[$v['id']]) && $params[$v['id']]){
- $params[$v['id']]= AuthGroup::where(['id'=>$params[$v['id']] ])->field('id,name')->find();
- }
- }else if($v['component'] == 'editor'){//编辑器
- if(isset($params[$v['id']]) && $params[$v['id']]){
- preg_match_all('/<img.+src=\"?(.+\.(jpg|jpeg|gif|bmp|bnp|png))\"?.+>/i',$params[$v['id']],$match);
- foreach ($match[1] as $m){
- $params[$v['id']]=str_replace($m,cdnurl($m,true),$params[$v['id']]);
- }
- }
- }
- }
- 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 (isset($params[$v['id']]) && is_array($params[$v['id']])) {
- $params[$v['id']] = implode(',', $params[$v['id']]);
- }
- }
- }
- } elseif ($v['component'] == 'label') {
- if (key_exists($v['id'], $params)) {
- if (isset($params[$v['id']]) && is_array($params[$v['id']])) {
- $params[$v['id']] = implode(',', $params[$v['id']]);
- }
- }
- } elseif ($v['component'] == 'checkbox') {
- if(isset($params[$v['id']]) && is_array($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;
- case 'daily'://日报
- case 'weekly':
- case 'monthly':
- case 'quarterly':
- case 'yearly':
- $model=new Daily();
- break;
- case 'signin':
- $model=new StaffSignIn();
- break;
- default:
- $model=new FormApproval();//自定义表单
- }
- 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'] : 'main';// 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);
- }
- if ($d['component'] == 'label') {
- $setting = json_encode($content,JSON_UNESCAPED_UNICODE);
- } else {
- $setting = implode('|', $label);
- }
- $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' => $setting,//设置
- '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' ://区域选择框
- case 'switch' ://开关
- $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' ://多选框
- $maxlength = '255';
- $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' ://文本框
- case 'editor' ://编辑器
- $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);
- $queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."`int(11) DEFAULT '".$defaultvalue."' COMMENT '".$name."'";
- break;
- case 'input-money' ://金额
- $queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` double(12,2) DEFAULT NULL 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' ://文件上传
- $maxlength = '255';
- $queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` VARCHAR ( ".$maxlength." ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '".$name."' ";
- break;
- case 'input-mobile' ://手机号
- case 'input-email' ://邮箱
- $maxlength = '255';
- $defaultvalue = "DEFAULT NULL";
- $queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` VARCHAR ( ".$maxlength." )".$defaultvalue." COMMENT '".$name."'";
- break;
- case 'location' ://地理位置
- case 'map' ://地图
- $maxlength = '255';
- $defaultvalue = "DEFAULT NULL";
- $queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` VARCHAR ( ".$maxlength." )".$defaultvalue." COMMENT '".$name."',ADD COLUMN `".$d['id']."_lng` VARCHAR ( ".$maxlength." )".$defaultvalue." COMMENT '".$name."',ADD COLUMN `".$d['id']."_lat` VARCHAR ( $maxlength )".$defaultvalue." COMMENT '".$name."'";
- break;
- case 'customer' ://客户
- case 'contact' ://联系人
- case 'contract' ://合同
- case 'business' ://商机
- case 'staff' ://员工
- $queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."`int(11) DEFAULT NULL 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' ://区域选择框
- case 'switch' ://开关
- $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' ://文本框
- case 'editor' ://编辑器
- $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);
- $queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `" . $d['id'] . "`int(11) DEFAULT '" . $defaultvalue . "' COMMENT '" . $name . "'";
- break;
- case 'input-money' ://金额
- $queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `" . $d['id'] . "`decimal(12,2) DEFAULT NULL COMMENT '" . $name . "'";
- break;
- case 'DatePicker' ://日期选择框
- $defaultvalue = "DEFAULT NULL";
- $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;
- case 'input-mobile' ://手机号
- case 'input-email' ://邮箱
- $maxlength = '255';
- $defaultvalue = "DEFAULT NULL";
- $queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `".$d['id']."` VARCHAR ( ".$maxlength." )".$defaultvalue." COMMENT '".$name."'";
- break;
- case 'location' ://地理位置
- case 'map' ://地图
- $maxlength = '255';
- $defaultvalue = "DEFAULT NULL";
- $queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `".$d['id']."` VARCHAR ( ".$maxlength." )".$defaultvalue." COMMENT '".$name."',MODIFY COLUMN `".$d['id']."_lng` VARCHAR ( ".$maxlength." )".$defaultvalue." COMMENT '".$name."',MODIFY COLUMN `".$d['id']."_lat` VARCHAR ( $maxlength )".$defaultvalue." COMMENT '".$name."'";
- break;
- case 'customer' ://客户
- case 'contact' ://联系人
- case 'contract' ://合同
- case 'business' ://商机
- case 'staff' ://员工
- $queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `".$d['id']."`int(11) DEFAULT NULL 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;
- }
- }
|