stanley-king 3 yıl önce
ebeveyn
işleme
d3ae299b9f

+ 2 - 2
data/config/dev/refill.ini.php

@@ -20,8 +20,8 @@ $tianjt_oil = ['name' => 'tianjt', 'store_id' => 7,'qualitys' => '1',
     'amount' => [
         100 => [['goods_id' => 6290, 'price' => 97.0, 'quality' => 1, 'card_type' => 'sinopec']],
         200 => [['goods_id' => 6291, 'price' => 194, 'quality' => 1, 'card_type' => 'sinopec']],
-        500 => [['goods_id' => 6292, 'price' => 485, 'quality' => 1, 'card_type' => 'sinopec']],
-        1000 => [['goods_id' => 6293, 'price' => 970, 'quality' => 1, 'card_type' => 'sinopec']]
+        500 => [['goods_id' => 6292, 'price' => 486, 'quality' => 1, 'card_type' => 'sinopec']],
+        1000 => [['goods_id' => 6293, 'price' => 971, 'quality' => 1, 'card_type' => 'sinopec']]
     ],
     'period' => ['start' => '8:30', 'end' => '22:20'], 'refill_type' => 'api'];
 

+ 21 - 0
data/model/provider_price.model.php

@@ -0,0 +1,21 @@
+<?php
+
+defined('InShopNC') or exit('Access Invalid!');
+
+class provider_priceModel extends Model
+{
+    public function __construct()
+    {
+        parent::__construct('provider_price');
+    }
+
+    public function getPirce($cond,$fields = '*', $master = false,$lock=false)
+    {
+        return $this->field($fields)->where($cond)->master($master)->lock($lock)->find();
+    }
+
+    public function getPirces($cond,$fields = '*')
+    {
+        return $this->field($fields)->where($cond)->select();
+    }
+}

+ 6 - 0
helper/refill/ProviderManager.php

@@ -10,6 +10,7 @@ require_once(BASE_HELPER_PATH . '/refill/IRefillPhone.php');
 require_once(BASE_HELPER_PATH . '/refill/IRefillCallBack.php');
 require_once(BASE_HELPER_PATH . '/refill/CalcMerchantPrice.php');
 require_once(BASE_HELPER_PATH . '/refill/util.php');
+require_once(BASE_HELPER_PATH . '/refill/chprice_helper.php');
 
 use Log;
 use mtopcard;
@@ -134,8 +135,13 @@ class ProviderManager
             $channels = $this->read_channel();
 
             global $config;
+
+            $chprice_helper = new chprice_helper();
+            $chprice_helper->load_from_db();
+
             $this->map_cfg($config['phone_providers'],'RefillPhone',$channels);
             $this->map_cfg($config['oil_providers'],'RefillOil',$channels);
+
             $this->map_cfg($config['third_providers'],'RefillPhone',$channels);
             $this->mOpenedProviderNames = array_unique($this->mOpenedProviderNames);
 

+ 1 - 1
helper/refill/XYZRefillFactory.php

@@ -30,7 +30,7 @@ require_once(BASE_HELPER_PATH . '/refill/policy/mratio_control.php');
 require_once(BASE_HELPER_PATH . '/refill/policy/overload_assigner.php');
 require_once(BASE_HELPER_PATH . '/refill/policy/interceptor.php');
 require_once(BASE_HELPER_PATH . '/refill/functional.php');
-
+require_once(BASE_HELPER_PATH . '/refill/chprice_helper.php');
 
 use Log;
 use StatesHelper;

+ 155 - 0
helper/refill/chprice_helper.php

