Files
OMS/app/eccommon/model/currency.php
2026-01-04 19:08:31 +08:00

424 lines
12 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Copyright 2012-2026 ShopeX (https://www.shopex.cn)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
class eccommon_mdl_currency extends dbeav_model {
var $idColumn = 'cur_code';
var $textColumn = 'cur_name';
function __construct(&$app)
{
parent::__construct($app);
$this->oMath = kernel::single('eccommon_math');
}//End Function
/**
* getSysCur
*
* @param boolean $pass_exist false // 是否过滤掉当前已入库的货币(unqiue index)
* @param string $pass_except '' // 过滤时 要保留当前的(修改货币设置时使用)
* @param boolean $is_sign // 是否还有货币符号
* @return array
* @access public
*/
public function getSysCur($pass_exist = false,$pass_except = '',$is_sign=true)
{
$return = array();
$aFilter = array();
if($pass_exist) {
$aFilter = $this->curAll(); //获取已入库的所有货币
$aFilter = $this->array_change_key($aFilter,'cur_code');
if(!empty($pass_except) && array_search($pass_except, $aFilter) !== false)
{
$key = array_search($pass_except, $aFilter);
unset($aFilter[$key]);
}
}
//使用文件方式 读取一定格式文件
foreach (file($this->app->app_dir.'/currency.txt') as $row)
{
list($code,$sign,$cnname,$enname) = explode("\t",trim($row));
if(in_array($code,$aFilter)) continue;
if ($is_sign)
$return[$code] = $sign.' '.$cnname;
else
$return[$code] = $cnname;
}
return $return;
}
/**
* This is method array_change_key
* 使用二维数据内部key代替外部key
* @param mixed $aArray This is a description
* @param mixed $aKey This is a description
* @return mixed This is the return value description
*
*/
function array_change_key($aArray=array(),$aKey=''){
$tmpArray= array();
if( is_array($aArray)){
foreach($aArray as $subKey => $subVal){
$tmpArray[$subKey]=@$subVal[$aKey];
}
}
return $tmpArray;
}
/**
* 获得数据库中的所有数据
* @params null
* @params array 货币数组
*/
public function curAll(){
$arr_curs = $this->getList('*', '', 0, -1);
return $arr_curs;
}
/**
* 得到指定currency code 对应的货币信息
* @params string currency code
* @return array 货币信息数组
*/
public function getcur($curCode){
if (!$this->_in_cur || (isset($this->_in_cur['cur_code']) && $this->_in_cur['cur_code'] != $curCode))
{
$filter = array(
'cur_code' => $curCode
);
$aCur = $this->dump($filter, '*');
if($aCur['cur_code']){
return $this->_in_cur = $aCur;
}else{
if (!$aCur)
{
$this->_default_cur = $this->db->selectrow('select * FROM sdb_eccommon_currency WHERE cur_default="true"');
if (!isset($this->_default_cur) || !$this->_default_cur)
{
//使用文件方式 读取一定格式文件
foreach(file($this->app->app_dir.'/currency.txt') as $row){
list($code,$sign,$cnname,$enname) = explode("\t",trim($row));
if(!in_array($code,$filter)) continue;
$this->_default_cur = array(
'cur_code' => $code,
'cur_name' => $cnname,
'cur_sign' => $sign,
'cur_rate' => 1,
);
return $this->_in_cur = $this->_default_cur;
}
}
}
$this->_in_cur = $aCur;
$arrDef = $this->getDefault();
$this->_in_cur = $arrDef;
return $this->_in_cur;
}
}
else
{
return $this->_in_cur;
}
}
/**
* 得到默认货币的信息
* @params null
* @return array 货币信息的数组
*/
public function getDefault(){
if(!$this->_default_cur){
$defCur = app::get('eccommon')->getConf('site.currency.defalt_currency');
$filter = array(
'cur_code' => $defCur
);
if (!($this->_default_cur = $this->dump($filter, '*'))) {
$this->_default_cur = $this->db->selectrow('SELECT * FROM `sdb_eccommon_currency` WHERE `cur_default`=\'true\'');
if (!isset($this->_default_cur) || !$this->_default_cur)
{
//使用文件方式 读取一定格式文件
foreach(file($this->app->app_dir.'/currency.txt') as $row){
list($code,$sign,$cnname,$enname) = explode("\t",trim($row));
if(!in_array($code,$filter)) continue;
$this->_default_cur = array(
'cur_code' => $code,
'cur_name' => $cnname,
'cur_sign' => $sign,
'cur_rate' => 1,
);
return $this->_default_cur;
}
}
}
}
return $this->_default_cur;
}
/**
* 清空默认属性
* @params null
* @return null
*/
public function set_currency_default()
{
$arrCurs = $this->curAll();
if ($arrCurs)
$this->update(array('cur_default' => 'false'), array());
}
//一下方法需要调整
public function getFormat($cur=null){
$ret = array();
if(!$cur) {
$cursign = $this->getDefault();
}else{
$cursign = $this->getcur($cur);
}
$ret['sign'] = $cursign['cur_sign'];
return $ret;
}
/**
* 商店币别金额显示统一调用函数
* @params float $money 金额
* @params string $currency 显示的货币种类如CNY/USD
* @params bool $is_sign 是否不带货币符号显示
* @params bool $is_rate 是否按汇率显示
* @return bool
*/
public function changer($money, $currency='', $is_sign=false, $is_rate=false)
{
// 异常处理
if ($money === null)
{
$money = intval($money);
}
// 获取货币金额
$cur_money = $this->get_cur_money($money, $currency);
if($is_rate){
$cur_money = $money;
}
// 格式化货币
if($is_sign)
{
return $this->formatNumber($cur_money, false, false);
}
else
{
return $this->_in_cur['cur_sign'] . $this->formatNumber($cur_money, false);
}
}
/**
* 商店币别金额显示统一调用函数(订单)
* @params float $money 金额
* @params string $currency 显示的货币种类如CNY/USD
* @params bool $is_sign 是否不带货币符号显示
* @params bool $is_rate 是否按汇率显示
* @return bool
*/
public function changer_odr($money, $currency='', $is_sign=false, $is_rate=false, $decimals='2', $operation_carryset='0')
{
// 异常处理
if ($money === null)
{
$money = intval($money);
}
// 获取货币金额
$cur_money = $this->get_cur_money($money, $currency);
if($is_rate){
$cur_money = $money;
}
$cur_money = $this->oMath->formatNumber($cur_money, $decimals, $operation_carryset);
// 格式化货币
if($is_sign)
{
return $cur_money;
}
else
{
return $this->_in_cur['cur_sign'] . $cur_money;
}
}
/**
* 读取货币金额
* @param float $money 金额
* @param string $currency 货币种类如CNY/USD
* @return string 货币兑换后的金额
*/
public function get_cur_money($money, $currency=''){
// 异常处理
if ($money === null)
{
$money = intval($money);
}
if(empty($currency))
{
$arrDef = $this->getDefault();
$currency = ($this->system->request['cur']) ? $this->system->request['cur'] : $arrDef['cur_code'];
}
if($currency){
$this->_in_cur = $this->getcur($currency);
}
return $this->oMath->number_multiple(array($money, ($this->_in_cur['cur_rate'] ? $this->_in_cur['cur_rate'] : 1)));
}
/**
* 得到货币的中文名字
* @params string - currency code
* @return string - cur_name
*/
public function get_cur_name($currency='')
{
if ($currency == '')
return '';
$this->_in_cur = $this->getcur($currency, true);
return $this->_in_cur['cur_name'];
}
/**
* 商店货币总额显示调整函数 - 默认没有基本格式数据,需要改变费率的
* @params int 货币金额
* @params string 货币币种
* @params boolean 是否为基本数据格式
* @params boolean 是否需要改变费率
*/
public function amount($money,$currency='',$basicFormat=false,$chgval=true){
// 异常处理
if ($money === null)
{
$money = intval($money);
}
if(empty($currency))
{
$arrDef = $this->getDefault();
$currency = ($this->system->request['cur']) ? $this->system->request['cur'] : $arrDef['cur_code'];
}
if($currency)
{
$this->_in_cur = $this->getcur($currency);
}
if($chgval){
$money = $this->oMath->number_multiple(array($money, ($this->_in_cur['cur_rate'] ? $this->_in_cur['cur_rate'] : 1)));
}
$money = $this->oMath->getOperationNumber($money);
$money = $this->formatNumber($money);
if($basicFormat){
return $money;
}
$precision = app::get('eccommon')->getConf('site.decimal_digit.display');
return $this->_in_cur['cur_sign'] . $money;
}
/**
* 商店总额显示调整函数 - 默认没有基本格式数据,需要改变费率的
* @params int 货币金额
* @params string 货币币种
* @params boolean 是否为基本数据格式
* @params boolean 是否需要改变费率
*/
public function amount_nocur($money,$currency='',$basicFormat=false,$chgval=true){
// 异常处理
if ($money === null)
{
$money = intval($money);
}
if(empty($currency))
{
$arrDef = $this->getDefault();
$currency = ($_REQUEST['cur']) ? $_REQUEST['cur'] : $arrDef['cur_code'];
}
if($currency){
$this->_in_cur = $this->getcur($currency);
}
if($chgval){
$money = $money*($this->_in_cur['cur_rate'] ? $this->_in_cur['cur_rate'] : 1);
}
$money = $this->oMath->getOperationNumber($money);
if($basicFormat){
return $money;
}
$precision = app::get('eccommon')->getConf('site.decimal_digit.display');
return $money;
}
/**
* 取回格式化的数据,供运算使用
* @params int 货币金额
* @params boolean 是否是计算
* @params boolean 是否不带货币符号显示
* @return string 格式化后的金额
*/
public function formatNumber($number, $is_count=true, $is_str=true){
// 异常处理
if ($number === null)
{
$money = intval($money);
}
// 取到格式化后的数值
$number = $this->oMath->getOperationNumber($number, $is_count);
if (!$is_count)
$this->_money_format['decimals'] = $this->oMath->goodsShowDecimals;
else
$this->_money_format['decimals'] = $this->oMath->operationDecimals;
if($is_str)
{
return number_format(trim($number),
$this->_money_format['decimals'],
$this->_money_format['dec_point'],$this->_money_format['thousands_sep']);
}
else
return number_format(trim($number), $this->_money_format['decimals'], '.', '');
}
}
?>