common.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: 流年 <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11. // 应用公共文件
  12. /**
  13. * +----------------------------------------------------------
  14. * 产生随机字串,可用来自动生成密码 默认长度6位 字母和数字混合
  15. * +----------------------------------------------------------
  16. * @param string $len 长度
  17. * @param string $type 字串类型
  18. * 0 字母 1 数字 其它 混合
  19. * @param string $addChars 额外字符
  20. * +----------------------------------------------------------
  21. * @return string
  22. * +----------------------------------------------------------
  23. */
  24. function rand_string($len = 6, $type = '', $addChars = '')
  25. {
  26. $str = '';
  27. switch ($type) {
  28. case 0:
  29. $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' . $addChars;
  30. break;
  31. case 1:
  32. $chars = str_repeat('0123456789', 3);
  33. break;
  34. case 2:
  35. $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' . $addChars;
  36. break;
  37. case 3:
  38. $chars = 'abcdefghijklmnopqrstuvwxyz' . $addChars;
  39. break;
  40. case 4:
  41. $chars = "们以我到他会作时要动国产的一是工就年阶义发成部民可出能方进在了不和有大这主中人上为来分生对于学下级地个用同行面说种过命度革而多子后自社加小机也经力线本电高量长党得实家定深法表着水理化争现所二起政三好十战无农使性前等反体合斗路图把结第里正新开论之物从当两些还天资事队批点育重其思与间内去因件日利相由压员气业代全组数果期导平各基或月毛然如应形想制心样干都向变关问比展那它最及外没看治提五解系林者米群头意只明四道马认次文通但条较克又公孔领军流入接席位情运器并飞原油放立题质指建区验活众很教决特此常石强极土少已根共直团统式转别造切九你取西持总料连任志观调七么山程百报更见必真保热委手改管处己将修支识病象几先老光专什六型具示复安带每东增则完风回南广劳轮科北打积车计给节做务被整联步类集号列温装即毫知轴研单色坚据速防史拉世设达尔场织历花受求传口断况采精金界品判参层止边清至万确究书术状厂须离再目海交权且儿青才证低越际八试规斯近注办布门铁需走议县兵固除般引齿千胜细影济白格效置推空配刀叶率述今选养德话查差半敌始片施响收华觉备名红续均药标记难存测士身紧液派准斤角降维板许破述技消底床田势端感往神便贺村构照容非搞亚磨族火段算适讲按值美态黄易彪服早班麦削信排台声该击素张密害侯草何树肥继右属市严径螺检左页抗苏显苦英快称坏移约巴材省黑武培著河帝仅针怎植京助升王眼她抓含苗副杂普谈围食射源例致酸旧却充足短划剂宣环落首尺波承粉践府鱼随考刻靠够满夫失包住促枝局菌杆周护岩师举曲春元超负砂封换太模贫减阳扬江析亩木言球朝医校古呢稻宋听唯输滑站另卫字鼓刚写刘微略范供阿块某功套友限项余倒卷创律雨让骨远帮初皮播优占死毒圈伟季训控激找叫云互跟裂粮粒母练塞钢顶策双留误础吸阻故寸盾晚丝女散焊功株亲院冷彻弹错散商视艺灭版烈零室轻血倍缺厘泵察绝富城冲喷壤简否柱李望盘磁雄似困巩益洲脱投送奴侧润盖挥距触星松送获兴独官混纪依未突架宽冬章湿偏纹吃执阀矿寨责熟稳夺硬价努翻奇甲预职评读背协损棉侵灰虽矛厚罗泥辟告卵箱掌氧恩爱停曾溶营终纲孟钱待尽俄缩沙退陈讨奋械载胞幼哪剥迫旋征槽倒握担仍呀鲜吧卡粗介钻逐弱脚怕盐末阴丰雾冠丙街莱贝辐肠付吉渗瑞惊顿挤秒悬姆烂森糖圣凹陶词迟蚕亿矩康遵牧遭幅园腔订香肉弟屋敏恢忘编印蜂急拿扩伤飞露核缘游振操央伍域甚迅辉异序免纸夜乡久隶缸夹念兰映沟乙吗儒杀汽磷艰晶插埃燃欢铁补咱芽永瓦倾阵碳演威附牙芽永瓦斜灌欧献顺猪洋腐请透司危括脉宜笑若尾束壮暴企菜穗楚汉愈绿拖牛份染既秋遍锻玉夏疗尖殖井费州访吹荣铜沿替滚客召旱悟刺脑措贯藏敢令隙炉壳硫煤迎铸粘探临薄旬善福纵择礼愿伏残雷延烟句纯渐耕跑泽慢栽鲁赤繁境潮横掉锥希池败船假亮谓托伙哲怀割摆贡呈劲财仪沉炼麻罪祖息车穿货销齐鼠抽画饲龙库守筑房歌寒喜哥洗蚀废纳腹乎录镜妇恶脂庄擦险赞钟摇典柄辩竹谷卖乱虚桥奥伯赶垂途额壁网截野遗静谋弄挂课镇妄盛耐援扎虑键归符庆聚绕摩忙舞遇索顾胶羊湖钉仁音迹碎伸灯避泛亡答勇频皇柳哈揭甘诺概宪浓岛袭谁洪谢炮浇斑讯懂灵蛋闭孩释乳巨徒私银伊景坦累匀霉杜乐勒隔弯绩招绍胡呼痛峰零柴簧午跳居尚丁秦稍追梁折耗碱殊岗挖氏刃剧堆赫荷胸衡勤膜篇登驻案刊秧缓凸役剪川雪链渔啦脸户洛孢勃盟买杨宗焦赛旗滤硅炭股坐蒸凝竟陷枪黎救冒暗洞犯筒您宋弧爆谬涂味津臂障褐陆啊健尊豆拔莫抵桑坡缝警挑污冰柬嘴啥饭塑寄赵喊垫丹渡耳刨虎笔稀昆浪萨茶滴浅拥穴覆伦娘吨浸袖珠雌妈紫戏塔锤震岁貌洁剖牢锋疑霸闪埔猛诉刷狠忽灾闹乔唐漏闻沈熔氯荒茎男凡抢像浆旁玻亦忠唱蒙予纷捕锁尤乘乌智淡允叛畜俘摸锈扫毕璃宝芯爷鉴秘净蒋钙肩腾枯抛轨堂拌爸循诱祝励肯酒绳穷塘燥泡袋朗喂铝软渠颗惯贸粪综墙趋彼届墨碍启逆卸航衣孙龄岭骗休借" . $addChars;
  42. break;
  43. case 5:
  44. $chars = 'ABCDEFGHIJKMNPQRSTUVWXYZ23456789' . $addChars;
  45. break;
  46. default:
  47. // 默认去掉了容易混淆的字符oOLl和数字01,要添加请使用addChars参数
  48. $chars = 'ABCDEFGHIJKMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789' . $addChars;
  49. break;
  50. }
  51. if ($len > 10) {
  52. //位数过长重复字符串一定次数
  53. $chars = $type == 1 ? str_repeat($chars, $len) : str_repeat($chars, 5);
  54. }
  55. if ($type != 4) {
  56. $chars = str_shuffle($chars);
  57. $str = substr($chars, 0, $len);
  58. } else {
  59. // 中文随机字
  60. for ($i = 0; $i < $len; $i++) {
  61. $str .= msubstr($chars, floor(mt_rand(0, mb_strlen($chars, 'utf-8') - 1)), 1);
  62. }
  63. }
  64. return $str;
  65. }
  66. /**
  67. * 字符串截取,支持中文和其他编码
  68. * @static
  69. * @access public
  70. * @param string $str 需要转换的字符串
  71. * @param string $start 开始位置
  72. * @param string $length 截取长度
  73. * @param string $charset 编码格式
  74. * @param string $suffix 截断显示字符
  75. * @return string
  76. */
  77. function msubstr($str, $start = 0, $length, $charset = "utf-8", $suffix = true)
  78. {
  79. if (function_exists("mb_substr")) {
  80. $slice = mb_substr($str, $start, $length, $charset);
  81. } elseif (function_exists('iconv_substr')) {
  82. $slice = iconv_substr($str, $start, $length, $charset);
  83. if (false === $slice) {
  84. $slice = '';
  85. }
  86. } else {
  87. $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
  88. $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
  89. $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
  90. $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
  91. preg_match_all($re[$charset], $str, $match);
  92. $slice = join("", array_slice($match[0], $start, $length));
  93. }
  94. if (strlen($slice) == strlen($str)) {
  95. return $slice;
  96. } else {
  97. return $suffix ? $slice . '...' : $slice;
  98. }
  99. }
  100. /**
  101. * 获取社保配置信息
  102. * @return array|mixed
  103. * @throws \think\db\exception\DataNotFoundException
  104. * @throws \think\db\exception\ModelNotFoundException
  105. * @throws \think\exception\DbException
  106. */
  107. function getSocialConf($type = null)
  108. {
  109. $data = cache('sys_social_conf');
  110. /* 获取缓存数据 */
  111. if (empty($data)) {
  112. $configs = model('Config')
  113. ->field('name,title,value,extra,group1,group2')
  114. ->where('group1', 'in', ['social', 'fund', 'service', 'basic', 'others'])
  115. ->select();
  116. $data = array(
  117. 'farmer' => array(
  118. 'social' => [],
  119. 'basic' => [],
  120. 'fund' => [],
  121. 'service' => []
  122. ),
  123. 'town' => array(
  124. 'social' => [],
  125. 'basic' => [],
  126. 'fund' => [],
  127. 'service' => []
  128. ),
  129. );
  130. foreach ($configs as $config) {
  131. $data[$config['group2']][$config['group1']][$config['name']] = array(floatval($config['value']), floatval($config['extra']), $config['title']);
  132. }
  133. cache('sys_social_conf', $data);
  134. }
  135. if ($type) {
  136. $type = $type == 1 ? 'town' : 'farmer';
  137. $data = $data[$type];
  138. }
  139. Log::record($data);
  140. return $data;
  141. }
  142. /**
  143. * 获取前100名折扣优惠名额
  144. * @return array
  145. * @throws \think\db\exception\DataNotFoundException
  146. * @throws \think\db\exception\ModelNotFoundException
  147. * @throws \think\exception\DbException
  148. */
  149. function getTopDiscountsCoupon()
  150. {
  151. $coupon = cache('sys_top_discounts_coupon');
  152. if (empty($coupon)) {
  153. $map = array(
  154. ['cid', '=', 1],
  155. ['type', '=', 1],
  156. ['status', 'in', '1,2']
  157. );
  158. $coupon = model('Coupon')->field('id,value,number,period')->where('id', 1)->find()->toArray();
  159. $coupon['issue'] = model('CouponReceive')->where($map)->count();
  160. cache('sys_top_discounts_coupon', $coupon, 600);
  161. }
  162. return $coupon;
  163. }
  164. /**
  165. * 获取服务费缴费券
  166. *
  167. * @param $uid
  168. * @param $type 社保|社保公积金
  169. * @return array|mixed
  170. * @throws \think\db\exception\DataNotFoundException
  171. * @throws \think\db\exception\ModelNotFoundException
  172. * @throws \think\exception\DbException
  173. */
  174. function getServiceDeductionCoupon($uid, $type = 'social')
  175. {
  176. $data = cache('sys_service_deduction_coupon_' . $uid);
  177. if (empty($data)) {
  178. $map = array(
  179. ['uid', '=', $uid],
  180. ['cid', '=', $type == 'social' ? 2 : 3],
  181. ['type', '=', 2],
  182. ['status', '=', '1']
  183. );
  184. $coupon = model('CouponReceive')->field('id')->where($map)->select()->toArray();
  185. $data = array(count($coupon), $coupon);
  186. cache('sys_service_deduction_coupon_' . $uid, $data, 600);
  187. }
  188. return $data;
  189. }
  190. /**
  191. * 计算费用明细
  192. * @param $param
  193. * @param string $type
  194. * @return array
  195. * @throws \think\db\exception\DataNotFoundException
  196. * @throws \think\db\exception\ModelNotFoundException
  197. * @throws \think\exception\DbException
  198. */
  199. function getCalcBill($param, $type = 'order')
  200. {
  201. if($param['social_type'] > 2){
  202. $param['social_type'] -= 2;
  203. }
  204. $conf = getSocialConf($param['social_type']);
  205. //缴费标准
  206. $socialBase = $param['social_basic']<=$conf['basic']['health'][0] ? $conf['basic'] : array(
  207. 'pension' => [$param['social_basic']],
  208. 'health' => [$param['social_basic']],
  209. 'unemployment' => [$param['social_basic']],
  210. 'injury' => [$param['social_basic']],
  211. 'birth' => [$param['social_basic']],
  212. );
  213. //基本社保
  214. \think\facade\Log::record($conf['social']);
  215. $bill = array(
  216. 'social' => array(
  217. 'pension' => [
  218. sprintf('%.2f', $socialBase['pension'][0] * ($conf['social']['pension'][0] + $conf['social']['pension'][1])),
  219. $conf['social']['pension'][2],
  220. ],
  221. 'health' => [
  222. sprintf('%.2f', $socialBase['health'][0] * ($conf['social']['health'][0] + $conf['social']['health'][1])),
  223. $conf['social']['health'][2],
  224. ],
  225. 'unemployment' => [
  226. sprintf('%.2f', $socialBase['unemployment'][0] * ($conf['social']['unemployment'][0] + $conf['social']['unemployment'][1])),
  227. $conf['social']['unemployment'][2],
  228. ],
  229. 'injury' => [
  230. sprintf('%.2f', $socialBase['injury'][0] * ($conf['social']['injury'][0] + $conf['social']['injury'][1])),
  231. $conf['social']['injury'][2],
  232. ],
  233. 'birth' => [
  234. sprintf('%.2f', $socialBase['birth'][0] * ($conf['social']['birth'][0] + $conf['social']['birth'][1])),
  235. $conf['social']['birth'][2],
  236. ],
  237. 'largeMedic' => [
  238. sprintf('%.2f', $conf['social']['largeMedic'][0] + $conf['social']['largeMedic'][1]),
  239. $conf['social']['largeMedic'][2],
  240. ],
  241. )
  242. );
  243. if ($type == 'order') {
  244. $bill['service_type'] = $param['service_type'];
  245. $bill['service'] = sprintf('%.2f', $conf['service'][$param['service_type']][0]);
  246. }
  247. if (isset($conf['others'])) {
  248. $bill['others'] = sprintf('%.2f', $conf['others']);
  249. }
  250. //社保小计
  251. $bill['subtotal'] = 0;
  252. foreach ($bill['social'] as $i) {
  253. $bill['subtotal'] += $i[0];
  254. }
  255. $bill['subtotal'] = sprintf('%.2f', $bill['subtotal']);
  256. $couponType = 'social';
  257. $bill['fund'] = 0;
  258. //是否缴纳公积金
  259. if (isset($param['fund_basic'])) {
  260. $fundBase = $param['fund_basic'] <= $conf['basic']['fund'][0] ? $conf['basic']['fund'][0] : $param['fund_basic'];
  261. $bill['fund'] = sprintf('%.2f', $fundBase * ($conf['fund']['fund'][0] + $conf['fund']['fund'][1]));
  262. $type == 'order' && ($bill['service'] = sprintf('%.2f', $conf['service'][$param['service_type']][1]));
  263. $couponType = 'all';
  264. }
  265. if ($type == 'order') {
  266. //检查服务费抵扣余量,即是否已缴费
  267. $bill['coupon'] = 0;
  268. $deduction = getServiceDeductionCoupon($param['uid'], $couponType);
  269. if ($deduction[0] > 0) {
  270. //服务费为0,记录待使用缴费券id
  271. $bill['service'] = 0;
  272. $bill['coupon'] = $deduction[1];
  273. } else {
  274. //检查半价优惠名额
  275. $discounts = getTopDiscountsCoupon();
  276. if ($discounts['issue'] < $discounts['number']) {
  277. //服务费折扣,记录折扣券信息
  278. $bill['service'] *= $discounts['value'];
  279. $bill['coupon'] = 0;
  280. $bill['discounts'] = true;
  281. }else{
  282. $bill['discounts'] = false;
  283. }
  284. }
  285. }
  286. $bill['total'] = sprintf('%.2f', (float)$bill['subtotal'] + (float)$bill['fund']);
  287. if($type == 'order'){
  288. $bill['service'] = sprintf('%.2f', $bill['service']);
  289. $bill['total'] += (float)$bill['service'];
  290. };
  291. //总计
  292. return $bill;
  293. }
  294. function arrayToXml($arr, $root)
  295. {
  296. $xml = '<' . $root . '>';
  297. foreach ($arr as $key => $val) {
  298. if (is_array($val)) {
  299. $xml .= '<' . $key . '>' . $this->arrayToXml($val, $root) . '</' . $key . '>';
  300. } else {
  301. $xml .= '<' . $key . '>' . $val . '</' . $key . '>';
  302. }
  303. }
  304. $xml .= '</' . $root . '>';
  305. return $xml;
  306. }
  307. function isActivity()
  308. {
  309. $data = cache('sys_activity_conf');
  310. /* 获取缓存数据 */
  311. if (empty($list)) {
  312. $conf = model('Config')
  313. ->field('name,value,extra')
  314. ->where('name', 'activity')
  315. ->find();
  316. $data = $conf['value'] == 'on' ? $conf['extra'] : $conf['value'];
  317. cache('sys_activity_conf', $data);
  318. }
  319. return $data;
  320. }
  321. function xmlToArray($xml)
  322. {
  323. libxml_disable_entity_loader(true);
  324. $val = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
  325. return $val;
  326. }
  327. /**
  328. * 下划线转驼峰
  329. * 思路:
  330. * step1.原字符串转小写,原字符串中的分隔符用空格替换,在字符串开头加上分隔符
  331. * step2.将字符串中每个单词的首字母转换为大写,再去空格,去字符串首部附加的分隔符.
  332. */
  333. function camelize($uncamelized_words, $separator = '_')
  334. {
  335. $uncamelized_words = $separator . str_replace($separator, " ", strtolower($uncamelized_words));
  336. return ltrim(str_replace(" ", "", ucwords($uncamelized_words)), $separator);
  337. }
  338. /**
  339. * 驼峰命名转下划线命名
  340. * 思路:
  341. * 小写和大写紧挨一起的地方,加上分隔符,然后全部转小写
  342. */
  343. function uncamelize($camelCaps, $separator = '_')
  344. {
  345. \think\facade\Log::record(preg_replace('/([a-z])([A-Z])/', "$1" . $separator . "$2", $camelCaps));
  346. return strtolower(preg_replace('/([a-z])([A-Z])/', "$1" . $separator . "$2", $camelCaps));
  347. }
  348. /**
  349. * 导出excel
  350. * @param $strTable 表格内容
  351. * @param $filename 文件名
  352. */
  353. function downloadExcel($strTable,$filename)
  354. {
  355. header("Content-type: application/vnd.ms-excel");
  356. header("Content-Type: application/force-download");
  357. header("Content-Disposition: attachment; filename=".$filename."_".date('Y-m-d').".xls");
  358. header('Expires:0');
  359. header('Pragma:public');
  360. echo '<html><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'.$strTable.'</html>';
  361. }