@@ -0,0 +1,155 @@
+<?php
+
+namespace refill;
+
+use mtopcard;
+use trans_wapper;
+use Exception;
+use Log;
+
+class chprice_helper
+{
+    public function update_from_file()
+    {
+        include(BASE_CONFIG_PATH . CONFIG_PREFIX . '/refill.ini.php');
+        global $config;
+
+        $oils = $config['oil_providers'];
+        $phones = $config['phone_providers'];
+        $this->update_db($oils,mtopcard\OilCardPaper);
+        $this->update_db($phones,mtopcard\PhoneCardPaper);
+    }
+
+    private function update_db($providers,$type)
+    {
+        $updater = function($name,$cfg,$type)
+        {
+            $json_cfg = json_encode($cfg);
+            $file_hash = md5($json_cfg);
+
+            $mod_price = Model('provider_price');
+            $store_id = intval($cfg['store_id']);
+            $item = $mod_price->getPirce(['provider_name' => $name,'product_type' => $type]);
+
+            if(empty($item)) {
+                $ret = $mod_price->insert(['product_type' => $type, 'provider_name' => $name, 'store_id' => $store_id,
+                    'cfg' => $json_cfg, 'cfg_hash' => $file_hash, 'operator' => 'system', 'update_time' => time()]);
+            }
+            elseif($item['cfg_hash'] != $file_hash)
+            {
+                try
+                {
+                    $tran = new trans_wapper($mod_price,'notify change order state trans');
+
+                    $item = $mod_price->getPirce(['provider_name' => $name,'product_type' => $type],'*',true,true);
+                    $effect_time = intval($item['effect_time']);
+                    if($effect_time > 0)
+                    {
+                        $ret = $mod_price->where(['price_id' => $item['price_id']])
+                                         ->update(['new_cfg' => $json_cfg, 'cfg_hash' => $file_hash, 'operator' => 'system', 'update_time' => time()]);
+                    }
+                    else
+                    {
+                        $ret = $mod_price->where(['price_id' => $item['price_id']])
+                                         ->update(['cfg' => $json_cfg, 'cfg_hash' => $file_hash, 'operator' => 'system', 'update_time' => time()]);
+                    }
+                    $tran->commit();
+                }
+                catch (Exception $ex)
+                {
+                    $tran->rollback();
+                    Log::record($ex->getMessage(),Log::ERR);
+                }
+            }
+            else {
+                $ret = true;
+            }
+
+            return $ret;
+        };
+
+        foreach ($providers as $provider) {
+            $name = $provider['name'];
+            $cfg = $provider['cfg'];
+
+            if(!empty($cfg)) {
+                $updater($name,$cfg,$type);
+            }
+        }
+    }
+
+    public function update($price_id,$cfgs,$effect_time)
+    {
+        try
+        {
+            $json_cfg = json_encode($cfgs);
+
+            $mod_price = Model('provider_price');
+            $tran = new trans_wapper($mod_price,'notify change order state trans');
+
+            $item = $mod_price->getPirce(['price_id' => $price_id], '*', true, true);
+            if ($effect_time > 0) {
+                $ret = $mod_price->where(['price_id' => $item['price_id']])
+                    ->update(['new_cfg' => $json_cfg, 'operator' => 'system', 'effect_time' => $effect_time, 'update_time' => time()]);
+            } else {
+                $ret = $mod_price->where(['price_id' => $item['price_id']])
+                    ->update(['cfg' => $json_cfg, 'new_cfg' => '', 'effect_time' => 0, 'operator' => 'system', 'update_time' => time()]);
+            }
+            $tran->commit();
+        }
+        catch (Exception $ex)
+        {
+            $tran->rollback();
+            Log::record($ex->getMessage(),Log::ERR);
+        }
+
+        return $ret;
+    }
+
+    public function effect($price_id)
+    {
+        try
+        {
+            $mod_price = Model('provider_price');
+            $tran = new trans_wapper($mod_price,'notify change order state trans');
+
+            $item = $mod_price->getPirce(['price_id' => $price_id], '*', true, true);
+            $effect_time = intval($item['effect_time']);
+
+            if ($effect_time > 0) {
+                $ret = $mod_price->where(['price_id' => $item['price_id']])
+                                 ->update(['cfg' => ['exp', 'new_cfg'], 'new_cfg' => '', 'effect_time' => 0]);
+            }
+            $tran->commit();
+        }
+        catch (Exception $ex)
+        {
+            $tran->rollback();
+            Log::record($ex->getMessage(),Log::ERR);
+        }
+
+        return $ret;
+    }
+
+    private function load_type($type)
+    {
+        $mod_price = Model('provider_price');
+        $items = $mod_price->getPirces(['product_type' => $type,'opened' => 1],'provider_name,cfg');
+
+        $result = [];
+        foreach ($items as $item) {
+            $result[] = ['name' => $item['provider_name'],'cfg' => json_decode($item['cfg'],true)];
+        }
+
+        return $result;
+    }
+
+    public function load_from_db()
+    {
+        include(BASE_CONFIG_PATH . CONFIG_PREFIX . '/refill.ini.php');
+
+        global $config;
+        $config['oil_providers'] = $this->load_type(mtopcard\OilCardPaper);
+        $config['phone_providers'] = $this->load_type(mtopcard\PhoneCardPaper);
+    }
+}

+ 36 - 0
test/TestProviderPrice.php

@@ -0,0 +1,36 @@
+<?php
+
+
+use PHPUnit\Framework\TestCase;
+
+define('APP_ID', 'test');
+define('BASE_ROOT_PATH', str_replace('/test', '', dirname(__FILE__)));
+
+require_once(BASE_ROOT_PATH . '/global.php');
+require_once(BASE_CORE_PATH . '/lrlz.php');
+require_once(BASE_ROOT_PATH . '/fooder.php');
+
+require_once(BASE_HELPER_PATH . '/refill/XYZRefillFactory.php');
+
+
+
+
+class TestProviderPrice extends TestCase
+{
+    public static function setUpBeforeClass(): void
+    {
+        Base::run_util();
+    }
+
+    public function testUpdateFromFile()
+    {
+        $chprice_helper = new refill\chprice_helper();
+        $chprice_helper->update_from_file();
+    }
+
+    public function testLoad()
+    {
+        $chprice_helper = new refill\chprice_helper();
+        $chprice_helper->load_from_db();
+    }
+}