<?php

class Common_DataCache
{

    /*
     * 清除全部缓存
     */
    public static function clean($subDir = '', $directoryLevel = 0)
    {
        $cache = Ec::cache($subDir, $directoryLevel);
        return $cache->clean('all');
    }

    /*
     * 获取user_right_action数据
     * @param $operation bool 0=>返回缓存数据; 1=>先清除再重写缓存数据
     * @return array/null
     */
    public static function getUserRightAction($operation = 0)
    {
        $cacheName = 'user_right_action';
        $cache = Ec::cache('auth');
        if ($operation == 1) {
            $isRemove = $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $results = Service_UserRightAction::getAll();
            foreach ($results as $k => $v) {
                $result[$v['ura_id']] = $v;
            }
            $cache->setLifetime(24 * 3600); // 设置时间，为空则永久
            $cache->save($result, $cacheName);
        }
        return $result;
    }


    public static function getUserResource($operation = 0)
    {
        $cacheName = 'user_right_action_source';
        $cache = Ec::cache('auth');
        if ($operation == 1) {
            $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $results = self::getUserRightAction();
            foreach ($results as $k => $v) {
                $result[$v['ura_module'] . ':' . $v['ura_controller']] = $v['ura_module'] . ':' . $v['ura_controller'];
            }
            $cache->setLifetime(24 * 3600);
            $cache->save($result, $cacheName);
        }
        return $result;
    }

    public static function getUserMenu($operation = 0)
    {
        $cacheName = 'user_menu';
        $cache = Ec::cache('auth');
        if ($operation == 1) {
            $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $results = Service_UserMenu::getByCondition(array(), '*', 0, 0, 'um_sort asc');
            foreach ($results as $k => $v) {
                $result[$v['um_id']] = $v;
            }
            $cache->setLifetime(24 * 3600);
            $cache->save($result, $cacheName);
        }
        return $result;
    }

    public static function getUserRight($operation = 0)
    {
        $cacheName = 'user_right';
        $cache = Ec::cache('auth');
        if ($operation == 1) {
            $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $results = Service_UserRight::getByCondition(array(), '*', 0, 0, 'ur_sort asc');
            foreach ($results as $k => $v) {
                $result[$v['ur_id']] = $v;
            }
            $cache->setLifetime(24 * 3600);
            $cache->save($result, $cacheName);
        }
        return $result;
    }

    public static function getSystem($operation = 0)
    {
        $cacheName = 'user_system';
        $cache = Ec::cache('auth');
        if ($operation == 1) {
            $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $results = Service_UserSystem::getByCondition(array(), '*', 0, 0, 'us_sort asc');
            foreach ($results as $k => $v) {
                $result[$v['us_id']] = $v;
            }
            $cache->setLifetime(24 * 3600);
            $cache->save($result, $cacheName);
        }
        return $result;
    }

    public static function getDepartment($operation = 0)
    {
        $cacheName = 'user_department';
        $cache = Ec::cache('auth');
        if ($operation == 1) {
            $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $results = Service_UserDepartment::getByCondition(array(), '*', 0, 0, 'ud_sort asc');
            foreach ($results as $k => $v) {
                $result[$v['ud_id']] = $v;
            }
            $cache->setLifetime(24 * 3600);
            $cache->save($result, $cacheName);
        }
        return $result;
    }

    public static function getUserPosition($operation = 0)
    {
        $cacheName = 'user_position';
        $cache = Ec::cache('auth');
        if ($operation == 1) {
            $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $results = Service_UserPosition::getByCondition(array(), '*', 0, 0, 'up_id asc');
            foreach ($results as $k => $v) {
                $result[$v['up_id']] = $v;
            }
            $cache->setLifetime(24 * 3600);
            $cache->save($result, $cacheName);
        }
        return $result;
    }

    public static function getUserPositionLevel($operation = 0)
    {
        $cacheName = 'user_position_level';
        $cache = Ec::cache('auth');
        if ($operation == 1) {
            $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $results = Service_UserPositionLevel::getAll();
            foreach ($results as $k => $v) {
                $result[$v['upl_id']] = $v;
            }
            $cache->setLifetime(72 * 3600);
            $cache->save($result, $cacheName);
        }
        return $result;
    }

    public static function getCountry($operation = 0)
    {
        $cacheName = 'country';
        $cache = Ec::cache();
        if ($operation == 1) {
            $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $results = Service_Country::getByCondition(array(), '*', 0, 0, array('country_name_en asc', 'country_sort asc'));
            foreach ($results as $k => $v) {
                $result[$v['country_id']] = $v;
            }
            $cache->setLifetime(72 * 3600);
            $cache->save($result, $cacheName);
        }
        return $result;
    }

