diff --git a/common/libs/MyLib.php b/common/libs/MyLib.php index 24a3ade..993e5f7 100644 --- a/common/libs/MyLib.php +++ b/common/libs/MyLib.php @@ -127,7 +127,7 @@ class MyLib { return $return_str; } - static public function Post($curlPost,$url,$cookie_flag=false) + static public function Post($curlPost, $url, $cookie_flag = false, $headers = []) { $cookie = \Yii::$app->getRuntimePath() . '/cookie_tmp.txt'; $curl = curl_init(); @@ -145,6 +145,9 @@ class MyLib { } curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); + if (count($headers) > 0) { + curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); + } $return_str = curl_exec($curl); curl_close($curl); return $return_str; @@ -357,4 +360,12 @@ class MyLib { return $i; } + static public function StartsWith($haystack, $needle){ + return strncmp($haystack, $needle, strlen($needle)) === 0; + } + + static public function EndsWith($haystack, $needle) + { + return $haystack != '' && $needle != '' && substr_compare($haystack, $needle, -strlen($needle)) === 0; + } } diff --git a/common/models/CarT.php b/common/models/CarT.php index c4f9d57..be554b1 100644 --- a/common/models/CarT.php +++ b/common/models/CarT.php @@ -7,10 +7,10 @@ use Yii; /** * This is the model class for table "car_t". * - * @property integer $id - * @property integer $user_id - * @property integer $car_type_id - * @property integer $car_use_id + * @property int $id + * @property int $user_id + * @property int $car_type_id + * @property int $car_use_id * @property string $car_no * @property string $factory_model * @property string $car_model @@ -18,32 +18,35 @@ use Yii; * @property string $insurer1_date * @property string $insurer2_date * @property string $id_man - * @property string $id_man_number + * @property string $id_man_number 被保险人证件号码 * @property string $engine_no * @property string $car_frame_no - * @property integer $seats + * @property int $seats * @property string $car_man * @property string $car_man_phone * @property string $remark - * @property integer $location + * @property int $location * @property string $print_date * @property string $car_man_number - * @property integer $is_track - * @property integer $times - * @property string $old_user * @property string $company * @property string $op_user1 * @property string $op_user2 - * @property string $from_src + * @property string $from_src 来源 * @property string $created_at * @property string $updated_at - * @property integer $op1_id - * @property integer $op2_id + * @property int $biaozhu + * @property int $is_xubao 是否续保 + * @property string $id_man_phone + * @property string $purchase_price + * @property string $car_man_type 车主证件类型 + * @property int $op1_id 新保ID + * @property int $op2_id 续保ID + * @property string $purchase_value */ -class CarT extends \common\models\Base +class CarT extends \yii\db\ActiveRecord { /** - * @inheritdoc + * {@inheritdoc} */ public static function tableName() { @@ -51,21 +54,22 @@ class CarT extends \common\models\Base } /** - * @inheritdoc + * {@inheritdoc} */ public function rules() { return [ - [['user_id'], 'required'], - [['user_id', 'car_type_id', 'car_use_id','seats','location','op1_id', 'op2_id'], 'integer'], - [['register_date', 'insurer1_date', 'insurer2_date','id_man','id_man_number','print_date','car_man_number', 'created_at', 'updated_at'], 'safe'], - [['car_no', 'factory_model', 'car_model', 'engine_no', 'car_frame_no','id_man_phone'], 'string', 'max' => 50], - [['car_man','car_man_phone','remark','company','op_user1','op_user2','from_src'], 'string', 'max' => 200], + [['user_id', 'car_type_id', 'car_use_id', 'seats', 'location', 'biaozhu', 'is_xubao', 'op1_id', 'op2_id'], 'integer'], + [['register_date', 'insurer1_date', 'insurer2_date', 'print_date', 'created_at', 'updated_at'], 'safe'], + [['purchase_price', 'purchase_value'], 'number'], + [['car_no', 'factory_model', 'car_model', 'engine_no', 'car_frame_no', 'car_man_phone', 'id_man_phone'], 'string', 'max' => 50], + [['id_man', 'id_man_number', 'car_man', 'car_man_number', 'company', 'op_user1', 'op_user2', 'from_src', 'car_man_type'], 'string', 'max' => 100], + [['remark'], 'string', 'max' => 200], ]; } /** - * @inheritdoc + * {@inheritdoc} */ public function attributeLabels() { @@ -78,29 +82,33 @@ class CarT extends \common\models\Base 'factory_model' => 'Factory Model', 'car_model' => 'Car Model', 'register_date' => 'Register Date', - 'insurer1_date' => 'Insurer 1 Date', - 'insurer2_date' => 'Insurer 2 Date', - 'id_man' => 'ID Man', - 'id_man_number' => 'ID Number', + 'insurer1_date' => 'Insurer1 Date', + 'insurer2_date' => 'Insurer2 Date', + 'id_man' => 'Id Man', + 'id_man_number' => 'Id Man Number', 'engine_no' => 'Engine No', 'car_frame_no' => 'Car Frame No', 'seats' => 'Seats', 'car_man' => 'Car Man', - 'car_man_phone' => 'Phone', + 'car_man_phone' => 'Car Man Phone', 'remark' => 'Remark', 'location' => 'Location', 'print_date' => 'Print Date', 'car_man_number' => 'Car Man Number', - 'is_track' => 'Is Track', - 'times' => 'Times', - 'old_user' => 'Old User', 'company' => 'Company', 'op_user1' => 'Op User1', 'op_user2' => 'Op User2', - 'op_user3' => 'Op User3', 'from_src' => 'From Src', 'created_at' => 'Created At', 'updated_at' => 'Updated At', + 'biaozhu' => 'Biaozhu', + 'is_xubao' => 'Is Xubao', + 'id_man_phone' => 'Id Man Phone', + 'purchase_price' => 'Purchase Price', + 'car_man_type' => 'Car Man Type', + 'op1_id' => 'Op1 ID', + 'op2_id' => 'Op2 ID', + 'purchase_value' => 'Purchase Value', ]; } diff --git a/frontend/controllers/CommonController.php b/frontend/controllers/CommonController.php index 9f28501..2a33f0a 100644 --- a/frontend/controllers/CommonController.php +++ b/frontend/controllers/CommonController.php @@ -380,6 +380,7 @@ class CommonController extends \yii\web\Controller $data['status'] = 'SUCCESS'; $data['fileUrl'] = '/'.$filename; + $data['OriginfileName'] = $img->getBaseName(); } return $data; } diff --git a/frontend/controllers/FinanceController.php b/frontend/controllers/FinanceController.php index c4f09ee..377dfab 100644 --- a/frontend/controllers/FinanceController.php +++ b/frontend/controllers/FinanceController.php @@ -33,6 +33,7 @@ use common\models\GzT; use common\models\InsurerCompany2T; use common\models\InsurerCompanyT; use common\models\InsurerTypeT; +use common\models\LinkmanT; use common\models\OrderCaiwuT; use common\models\OrderGiftT; use common\models\OrderT; @@ -7532,7 +7533,6 @@ class FinanceController extends \frontend\controllers\UserBaseController 'my_type1_query_hebao' => $my_type1_query_hebao, 'type_query' => $type_query, 'type3_query' => $type3_query, - 'back_params' => $back_params, 'pay_order_users' => $pay_order_users, 'pay_chexian' => $pay_chexian, 'pay_nochexian' => $pay_nochexian, @@ -8049,4 +8049,394 @@ class FinanceController extends \frontend\controllers\UserBaseController return $result; } + public function actionCarInfoImportIndex() + { + $request = Yii::$app->request; + return $this->render('car-info-import-index'); + } + + public function actionCarInfoImport() + { + set_time_limit(0); + ini_set('memory_limit', '3072M'); + $this->pushInfoToHtml('开始处理上传文件...'); + $request = Yii::$app->request; + $base_filename = $request->get('urlfile'); + $upload_filename = $request->get('filename'); + $this->pushInfoToHtml('文件名:' . $upload_filename); + $web_path = Yii::$app->getBasePath() . '/../frontend/web'; + $filename = $web_path . $base_filename; + $this->pushInfoToHtml('开始加载excel文件...'); + $reader = new \PHPExcel_Reader_Excel2007(); + if(!$reader->canRead($filename)) { + $reader = new \PHPExcel_Reader_Excel5(); + if(!$reader->canRead($filename)) { + $this->pushInfoToHtml('加载失败,不能读取文件...'); + exit(); + } + } + $data = $reader->load($filename)->getSheet(0)->toArray('', true, true); + $total = count($data); + $this->pushInfoToHtml('加载完成,预计'. $total .'条数据...'); + $statistical_information = [ + 'total_all' => $total - 1, + 'total_skip' => 0, + 'total_insert' => 0, + 'total_update' => 0, + 'total_conflict' => 0, + 'total_handle' => 0, + ]; + $from_src = 'BMC' . date('Ymd') . strtoupper(substr(md5($filename), 0, 6)); + $file_path = Yii::getAlias('@frontend/web'); + $destination = '/upload/outlier_data/'; + if (!is_dir($file_path . $destination)) { + @mkdir($file_path . $destination, 0777); + } + $filename = md5('outlier_data_' . date('Y-m-d-H-i')) . '.csv'; + $this->pushInfoToHtml('开始处理...'); + for ($i = 1; $i < $total; $i++) { + $item = $data[$i]; + $this->pushInfoToHtml('第' . ($i) . '条:' . $item[1]); + $import_info = ['linkmans'=>[], 'linkphones'=>[]]; + $import_info['register_date'] = trim(sprintf("%s",$item[0])); + $import_info['car_no'] = trim(sprintf("%s",$item[1])); + $import_info['car_frame_no'] = trim(sprintf("%s",$item[2])); + $import_info['engine_no'] = trim(sprintf("%s",$item[3])); + $import_info['factory_model'] = trim(sprintf("%s",$item[4])); + $import_info['car_year'] = trim(sprintf("%s", $item[5])); + $import_info['factory_model'] .= ' ' . trim(sprintf("%s", $item[6])); + $import_info['car_man'] = trim(sprintf("%s",$item[7])); + $import_info['car_number'] = trim(sprintf("%s",$item[8])); + $import_info['phone'] = trim(sprintf("%s",$item[9])); + $import_info['purchase_value'] = trim(sprintf("%s",$item[10])); + $import_info['id_man'] = trim(sprintf("%s",$item[11])); + $import_info['id_number'] = trim(sprintf("%s",$item[12])); + $import_info['id_phone'] = trim(sprintf("%s",$item[13])); + $import_info['company'] = trim(sprintf("%s",$item[14])); + $import_info['insurer1_date'] = trim(sprintf("%s",$item[15])); + $import_info['insurer2_date'] = trim(sprintf("%s",$item[16])); + $import_info['insurer_type'] = trim(sprintf("%s",$item[17])); + $import_info['linkmans'][] = trim(sprintf("%s",$item[18])); + $import_info['linkphones'][] = trim(sprintf("%s",$item[19])); + $import_info['linkmans'][] = trim(sprintf("%s",$item[20])); + $import_info['linkphones'][] = trim(sprintf("%s",$item[21])); + $import_info['linkmans'][] = trim(sprintf("%s",$item[22])); + $import_info['linkphones'][] = trim(sprintf("%s",$item[23])); + $import_info['car_no'] = $import_info['car_no'] == '*' ? '' : $import_info['car_no']; + if ($import_info['car_frame_no'] == '' && $import_info['car_no'] == '' && $import_info['engine_no'] == '') { + $statistical_information['total_skip']++; + unset($item,$data[$i]); + $statistical_information['total_all'] --; + continue; + } + $tran = CarT::getDb()->beginTransaction(); + try { + $ret = $this->checkCarProject($from_src, $import_info); + switch($ret['code']){ + case 1: + $this->pushInfoToHtml('项目存在,做更新处理...'); + $ret = $this->updateCarInfo($ret['id'], $import_info, $from_src, false, true); + $statistical_information['total_update']++; + break; + case 2: + $this->pushInfoToHtml('空行或已导入,跳过...'); + $statistical_information['total_skip']++; + break; + case 3: + $this->pushInfoToHtml('新增数据,做插入处理...'); + $ret = $this->createCarInfo($import_info, $from_src); + $statistical_information['total_insert']++; + break; + } + $tran->commit(); + }catch(\Exception $e){ + $tran->rollBack(); + $this->pushInfoToHtml('操作失败:' . $e->getMessage()); + } + + if(!$ret['success']){ + $data[$i][] = $ret['msg']; + $this->outlierDataHandle($data[$i], $file_path . $destination . $filename); + $statistical_information['total_handle']++; + } + unset($item, $data[$i], $ret); + } + $this->pushInfoToHtml('操作成功'. "数据总计{$statistical_information['total_all']}条, + 冲突{$statistical_information['total_conflict']}, + 更新{$statistical_information['total_update']}, + 跳过{$statistical_information['total_skip']}, + 插入{$statistical_information['total_insert']}, + 异常{$statistical_information['total_handle']}"); + echo ''; + exit(); + } + + public function actionCarInfoBhxUpdate() + { + set_time_limit(0); + ini_set('memory_limit', '3072M'); + $this->pushInfoToHtml('开始处理上传文件...'); + $request = Yii::$app->request; + $base_filename = $request->get('urlfile'); + $upload_filename = $request->get('filename'); + $this->pushInfoToHtml('文件名:' . $upload_filename); + $web_path = Yii::$app->getBasePath() . '/../frontend/web'; + $filename = $web_path . $base_filename; + $this->pushInfoToHtml('开始加载excel文件...'); + $reader = new \PHPExcel_Reader_Excel2007(); + if(!$reader->canRead($filename)) { + $reader = new \PHPExcel_Reader_Excel5(); + if(!$reader->canRead($filename)) { + $this->pushInfoToHtml('加载失败,不能读取文件...'); + exit(); + } + } + $data = $reader->load($filename)->getSheet(0)->toArray('', true, true); + $total = count($data); + $this->pushInfoToHtml('加载完成,预计'. $total .'条数据...'); + $statistical_information = [ + 'total_all' => $total - 1, + 'total_skip' => 0, + 'total_insert' => 0, + 'total_update' => 0, + 'total_error' => 0, + 'total_error_arr' => [], + ]; + $this->pushInfoToHtml('开始处理...'); + for ($i = 1; $i < $total; $i++) { + $item = $data[$i]; + $this->pushInfoToHtml('第' . ($i + 1) . '条:' . $item[0]); + $car_no = trim(sprintf("%s", $item[0])); + $car_man = trim(sprintf("%s", $item[1])); + $factory_model = trim(sprintf("%s", $item[2])); + $engine_no = trim(sprintf("%s", $item[3])); + $car_frame_no = trim(sprintf("%s", $item[4])); + $register_date = trim(sprintf("%s", $item[5])); + $company = trim(sprintf("%s", $item[6])); + $insurer1_date = trim(sprintf("%s", $item[7])); + $insurer2_date = trim(sprintf("%s", $item[8])); + $id_man = trim(sprintf("%s", $item[9])); + $id_number = trim(sprintf("%s", $item[10])); + + $car_info = CarT::findOne(['car_frame_no' => $car_frame_no]); + if(isset($car_info)) { + if ($car_info->location > 2 && $car_info->insurer1_date >= $insurer1_date) { + $this->pushInfoToHtml('空行或已导入,跳过...'); + $statistical_information['total_skip'] ++ ; + continue; + } + $car_info->car_no = $car_no!= '' ? $car_no : $car_info->car_no; + $car_info->car_man = $car_info->car_man!= '' ? $car_info->car_man : $car_man; + $car_info->register_date = $register_date; + $car_info->factory_model = $factory_model; + //对比原信息是否包含待更新信息(删除星号) + $car_info->engine_no = $car_info->engine_no != '' && MyLib::StartsWith($car_info->engine_no,rtrim($engine_no,'*')) ? $car_info->engine_no : $engine_no; + $insurer1_flag = strtotime(date('Y',strtotime($insurer1_date))) > strtotime(date('Y',strtotime($car_info->insurer1_date))); + if($insurer1_flag){ + $car_info->insurer1_date = $insurer1_date; + } + $insurer2_flag = strtotime(date('Y',strtotime($insurer2_date))) > strtotime(date('Y',strtotime($car_info->insurer2_date))); + if($insurer2_flag) { + $car_info->insurer2_date = $insurer2_date; + } + if(($car_info->insurer1_date != '' && $insurer1_flag) || ($car_info->insurer2_date != '' && $insurer2_flag) || $car_info->insurer1_date == '' || $car_info->insurer2_date == ''){ + $car_info->company = $company != '' ? $company : $car_info->company; + $car_info->id_man = $car_info->id_man != '' && MyLib::StartsWith($car_info->id_man,rtrim($id_man,'*')) ? $car_info->id_man : $id_man; + $car_info->id_man_number = $car_info->id_man_number != '' && MyLib::StartsWith($car_info->id_man_number,rtrim($id_number,'*')) ? $car_info->id_man_number : $id_number; + } + + if (!$car_info->save()) { + $this->pushInfoToHtml('操作失败:' . json_encode($car_info->getErrorSummary(true))); + $statistical_information['total_error'] ++ ; + $statistical_information['total_error_arr'][] = $i; + }else { + $this->pushInfoToHtml('更新车辆信息...'); + $statistical_information['total_update'] ++ ; + } + }else { + $statistical_information['total_skip'] ++ ; + $this->pushInfoToHtml('空行或不存在,跳过...'); + } + } + $this->pushInfoToHtml('操作成功'. "数据总计{$statistical_information['total_all']}条, + 更新{$statistical_information['total_update']}, + 失败{$statistical_information['total_error']}, + 失败数据列:". implode(',',$statistical_information['total_error_arr']) . ", + 跳过{$statistical_information['total_skip']}"); + echo ''; + exit(); + } + + private function pushInfoToHtml($msg){ + echo "

>>>    $msg

"; + ob_flush(); + flush(); + } + + /** + * 检查车辆信息 + * @param $from_src + * @param $import_info + * @return array + */ + private function checkCarProject($from_src, $import_info) + { + $result = ['success' => true]; + $car_info = CarT::find()->where([ + 'car_frame_no' => $import_info['car_frame_no'], + ])->one(); + + //如果当前批次插入信息则跳过 + if ($car_info) { //基础信息冲突调整 + if ($car_info->from_src == $from_src) { + $result['code'] = 2; + $result['msg'] = '批次重复,跳过'; + return $result; + } + $result['code'] = 1; + $result['msg'] = '信息更新'; + $result['id'] = $car_info->id; + } else { + $result['code'] = 3; + $result['msg'] = '新增数据'; + } + unset($car_info); + return $result; + } + + /** + * 新增车辆信息 + * @param $info + * @param $from_src + * @param int $lv + * @param null $old_car_info + * @return array + * @throws \Exception + */ + private function createCarInfo($info, $from_src, $lv = 1, &$old_car_info = null) + { + $result = []; + $car_info = new CarT(); + $car_info->from_src = $from_src; + $car_info->user_id = $this->my->id; + $car_info->car_use_id = 0; + $car_info->car_type_id = 0; + $car_info->car_no = $info['car_no']?:$car_info->car_no; + $car_info->location = 1; + $car_info->car_man = $info['car_man']; + $car_info->car_man_number = $info['car_number']; + $car_info->car_man_phone = $info['phone']; + $car_info->factory_model = $info['factory_model']; + $car_info->engine_no = $info['engine_no']; + $car_info->car_frame_no = $info['car_frame_no']; + $car_info->register_date = $info['register_date']; + $car_info->company = $info['company']; + $car_info->insurer1_date = $info['insurer1_date']; + $car_info->insurer2_date = $info['insurer2_date']; + $car_info->id_man = $info['id_man']; + $car_info->id_man_number = $info['id_number']; + $car_info->id_man_phone = $info['id_phone']; + $car_info->purchase_value = $info['purchase_value']?:0;; + if (!$car_info->save()) throw new \Exception("车辆信息保存失败:" . json_encode($car_info->getErrors(),JSON_UNESCAPED_UNICODE)); + $info['linkphones'] = is_array($info['linkphones']) ? $info['linkphones'] : explode(',', $info['linkphones']); + $info['linkmans'] = is_array($info['linkmans']) ? $info['linkmans'] : explode(',', $info['linkmans']); + foreach ($info['linkphones'] as $k => $link) { + if(!$link) continue; + $linkman_info = LinkmanT::findOne(['car_id' => $id, 'phone' => $link]); + if(!$linkman_info){ + $linkman_info = new LinkmanT(); + } + $linkman_info->car_id = $id; + $linkman_info->phone = $link; + $linkman_info->name = $info['linkmans'][$k]; + $linkman_info->type = '联系人'; + if (!$linkman_info->save()) throw new \Exception("联系人信息保存:" . json_encode($kehu_info->getErrors(),JSON_UNESCAPED_UNICODE)); + } + unset($car_info,$kehu_info,$linkman_info); + $result['success'] = true; + $result['msg'] = '保存成功'; + return $result; + } + + /** + * 更新车辆信息 + * 强制更新 以导入信息为主 + * 车主电话冲突处理 原被保险人电话为空时,原车主电话改至更新信息的被保险人电话作更新处理,如果原被保险人电话不为空改至联系人电话作更新处理 + * 车牌、发动机、车主、车主证件 原库不为空使用原库否则更新 + * 保险日期以最新为主 + * 其余项以更新消息为主 + * @param $id + * @param $info + * @param $from_src + * @param bool $is_car_phone_conflict + * @return array + * @throws \Exception + */ + private function updateCarInfo($id, $info, $from_src, $is_car_phone_conflict = false) + { + $result = []; + $car_info = CarT::findOne(['id' => $id]); + $car_info->car_frame_no = $info['car_frame_no']; + $car_info->from_src = $from_src; + $car_info->user_id = $this->my->id; + $car_info->car_use_id = 0; + $car_info->car_type_id = 0; + $car_info->is_track = 0; + $car_info->times = 1; + $car_info->invalid_flag = 0; + $car_info->invalid_id = 0; + $car_info->car_year = $info['car_year']; + if (str_replace('-', '', $car_info->car_no) == $info['car_no']) { + $car_info->car_no = $info['car_no']; + } else { + $car_info->car_no = $car_info->car_no != '' ? $car_info->car_no : $info['car_no']; + } + $car_info->engine_no = $car_info->engine_no != '' ? $car_info->engine_no : $info['engine_no']; + $car_info->car_man = $car_info->car_man != '' ? $car_info->car_man : $info['car_man']; + $car_info->car_man_number = $car_info->car_man_number != '' ? $car_info->car_man_number : $info['car_number']; + if($is_car_phone_conflict && $car_info->id_man_phone == ''){ + $car_info->id_man_phone = $car_info->car_man_phone; + $car_info->car_man_phone = $info['phone']; + }else if($is_car_phone_conflict && $car_info->id_man_phone != ''){ + $info['linkmans'][] = $car_info->car_man; + $info['linkphones'][] = $car_info->car_man_phone; + $car_info->car_man_phone = $info['phone']; + }else { + $car_info->id_man_phone = $car_info->id_man_phone != '' && $car_info->id_man_phone == $info['id_phone'] ? $car_info->id_man_phone : $info['id_phone']; + $car_info->car_man_phone = $car_info->car_man_phone != '' ? $car_info->car_man_phone : $info['phone']; + } + $car_info->factory_model = $car_info->factory_model != '' && $car_info->factory_model == $info['factory_model'] ? $car_info->factory_model : ($info['factory_model']?:$car_info->factory_model); + $car_info->register_date = $car_info->register_date != '' && $car_info->register_date == $info['register_date'] ? $car_info->register_date : ($info['register_date'] ?: $car_info->register_date); + $car_info->company = $car_info->company != '' && $car_info->company == $info['company'] ? $car_info->company : ($info['company'] ?: $car_info->company); + $car_info->id_man = $car_info->id_man != '' && $car_info->id_man == $info['id_man'] ? $car_info->id_man : ($info['id_man'] ?: $car_info->id_man); + $car_info->id_man_number = $car_info->id_man_number != '' && $car_info->id_man_number == $info['id_number'] ? $car_info->id_man_number : ($info['id_number']?:$car_info->id_man_number); + $car_info->purchase_value = $car_info->purchase_value != '' && $car_info->purchase_value == $info['purchase_value'] ? $car_info->purchase_value : ($info['purchase_value'] ?: $car_info->purchase_value); + $car_info->purchase_value = $car_info->purchase_value > 0 ? $car_info->purchase_value : 0; + $car_info->insurer1_date = $car_info->insurer1_date != '' && strtotime($car_info->insurer1_date) >= strtotime($info['insurer1_date']) ? $car_info->insurer1_date : $info['insurer1_date']; + $car_info->insurer2_date = $car_info->insurer2_date != '' && strtotime($car_info->insurer2_date) >= strtotime($info['insurer2_date']) ? $car_info->insurer2_date : $info['insurer2_date']; + if (!$car_info->save()) + throw new \Exception("车辆信息保存失败:" . json_encode($car_info->getErrors(),JSON_UNESCAPED_UNICODE)); + $info['linkphones'] = is_array($info['linkphones']) ? $info['linkphones'] : explode(',', $info['linkphones']); + $info['linkmans'] = is_array($info['linkmans']) ? $info['linkmans'] : explode(',', $info['linkmans']); + foreach ($info['linkphones'] as $k => $link) { + if(!$link){ + continue; + } + $id = $id ?: $car_info->id; + $linkman_info = LinkmanT::findOne(['car_id' => $id, 'phone' => $link]); + if(!$linkman_info){ + $linkman_info = new LinkmanT(); + } + $linkman_info->car_id = $id; + $linkman_info->phone = $link; + $linkman_info->name = $info['linkmans'][$k]; + $linkman_info->type = '联系人'; + if (!$linkman_info->save()) + throw new \Exception("联系人信息保存失败:" . json_encode($linkman_info->getErrors(),JSON_UNESCAPED_UNICODE)); + } + unset($car_info,$kehu_info,$linkman_info); + $result['success'] = true; + $result['msg'] = '保存成功'; + return $result; + } } diff --git a/frontend/controllers/PhoneController.php b/frontend/controllers/PhoneController.php index b9029d0..76d1c38 100644 --- a/frontend/controllers/PhoneController.php +++ b/frontend/controllers/PhoneController.php @@ -4,8 +4,10 @@ namespace frontend\controllers; use common\libs\Fdfs; use common\libs\MyLib; +use common\models\AppointmentT; use common\models\CardinfoT; use common\models\CarLogT; +use common\models\LinkmanT; use common\models\OrderGiftT; use common\models\OrderT; use common\models\OrderUserT; @@ -828,7 +830,6 @@ class PhoneController extends \yii\web\Controller return $result; } - public function actionPushApi22() { // header("Content-type: text/html; charset=utf-8"); @@ -951,4 +952,123 @@ class PhoneController extends \yii\web\Controller } + public function actionPhoneList(){ + Yii::$app->response->format = Response::FORMAT_JSON; + $request = Yii::$app->request; + $result['success'] = false; + $result['msg'] = '操作失败'; + + $car_id = $request->get('car_id',0); + $user_id = $request->get('user_id',0); + + $appointment_info = AppointmentT::find()->where(['and', + ['=','car_id', $car_id], + ['=','user_id', $user_id]])->one(); + + if(!$appointment_info){ + $result['msg'] = '当前用户无此预约信息'; + return $result; + } + + $car_info = $appointment_info->car; + $linkman_list = []; + $linkman_info = LinkmanT::find() + ->where(['car_id' => $car_id]) + ->orderBy('id ASC')->all(); + $linkman_list[] = [ + 'name' => $car_info->car_man . '(车主)', + 'phone' => $car_info->car_man_phone, + ]; + $linkman_list[] = [ + 'name' => $car_info->id_man . '(被保险人)', + 'phone' => $car_info->id_man_phone, + ]; + foreach ($linkman_info as $item){ + $linkman_list[] = [ + 'name' => $item->name . '(联系人)', + 'phone' => $item->phone, + ]; + } + $result['success'] = true; + $result['msg'] = '操作成功'; + $result['data'] = [ + 'phones' => $linkman_list, + 'car_info' => $car_info, + ]; + return $result; + } + + public function actionWebAxOut(){ + Yii::$app->response->format = Response::FORMAT_JSON; + $request = Yii::$app->request; + $result['success'] = false; + $result['msg'] = '设置错误'; + if($this->getPhoneTime() <= 0){ + $result['msg'] = '电话剩余话费不足,请联系管理员充值'; + return $result; + } + + $caller = $request->get('caller',''); + $called = $request->get('called',''); + $user_id = $request->get('user_id',0); + + $assign = NetworkPhoneAssignT::find()->where('user_id='.$user_id)->one(); + if(!$assign){ + $result['msg'] = '该账号无绑定主叫号码'; + return $result; + } + $sub_infos = NetworkPhoneSubT::find()->where('assign_id='.$assign->id)->indexBy('id')->asArray()->all();; + $count = count($sub_infos); + if($count <= 0){ + $result['msg'] = '该主叫号码无绑定子号码'; + return $result; + } + $tel_x = $tel_y = $sub_infos[mt_rand(0,$count-1)]['phone']; + + $parmas = [ + 'appkey' => '0946239060682011', + 'ts' => time(), + 'caller' => $caller, + 'called' => $called, + 'expiration'=> 60, + 'request_id' => md5(uniqid(microtime(true),true)), + 'tel_x' =>$tel_x, + 'tel_y' =>$tel_y + ]; + ksort($parmas); + $parmas['sign'] = md5(http_build_query($parmas) . '&secret=3E8QV35pHjjev1713E61xV3tFq1N1E4W'); + $res = MyLib::Post(json_encode($parmas), 'http://api.1ketong.com/ykt-pool/number/ax2/call_out', false, [ + "Content-Type: application/json;charset=UTF-8", + "Accept:application/json", + ]); + $succ = json_decode($res); + if ($succ->code == 0) { + $assign->is_phone = 1; + $assign->save(false); + $result['success'] = true; + $result['msg'] = $tel_x; + }else { + $result['msg'] = '远程接口调用失败,请稍后重试'; + } + return $result; + } + + private function getPhoneTime() + { + //检查通话剩余分钟 + $url = Yii::$app->params['userPanel']['myinfo_url']; + $token = Yii::$app->params['userPanel']['token']; + $client = new Client(); + $res = $client->request('GET', $url . '?token=' . $token); + $phone_time = 0; + if ($res->getStatusCode() == 200) { + $obj = json_decode($res->getBody(), true); + if ($obj['code'] == 400) { + $result['msg'] = $obj['msg']; + return $result; + } + $phone_time = intval($obj['data']['phone_time']); + } + return $phone_time; + } } diff --git a/frontend/views/car/info.php b/frontend/views/car/info.php index 5542cb4..cee5882 100644 --- a/frontend/views/car/info.php +++ b/frontend/views/car/info.php @@ -8,18 +8,13 @@ use \common\libs\MyLib;
- -
车辆信息
- - - 操作记录 @@ -28,7 +23,7 @@ use \common\libs\MyLib;
-
+
@@ -95,6 +90,15 @@ use \common\libs\MyLib;
+
@@ -199,9 +203,8 @@ use \common\libs\MyLib;
- - beginBlock('footer_js'); ?> + @@ -230,7 +233,6 @@ use \common\libs\MyLib; function refreshList() { $('#listTable').bootstrapTable('refresh'); } - function search() { $('#listTable').bootstrapTable('destroy'); $('#listTable').bootstrapTable({ @@ -246,8 +248,12 @@ use \common\libs\MyLib; } }); } - $(function() { + $('#qrcode').qrcode({ + text: window.location.origin + '/phone.html?car_id=id?>&user_id=', + width: 128, + height: 128, + }); search(); wsInit(); $.get('/car/bihu-search?id=id?>',function(obj) { @@ -318,7 +324,6 @@ use \common\libs\MyLib; parent.layer.msg("您的浏览器不支持 WebSocket!"); } } - function showResult(val){ var serverInfo = document.getElementById("serverInfo").value; var okText = serverInfo + "连接成功"; diff --git a/frontend/views/finance/car-info-import-index.php b/frontend/views/finance/car-info-import-index.php new file mode 100644 index 0000000..05097e3 --- /dev/null +++ b/frontend/views/finance/car-info-import-index.php @@ -0,0 +1,79 @@ + +beginBlock('header_css'); ?> + +endBlock(); ?> + +
+
+
+
批量处理车辆信息
+
+
+
+
+
+
+ +
+ + +
+
+ + + + [下载车辆信息导入模板] +
+
+
+
+
+
+ +
+
+
+
+ +beginBlock('footer_js'); ?> + + +endBlock('footer_js'); ?> diff --git a/frontend/web/js/jquery.qrcode.min.js b/frontend/web/js/jquery.qrcode.min.js new file mode 100644 index 0000000..fe9680e --- /dev/null +++ b/frontend/web/js/jquery.qrcode.min.js @@ -0,0 +1,28 @@ +(function(r){r.fn.qrcode=function(h){var s;function u(a){this.mode=s;this.data=a}function o(a,c){this.typeNumber=a;this.errorCorrectLevel=c;this.modules=null;this.moduleCount=0;this.dataCache=null;this.dataList=[]}function q(a,c){if(void 0==a.length)throw Error(a.length+"/"+c);for(var d=0;da||this.moduleCount<=a||0>c||this.moduleCount<=c)throw Error(a+","+c);return this.modules[a][c]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){for(var a=1,a=1;40>a;a++){for(var c=p.getRSBlocks(a,this.errorCorrectLevel),d=new t,b=0,e=0;e=d;d++)if(!(-1>=a+d||this.moduleCount<=a+d))for(var b=-1;7>=b;b++)-1>=c+b||this.moduleCount<=c+b||(this.modules[a+d][c+b]= +0<=d&&6>=d&&(0==b||6==b)||0<=b&&6>=b&&(0==d||6==d)||2<=d&&4>=d&&2<=b&&4>=b?!0:!1)},getBestMaskPattern:function(){for(var a=0,c=0,d=0;8>d;d++){this.makeImpl(!0,d);var b=j.getLostPoint(this);if(0==d||a>b)a=b,c=d}return c},createMovieClip:function(a,c,d){a=a.createEmptyMovieClip(c,d);this.make();for(c=0;c=f;f++)for(var i=-2;2>=i;i++)this.modules[b+f][e+i]=-2==f||2==f||-2==i||2==i||0==f&&0==i?!0:!1}},setupTypeNumber:function(a){for(var c= +j.getBCHTypeNumber(this.typeNumber),d=0;18>d;d++){var b=!a&&1==(c>>d&1);this.modules[Math.floor(d/3)][d%3+this.moduleCount-8-3]=b}for(d=0;18>d;d++)b=!a&&1==(c>>d&1),this.modules[d%3+this.moduleCount-8-3][Math.floor(d/3)]=b},setupTypeInfo:function(a,c){for(var d=j.getBCHTypeInfo(this.errorCorrectLevel<<3|c),b=0;15>b;b++){var e=!a&&1==(d>>b&1);6>b?this.modules[b][8]=e:8>b?this.modules[b+1][8]=e:this.modules[this.moduleCount-15+b][8]=e}for(b=0;15>b;b++)e=!a&&1==(d>>b&1),8>b?this.modules[8][this.moduleCount- +b-1]=e:9>b?this.modules[8][15-b-1+1]=e:this.modules[8][15-b-1]=e;this.modules[this.moduleCount-8][8]=!a},mapData:function(a,c){for(var d=-1,b=this.moduleCount-1,e=7,f=0,i=this.moduleCount-1;0g;g++)if(null==this.modules[b][i-g]){var n=!1;f>>e&1));j.getMask(c,b,i-g)&&(n=!n);this.modules[b][i-g]=n;e--; -1==e&&(f++,e=7)}b+=d;if(0>b||this.moduleCount<=b){b-=d;d=-d;break}}}};o.PAD0=236;o.PAD1=17;o.createData=function(a,c,d){for(var c=p.getRSBlocks(a, +c),b=new t,e=0;e8*a)throw Error("code length overflow. ("+b.getLengthInBits()+">"+8*a+")");for(b.getLengthInBits()+4<=8*a&&b.put(0,4);0!=b.getLengthInBits()%8;)b.putBit(!1);for(;!(b.getLengthInBits()>=8*a);){b.put(o.PAD0,8);if(b.getLengthInBits()>=8*a)break;b.put(o.PAD1,8)}return o.createBytes(b,c)};o.createBytes=function(a,c){for(var d= +0,b=0,e=0,f=Array(c.length),i=Array(c.length),g=0;g>>=1;return c},getPatternPosition:function(a){return j.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,c,d){switch(a){case 0:return 0==(c+d)%2;case 1:return 0==c%2;case 2:return 0==d%3;case 3:return 0==(c+d)%3;case 4:return 0==(Math.floor(c/2)+Math.floor(d/3))%2;case 5:return 0==c*d%2+c*d%3;case 6:return 0==(c*d%2+c*d%3)%2;case 7:return 0==(c*d%3+(c+d)%2)%2;default:throw Error("bad maskPattern:"+ +a);}},getErrorCorrectPolynomial:function(a){for(var c=new q([1],0),d=0;dc)switch(a){case 1:return 10;case 2:return 9;case s:return 8;case 8:return 8;default:throw Error("mode:"+a);}else if(27>c)switch(a){case 1:return 12;case 2:return 11;case s:return 16;case 8:return 10;default:throw Error("mode:"+a);}else if(41>c)switch(a){case 1:return 14;case 2:return 13;case s:return 16;case 8:return 12;default:throw Error("mode:"+ +a);}else throw Error("type:"+c);},getLostPoint:function(a){for(var c=a.getModuleCount(),d=0,b=0;b=g;g++)if(!(0>b+g||c<=b+g))for(var h=-1;1>=h;h++)0>e+h||c<=e+h||0==g&&0==h||i==a.isDark(b+g,e+h)&&f++;5a)throw Error("glog("+a+")");return l.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;256<=a;)a-=255;return l.EXP_TABLE[a]},EXP_TABLE:Array(256), +LOG_TABLE:Array(256)},m=0;8>m;m++)l.EXP_TABLE[m]=1<m;m++)l.EXP_TABLE[m]=l.EXP_TABLE[m-4]^l.EXP_TABLE[m-5]^l.EXP_TABLE[m-6]^l.EXP_TABLE[m-8];for(m=0;255>m;m++)l.LOG_TABLE[l.EXP_TABLE[m]]=m;q.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var c=Array(this.getLength()+a.getLength()-1),d=0;d +this.getLength()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(a.get(0)),d=Array(this.getLength()),b=0;b>>7-a%8&1)},put:function(a,c){for(var d=0;d>>c-d-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var c=Math.floor(this.length/8);this.buffer.length<=c&&this.buffer.push(0);a&&(this.buffer[c]|=128>>>this.length%8);this.length++}};"string"===typeof h&&(h={text:h});h=r.extend({},{render:"canvas",width:256,height:256,typeNumber:-1, +correctLevel:2,background:"#ffffff",foreground:"#000000"},h);return this.each(function(){var a;if("canvas"==h.render){a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();var c=document.createElement("canvas");c.width=h.width;c.height=h.height;for(var d=c.getContext("2d"),b=h.width/a.getModuleCount(),e=h.height/a.getModuleCount(),f=0;f").css("width",h.width+"px").css("height",h.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",h.background);d=h.width/a.getModuleCount();b=h.height/a.getModuleCount();for(e=0;e").css("height",b+"px").appendTo(c);for(i=0;i").css("width", +d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo(f)}}a=c;jQuery(a).appendTo(this)})}})(jQuery); diff --git a/frontend/web/phone.html b/frontend/web/phone.html new file mode 100644 index 0000000..9a52784 --- /dev/null +++ b/frontend/web/phone.html @@ -0,0 +1,136 @@ + + + + + + + 斑马养车 + + + +
+
+
+
+ +
+ +
+
+
+ + +
+
+
+
+
+
车辆信息
+
+ + + + + + + +
车牌号
车架号
发动机号
厂牌型号
+
+
+
+
联系人信息
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/frontend/web/print/car_info_import_temp.xlsx b/frontend/web/print/car_info_import_temp.xlsx new file mode 100644 index 0000000..dfd7a94 Binary files /dev/null and b/frontend/web/print/car_info_import_temp.xlsx differ diff --git a/frontend/web/print/install_lodop64.exe b/frontend/web/print/install_lodop64.exe deleted file mode 100644 index d788e0d..0000000 Binary files a/frontend/web/print/install_lodop64.exe and /dev/null differ