You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
412 lines
18 KiB
412 lines
18 KiB
3 years ago
|
<?php
|
||
|
namespace app\api\controller;
|
||
|
use app\api\model\Bidding;
|
||
|
use app\common\controller\Api;
|
||
|
use app\common\model\Banner;
|
||
|
use app\common\model\Collect;
|
||
|
use app\common\model\Tender;
|
||
|
use app\common\ResponseJson;
|
||
|
use app\common\SdException;
|
||
|
use app\middleware\Token;
|
||
|
use OSS\Core\OssException;
|
||
|
use sdModule\common\helper\Excel;
|
||
|
use sdModule\common\Sc;
|
||
|
use Smalot\PdfParser\Parser;
|
||
|
use think\facade\App;
|
||
|
use think\facade\Db;
|
||
|
use Imagick;
|
||
|
class Index extends Api
|
||
|
{
|
||
|
const APP_ID = '23542778';
|
||
|
const API_KEY = '0ySWTA6pHnRI7u9gXuPROH86';
|
||
|
const SECRET_KEY = 'SdYmL9VU0k55DaGXGSdZ8frqCgQcdPgT';
|
||
|
|
||
|
public array $middleware = [Token::class=>['except'=>['download','banner','auto']]];
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @param \Bidding $bidding
|
||
|
* @return \think\response\Json
|
||
|
* @throws \think\db\exception\DbException
|
||
|
* @author Deng
|
||
|
* @date 2020-12-22 11:15
|
||
|
* 首页获取列表
|
||
|
* OR LOCATE(\''.$value . '\', type) > 0
|
||
|
*/
|
||
|
public function getBidingList(Bidding $bidding){
|
||
|
$member = \app\api\model\Member::getMember();
|
||
|
if(!$member){
|
||
|
return ResponseJson::fail('用户不存在或者尚未注册');
|
||
|
}
|
||
|
if($member['status']==0){
|
||
|
return ResponseJson::fail('您被限制登录,请联系管理员');
|
||
|
}
|
||
|
$getData = $this->request->get();
|
||
|
$where = 'delete_time=0';
|
||
|
if(isset($getData['keyword']) && $getData['keyword']!=''){
|
||
|
/* $where.= ' AND (LOCATE(\''.$getData['keyword'] . '\',title)>0 OR LOCATE(\''.$getData['keyword'] . '\',contract_title)>0 OR LOCATE(\''.$getData['keyword'] . '\',contractNo)>0 OR LOCATE(\''.$getData['keyword'] . '\',project_title)>0)';*/
|
||
|
$where.= ' AND (LOCATE(\''.$getData['keyword'] . '\',title)>0)';
|
||
|
}
|
||
|
if(!$getData['status'] == 3){
|
||
|
$where.= ' AND status='.$getData['status'];
|
||
|
}
|
||
|
$getData['status'] = isset($getData['status']) ? $getData['status'] : 0;
|
||
|
if (isset($getData['is_urgent'])) $where.= ' AND is_urgent='.$getData['is_urgent'];
|
||
|
return ResponseJson::success($bidding->getBiddingList($getData['page'],$getData['limit'],$where));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param Bidding $bidding
|
||
|
* @param $id
|
||
|
* @param $member_id
|
||
|
* @return \think\response\Json
|
||
|
* @throws \think\db\exception\DataNotFoundException
|
||
|
* @throws \think\db\exception\DbException
|
||
|
* @throws \think\db\exception\ModelNotFoundException
|
||
|
* @author Deng
|
||
|
* @date 2020-12-22 11:42
|
||
|
* 获取详情
|
||
|
*/
|
||
|
public function getBidingDetails(Bidding $bidding,$id,$member_id=0){
|
||
|
$member = \app\api\model\Member::getMember();
|
||
|
if(!$member){
|
||
|
return ResponseJson::fail('用户不存在或者尚未注册');
|
||
|
}
|
||
|
if($member['status']==0){
|
||
|
return ResponseJson::fail('您被限制登录,请联系管理员');
|
||
|
}
|
||
|
return ResponseJson::success($bidding->getBindingDetails($id,$member['id']));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param Collect $collect
|
||
|
* @return \think\response\Json
|
||
|
* @throws \think\db\exception\DataNotFoundException
|
||
|
* @throws \think\db\exception\DbException
|
||
|
* @throws \think\db\exception\ModelNotFoundException
|
||
|
* @author Deng
|
||
|
* @date 2020-12-22 14:44
|
||
|
* 关注招标
|
||
|
*/
|
||
|
public function attention(Collect $collect){
|
||
|
$getData = $this->request->get();
|
||
|
$member = \app\api\model\Member::getMember();
|
||
|
if(empty($member)){
|
||
|
return ResponseJson::fail('您暂时还未登录,请登录后关注招标项目');
|
||
|
}
|
||
|
if($member['status']==0){
|
||
|
return ResponseJson::fail('您被限制登录,请联系管理员');
|
||
|
}
|
||
|
if(empty($getData['bidding_id'])){
|
||
|
return ResponseJson::fail('参数缺失');
|
||
|
}
|
||
|
$data = $collect->where([
|
||
|
'member_id' => $member['id'],
|
||
|
'bidding_id' => $getData['bidding_id'],
|
||
|
'delete_time' => 0
|
||
|
])->find();
|
||
|
if(!$data){
|
||
|
$result = $collect->save([
|
||
|
'member_id' => $member['id'],
|
||
|
'bidding_id' => $getData['bidding_id'],
|
||
|
'create_time' => date('Y-m-d H:i:s'),
|
||
|
'update_time' => date('Y-m-d H:i:s'),
|
||
|
]);
|
||
|
return $result ? ResponseJson::success('','关注成功') : ResponseJson::fail('关注成功');
|
||
|
}else{
|
||
|
return ResponseJson::fail('您已经关注该项目');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param Collect $collect
|
||
|
* @return \think\response\Json
|
||
|
* @throws \Exception
|
||
|
* @author Deng
|
||
|
* @date 2020-12-22 14:44
|
||
|
* 取消关注
|
||
|
*/
|
||
|
public function cancelAttention(Collect $collect){
|
||
|
$getData = $this->request->get();
|
||
|
$member = \app\api\model\Member::getMember();
|
||
|
if(!$member){
|
||
|
return ResponseJson::fail('用户不存在或者尚未注册');
|
||
|
}
|
||
|
if($member['status']==0){
|
||
|
return ResponseJson::fail('您被限制登录,请联系管理员');
|
||
|
}
|
||
|
if(empty($getData['bidding_id'])){
|
||
|
return ResponseJson::fail('参数缺失');
|
||
|
}
|
||
|
$data = $collect->where(['member_id' => $member['id'], 'bidding_id' => $getData['bidding_id'], 'delete_time' => 0])->findOrEmpty();
|
||
|
if($data){
|
||
|
$result = $collect->where('id',$data['id'])->useSoftDelete('delete_time',time())->delete();
|
||
|
return $result ? ResponseJson::success('','操作成功') : ResponseJson::fail('操作失败');
|
||
|
}else{
|
||
|
return ResponseJson::fail('取消关注的招标项目不存在');
|
||
|
}
|
||
|
}
|
||
|
/**
|
||
|
* @return \think\response\File
|
||
|
* @author Deng
|
||
|
* @date 2020-12-22 14:07
|
||
|
* 文件下载
|
||
|
*/
|
||
|
public function download(){
|
||
|
$getData = $this->request->get();
|
||
|
$str = App::getRootPath() . '/upload/' . $getData['path'];
|
||
|
if (file_exists($str)) {
|
||
|
return download($str, $getData['tag']);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @return \think\response\Json
|
||
|
* @throws SdException
|
||
|
* 阿里云oss
|
||
|
*/
|
||
|
public function ailOss(){
|
||
|
try {
|
||
|
if (empty($_FILES['file'])) {
|
||
|
return ResponseJson::fail('无上传文件');
|
||
|
}
|
||
|
$result = Sc::aLiYunOSS()->uploadFile('file');
|
||
|
} catch (OssException $e) {
|
||
|
throw new SdException($e->getErrorMessage());
|
||
|
}
|
||
|
return ResponseJson::success($result);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param \app\api\model\Member $member
|
||
|
* @return \think\response\Json
|
||
|
* @author Deng
|
||
|
* @date 2021-01-04 11:25
|
||
|
* 投标
|
||
|
*/
|
||
|
public function tender(\app\api\model\Member $member){
|
||
|
$getPost = $this->request->post();
|
||
|
$memberInfo = \app\api\model\Member::getMember();
|
||
|
if(!$memberInfo){
|
||
|
return ResponseJson::fail('用户不存在或者尚未注册');
|
||
|
}
|
||
|
if($memberInfo['status']==0){
|
||
|
return ResponseJson::fail('您被限制登录,请联系管理员');
|
||
|
}
|
||
|
$bidding = Bidding::where(['id'=>$getPost['bidding_id'],'delete_time'=>0])->findOrEmpty()->toArray();
|
||
|
if(!$bidding){
|
||
|
return ResponseJson::fail('您投标的项目不存在');
|
||
|
}
|
||
|
if($bidding['status'] > 0){
|
||
|
return ResponseJson::fail('您投标的项目已中标');
|
||
|
}
|
||
|
if($memberInfo){
|
||
|
if($memberInfo['is_tender']==0) return ResponseJson::fail('您暂时没有投标权限,请联系管理员');
|
||
|
if($getPost['file_id']){
|
||
|
$data = Db::name('resource')->where('id',$getPost['file_id'])->find();
|
||
|
$path = App::getRootPath().'/upload/'.$data['path'];
|
||
|
|
||
|
if(file_exists($path)){
|
||
|
$tender_price = 0;
|
||
|
if(strstr($data['tag'],'xlsx') || strstr($data['tag'],'xls')){
|
||
|
$excel = new Excel($path,'read');
|
||
|
$data = $excel->getActiveData();
|
||
|
foreach ($data as $key=>$val){
|
||
|
if($val[7] == '合计' && !empty($val[8])){
|
||
|
$tender_price = trim($val[8]);
|
||
|
}
|
||
|
}
|
||
|
if($tender_price == 0){
|
||
|
return ResponseJson::fail('投标文件合计价格不规范,请重新上传');
|
||
|
}
|
||
|
}elseif (strstr($data['tag'],'pdf')){
|
||
|
//pdf转png
|
||
|
pdf_png($path,App::getRootPath().'/upload/watermark/',$data['md5']);
|
||
|
$path = App::getRootPath().'/upload/watermark/'.$data['md5'].'.png';
|
||
|
if(file_exists($path)){
|
||
|
//加水印
|
||
|
\think\Image::open($path)->water('./logo.png')->save(App::getRootPath().'/upload/watermark/'.$data['md5'].'.jpg');
|
||
|
/* $image = file_get_contents($path);
|
||
|
$res = $apiOcr->webImage($image);
|
||
|
if(isset($res['error_code']) && !empty($res['error_code'])){
|
||
|
return ResponseJson::fail('图片错误,错误码:'.$res['error_code'].',错误详细信息请参考百度Ai图片识别对应错误码。');
|
||
|
}
|
||
|
if(empty($res['words_result'])){
|
||
|
return ResponseJson::fail('上传报价图片内容无法识别,请重新上传');
|
||
|
}
|
||
|
foreach ($res['words_result'] as $item){
|
||
|
if(strstr($item['words'],'ㄍ')){
|
||
|
$tender_price = trim(str_replace('ㄍ','',$item['words']));
|
||
|
}elseif (strstr($item['words'],'《')){
|
||
|
$tender_price = trim(str_replace('《','',$item['words']));
|
||
|
}elseif (strstr($item['words'],'》')){
|
||
|
$tender_price = trim(str_replace('》','',$item['words']));
|
||
|
}elseif (strstr($item['words'],'合计')){
|
||
|
$tender_price = trim(str_replace('合计','',$item['words']));
|
||
|
}
|
||
|
}
|
||
|
if (strstr($tender_price,'《')){
|
||
|
$tender_price = trim(str_replace('《','',$tender_price));
|
||
|
}
|
||
|
if (strstr($tender_price,'》')){
|
||
|
$tender_price = trim(str_replace('》','',$tender_price));
|
||
|
}
|
||
|
if(strstr($tender_price,'合计')){
|
||
|
$tender_price = trim(str_replace('合计','',$tender_price));
|
||
|
}
|
||
|
if(strstr($tender_price,'标段1')){
|
||
|
$tender_price = trim(str_replace('标段1','',$tender_price));
|
||
|
}
|
||
|
if(strstr($tender_price,'标段')){
|
||
|
$tender_price = trim(str_replace('标段','',$tender_price));
|
||
|
}
|
||
|
|
||
|
if(empty($tender_price)){
|
||
|
return ResponseJson::fail('上传报价图片合计金额无法识别,请重新上传');
|
||
|
}*/
|
||
|
$tender_price = $this->image($path);
|
||
|
}
|
||
|
}elseif (strstr($data['tag'],'png') || strstr($data['tag'],'jpg')){
|
||
|
//处理图片
|
||
|
\think\Image::open($path)->water('./logo.png')->save(App::getRootPath().'/upload/watermark/'.$data['md5'].'.jpg');
|
||
|
$tender_price = $this->image($path);
|
||
|
}
|
||
|
$getPost['tender_price'] = $tender_price;
|
||
|
$ip = Bidding::get_ip();
|
||
|
$ip = json_decode($ip);
|
||
|
if($ip->ret ==='ok'){
|
||
|
$getPost['ip'] = $ip->ip;
|
||
|
$getPost['ip_address'] = $ip->data[0];
|
||
|
if(!empty($ip->data[1])){
|
||
|
$getPost['ip_address'].='-'.$ip->data[1];
|
||
|
}
|
||
|
if($ip->data[2]){
|
||
|
$getPost['ip_address'].='-'.$ip->data[2];
|
||
|
}
|
||
|
}
|
||
|
}else{
|
||
|
return ResponseJson::fail('缺少资源ID');
|
||
|
}
|
||
|
}
|
||
|
$getPost['member_id'] = $memberInfo['id'];
|
||
|
$result = Tender::create($getPost);
|
||
|
return $result ? ResponseJson::success('','投标成功') : ResponseJson::fail('投标失败');
|
||
|
}else{
|
||
|
return ResponseJson::fail('会员不存在');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
public function image($path){
|
||
|
//图片类
|
||
|
require_once App::getRootPath().'/extend/AipOcr/AipOcr.php';
|
||
|
$apiOcr = new \AipOcr(self::APP_ID, self::API_KEY, self::SECRET_KEY);
|
||
|
$image = file_get_contents($path);
|
||
|
$res = $apiOcr->webImage($image);
|
||
|
if(isset($res['error_code']) && !empty($res['error_code'])){
|
||
|
return ResponseJson::fail('图片错误,错误码:'.$res['error_code'].',错误详细信息请参考百度Ai图片识别对应错误码。');
|
||
|
}
|
||
|
if(empty($res['words_result'])){
|
||
|
return ResponseJson::fail('上传报价图片内容无法识别,请重新上传');
|
||
|
}
|
||
|
$tender_price = '';
|
||
|
foreach ($res['words_result'] as $key => $item){
|
||
|
/*if ($item['words'] === '合计'){
|
||
|
$tender_price = $res['words_result'][$key+1]['words'];
|
||
|
break;
|
||
|
}else if(strstr($item['words'],'ㄍ')){
|
||
|
$tender_price = trim(str_replace('ㄍ','',$item['words']));
|
||
|
break;
|
||
|
}elseif (strstr($item['words'],'《')){
|
||
|
$tender_price = trim(str_replace('《','',$item['words']));
|
||
|
break;
|
||
|
}elseif (strstr($item['words'],'》')){
|
||
|
$tender_price = trim(str_replace('》','',$item['words']));
|
||
|
break;
|
||
|
}elseif (strstr($item['words'],'合计')){
|
||
|
$tender_price = trim(str_replace('合计','',$item['words']));
|
||
|
break;
|
||
|
}*/
|
||
|
if ($item['words'] === '合计'){
|
||
|
$tender_price = $res['words_result'][$key+1]['words'];
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if(strstr($tender_price,'ㄍ')){
|
||
|
$tender_price = trim(str_replace('ㄍ','',$tender_price));
|
||
|
}
|
||
|
if (strstr($tender_price,'《')){
|
||
|
$tender_price = trim(str_replace('《','',$tender_price));
|
||
|
}
|
||
|
if (strstr($tender_price,'》')){
|
||
|
$tender_price = trim(str_replace('》','',$tender_price));
|
||
|
}
|
||
|
if(strstr($tender_price,'合计')){
|
||
|
$tender_price = trim(str_replace('合计','',$tender_price));
|
||
|
}
|
||
|
if(strstr($tender_price,'标段1')){
|
||
|
$tender_price = trim(str_replace('标段1','',$tender_price));
|
||
|
}
|
||
|
if(strstr($tender_price,'标段')){
|
||
|
$tender_price = trim(str_replace('标段','',$tender_price));
|
||
|
}
|
||
|
if(empty($tender_price)){
|
||
|
return ResponseJson::fail('上传报价图片合计金额无法识别,请重新上传');
|
||
|
}
|
||
|
return $tender_price;
|
||
|
}
|
||
|
/**
|
||
|
* @return \think\response\Json
|
||
|
* @throws \think\db\exception\DataNotFoundException
|
||
|
* @throws \think\db\exception\DbException
|
||
|
* @throws \think\db\exception\ModelNotFoundException
|
||
|
* @author Deng
|
||
|
* @date 2021-01-12 18:02
|
||
|
* 轮播
|
||
|
*/
|
||
|
public function banner()
|
||
|
{
|
||
|
return ResponseJson::success(Banner::where('delete_time',0)->order('sort desc')->field('id,title,cover,cover_url')->select()->toArray());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return \think\response\Json
|
||
|
* @throws \think\db\exception\DataNotFoundException
|
||
|
* @throws \think\db\exception\DbException
|
||
|
* @throws \think\db\exception\ModelNotFoundException
|
||
|
* @author Deng
|
||
|
* @date 2021-01-14 17:06
|
||
|
* 自动结标
|
||
|
*/
|
||
|
public function auto(){
|
||
|
$bidding = Bidding::where(['status'=>0,'delete_time'=>0])->whereTime('open_bid_time','<',time())->select()->toArray();
|
||
|
Db::startTrans();
|
||
|
try {
|
||
|
foreach ($bidding as $bid){
|
||
|
$getData = Tender::where(['bidding_id'=>$bid['id'],'status'=>0,'delete_time'=>0])->order('tender_price desc')->findOrEmpty()->toArray();
|
||
|
if(isset($getData['id']) && $getData['id']){
|
||
|
//修改投标状态
|
||
|
Db::name('tender')->where('id',$getData['id'])->update(['status'=>1,'update_time'=>date('Y-m-d H:i:s')]);
|
||
|
//发送通知
|
||
|
// $bidding = \app\common\model\Bidding::where('id',$getData['bidding_id'])->find()->toArray();
|
||
|
$content= '恭喜您通过招标。请您和我司负责人'.$bid['contact_person'].'进行沟通联系方式:'.$bid['contact_person_tel'];
|
||
|
\app\common\model\Notice::create([
|
||
|
'member_id' => $getData['member_id'],
|
||
|
'bidding_id' => $bid['id'],
|
||
|
'content' => $content,
|
||
|
'contract_title' => $bid['project_title']
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
//修改招标状态
|
||
|
\app\common\model\Bidding::where(['id'=>$bid['id']])->update(['status'=>1,'update_time'=>date('Y-m-d H:i:s')]);
|
||
|
}
|
||
|
db::commit();
|
||
|
return ResponseJson::success();
|
||
|
} catch (\Exception $exception) {
|
||
|
db::rollback();
|
||
|
return ResponseJson::fail($exception->getMessage());
|
||
|
}
|
||
|
}
|
||
|
}
|