3) { //万单位 //截取前俩为 $str = substr_replace(strstr($number, substr($number, -2), ' '), '.', -1, 0) . "公里"; } else { return $number . '米'; } return $str . '米'; } } if (!function_exists('build_field_option')) { function build_field_option($name = null, $selected = null, $type = null) { //获取选项列表 $fields = \addons\qingdongams\model\Field::getField($name, $type); $html = ''; foreach ($fields as $v) { if ($selected == $v) { $html .= ""; } else { $html .= ""; } } return $html; } } //修改多维数组为一位数组 if (!function_exists('modify_array')) { function modify_array($arr, $field1, $field2) { $data = []; foreach ($arr as $v) { $data[$v[$field1] ?? ''] = $v[$field2] ?? ''; } return $data; } } //显示文件夹 if (!function_exists('showdir')) { function showdir($path) { $dh = opendir($path);//打开目录 $arr = []; while (($d = readdir($dh)) != false) { //逐个文件读取,添加!=false条件,是为避免有文件或目录的名称为0 if ($d == '.' || $d == '..') {//判断是否为.或..,默认都会有 continue; } if (is_dir($path . '/' . $d)) {//如果为目录 $lowers = showdir($path . '/' . $d);//继续读取该目录下的目录或文件 if ($lowers) { $arr = array_merge($arr, $lowers); } } else { $arr[] = $path . '/' . $d; } } return $arr; } } //获取年度列表 if (!function_exists('getYears')) { function getYears() { $start = 2020; $years = []; $toYear = date('Y'); $end = date('Y') + 1; for ($start; $start <= $end; $start++) { if ($start == $toYear) { $years[] = [ 'id' => $start, 'name' => $start . '年', 'selected' => 'selected' ]; } else { $years[] = [ 'id' => $start, 'name' => $start . '年', ]; } } return $years; } } ///随机字符串,字母+数字 if (!function_exists('genRandomString')) { function genRandomString($len, $t = 0) { $chars = array( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" ); $chars1 = array( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" ); $chars2 = array( "1", "2", "3", "4", "5", "6", "7", "8", "9" ); $chars3 = array( "A", "B", "C", "D", "E", "F", "G", "O", "H", "I", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" ); $chars4 = array( "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "1", "2", "3", "4", "5", "6", "7", "8", "9" ); if ($t == 1) { $charsLen = count($chars1) - 1; shuffle($chars1); // 将数组打乱 $output = ""; for ($i = 0; $i < $len; $i++) { $output .= $chars1[mt_rand(0, $charsLen)]; } } elseif ($t == 2) { $charsLen = count($chars2) - 1; shuffle($chars2); // 将数组打乱 $output = ""; for ($i = 0; $i < $len; $i++) { $output .= $chars2[mt_rand(0, $charsLen)]; } } elseif ($t == 3) { $charsLen = count($chars3) - 1; shuffle($chars3); // 将数组打乱 $output = ""; for ($i = 0; $i < $len; $i++) { $output .= $chars3[mt_rand(0, $charsLen)]; } } elseif ($t == 4) { $charsLen = count($chars4) - 1; shuffle($chars4); // 将数组打乱 $output = ""; for ($i = 0; $i < $len; $i++) { $output .= $chars4[mt_rand(0, $charsLen)]; } } else { $charsLen = count($chars) - 1; shuffle($chars); // 将数组打乱 $output = ""; for ($i = 0; $i < $len; $i++) { $output .= $chars[mt_rand(0, $charsLen)]; } } return $output; } } //将表情进行转义 用于存储的时候 if (!function_exists('emoji_encode')) { function emoji_encode($str) { if (!is_string($str)) return $str; if (!$str || $str == 'undefined') return ''; $text = json_encode($str); //暴露出unicode $text = preg_replace_callback("/(\\\u[2def][0-9a-f]{3})/i", function ($str) { return addslashes($str[0]); }, $text); //将emoji的unicode留下,其他不动,这里的正则比原答案增加了d,因为我发现我很多emoji实际上是\ud开头的,反而暂时没发现有\ue开头。 return json_decode($text); } } //将表情进行反转义 用于读取的时候 if (!function_exists('emoji_decode')) { function emoji_decode($str) { $text = json_encode($str); //暴露出unicode $text = preg_replace_callback('/\\\\\\\\/i', function ($str) { return '\\'; }, $text); //将两条斜杠变成一条,其他不动 return json_decode($text); } } //过滤emoji if (!function_exists('filter_Emoji')) { function filter_Emoji($str) { $str = preg_replace_callback( //执行一个正则表达式搜索并且使用一个回调进行替换 '/./u', function (array $match) { return strlen($match[0]) >= 4 ? '' : $match[0]; }, $str); return $str; } } //获取编号 if (!function_exists('get_num')) { function get_num($type) { return 'R' . date('Ymd') . rand(10000, 99999); } } if (!function_exists('setTimes')) { /** * @param $times * @param string $type date|datetime|time * @return array|string */ function setTimes($times, $type = 'date') { switch ($times) { case 'today': $today = date('Y-m-d'); $todayend = date('Y-m-d'); $result = [$today, $todayend]; break; case 'yesterday': $yesterday = date('Y-m-d', strtotime('-1 day')); $result = [$yesterday, $yesterday]; break; case 'tomorrow': $tomorrow = date('Y-m-d', strtotime('+1 day')); $result = [$tomorrow, $tomorrow]; break; case 'thisweek': $thisweek_start = date("Y-m-d", mktime(0, 0, 0, date("m"), date("d") - date("w") + 1, date("Y"))); $thisweek_end = date("Y-m-d", mktime(23, 59, 59, date("m"), date("d") - date("w") + 7, date("Y"))); $result = [$thisweek_start, $thisweek_end]; break; case 'lastweek': $lastweek_start = date("Y-m-d", mktime(0, 0, 0, date("m"), date("d") - date("w") + 1 - 7, date("Y"))); $lastweek_end = date("Y-m-d", mktime(23, 59, 59, date("m"), date("d") - date("w") + 7 - 7, date("Y"))); $result = [$lastweek_start, $lastweek_end]; break; case 'nextweek': $lastweek_start = date("Y-m-d", mktime(0, 0, 0, date("m"), date("d") - date("w") + 1 + 7, date("Y"))); $lastweek_end = date("Y-m-d", mktime(23, 59, 59, date("m"), date("d") - date("w") + 7 + 7, date("Y"))); $result = [$lastweek_start, $lastweek_end]; break; case 'thismonth': $thismonth_start = date("Y-m-d", mktime(0, 0, 0, date("m"), 1, date("Y"))); $thismonth_end = date("Y-m-d", mktime(23, 59, 59, date("m"), date("t"), date("Y"))); $result = [$thismonth_start, $thismonth_end]; break; case 'lastmonth': $lastmonth_start = date("Y-m-d", mktime(0, 0, 0, date("m") - 1, 1, date("Y"))); $lastmonth_end = date("Y-m-d", mktime(23, 59, 59, date("m"), 0, date("Y"))); $result = [$lastmonth_start, $lastmonth_end]; break; case 'nextmonth': $nextmonth_start = date("Y-m-d", mktime(0, 0, 0, date("m") + 1, 1, date("Y"))); $nextmonth_end = date("Y-m-d", mktime(23, 59, 59, date("m") + 1, date("t"), date("Y"))); $result = [$nextmonth_start, $nextmonth_end]; break; case 'thisquarter': //本季度未最后一月天数 $getMonthDays = date("t", mktime(0, 0, 0, date('n') + (date('n') - 1) % 3, 1, date("Y"))); //本季度/ $thisquarter_start = date('Y-m-d', mktime(0, 0, 0, date('n') - (date('n') - 1) % 3, 1, date('Y'))); $thisquarter_end = date('Y-m-d', mktime(23, 59, 59, date('n') + (date('n') - 1) % 3, $getMonthDays, date('Y'))); $result = [$thisquarter_start, $thisquarter_end]; break; case 'lastquarter': //上季度未最后一月天数 $getMonthDays = date("t", mktime(0, 0, 0, date('n') + (date('n') - 1) % 3 - 3, 1, date("Y"))); $thisquarter_start = date('Y-m-d', mktime(0, 0, 0, date('n') - (date('n') - 1) % 3 - 3, 1, date('Y'))); $thisquarter_end = date('Y-m-d', mktime(23, 59, 59, date('n') + (date('n') - 1) % 3 - 3, $getMonthDays, date('Y'))); $result = [$thisquarter_start, $thisquarter_end]; break; case 'nextquarter': //下季度未最后一月天数 $getMonthDays = date("t", mktime(0, 0, 0, date('n') + (date('n') - 1) % 3 + 3, 1, date("Y"))); $thisquarter_start = date('Y-m-d', mktime(0, 0, 0, date('n') - (date('n') - 1) % 3 + 3, 1, date('Y'))); $thisquarter_end = date('Y-m-d', mktime(23, 59, 59, date('n') + (date('n') - 1) % 3 + 3, $getMonthDays, date('Y'))); $result = [$thisquarter_start, $thisquarter_end]; break; case 'thisyear': //今年 $thisyear_start = date('Y') . '-1-1'; $thisquarter_end = date('Y') . '-12-31'; $result = [$thisyear_start, $thisquarter_end]; break; case 'lastyear': //去年 $lastyear_start = date('Y')-1 . '-1-1'; $lastyear_end = date('Y')-1 . '-12-31'; $result = [$lastyear_start, $lastyear_end]; break; case 'nextyear': //下一年 $nextyear_start = date('Y')+1 . '-1-1'; $nextyear_end = date('Y')+1 . '-12-31'; $result = [$nextyear_start, $nextyear_end]; break; case 'else'://其他 $dates=input('dates','','trim'); $times = explode(' - ', $dates); $result = [$times[0] ?? date('Y-m-d'), $times[1] ?? date('Y-m-d')]; break; default: $times = explode(',', $times); $result = [$times[0] ?? date('Y-m-d'), $times[1] ?? date('Y-m-d')]; break; } if ($type == 'date') { return $result; } elseif ($type == 'datetime') { $result[0] = date('Y-m-d H:i:s', strtotime($result[0])); $result[1] = date('Y-m-d H:i:s', strtotime($result[1]) + 86400 - 1); return $result; } elseif ($type == 'time') { $result[0] =strtotime($result[0]); $result[1] =strtotime($result[1]) + 86400 - 1; return $result; } else { return $result; } } } if (!function_exists('export_excel')){ //导出excel function export_excel($title, $expTableData, $excel = 'export') { header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename=' . $excel . '.xlsx'); header('Cache-Control: max-age=0'); $obj = new \PhpOffice\PhpSpreadsheet\Spreadsheet(); // 以下内容是excel文件的信息描述信息 $obj->getProperties()->setTitle('导出文件'); //设置标题 $obj->setActiveSheetIndex(0); $obj->getActiveSheet()->setTitle('导出文件'); /* 循环读取每个单元格的数据 */ $a = 'A'; $currentSheet = $obj->getActiveSheet(); foreach ($title as $key => $value) { //读取工作表1 // 设置第一行加粗 $obj->getActiveSheet()->getStyle($a . '1')->getFont()->setBold(true); //这里是设置单元格的内容 $currentSheet->getCell($a . '1')->setValue($value); $a++; } //行数循环 $b = 2; foreach ($expTableData as $k => $row) { $a = 'A'; foreach ($row as $key => $value) { //这里是设置单元格的内容 $currentSheet->getCell($a . $b)->setValue($value); $a++; } $b++; } $PHPWriter = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($obj); $fileName = $excel . date('YmdHis') . '.xlsx'; $file_path = ROOT_PATH . 'public' . '/export/' . date('Y-m-d') . '/' . $fileName; // 创建文件夹 $path_info = pathinfo($file_path); if ($path_info['dirname'] && !is_dir($path_info['dirname'])) { $result = create_dir($path_info['dirname']); if (false === $result) { return false; } } $PHPWriter->save($file_path); $datas['filePath'] = '/' . 'export/' . date('Y-m-d') . '/' . $fileName; $datas['fileName'] = $fileName; $datas['size'] = filesize('./' . 'export/' . date('Y-m-d') . '/' . $fileName); return $datas; } } if (!function_exists('create_dir')){ /** * 创建文件夹,可以多级创建 * @param string $filename 需要创建的文件夹路径 * @return boolean */ function create_dir($filename) { if (!is_dir($filename)) { create_dir(dirname($filename)); return mkdir($filename, 0777); } return true; } } if (!function_exists('convertAmountToCn')){ /** * 将数值金额转换为中文大写金额 * @param $amount float 金额(支持到分) * @param $type int 补整类型,0:到角补整;1:到元补整 * @return mixed 中文大写金额 */ function convertAmountToCn($amount, $type = 1) { // 判断输出的金额是否为数字或数字字符串 if (!is_numeric($amount)) { return "要转换的金额只能为数字!"; } // 金额为0,则直接输出"零元整" if ($amount == 0) { return "人民币零元整"; } // 金额不能为负数 if ($amount < 0) { return "要转换的金额不能为负数!"; } // 金额不能超过万亿,即12位 if (strlen($amount) > 12) { return "要转换的金额不能为万亿及更高金额!"; } // 预定义中文转换的数组 $digital = array('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'); // 预定义单位转换的数组 $position = array('仟', '佰', '拾', '亿', '仟', '佰', '拾', '万', '仟', '佰', '拾', '元'); // 将金额的数值字符串拆分成数组 $amountArr = explode('.', $amount); // 将整数位的数值字符串拆分成数组 $integerArr = str_split($amountArr[0], 1); // 将整数部分替换成大写汉字 $result = ''; $integerArrLength = count($integerArr); // 整数位数组的长度 $positionLength = count($position); // 单位数组的长度 for ($i = 0; $i < $integerArrLength; $i++) { // 如果数值不为0,则正常转换 if ($integerArr[$i] != 0) { $result = $result . $digital[$integerArr[$i]] . $position[$positionLength - $integerArrLength + $i]; } else { // 如果数值为0, 且单位是亿,万,元这三个的时候,则直接显示单位 if (($positionLength - $integerArrLength + $i + 1) % 4 == 0) { $result = $result . $position[$positionLength - $integerArrLength + $i]; } } } // 如果小数位也要转换 if ($type == 0) { // 将小数位的数值字符串拆分成数组 $decimalArr = str_split($amountArr[1], 1); // 将角替换成大写汉字. 如果为0,则不替换 if ($decimalArr[0] != 0) { $result = $result . $digital[$decimalArr[0]] . '角'; } // 将分替换成大写汉字. 如果为0,则不替换 if ($decimalArr[1] != 0) { $result = $result . $digital[$decimalArr[1]] . '分'; } } else { $result = $result . '整'; } return $result; } } if (!function_exists('getItemNumber')) { function getItemNumber($type) { if ($type == 'quote') { return 'Q' . date('ymd') . rand(1, 9999); } if ($type == 'consume') { return 'F' . date('ymd') . rand(1, 9999); } if ($type == 'contract') { return 'K' . date('ymd') . rand(1, 9999); } if ($type == 'workorder') { return 'W' . date('ymd') . rand(1, 9999); } if ($type == 'export') { return 'Ck' . date('ymd') . rand(1, 9999); } if ($type == 'import') { return 'Rk' . date('ymd') . rand(1, 9999); } if ($type == 'receivables') { return 'R' . date('ymd') . rand(1, 9999); } return date('ymd') . rand(1, 9999); } } //获取date时间列表 if (!function_exists('getDateList')) { function getDateList($start_time, $end_time) { $data = []; for ($i = $start_time; $i < $end_time; $i = $i + 86400) { $data[] = date('Y-m-d', $i); } return $data; } } if (!function_exists('getRatio')) { //获取比例 function getRatio($number, $achievement) { if (empty($number)) { return 0; } if ($achievement == 0) { return 0; } return $achievement ? intval(sprintf("%.2f", $number / $achievement) * 100) : 0; } } //根据时间段获取所包含的年份 function getYearByTime($start_time, $end_time) { $yearArr = []; $monthArr = monthList($start_time, $end_time); foreach ($monthArr as $v) { $yearArr[date('Y',$v)] = date('Y',$v); } return array_values($yearArr); } /** * 生成从开始月份到结束月份的月份数组 * @param int $start 开始时间戳 * @param int $end 结束时间戳 */ function monthList($start,$end){ if (!is_numeric($start) || !is_numeric($end) || ($end <= $start)) return ''; $start = date('Y-m',$start); $end = date('Y-m',$end); //转为时间戳 $start = strtotime($start.'-01'); $end = strtotime($end.'-01'); $i = 0; $d = array(); while ($start <= $end) { //这里累加每个月的的总秒数 计算公式:上一月1号的时间戳秒数减去当前月的时间戳秒数 $d[$i] = $start; $start += strtotime('+1 month',$start)-$start; $i++; } return $d; } //根据时间段获取所包含的月份 function getmonthByTime($start_time, $end_time) { $monthList = []; $monthArr = monthList($start_time, $end_time); foreach ($monthArr as $v) { $monthList[date('Y',$v)][] = date('m',$v); } return $monthList; }