Form.php 17 KB

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