FormField.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <?php
  2. namespace addons\qingdongams\model;
  3. use think\Model;
  4. use think\Validate;
  5. use traits\model\SoftDelete;
  6. /**
  7. * 表单字段
  8. */
  9. class FormField extends Model {
  10. use SoftDelete;
  11. const LEADS_TYPE = 'leads';
  12. const CUSTOMER_TYPE = 'customer';
  13. const CONTACTS_TYPE = 'contacts';
  14. const CONTRACT_TYPE = 'contract';
  15. const RECEIVABLES_TYPE = 'examine';
  16. const BUSINESS_TYPE = 'business';
  17. const SIGNIN_TYPE = 'signin';
  18. // 表名,不含前缀
  19. protected $name = 'qingdongams_form_field';
  20. // 自动写入时间戳字段
  21. protected $autoWriteTimestamp = 'int';
  22. // 定义时间戳字段名
  23. protected $createTime = 'createtime';
  24. protected $updateTime = 'updatetime';
  25. protected $deleteTime = 'deletetime';
  26. public function getUpdatetimeAttr($value){
  27. return date('Y-m-d H:i',$value);
  28. }
  29. /**
  30. * 获取表单字段
  31. */
  32. public static function getFields($type){
  33. $fields=self::where(['types'=>$type,'list_show'=>1,'info_type'=>'main'])->select();
  34. $js=[];
  35. foreach ($fields as $v){
  36. if(in_array($v['field'],['name','num'])){//名称
  37. continue;
  38. }
  39. $d=[
  40. 'field' => $v['field'],
  41. 'title' => $v['name'],
  42. 'operate' => 'like',
  43. 'autocomplete' => false,
  44. ];
  45. if($v['form_type'] == 'Cascader'){
  46. $d['extend']='data-toggle="city-picker"';
  47. }else if($v['form_type'] == 'label'){//标签
  48. $d['formatter']='(false || function (value){
  49. if(value){
  50. let str_split=value.split(","),html="";
  51. console.log(str_split)
  52. $.each(str_split,function (index, item){
  53. let spab_split=item.split("^");
  54. html+= \'<div class="label" style="margin-left:5px;background: rgba(0, 82, 204, 0.1);color:\'+ spab_split[1] + \'">\'+ spab_split[0] + \'</div>\';
  55. });
  56. return html;
  57. }else{
  58. return value;
  59. }
  60. })';
  61. if($v['setting']){
  62. $set = json_decode($v['setting'],true);
  63. $setting=[];
  64. foreach ($set as $s){
  65. foreach ($s['children'] as $c){
  66. $setting[$c['la_va']]=$c['value'];
  67. }
  68. }
  69. }else{
  70. $setting=[];
  71. }
  72. $d['operate'] = 'like';
  73. $d['searchList']=json_encode($setting,JSON_UNESCAPED_UNICODE);
  74. }else if($v['form_type'] == 'uploadImage'){//图片
  75. continue;
  76. }else if($v['form_type'] == 'uploadFile'){//文件
  77. continue;
  78. }else if($v['form_type'] == 'DatePicker' ){//日期
  79. $d['operate']='RANGE';
  80. $d['addclass']='datetimerange';
  81. $d['formatter']='Table.api.formatter.datetime';
  82. $d['extend']='data-locale="{format:\"YYYY-MM-DD\"}"';
  83. }else if($v['form_type'] == 'TimePicker' ){//时间
  84. $d['operate']='RANGE';
  85. $d['addclass']='datetimerange';
  86. $d['formatter']='Table.api.formatter.datetime';
  87. }else if($v['form_type'] == 'textarea'){//文本
  88. $d['operate']=false;
  89. }else if(in_array($v['form_type'],['select','checkbox','radio'])){//下拉
  90. $d['searchList']=json_encode(explode('|',$v['setting']),JSON_UNESCAPED_UNICODE);
  91. }else if(in_array($v['form_type'],['Rate'])){//分数
  92. $d['operate'] = '=';
  93. $d['searchList']=json_encode([1=>1,2=>2,3=>3,4=>4,5=>5],JSON_UNESCAPED_UNICODE);
  94. }else if($v['form_type'] == 'editor'){//编辑器
  95. $d['operate']=false;
  96. }else if($v['form_type'] == 'switch'){//开关
  97. $d['operate'] = '=';
  98. $d['searchList']=json_encode(['1'=>'启用','0'=>'关闭'],JSON_UNESCAPED_UNICODE);
  99. $d['formatter']='Table.api.formatter.status';
  100. } else if ($v['form_type'] == 'customer') {//关联客户
  101. $d['operate'] = '=';
  102. $d['addClass'] = 'selectpage';
  103. $d['visible'] = false;
  104. $d['extend'] = "data-source='qingdongams/customer/customer/index' data-field='name'";
  105. } else if ($v['form_type'] == 'contact') {//关联联系人
  106. $d['operate'] = '=';
  107. $d['addClass'] = 'selectpage';
  108. $d['visible'] = false;
  109. $d['extend'] = "data-source='qingdongams/customer/contact/index' data-field='name'";
  110. } else if ($v['form_type'] == 'contract') {//关联合同
  111. $d['operate'] = '=';
  112. $d['addClass'] = 'selectpage';
  113. $d['visible'] = false;
  114. $d['extend'] = "data-source='qingdongams/customer/contract/index' data-field='name'";
  115. } else if ($v['form_type'] == 'business') {//关联商机
  116. $d['operate'] = '=';
  117. $d['addClass'] = 'selectpage';
  118. $d['visible'] = false;
  119. $d['extend'] = "data-source='qingdongams/customer/business/index' data-field='name'";
  120. } else if ($v['form_type'] == 'staff') {//员工
  121. $d['operate'] = '=';
  122. $d['addClass'] = 'selectpage';
  123. $d['visible'] = false;
  124. $d['extend'] = "data-source='qingdongams/department/staff/index' data-field='name'";
  125. } else if ($v['form_type'] == 'department') {//关联部门
  126. $d['operate'] = '=';
  127. $d['addClass'] = 'selectpage';
  128. $d['visible'] = false;
  129. $d['extend'] = "data-source='qingdongams/department/group/index' data-field='name'";
  130. }
  131. $js[] = $d;
  132. }
  133. return json_encode($js,JSON_UNESCAPED_UNICODE);
  134. }
  135. /**
  136. * 验证表单字段
  137. */
  138. public static function checkFields($types,&$params,$id=null)
  139. {
  140. switch ($types){
  141. case 'leads'://线索
  142. $model=new Leads();
  143. break;
  144. case 'customer'://客户
  145. $model=new Customer();
  146. break;
  147. case 'contract'://合同
  148. $model=new Contract();
  149. break;
  150. case 'contacts'://联系人
  151. $model=new Contacts();
  152. break;
  153. case 'receivabels'://回款
  154. $model=new Receivables();
  155. break;
  156. }
  157. $fields=self::where(['types'=>$types,'info_type'=>'main'])->select();
  158. foreach ($fields as $v){
  159. //必填
  160. if($v['is_null'] == 1){
  161. if (!isset($params[$v['field']]) || empty($params[$v['field']])) {
  162. return $v['name'] . '不能为空!';
  163. }
  164. }
  165. //唯一
  166. if($v['is_unique'] == 1){
  167. if (!isset($params[$v['field']]) || empty($params[$v['field']])) {
  168. continue;
  169. }
  170. $where=[];
  171. if(!empty($id)){
  172. $where['id']=['neq',$id];
  173. }
  174. if(is_array($params[$v['field']])){
  175. $params[$v['field']]=implode(',',$params[$v['field']]);
  176. }
  177. $where[$v['field']]=$params[$v['field']];
  178. if($model->where($where)->count() > 0){
  179. return $v['name'] ."【{$params[$v['field']]}】". '已存在!';
  180. }
  181. }
  182. if($v['form_type'] == 'input-mobile'){//手机号
  183. if (isset($params[$v['field']]) && $params[$v['field']]) {
  184. if (!Validate::regex($params[$v['field']], "^1\d{10}$")) {
  185. return $v['name'] ."【{$params[$v['field']]}】". '格式错误!';
  186. }
  187. }
  188. }elseif($v['form_type'] == 'input-email'){//邮箱
  189. if (isset($params[$v['field']]) && $params[$v['field']]) {
  190. if (!Validate::is($params[$v['field']], "email")) {
  191. return $v['name'] ."【{$params[$v['field']]}】". '格式错误!';
  192. }
  193. }
  194. }elseif($v['form_type'] == 'editor'){//编辑器
  195. //编辑器提交时 会去除html 标签,重新获取值,不同表单有不同的提交名称
  196. if (isset($params[$v['field']]) && $params[$v['field']]) {
  197. $list=['','row.','customer.','data.','contacts.','leads.'];
  198. foreach ($list as $n) {
  199. if (input($n . $v['field'], NULL, 'trim')) {
  200. $params[$v['field']] = input($n . $v['field'], NULL, 'trim');
  201. break;
  202. }
  203. }
  204. }
  205. }elseif($v['form_type'] == 'location' || $v['form_type'] == 'map'){//地理位置
  206. if($types == self::CUSTOMER_TYPE){//客户
  207. if (isset($params[$v['field']]) && $params[$v['field']]) {
  208. $params['address']=$params[$v['field']];
  209. $params['address_detail']=$params[$v['field']];
  210. $params['lat']=$params[$v['field'].'_lat'];
  211. $params['lng']=$params[$v['field'].'_lng'];
  212. }
  213. }
  214. }
  215. }
  216. return true;
  217. }
  218. /**
  219. * 获取搜索条件
  220. */
  221. public static function updateWhereField($types,$params){
  222. $fields=self::where(['types'=>$types,'info_type'=>'main'])->select();
  223. $where=[];
  224. foreach ($fields as $v){
  225. if(!isset($params[$v['field']]) || $params[$v['field']] === ''){
  226. continue;
  227. }
  228. if($v['form_type'] == 'uploadImage'){//图片
  229. continue;
  230. }else if($v['form_type'] == 'uploadFile'){//文件
  231. continue;
  232. }else if($v['form_type'] == 'DatePicker' ){//日期
  233. $times=explode(',',$params[$v['field']]);
  234. $where[$v['field']]=['between',$times ];
  235. }else if($v['form_type'] == 'TimePicker' ){//时间
  236. $times=explode(',',$params[$v['field']]);
  237. $where[$v['field']]=['between',$times ];
  238. }else if($v['form_type'] == 'textarea'){//文本
  239. continue;
  240. }else if(in_array($v['form_type'],['select','checkbox','radio'])){//
  241. $where[$v['field']]=$params[$v['field']];
  242. }else if(in_array($v['form_type'],['Rate'])){//星级
  243. $where[$v['field']]=$params[$v['field']];
  244. }else{
  245. $where[$v['field']]=['like',"%{$params[$v['field']]}%" ];
  246. }
  247. }
  248. return $where;
  249. }
  250. }