getFieldList($types, $typesId); # 验证 foreach ($fieldList AS $key => $value) { # 字段授权,没有读写权限,跳过验证。 if (!$userLevel && !empty($grantData[$types])) { $status = getFieldGrantStatus($value['field'], $grantData[$types]); if (empty($status['read']) || (empty($dataId) && empty($status['write']))) continue; } # 验证非明细表格字段数据 if (!empty($value['is_null']) && !in_array($value['form_type'], ['detail_table', 'boolean_value']) && (isset($param[$value['field']]) && empty($param[$value['field']]))) { $error = $value['name'] . '字段不能为空!'; break; } # 验证字段长度 if (!empty($value['max_length']) && $value['form_type'] != 'detail_table' && strlen($param[$value['field']]) > $value['max_length']) { $error = $value['name'] . '字段超过设定长度!'; break; } # 验证百分数字段长度 if ($value['form_type'] == 'percent' && strlen($param[$value['field']]) > 11) { $error = $value['name'] . "字段长度不能大于10位!"; break; } # 验证数字字段长度 if ($value['form_type'] == 'number' && strlen($param[$value['field']]) > 16) { $error = $value['name'] . "字段长度不能大于16位!"; break; } # 验证明细表格不能为空 if (!empty($value['is_null']) && $value['form_type'] == 'detail_table' && isset($param[$value['field']]) && empty($param[$value['field']])) { $error = $value['name'] . '数据不能为空!'; } # 验证明细表格可以为空,明细表格里的字段不能为空的情况。 if ($value['form_type'] == 'detail_table') { foreach ($param[$value['field']] AS $val) { foreach ($val AS $v) { if (!empty($v['is_null']) && empty($v['is_hidden']) && isset($v['value']) && empty($v['value'])) { $error = $value['name'] . '中的' . $v['name'] . '字段不能为空!'; break; } } } } if (empty($value['is_unique'])) continue; // 人员、部门、文件、手写签名、描述文字、多选、明细表格跳过验证 if (in_array($value['form_type'], ['user', 'structure', 'file', 'handwriting_sign', 'desc_text', 'checkbox', 'detail_table'])) continue; $uniqueStatus = false; # 验证唯一性 if ($value['form_type'] == 'date_interval' && !empty($param[$value['field']])) { // 日期区间 $uniqueStatus = $this->checkDataUniqueForDateInterval($types, $value['field'], $param[$value['field']], $dataId); } elseif ($value['form_type'] == 'position' && !empty($param[$value['field']])) { // 地址 $uniqueStatus = $this->checkDataUniqueForPosition($types, $value['field'], $param[$value['field']], $dataId); } elseif ($value['form_type'] == 'location' && !empty($param[$value['field']])) { // 定位 $uniqueStatus = $this->checkDataUniqueForLocation($types, $value['field'], $param[$value['field']], $dataId); } else { if (!empty($param[$value['field']])) $uniqueStatus = $this->checkDataUniqueForCommon($types, $value['field'], $param[$value['field']], $dataId); } if (!empty($uniqueStatus)) { $error = $types == 'crm_customer' ? '(客户/公海)中的' . $value['name'] . "字段值重复!" : $value['name'] . "字段值重复!"; break; } } return $error; } /** * 验证唯一性(通用) * 单行文本、多行文本、网址、布尔值、单选、数字 * 手机、邮箱、日期、日期时间、货币、百分数 * * @param string $types 栏目类型 * @param string $field 字段名称 * @param string $value 字段值 * @param int $dataId 更新时,传来的数据ID * @author fanqi * @since 2021-05-18 * @return float|mixed|string */ private function checkDataUniqueForCommon($types, $field, $value, $dataId = 0) { if (empty($value)) return false; # 主键 $primaryKey = getPrimaryKeyName($types); # 查询条件 $where[$field] = $value; if (!empty($dataId)) $where[$primaryKey] = ['neq', $dataId]; return db($types)->where($where)->value($primaryKey); } /** * 验证唯一性(日期区间) * * @param string $types 栏目类型 * @param string $field 字段名称 * @param array $value 字段值 * @param int $dataId 更新时,传来的数据ID * @author fanqi * @since 2021-05-18 * @return float|mixed|string */ private function checkDataUniqueForDateInterval($types, $field, $value, $dataId = 0) { if (empty($value)) return false; # 主键 $primaryKey = getPrimaryKeyName($types); # 查询条件 $where[$field] = implode('_', $value); if (!empty($dataId)) $where[$primaryKey] = ['neq', $dataId]; return db($types)->where($where)->value($primaryKey); } /** * 验证唯一性(地址) * * @param string $types 栏目类型 * @param string $field 字段名称 * @param array $value 字段值 * @param int $dataId 更新时,传来的数据ID * @author fanqi * @since 2021-05-18 * @return float|mixed|string */ private function checkDataUniqueForPosition($types, $field, $value, $dataId = 0) { if (empty($value)) return false; # 主键 $primaryKey = getPrimaryKeyName($types); # 查询条件 $where[$field] = implode(',', array_column($value, 'name')); if (!empty($dataId)) $where[$primaryKey] = ['neq', $dataId]; return db($types)->where($where)->value($primaryKey); } /** * 验证唯一性(定位) * * @param string $types 栏目类型 * @param string $field 字段名称 * @param array $value 字段值 * @param int $dataId 更新时,传来的数据ID * @author fanqi * @since 2021-05-18 * @return float|mixed|string */ private function checkDataUniqueForLocation($types, $field, $value, $dataId = 0) { if (empty($value['address'])) return false; # 主键 $primaryKey = getPrimaryKeyName($types); # 查询条件 $where[$field] = $value['address']; if (!empty($dataId)) $where[$primaryKey] = ['neq', $dataId]; return db($types)->where($where)->value($primaryKey); } // /** // * 验证唯一性(部门) // * // * @param string $types 栏目类型 // * @param string $field 字段名称 // * @param string $value 字段值 // * @param int $dataId 更新时,传来的数据ID // * @author fanqi // * @since 2021-05-18 // * @return float|mixed|string // */ // private function checkDataUniqueForStructure($types, $field, $value, $dataId = 0) // { // if (empty($value)) return false; // // # 主键 // $primaryKey = getPrimaryKeyName($types); // // # 查询条件 // $where[$field] = ',' . $value . ','; // if (!empty($dataId)) $where[$primaryKey] = ['neq', $dataId]; // // return db($types)->where($where)->value($primaryKey); // } /** * 自定义字段列表 * * @param string $types 自定义表栏目类型:crm_leads、crm_customer ... * @param int $typesId 自定义表栏目类型ID * @author fanqi * @since 2021-05-18 * @return bool|\PDOStatement|string|\think\Collection */ private function getFieldList($types, $typesId) { # 查询条件 $where = [ 'types' => $types, 'types_id' => $typesId, 'is_hidden' => 0, 'form_type' => ['neq', 'desc_text'] ]; # 查询字段 $fields = ['field', 'name', 'form_type', 'is_unique', 'is_null', 'max_length']; return db('admin_field')->field($fields)->where($where)->select(); } }