d3yii2/d3edi

此包的最新版本(dev-master)没有提供许可证信息。

EDI

dev-master 2022-04-01 12:38 UTC

This package is auto-updated.

Last update: 2024-08-29 05:37:48 UTC


README

特性

  • 在数据库中收集EDI消息
  • 其他进程处理收集的消息和登记
    • 处理状态和参考记录
    • 错误状态和错误信息

使用的包

数据库模式

DB Schema

安装

安装此扩展的首选方法是使用 composer

运行

$ composer require d3yii2/d3edi "*"

或添加

"d3yii2/d3edi": "*"

到您的 composer.json 文件的 require 部分。

方法

用法

将edi数据映射到模型属性

class DepoEdiBooking extends BaseDepoEdiBooking
{
    public function loadEdi($ediMessage): void
    {
        $r = $ediMessage->readEdiMessage();
        $this->booking_ref_number = $r->readEdiDataValue(['RFF',['1'=>'BN']],1,0);
        $this->carier = $r->readEdiDataValue(['NAD',['1'=>'CA']],2,0);
        $this->containerType = $r->readEdiDataValue(['EQD',['1'=>'CN']],3,0);
        if(!$this->cont_type_id = CargoContTypeDictionary::getIdByEdiCode($containerType)){
            $this->cont_type_id = null;
            $this->addError('cont_type_id','Undefined container type: ' . $containerType);
        }
    }
}

处理

        $cnt = 0;
        foreach(EdiMessage::find()->allNews() as $ediMessage){
            if(!$transaction = $this->module->db->begintransaction()){
                throw new \yii\db\Exception('can not start Begin transaction');
            }
            try {
                $ediBooking = new DepoEdiBooking();
                $ediBooking->loadEdi($ediMessage);
                if ($ediBooking->hasErrors() || !$ediBooking->validate()) {
                    $ediMessage->saveError($ediBooking->getErrors());
                    continue;
                }
                if (!$ediBooking->save()) {
                    throw new D3ActiveRecordException($ediBooking);
                }

                $ediMessage->saveProcessed($ediBooking);

                $transaction->commit();
                $cnt ++;
                continue;
            }catch (Exception $e){
                $transaction->rollBack();
                Yii::error($e->getMessage());
                Yii::error($e->getTraceAsString());
                $ediMessage->saveError($e->getMessage());
            }
        }

        return $cnt;

    }

未处理消息的面板

为了显示未处理的消息,可以使用面板解决方案 Yii2Panel

添加小部件

echo \unyii2\yii2panel\PanelWidget::widget([
    'name' => 'MyAllerts',
]);

在模块中添加参数面板

class MyModule extends Module
{
    
    /**
     * @var array panels for PanelWidgets
     */
    public $panels;

在模块配置中添加小部件

        'mymodule' => [
            'class' => 'MyModule',
            'panels' => [
                'MyAllerts' =>
                [
                    [
                        'route' => 'edi/panel/message',
                     ]
                 ]
            ],
        ],

在EDI模块中可以为面板设置访问权限的角色。否则,每个授权用户都可以访问面板小部件

        'edi' => [
            'class' => 'd3yii2\d3edi\Module',
            'accessRulesMessageRoles' => ['Depo3EdiFull']
        ],