thinkphp5的excel导入数据事务处理代码片段

简介: thinkphp5的excel导入数据事务处理代码片段

1.功能商品名称不能重复,包含excel里面不能重复,同时也不能和已经导入的商品名字重复。(没有通过数据库唯一约束实现)

2.循环里面一条一条处理,一旦有一条数据处理失败则回滚,都成功才会最终提交。(mysql数据库引擎需要是innodb)

3.如果多行数据有问题,失败问题原因都会展示。(错误累计展示,方便对excel修改,再次导入,抛异常就无法错误数据累计多行展示了)

代码如下:

public function ajax_daoru_good() {

//平台客户的keynum

$basekeynum = session("cn_accountinfo.basekeynum");

$param = Request::instance()->param();

$file = $_FILES['file'];

//此处省略把文件读取到数组代码

$arr = excelToArray($destination);

//读取到数组

$error_flag="0";

$error_msg="";

foreach ($arr as $key => $v) {

$id =$v["0"];

$goodsname =trim($v["1"]);

$classify_name =trim($v["2"]);

$goods_thumb = $v["3"];

$goodspc = $v["4"];

$o = $v["5"];

$goodsintegral = $v["6"];

$status = $v["7"];

if($goodsname=='') {

  $error_flag=1;

  $error_msg.= "第" . ($key+2) . "行商品名称为空!<br/>";

}

if($classify_name=='') {

  $error_flag=1;

  $error_msg.= "第" . ($key+2) . "行分类名称为空!<br/>";

}

$goodsinfo = Db::table('client_good')->where("goodsname='$goodsname' and clientkeynum='$basekeynum' ")->find();

if (!empty($goodsinfo)) {

  $error_flag=1;

  $error_msg.= "第" . ($key+2) . "行商品名称和系统里面重复<br/>";

}

}

if($error_flag=='1') {

$rt["sta"] = 0;

$rt["msg"] = $error_msg;

echo json_encode($rt);

die;

}

//开启事务处理机制

$trans_result = true;

Db::startTrans();

try {

foreach ($arr as $key => $v) {

  $id =$v["0"];

  $goodsname =trim($v["1"]);

  $classify_name =trim($v["2"]);

  $goods_thumb = $v["3"];

  $goodspc = $v["4"];

  $o = $v["5"];

  $goodsintegral = $v["6"];

  $status = $v["7"];

  $goodsinfo = Db::table('client_good')->where("goodsname='$goodsname' and clientkeynum='$basekeynum' ")->find();

  //echo Db::table('client_good')->getLastSql();

  if (!empty($goodsinfo)) {

  //throw new \Exception(  "第" . ($key+2) . "行商品名称(".$goodsname.")和excel里面其他行重复<br/>" );

  $error_msg.=  "第" . ($key+2) . "行商品名称(".$goodsname.")和excel里面其他行重复<br/>";

  $trans_result = false;

  }

  //先查询分类是否存在,不存在则新增

  $classify_info =Db::table('client_good_classifylist')->where("name='$classify_name' and clientkeynum='$basekeynum' ")->find();

  if (!empty($classify_info)) {

  $classify_id=$classify_info['id'];

  } else {

  //新增

  $addclassify['name']=$classify_name;

  $addclassify['o']=0;

  $addclassify['add_time']=time();

  $addclassify['is_del']=1;

  $addclassify['clientkeynum']=$basekeynum;

  $addclassify['type']="商品列表";

  $classify_id=Db::table('client_good_classifylist')->insertGetId( $addclassify);

  if(!$classify_id) {

    //throw new \Exception("第" . ($key+2) . "行分类名称".$classify_name."新增失败<br/> ");

    $error_msg.= "第" . ($key+2) . "行分类名称".$classify_name."新增失败<br/> ";

    $trans_result = false;

  }

  }

  //新增商品

  $add["goodsname"] = $goodsname;

  $add["classify_id"] = $classify_id;

  $add["classify_name"] = $classify_name;

  $add["goods_thumb"] = $goods_thumb;

  $add["goodsimg"] = $goods_thumb;

  $add["goodspic"] = $goods_thumb;

  $add["goodspic"] = $goods_thumb;

  $add["goodscarousel"] = $goodspc;

  $add["o"] = $o;

  $add["goodsintegral"] = $goodsintegral;

  $add["market_integral"] = $goodsintegral;

  $add["status"] = $status;

  $add["clientkeynum"] = $basekeynum;

  $add["is_check"] =1;

  $add["is_sub"] = 1;

  $goods_id=Db::table('client_good')->insertGetId($add);

  //echo Db::table('client_good')->getLastSql();die;

  if(!$goods_id) {

  //throw new \Exception("第" . ($key+2) . "行商品名称".$goodsname."新增失败<br/>");

  $error_msg.= "第" . ($key+2) . "行商品名称".$goodsname."新增失败<br/>";

  $trans_result = false;

  }

}

}

catch ( \Exception $e ) {

$trans_result = false;

$msg = $e->getMessage();

}

if ( !$trans_result ) {

// 回滚事务

Db::rollback();

$rt['sta'] = '0';

$rt['msg'] = '<font color=red>导入失败!错误原因==》</font><br/>'.$msg.$error_msg;

echo json_encode( $rt );

die;

}

Db::commit();

$rt["sta"] = 1;

$rt["msg"] = "导入成功";

echo json_encode($rt);

die;

相关文章
|
7月前
|
存储 SQL C#
C#实现Excel合并单元格数据导入数据集
C#实现Excel合并单元格数据导入数据集
|
Java
从Excel批量导入数据说到ForkJoin的原理
前面我们介绍了EasyPOI,用其进行Excel导入导出,非常的方便,非常的简单。但是4.0.0 版本以及其之前的版本都是通过单线程的方式对Excel中的数据进行解析的。效率比较差。 今天我将做一个测试,5000条数据,分别使用EasyPOI的方式和自己手写ForkJoin的方式(多任务)的方式来导入,来比较这两者的性能差异。
226 0
从Excel批量导入数据说到ForkJoin的原理
|
Java easyexcel 数据库连接
多个sheet Excel 数据 导入数据库 如何实现?
多个sheet Excel 数据 导入数据库 如何实现?
266 0
|
XML 缓存 API
百万级 Excel导入数据库 效率太低? 基于 SAX 的事件模型 导入,将会解决 效率问题
百万级 Excel导入数据库 效率太低? 基于 SAX 的事件模型 导入,将会解决 效率问题
101 0
|
数据库
数据库必备技能:Navicat如何使用Excel建表、导入数据
navicat有Excel建表导入数据的功能,试了试,的确很强大。
|
关系型数据库 数据库 Oracle
如何从Excel表格导入数据批量生成二维码
目前二维码应用渐趋广泛,二维码具有储存量大、保密性高、追踪性高、抗损性强、备援性大、成本便宜等特性,这些特性特别适用于表单、安全保密、追踪、证照、存货盘点、资料备援等方面。那么我们怎么用条码打印软件从现有Excel表格中导入数据批量生成我们所需要的二维码呢? 首先我们打开条码打印软件,点击“新建”...
2749 0
|
SQL 存储 关系型数据库
【RDS MySQL】将Excel的数据导入数据库
您可以将Excel的数据通过数据管理服务DMS(Data Management Service)导入到RDS MySQL数据库中。
799 0
【RDS MySQL】将Excel的数据导入数据库
|
Java Maven
Springboot excel导入 EasyPOI 双表头的excel 导入数据
在工作中难免会遇到excel的数据导入。但是有些时间Excel的表头却不那么友好的
|
SQL 数据库 数据安全/隐私保护
如何从Excel中向SQL SERVER 2008导入数据
从Excel中向SQL SERVER 2008导入数据
4237 0