    public static function getWarehouse($operation = 0, $warehouseId = 0)
    {
        $cacheName = 'warehouse';
        $cache = Ec::cache('warehouse');
        if ($operation == 1) {
            $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $results = Service_Warehouse::getAll();
            foreach ($results as $k => $v) {
                $result[$v['warehouse_id']] = $v;
            }
            $cache->setLifetime(72 * 3600);
            $cache->save($result, $cacheName);
        }
        if ($warehouseId) {
            $result = $result[$warehouseId];
        }
        return $result;
    }

    public static function getWarehouseSimple($operation = 0, $warehouseId = 0)
    {
        $cacheName = 'warehouse_simple';
        $cache = Ec::cache('warehouse');
        if ($operation == 1) {
            $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $results = Service_Warehouse::getByCondition(array(), array('warehouse_code', 'warehouse_id'));
            foreach ($results as $k => $v) {
                $result[$v['warehouse_id']] = $v['warehouse_code'];
            }
            $cache->setLifetime(72 * 3600);
            $cache->save($result, $cacheName);
        }
        if ($warehouseId) {
            $result = $result[$warehouseId];
        }
        return $result;
    }

    public static function getQcOptions($operation = 0)
    {
        $cacheName = 'product_qc_options';
        $cache = Ec::cache('common');
        if ($operation == 1) {
            $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $results = Service_ProductQcOptions::getAll();
            foreach ($results as $k => $v) {
                $result[$v['pqo_id']] = $v;
            }
            $cache->setLifetime(36 * 3600);
            $cache->save($result, $cacheName);
        }
        return $result;
    }

    public static function getProductCategory($operation = 0)
    {
        $cacheName = 'product_category';
        $cache = Ec::cache('common');
        if ($operation == 1) {
            $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $results = Service_ProductCategory::getByCondition(array(), array('pc_id', 'pc_name_en','pc_shortname', 'warehouse_id','pc_name'), 0, 0, array('pc_sort_id'));
            foreach ($results as $k => $v) {
                $result[$v['pc_id']] = $v;
            }
            $cache->setLifetime(72 * 3600);
            $cache->save($result, $cacheName);
        }
        return $result;
    }

    public static function getCurrency($operation = 0)
    {
        $cacheName = 'currency';
        $cache = Ec::cache('common');
        if ($operation == 1) {
            $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $results = Service_Currency::getByCondition(array(), '*', 0, 0, array('currency_code'));
            foreach ($results as $k => $v) {
                $result[$v['currency_code']] = $v;
            }
            $cache->setLifetime(24 * 3600);
            $cache->save($result, $cacheName);
        }
        return $result;
    }

    public static function getWarehouseArea($operation = 0)
    {
        $cacheName = 'warehouse_area';
        $cache = Ec::cache('warehouse');
        if ($operation == 1) {
            $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $results = Service_WarehouseArea::getByCondition(array(), array('wa_code', 'wa_name', 'warehouse_id'), 0, 0, array('wa_code'));
            foreach ($results as $k => $v) {
                $result[$v['wa_code']] = $v;
            }
            $cache->setLifetime(24 * 3600);
            $cache->save($result, $cacheName);
        }
        return $result;
    }

    public static function getLocationType($operation = 0)
    {
        $cacheName = 'location_type';
        $cache = Ec::cache('warehouse');
        if ($operation == 1) {
            $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $results = Service_LocationType::getByCondition(array(), array('lt_code', 'lt_description', 'lt_status', 'warehouse_id'), 0, 0, array('lt_code'));
            foreach ($results as $k => $v) {
                $result[$v['lt_code']] = $v;
            }
            $cache->setLifetime(24 * 3600);
            $cache->save($result, $cacheName);
        }
        return $result;
    }

    public static function getShippingMethodSimple($operation = 0)
    {
        $cacheName = 'shipping_method_simple';
        $cache = Ec::cache('ship');
        if ($operation == 1) {
            $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $results = Service_ShippingMethod::getByCondition(array(), array('sm_id', 'sm_code','sm_name_cn', 'warehouse_id', 'sm_status'), 0, 0, array('sm_code','sm_sort'));
            foreach ($results as $k => $v) {
                $result[$v['sm_code']] = $v;
            }
            $cache->setLifetime(24 * 3600);
            $cache->save($result, $cacheName);
        }
        return $result;
    }
	

