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;