Form.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. <?php
  2. namespace addons\qingdongams\model;
  3. use app\admin\model\AuthGroup;
  4. use think\Db;
  5. use think\Exception;
  6. use think\Model;
  7. use traits\model\SoftDelete;
  8. /**
  9. * 表单
  10. */
  11. class Form extends Model {
  12. use SoftDelete;
  13. const LEADS_TYPE = 'leads';
  14. const CUSTOMER_TYPE = 'customer';
  15. const CONTACTS_TYPE = 'contacts';
  16. const CONTRACT_TYPE = 'contract';
  17. const RECEIVABLES_TYPE = 'examine';
  18. const BUSINESS_TYPE = 'business';
  19. const SIGNIN_TYPE = 'signin';
  20. // 表名,不含前缀
  21. protected $name = 'qingdongams_form';
  22. // 自动写入时间戳字段
  23. protected $autoWriteTimestamp = 'int';
  24. // 定义时间戳字段名
  25. protected $createTime = 'createtime';
  26. protected $updateTime = 'updatetime';
  27. protected $deleteTime = 'deletetime';
  28. public function getUpdatetimeAttr($value){
  29. return date('Y-m-d H:i',$value);
  30. }
  31. public static function getDataValue($type,$info=[]){
  32. $data=self::where(['type'=>$type])->value('data');
  33. if($data){
  34. $form = json_decode($data,true)['data'];
  35. foreach($form as $k=>$v){
  36. $form[$k]['data_value'] ='';
  37. if($info){
  38. $form[$k]['data_value'] = isset($info[$v['id']]) ? $info[$v['id']] : '';
  39. if(array_key_exists($v['id'],$info) && isset($info[$v['id']])){
  40. if($v['component'] == 'select'){
  41. if(isset($v['config']['multiple']) && $v['config']['multiple'] == true){
  42. if(is_array($info[$v['id']])){
  43. $selectArrInfo = [];
  44. foreach($info[$v['id']] as $ks=>$vs){
  45. $selectArrInfo[$vs] = $vs;
  46. }
  47. $form[$k]['data_value'] = $selectArrInfo;
  48. }else{
  49. $selectArr = explode(',',$info[$v['id']]);
  50. $selectArrInfo = [];
  51. foreach($selectArr as $ks=>$vs){
  52. $selectArrInfo[$vs] = $vs;
  53. }
  54. $form[$k]['data_value'] = $selectArrInfo;
  55. }
  56. }
  57. }
  58. }
  59. }
  60. }
  61. return $form;
  62. }else{
  63. return [];
  64. }
  65. }
  66. public static function getDataDetail($type,$params)
  67. {
  68. $form = Form::getDataValue($type);
  69. foreach($form as $k=>$v){
  70. if($v['component'] == 'uploadImage' || $v['component'] == 'uploadFile'){
  71. $params[$v['id'].'_str'] = NULL;
  72. if(key_exists($v['id'],$params)){
  73. if(isset($params[$v['id']]) && $params[$v['id']]){
  74. $whereT['id'] = array('in',$params[$v['id']]);
  75. $fileinfo = File::where($whereT)->field('id,name,file_path,save_name')->select();
  76. $fileinfo=collection($fileinfo)->toArray();
  77. $params[$v['id']] = $fileinfo;
  78. if($fileinfo){
  79. $fileinfodata = '';
  80. foreach($fileinfo as $kss=>$vss){
  81. $fileinfodata = $vss['save_name'].','.$fileinfodata;
  82. }
  83. $params[$v['id'].'_str'] = rtrim($fileinfodata,',')?:NULL;
  84. }
  85. }
  86. }
  87. }else if($v['component'] == 'customer'){//客户
  88. if(isset($params[$v['id']]) && $params[$v['id']]){
  89. $params[$v['id']]= Customer::where(['id'=>$params[$v['id']] ])->field('id,name')->find();
  90. }
  91. }else if($v['component'] == 'contact'){//联系人
  92. if(isset($params[$v['id']]) && $params[$v['id']]){
  93. $params[$v['id']]= Contacts::where(['id'=>$params[$v['id']] ])->field('id,name')->find();
  94. }
  95. }else if($v['component'] == 'contract'){//合同
  96. if(isset($params[$v['id']]) && $params[$v['id']]){
  97. $params[$v['id']]= Contract::where(['id'=>$params[$v['id']] ])->field('id,name')->find();
  98. }
  99. }else if($v['component'] == 'business'){//商机
  100. if(isset($params[$v['id']]) && $params[$v['id']]){
  101. $params[$v['id']]= Business::where(['id'=>$params[$v['id']] ])->field('id,name')->find();
  102. }
  103. }else if($v['component'] == 'staff'){//员工
  104. if(isset($params[$v['id']]) && $params[$v['id']]){
  105. $params[$v['id']]= Staff::where(['id'=>$params[$v['id']] ])->field('id,name')->find();
  106. }
  107. }else if($v['component'] == 'department'){//部门
  108. if(isset($params[$v['id']]) && $params[$v['id']]){
  109. $params[$v['id']]= AuthGroup::where(['id'=>$params[$v['id']] ])->field('id,name')->find();
  110. }
  111. }else if($v['component'] == 'editor'){//编辑器
  112. if(isset($params[$v['id']]) && $params[$v['id']]){
  113. preg_match_all('/<img.+src=\"?(.+\.(jpg|jpeg|gif|bmp|bnp|png))\"?.+>/i',$params[$v['id']],$match);
  114. foreach ($match[1] as $m){
  115. $params[$v['id']]=str_replace($m,cdnurl($m,true),$params[$v['id']]);
  116. }
  117. }
  118. }
  119. }
  120. return $params;
  121. }
  122. /**
  123. *获取form表单的NameID
  124. */
  125. public static function getFromNameId($type){
  126. $data=self::getDataValue($type);
  127. $result=[];
  128. foreach ($data as $v){
  129. $result[$v['config']['label']]=$v['id'];
  130. }
  131. return $result;
  132. }
  133. /**
  134. * 更新提交表单内容
  135. * @param $type string 类型
  136. * @param $params array 提交内容
  137. * @return mixed
  138. */
  139. public static function updateFormParams($type, $params)
  140. {
  141. $form = Form::getDataValue($type);
  142. foreach ($form as $k => $v) {
  143. if ($v['component'] == 'uploadImage' || $v['component'] == 'uploadFile') {
  144. if (key_exists($v['id'], $params)) {
  145. if ($params[$v['id']]) {
  146. $filearr = explode(',', $params[$v['id']]);
  147. $files = '';
  148. if ($filearr) {
  149. foreach ($filearr as $ks => $vs) {
  150. $files = File::where(array('file_path' => $vs))
  151. ->order('id desc')->value('id') . ',' . $files;
  152. }
  153. $params[$v['id']] = rtrim($files, ',');
  154. }
  155. }
  156. }
  157. } elseif ($v['component'] == 'select') {
  158. if (isset($v['config']['multiple']) && $v['config']['multiple'] == true) {
  159. if (key_exists($v['id'], $params)) {
  160. if (isset($params[$v['id']]) && is_array($params[$v['id']])) {
  161. $params[$v['id']] = implode(',', $params[$v['id']]);
  162. }
  163. }
  164. }
  165. } elseif ($v['component'] == 'label') {
  166. if (key_exists($v['id'], $params)) {
  167. if (isset($params[$v['id']]) && is_array($params[$v['id']])) {
  168. $params[$v['id']] = implode(',', $params[$v['id']]);
  169. }
  170. }
  171. } elseif ($v['component'] == 'checkbox') {
  172. if(isset($params[$v['id']]) && is_array($params[$v['id']])){
  173. $params[$v['id']] = implode(',', $params[$v['id']]);
  174. }
  175. }
  176. }
  177. return $params;
  178. }
  179. /**
  180. * 获取model
  181. * @param $type
  182. * @return Contacts|Contract|Customer|Leads|Receivables
  183. */
  184. public function getTypeModel($type){
  185. switch ($type){
  186. case 'leads'://线索
  187. $model=new Leads();
  188. break;
  189. case 'customer'://客户
  190. $model=new Customer();
  191. break;
  192. case 'contract'://合同
  193. $model=new Contract();
  194. break;
  195. case 'contacts'://联系人
  196. $model=new Contacts();
  197. break;
  198. case 'examine'://回款
  199. case 'receivabels'://回款
  200. $model=new Receivables();
  201. break;
  202. case self::BUSINESS_TYPE://商机
  203. $model=new Business();
  204. break;
  205. case 'daily'://日报
  206. case 'weekly':
  207. case 'monthly':
  208. case 'quarterly':
  209. case 'yearly':
  210. $model=new Daily();
  211. break;
  212. case 'signin':
  213. $model=new StaffSignIn();
  214. break;
  215. default:
  216. $model=new FormApproval();//自定义表单
  217. }
  218. return $model;
  219. }
  220. /**
  221. * 更新表单
  222. */
  223. public function updateForm($id, $data)
  224. {
  225. $row = self::get($id);
  226. $fields = json_decode($data, true);
  227. (new Field())->setFormField($row['type'], $fields['data']);
  228. $insertFormField = [];
  229. $model=$this->getTypeModel($row['type']);
  230. if(!empty($model)){
  231. $tableFields=$model->getTableFields();
  232. }
  233. $addParams=[];
  234. $updateParams=[];
  235. foreach ($fields['data'] as $k => &$d) {
  236. if(isset($d['showInfoType'])){
  237. unset($d['showInfoType']);
  238. }
  239. $content = $d['config']['content'] ?? [];
  240. $label = [];
  241. foreach ($content as $c) {
  242. if (isset($c['label'])) {
  243. $label[] = $c['label'];
  244. } else {
  245. $label[] = $c['value'];
  246. }
  247. }
  248. $name = $d['config']['label'] ?? '';
  249. $infoType = isset($d['config']['infoType']) ? $d['config']['infoType'] : 'main';// additional附加信息 main 主要信息
  250. if ($infoType == 'main' && !empty($model)) {
  251. if (!in_array($d['id'], $tableFields)) {
  252. $addParams[] = $d;
  253. } else {
  254. $updateParams[] = $d;
  255. }
  256. }
  257. $value = $d['config']['value'] ?? '';
  258. if (is_array($value)) {
  259. $value = implode(',', $value);
  260. }
  261. if ($d['component'] == 'label') {
  262. $setting = json_encode($content,JSON_UNESCAPED_UNICODE);
  263. } else {
  264. $setting = implode('|', $label);
  265. }
  266. $insertFormField[] = [
  267. 'types' => $row['type'],
  268. 'types_id' => 0,//分类ID(审批等)
  269. 'field' => $d['id'],//字段名
  270. 'name' => $name,//标识名
  271. 'form_type' => $d['component'],//字段类型
  272. 'default_value' => $value,//默认值
  273. 'is_unique' => isset($d['config']['only']) ? ($d['config']['only'] ? 1 : 0) : '',//是否唯一
  274. 'is_null' => ($d['config']['required'] ?? NULL) ? 1 : 0,//是否必填
  275. 'input_tips' => $d['config']['placeholder'] ?? '',//提示文字
  276. 'setting' => $setting,//设置
  277. 'order_id' => $k,//排序ID
  278. 'info_type' => $infoType,//信息类型
  279. 'operating' => $d['config']['is_delete'] ? 0 : 3,//0改删,1改,2删,3无
  280. 'list_show' => isset($d['config']['listShow']) ? ($d['config']['listShow'] ? 1 : 0) :0,//列表显示(1是,0否)
  281. 'add_show' => isset($d['config']['addShow']) ? ($d['config']['addShow'] ? 1 : 0) :0,//添加显示(1是,0否)
  282. 'createtime' => time(),
  283. 'updatetime' => time()
  284. ];
  285. }
  286. $errorMessage = [];
  287. //新增
  288. if ($addParams) {
  289. if (! $this->createData($row['type'], $addParams)) {
  290. $errorMessage[] = $this->getError();
  291. }
  292. }
  293. //编辑
  294. if ($updateParams) {
  295. if (! $this->updateData($row['type'],$updateParams)) {
  296. $errorMessage[] = $this->getError();
  297. }
  298. }
  299. if ($errorMessage) {
  300. throw new Exception(implode(';', $errorMessage));
  301. }
  302. $formFieldModel = new FormField();
  303. $formFieldModel->where(['types'=>$row['type']])->delete();
  304. if(!$formFieldModel->allowField(true)->saveAll($insertFormField)){
  305. throw new Exception('添加表单字段失败');
  306. }
  307. return (new self())->save(['data' => json_encode($fields,JSON_UNESCAPED_UNICODE)], ['id' => $id]);
  308. }
  309. /**
  310. * 创建字段
  311. */
  312. public function createData($types, $param){
  313. $model=$this->getTypeModel($types);
  314. $tablename=$model->getTable();
  315. $maxlength = '255';
  316. $defaultvalue = "DEFAULT NULL";
  317. //根据字段类型,创建字段
  318. $error_message=[];
  319. foreach ($param as $d){
  320. $default_value = $d['config']['value'] ?? '';
  321. if (is_array($default_value)) {
  322. $default_value = implode(',', $default_value);
  323. }
  324. $name= $d['config']['label'] ?? '';
  325. switch ($d['component']) {
  326. case 'Rate' ://评分
  327. case 'input' ://输入框
  328. case 'Cascader' ://区域选择框
  329. case 'switch' ://开关
  330. $queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` VARCHAR( 255 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '".$name."'";
  331. break;
  332. case 'radio' ://单选框
  333. case 'select' ://下拉选择框
  334. case 'checkbox' ://多选框
  335. $maxlength = '255';
  336. $defaultvalue = $default_value ? "DEFAULT '".$default_value."'" : '';
  337. $queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` VARCHAR( ".$maxlength." ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ".$defaultvalue." COMMENT '".$name."'";
  338. break;
  339. case 'textarea' ://文本框
  340. case 'editor' ://编辑器
  341. $queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` TEXT COMMENT '".$name."'";
  342. break;
  343. case 'input-number' ://数字框
  344. $defaultvalue = abs(intval($default_value)) > 2147483647 ? 2147483647 : intval($default_value);
  345. $queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."`int(11) DEFAULT '".$defaultvalue."' COMMENT '".$name."'";
  346. break;
  347. case 'input-money' ://金额
  348. $queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` double(12,2) DEFAULT NULL COMMENT '".$name."'";
  349. break;
  350. case 'DatePicker' ://日期选择框
  351. $queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` DATE ".$defaultvalue." COMMENT '".$name."'";
  352. break;
  353. case 'TimePicker' ://时间选择框
  354. $defaultvalue = "DEFAULT NULL";
  355. $queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` DATETIME ".$defaultvalue." COMMENT '".$name."'";
  356. break;
  357. case 'uploadImage' ://图片上传
  358. case 'uploadFile' ://文件上传
  359. $maxlength = '255';
  360. $queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` VARCHAR ( ".$maxlength." ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '".$name."' ";
  361. break;
  362. case 'input-mobile' ://手机号
  363. case 'input-email' ://邮箱
  364. $maxlength = '255';
  365. $defaultvalue = "DEFAULT NULL";
  366. $queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` VARCHAR ( ".$maxlength." )".$defaultvalue." COMMENT '".$name."'";
  367. break;
  368. case 'location' ://地理位置
  369. case 'map' ://地图
  370. $maxlength = '255';
  371. $defaultvalue = "DEFAULT NULL";
  372. $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."'";
  373. break;
  374. case 'customer' ://客户
  375. case 'contact' ://联系人
  376. case 'contract' ://合同
  377. case 'business' ://商机
  378. case 'staff' ://员工
  379. $queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."`int(11) DEFAULT NULL COMMENT '".$name."'";
  380. break;
  381. default :
  382. $maxlength = 255;
  383. $queryStr = "ALTER TABLE `" . $tablename . "` ADD COLUMN `".$d['id']."` VARCHAR( ".$maxlength." ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ".$defaultvalue." COMMENT '".$name."'";
  384. break;
  385. }
  386. $resData = Db::execute($queryStr);
  387. if ($resData === false) {
  388. $this->where(['field_id' => $this->field_id])->delete();
  389. $error_message[] = $name.',添加失败';
  390. }
  391. }
  392. if ($error_message) {
  393. $this->error = implode(';',$error_message);
  394. return false;
  395. }
  396. return true;
  397. }
  398. /**
  399. * 修改字段
  400. */
  401. public function updateData($types, $param)
  402. {
  403. $model=$this->getTypeModel($types);
  404. $tablename = $model->getTable();
  405. $maxlength = '255';
  406. $defaultvalue = "DEFAULT NULL";
  407. //根据字段类型,创建字段
  408. $error_message=[];
  409. foreach ($param as $d) {
  410. $default_value = $d['config']['value'] ?? '';
  411. if (is_array($default_value)) {
  412. $default_value = implode(',', $default_value);
  413. }
  414. $name = $d['config']['label'] ?? '';
  415. switch ($d['component']) {
  416. case 'Rate' ://评分
  417. case 'input' ://输入框
  418. case 'Cascader' ://区域选择框
  419. case 'switch' ://开关
  420. $queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `" . $d['id'] . "` VARCHAR( 255 ) COMMENT '" . $name . "'";
  421. break;
  422. case 'radio' ://单选框
  423. case 'select' ://下拉选择框
  424. case 'checkbox' ://多选框
  425. $defaultvalue = $default_value ? "DEFAULT '" . $default_value . "'" : '';
  426. $queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `" . $d['id'] . "` VARCHAR( " . $maxlength . " ) " . $defaultvalue . " COMMENT '" . $name . "'";
  427. break;
  428. case 'textarea' ://文本框
  429. case 'editor' ://编辑器
  430. $queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `" . $d['id'] . "` TEXT COMMENT '" . $name . "'";
  431. break;
  432. case 'input-number' ://数字框
  433. $defaultvalue = abs(intval($default_value)) > 2147483647 ? 2147483647 : intval($default_value);
  434. $queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `" . $d['id'] . "`int(11) DEFAULT '" . $defaultvalue . "' COMMENT '" . $name . "'";
  435. break;
  436. case 'input-money' ://金额
  437. $queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `" . $d['id'] . "`decimal(12,2) DEFAULT NULL COMMENT '" . $name . "'";
  438. break;
  439. case 'DatePicker' ://日期选择框
  440. $defaultvalue = "DEFAULT NULL";
  441. $queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `" . $d['id'] . "` DATE " . $defaultvalue . " COMMENT '" . $name . "'";
  442. break;
  443. case 'TimePicker' ://时间选择框
  444. $defaultvalue = "DEFAULT NULL";
  445. $queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `" . $d['id'] . "` DATETIME " . $defaultvalue . " COMMENT '" . $name . "'";
  446. break;
  447. case 'uploadImage' ://图片上传
  448. case 'uploadFile' ://文件上传
  449. $queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `" . $d['id'] . "` VARCHAR ( " . $maxlength . " ) COMMENT '" . $name . "' ";
  450. break;
  451. case 'input-mobile' ://手机号
  452. case 'input-email' ://邮箱
  453. $maxlength = '255';
  454. $defaultvalue = "DEFAULT NULL";
  455. $queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `".$d['id']."` VARCHAR ( ".$maxlength." )".$defaultvalue." COMMENT '".$name."'";
  456. break;
  457. case 'location' ://地理位置
  458. case 'map' ://地图
  459. $maxlength = '255';
  460. $defaultvalue = "DEFAULT NULL";
  461. $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."'";
  462. break;
  463. case 'customer' ://客户
  464. case 'contact' ://联系人
  465. case 'contract' ://合同
  466. case 'business' ://商机
  467. case 'staff' ://员工
  468. $queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `".$d['id']."`int(11) DEFAULT NULL COMMENT '".$name."'";
  469. break;
  470. default :
  471. $maxlength = 255;
  472. $queryStr = "ALTER TABLE `" . $tablename . "` MODIFY COLUMN `" . $d['id'] . "` VARCHAR( " . $maxlength . " ) COMMENT '" . $name . "'";
  473. break;
  474. }
  475. $resData = Db::execute($queryStr);
  476. if ($resData === false) {
  477. $this->where(['field_id' => $this->field_id])->delete();
  478. $error_message[] = $name . ',添加失败';
  479. }
  480. }
  481. if ($error_message) {
  482. $this->error = implode(';', $error_message);
  483. return false;
  484. }
  485. return true;
  486. }
  487. }