   /**
     * @author william-fan
     * @todo 运输方式和国家对应关系
     */
    public static function getShipTypeCountryMap($operation = 0)
    {
    	$cacheName = 'sm_country_map';
    	$cache = Ec::cache();
    	if ($operation == 1) {
    		$isRemove = $cache->remove($cacheName);
    	}
    	if (!$arr = $cache->load($cacheName)) {
    		$country = self::getCountry();
    		$arr = array();
    		foreach ($country as $k => $v) {
    			$map = Service_SmCountryMap::getByCondition(array(
    					'country_id' => $v['country_id'],
    					'or_country_id' => 0
    			), array(
    					'country_id',
    					'sm_code',
    					'warehouse_id'
    			), 0, 0, 'sm_code', 'sm_code');
    			$v['ship_type'] = $map;
    			if(!empty($map)){
    				$arr[$v['country_id']] = $v;
    			}
    		}
    		$cache->setLifetime(24 * 3600); // 设置时间，为空则永久
    		$cache->save($arr, $cacheName);
    	}
    
    	return $arr;
    }
	
	
   /**
     * @author william-fan
     * @todo 用于获取运输方式
     */
    public static function getShippingMethod($sm_id = 0, $operation = 0)
    {
    	$cacheName = 'shipping_method';
    	$cache = Ec::cache();
    	if ($operation == 1) {
    		$isRemove = $cache->remove($cacheName);
    	}
    	$arr = array();
    	if (!$arr = $cache->load($cacheName)) {
    		$result = Service_ShippingMethod::getAll();
    
    		foreach ($result as $ca) {
    			$arr[$ca['sm_id']] = $ca;
    		}
    		$cache->setLifetime(24 * 3600); // 设置时间，为空则永久
    		$cache->save($arr, $cacheName);
    	}
    	if ($sm_id) {
    		return isset($arr[$sm_id]) ? $arr[$sm_id] : array();
    	}
    	return $arr;
    }

    /**
     * 供应商基础数据缓存
     * @param unknown_type $operation
     * @return Ambigous <mixed, false, boolean, string, unknown>
     */
    public static function getBank($operation = 0)
    {
        $cacheName = 'bank';
        $cache = Ec::cache('financial');
        if ($operation == 1) {
            $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $results = Service_Bank::getAll();
            foreach ($results as $k => $v) {
                $result[$v['bk_code']] = $v;
            }
            ksort($result);
            $cache->setLifetime(24 * 3600);
            $cache->save($result, $cacheName);
        }
        return $result;
    }
    
    /**
     * 服务商基础数据缓存
     * @param unknown_type $operation
     * @return Ambigous <mixed, false, boolean, string, unknown>
     */
    public static function getProvider($operation = 0)
    {
        $cacheName = 'provider';
        $cache = Ec::cache('financial');
        if ($operation == 1) {
            $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $results = Service_ServiceProvider::getAll();
            foreach ($results as $k => $v) {
                $result[$v['sp_code']] = $v;
            }
            $cache->setLifetime(24 * 3600);
            $cache->save($result, $cacheName);
        }
        return $result;
    }
    /**
     * @author william-fan
     * @todo 缓存财务数据
     */
    public static function getImportData($id_id,$operation = 0)
    {
        $cacheName = 'import_data';
        $cache = Ec::cache('data'.$id_id);
        if ($operation == 1) {
            $cache->remove($cacheName);
        }
        if (!$result = $cache->load($cacheName)) {
            $idRow = Service_ImportData::getByField($id_id, 'id_id');
            $columnMap = Process_ImportDataProcess::columnMap($idRow['id_code']);
            $columnMapKey = array_flip($columnMap);

            $condition['id_id'] = $id_id;
            $rows = Table_ImportDataDetailFormat::getInstance()->getGroupByCondition($condition, array('id_id', 'iddf_rowno',''), 0, 0, array("id_id"));
            $data = array();
            foreach ($rows as $key => $row) {
                $list = Service_ImportDataDetailFormat::getByCondition(array('id_id' => $row['id_id'], 'iddf_rowno' => $row['iddf_rowno']), '*', 0, 0, array('iddf_rowno asc'));
                foreach ($list as $ro) {
                    if (isset($columnMapKey[$ro['iddf_code']])) {
                        $data[$key][$ro['iddf_code']] = $ro['iddf_value'];
                    }
                }
            }
            /*
            $results = Service_ServiceProvider::getAll();
            foreach ($results as $k => $v) {
                $result[$v['sp_code']] = $v;
            }*/
            $cache->setLifetime(24 * 3600);
            $cache->save($data, $cacheName);
            return $data;
        }
        return $result;
    }

}