From 3a92a48b3a660f9ab94df64bdfd93bb3dc6faba9 Mon Sep 17 00:00:00 2001 From: qinzexin <“731344816@qq.com”> Date: Thu, 19 Jun 2025 14:03:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=AC=E5=A4=B4=E7=AE=A1=E7=90=86=E5=A2=9E?= =?UTF-8?q?=E5=88=A0=E6=94=B9=E6=9F=A5=20=E5=88=97=E8=A1=A8=20=E5=8F=91?= =?UTF-8?q?=E7=A5=A8=E7=94=B3=E8=AF=B7=20=E8=AE=A2=E5=8D=95=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E5=8F=91=E7=A5=A8=E4=BF=A1=E6=81=AF=20=E5=8F=AF?= =?UTF-8?q?=E5=BC=80=E5=8F=91=E7=A5=A8=E7=9A=84=E8=AE=A2=E5=8D=95=E5=88=97?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/controller/user/invoice/Apply.php | 3 +- .../admin/lang/zh-cn/user/invoice/apply.php | 3 + .../admin/model/user/invoice/Apply.php | 2 +- .../admin/view/user/invoice/apply/edit.html | 17 + application/api/controller/school/Header.php | 295 +++++++++++++++ .../controller/school/newactivity/Order.php | 6 + .../school/newworker/activity/Order.php | 6 + application/common/controller/Api.php | 2 +- .../common/model/school/activity/Activity.php | 17 +- .../model/school/activity/order/Order.php | 12 + .../common/model/user/invoice/Apply.php | 72 +++- .../common/model/user/invoice/Header.php | 335 ++++++++++++++++++ application/extra/upload.php | 4 +- .../lang/zh-cn/user/invoice/apply.php | 4 + .../manystore/model/user/invoice/Apply.php | 2 +- .../view/user/invoice/apply/edit.html | 18 + .../assets/js/backend/user/invoice/apply.js | 10 +- .../assets/js/manystore/user/invoice/apply.js | 13 +- 18 files changed, 799 insertions(+), 22 deletions(-) create mode 100644 application/api/controller/school/Header.php diff --git a/application/admin/controller/user/invoice/Apply.php b/application/admin/controller/user/invoice/Apply.php index c2a8343..bb27a33 100644 --- a/application/admin/controller/user/invoice/Apply.php +++ b/application/admin/controller/user/invoice/Apply.php @@ -191,8 +191,9 @@ class Apply extends Backend $result = false; try{ $desc = $params["desc"]; + $images= $params["images"]; $model = (new \app\common\model\user\invoice\Apply()); - $model->examine($ids,$desc,$this->auth->id,'admin',false,true); + $model->examine($ids,$images,$desc,$this->auth->id,'admin',false,true); $row->allowField(true)->save($params); }catch (\Exception $e){ $this->error($e->getMessage()); diff --git a/application/admin/lang/zh-cn/user/invoice/apply.php b/application/admin/lang/zh-cn/user/invoice/apply.php index 5a6585d..c88d356 100644 --- a/application/admin/lang/zh-cn/user/invoice/apply.php +++ b/application/admin/lang/zh-cn/user/invoice/apply.php @@ -7,10 +7,13 @@ return [ 'Set status to 1' => '设为申请中', 'Status 2' => '已开票', 'Set status to 2' => '设为已开票', + 'Status -3' => '已作废', + 'Set status to -3' => '设为已作废', 'Apply_type' => '申请类型', 'Apply_type 1' => '单开', 'Apply_type 2' => '连开', 'Price' => '申请实付金额', + 'Images' => '发票图片展示', 'Fee_price' => '平台手续费', 'Desc' => '开票备注', 'Head_type' => '抬头类型', diff --git a/application/admin/model/user/invoice/Apply.php b/application/admin/model/user/invoice/Apply.php index fb34cc4..4a1af20 100644 --- a/application/admin/model/user/invoice/Apply.php +++ b/application/admin/model/user/invoice/Apply.php @@ -36,7 +36,7 @@ class Apply extends Model public function getStatusList() { - return ['1' => __('Status 1'), '2' => __('Status 2')]; + return ['1' => __('Status 1'), '2' => __('Status 2'), '-3' => __('Status -3')]; } public function getApplyTypeList() diff --git a/application/admin/view/user/invoice/apply/edit.html b/application/admin/view/user/invoice/apply/edit.html index 866d57a..7bdec3a 100644 --- a/application/admin/view/user/invoice/apply/edit.html +++ b/application/admin/view/user/invoice/apply/edit.html @@ -143,6 +143,23 @@ +
+ +
+
+ +
+ + +
+ +
+ + +
+
+ +
diff --git a/application/api/controller/school/Header.php b/application/api/controller/school/Header.php new file mode 100644 index 0000000..5fdf5e8 --- /dev/null +++ b/application/api/controller/school/Header.php @@ -0,0 +1,295 @@ +transactionCheck(); + + $this->model = new HeaderModel; + parent::_initialize(); + //敏感词过滤 +// $this->checkSensitivewords([]); + +// $this->setUrlLock(); + } + + + + + /** + * @ApiTitle( 抬头列表接口) + * @ApiSummary(抬头列表接口) + * @ApiMethod(GET) + * @ApiParams(name = "keywords", type = "string",required=false,description = "搜索关键字") + * @ApiParams(name = "page", type = "string",required=true,description = "页数") + * @ApiParams(name = "limit", type = "string",required=true,description = "条数") + * + * @ApiReturn({ + * + *}) + */ + public function header_list() + { + $user_id = 0; + $user = $this->auth->getUser();//登录用户 + if($user)$user_id = $user['id']; + + $params = []; + $params['user_id'] = $user_id; + $page = $this->request->get('page/d', 0); //页数 + $limit = $this->request->get('limit/d', 0); //条数 + $params["keywords"] = $this->request->get('keywords/s', ''); //搜索关键字 + + +// $params["time"] = $this->request->get('time/s', ''); //时间 + + try{ + //当前申请状态 + $res = $this->model::headerList($page, $limit,$params); +// if($user_id =='670153'){ +// file_put_contents("ceshi66.txt",(new AppointmentOrder())->getLastSql()); +// } + }catch (\Exception $e){ + + $this->error($e->getMessage()); + } + $this->success('查询成功', $res); + } + + + /** + * @ApiTitle( 抬头详情) + * @ApiSummary(抬头详情) + * @ApiMethod(GET) + * @ApiParams(name = "id", type = "int",required=true,description = "抬头id") + * @ApiReturn({ + * + *}) + */ + public function detail(){ + $id = $this->request->get('id/d',''); + + if(empty($id)){ + $this->error(__('缺少必要参数')); + } + + try { + $res = $this->model->detail($id); + } catch (\Exception $e){ +// Log::log($e->getMessage()); + $this->error($e->getMessage(),['errcode'=>$e->getCode()]); + } + $this->success('获取成功', ['detail' => $res]); + } + + + + /** + * 删除抬头 + * + * @ApiMethod (POST) + * @ApiParams (name="ids", type="string", required=true, description="要删除的ids") + */ + public function del() + { +// $admin_id = $this->auth->id; + $ids = $this->request->post('ids/s'); + + try{ + $menulist = $this->model->del($ids,true); + } catch (\Exception $e) { + $this->error($e->getMessage()); + } + + $this->success('删除成功', $menulist); + } + + + + + + + /** + * @ApiTitle(添加抬头) + * @ApiSummary(添加抬头) + * @ApiMethod(POST) + * @ApiParams(name = "head_type", type = "string",required=true,description = "抬头类型:personal=个人或事业单位,corporate=企业") + * @ApiParams(name = "invoice_type", type = "string",required=true,description = "发票类型:ordinary=普通发票,special=专用发票") + * @ApiParams(name = "invoice_header", type = "string",required=true,description = "发票抬头") + * @ApiParams(name = "tax_id", type = "string",required=true,description = "税号") + * @ApiParams(name = "bank_deposit", type = "string",required=true,description = "开户银行") + * @ApiParams(name = "bank_number", type = "string",required=true,description = "银行账号") + * @ApiParams(name = "enterprise_address", type = "string",required=true,description = "企业地址") + * @ApiParams(name = "enterprise_phone", type = "string",required=true,description = "企业电话") + * @ApiParams(name = "invoice_reservation_phone", type = "string",required=true,description = "发票预留电话") + * @ApiParams(name = "invoice_reservation_email", type = "string",required=true,description = "发票预留邮箱") + * @ApiParams(name = "is_default", type = "string",required=true,description = "是否默认:0=否,1=是") + * @ApiReturn({ + * + *}) + */ + public function add(){ + + //敏感词过滤 + $this->checkSensitivewords(["invoice_header"]); + + $user_id = 0; + $user = $this->auth->getUser();//登录用户 + if($user)$user_id = $user['id']; + $params = []; + $params["user_id"] = $user_id; //老师id + $params["head_type"] = $this->request->post('head_type/s', ''); //课程标签 + $params["invoice_type"] = $this->request->post('invoice_type/s', ''); //课程标签 + $params["invoice_header"] = $this->request->post('invoice_header/s', ''); //课程标签 + $params["tax_id"] = $this->request->post('tax_id/s', ''); //课程标签 + $params["bank_deposit"] = $this->request->post('bank_deposit/s', ''); //课程标签 + $params["bank_number"] = $this->request->post('bank_number/s', ''); //课程标签 + $params["enterprise_address"] = $this->request->post('enterprise_address/s', ''); //课程标签 + $params["enterprise_phone"] = $this->request->post('enterprise_phone/s', ''); //课程标签 + $params["invoice_reservation_phone"] = $this->request->post('invoice_reservation_phone/s', ''); //课程标签 + $params["invoice_reservation_email"] = $this->request->post('invoice_reservation_email/s', ''); //课程标签 + $params["is_default"] = $this->request->post('is_default/d', ''); //课程标签 + + try{ + $res = $this->model->add($params,true); + }catch (\Throwable $e){ + $this->error($e->getMessage()); + } + $this->success('添加成功', $res); + } + + + + /** + * @ApiTitle(编辑成员) + * @ApiSummary(编辑成员) + * @ApiMethod(POST) + * @ApiRoute (/api/school.header/edit/ids/{ids}) + * @ApiParams (name="ids", type="string", required=true, description="需要编辑的id") + * @ApiParams(name = "head_type", type = "string",required=true,description = "抬头类型:personal=个人或事业单位,corporate=企业") + * @ApiParams(name = "invoice_type", type = "string",required=true,description = "发票类型:ordinary=普通发票,special=专用发票") + * @ApiParams(name = "invoice_header", type = "string",required=true,description = "发票抬头") + * @ApiParams(name = "tax_id", type = "string",required=true,description = "税号") + * @ApiParams(name = "bank_deposit", type = "string",required=true,description = "开户银行") + * @ApiParams(name = "bank_number", type = "string",required=true,description = "银行账号") + * @ApiParams(name = "enterprise_address", type = "string",required=true,description = "企业地址") + * @ApiParams(name = "enterprise_phone", type = "string",required=true,description = "企业电话") + * @ApiParams(name = "invoice_reservation_phone", type = "string",required=true,description = "发票预留电话") + * @ApiParams(name = "invoice_reservation_email", type = "string",required=true,description = "发票预留邮箱") + * @ApiParams(name = "is_default", type = "string",required=true,description = "是否默认:0=否,1=是") + * @ApiReturn({ + * + *}) + */ + public function edit($ids = null){ + //敏感词过滤 + $this->checkSensitivewords(["name","idnum"]); + + $user_id = 0; + $user = $this->auth->getUser();//登录用户 + if($user)$user_id = $user['id']; + $params = []; + $params["user_id"] = $user_id; //老师id + $params["head_type"] = $this->request->post('head_type/s', ''); //课程标签 + $params["invoice_type"] = $this->request->post('invoice_type/s', ''); //课程标签 + $params["invoice_header"] = $this->request->post('invoice_header/s', ''); //课程标签 + $params["tax_id"] = $this->request->post('tax_id/s', ''); //课程标签 + $params["bank_deposit"] = $this->request->post('bank_deposit/s', ''); //课程标签 + $params["bank_number"] = $this->request->post('bank_number/s', ''); //课程标签 + $params["enterprise_address"] = $this->request->post('enterprise_address/s', ''); //课程标签 + $params["enterprise_phone"] = $this->request->post('enterprise_phone/s', ''); //课程标签 + $params["invoice_reservation_phone"] = $this->request->post('invoice_reservation_phone/s', ''); //课程标签 + $params["invoice_reservation_email"] = $this->request->post('invoice_reservation_email/s', ''); //课程标签 + $params["is_default"] = $this->request->post('is_default/d', ''); //课程标签 + + try{ + $res = $this->model->edit($ids,$params,true); + }catch (\Throwable $e){ + $this->error($e->getMessage()); + } + $this->success('编辑成功', $res); + } + + + + + + + + + + /** + * @ApiTitle(订单申请开票(单开|合开)) + * @ApiSummary(订单申请开票) + * @ApiMethod(POST) + * @ApiParams(name = "order_nos", type = "string",required=true,description = "需要开票的订单号:多开传多个逗号隔开字符串") + * @ApiParams(name = "head_type", type = "string",required=true,description = "抬头类型:personal=个人或事业单位,corporate=企业") + * @ApiParams(name = "invoice_type", type = "string",required=true,description = "发票类型:ordinary=普通发票,special=专用发票") + * @ApiParams(name = "invoice_header", type = "string",required=true,description = "发票抬头") + * @ApiParams(name = "tax_id", type = "string",required=true,description = "税号") + * @ApiParams(name = "bank_deposit", type = "string",required=true,description = "开户银行") + * @ApiParams(name = "bank_number", type = "string",required=true,description = "银行账号") + * @ApiParams(name = "enterprise_address", type = "string",required=true,description = "企业地址") + * @ApiParams(name = "enterprise_phone", type = "string",required=true,description = "企业电话") + * @ApiParams(name = "invoice_reservation_phone", type = "string",required=true,description = "发票预留电话") + * @ApiParams(name = "invoice_reservation_email", type = "string",required=true,description = "发票预留邮箱") + * @ApiReturn({ + * + *}) + */ + public function apply(){ + $this->model = new Apply(); + //敏感词过滤 + $this->checkSensitivewords(["invoice_header"]); + + $user_id = 0; + $user = $this->auth->getUser();//登录用户 + if($user)$user_id = $user['id']; + $params = []; + $params["user_id"] = $user_id; //老师id + $order_no = $this->request->post('order_nos/s', ''); //课程标签 + + $params["head_type"] = $this->request->post('head_type/s', ''); //课程标签 + $params["invoice_type"] = $this->request->post('invoice_type/s', ''); //课程标签 + $params["invoice_header"] = $this->request->post('invoice_header/s', ''); //课程标签 + $params["tax_id"] = $this->request->post('tax_id/s', ''); //课程标签 + $params["bank_deposit"] = $this->request->post('bank_deposit/s', ''); //课程标签 + $params["bank_number"] = $this->request->post('bank_number/s', ''); //课程标签 + $params["enterprise_address"] = $this->request->post('enterprise_address/s', ''); //课程标签 + $params["enterprise_phone"] = $this->request->post('enterprise_phone/s', ''); //课程标签 + $params["invoice_reservation_phone"] = $this->request->post('invoice_reservation_phone/s', ''); //课程标签 + $params["invoice_reservation_email"] = $this->request->post('invoice_reservation_email/s', ''); //课程标签 +// $params["is_default"] = $this->request->post('is_default/d', ''); //课程标签 + + try{ + + $res = $this->model->add($order_no,$params,$user_id,'user',true,true); + }catch (\Throwable $e){ + $this->error($e->getMessage()); + } + $this->success('添加成功', $res); + } + + + + +} \ No newline at end of file diff --git a/application/api/controller/school/newactivity/Order.php b/application/api/controller/school/newactivity/Order.php index 6a878da..7c0191b 100644 --- a/application/api/controller/school/newactivity/Order.php +++ b/application/api/controller/school/newactivity/Order.php @@ -79,6 +79,8 @@ class Order extends Base * @ApiParams(name = "status", type = "string",required=false,description = "订单状态:-3=已取消,0=待支付,2=已报名,3=核销中,4=售后中,5=退款结算中,6=已退款,9=已完成") * @ApiParams(name = "server_status", type = "string",required=false,description = "售后订单状态:0=正常,3=售后中,6=售后完成") * @ApiParams(name = "auth_status", type = "string",required=false,description = "售后结果状态:0=待审核,1=同意退款,2=拒绝退款") + * @ApiParams(name = "invoice_status", type = "string",required=false,description = "发票申请状态:0=未申请,1=申请中,2=已开票") + * @ApiParams(name = "have_invoice", type = "int",required=false,description = "是否查可开票:1是") * @ApiParams(name = "activity_id", type = "int",required=false,description = "活动id") * @ApiReturn({ * @@ -97,6 +99,10 @@ class Order extends Base $params = []; $params["auth_status"] = $this->request->get('auth_status/s', ''); //搜索关键字 + + $params["invoice_status"] = $this->request->get('invoice_status/s', ''); //搜索关键字 + $params["have_invoice"] = $this->request->get('have_invoice/d', 0); //搜索关键字 + $activity_id = $this->request->get('activity_id/s', ''); //搜索关键字 $has_evaluate = $this->request->get('has_evaluate/d', 0); //搜索关键字 diff --git a/application/api/controller/school/newworker/activity/Order.php b/application/api/controller/school/newworker/activity/Order.php index 196d5e3..2c42bbf 100644 --- a/application/api/controller/school/newworker/activity/Order.php +++ b/application/api/controller/school/newworker/activity/Order.php @@ -74,6 +74,8 @@ class Order extends Base * @ApiParams(name = "status", type = "string",required=false,description = "订单状态:-3=已取消,0=待支付,2=已报名,3=核销中,4=售后中,5=退款结算中,6=已退款,9=已完成") * @ApiParams(name = "server_status", type = "string",required=false,description = "售后订单状态:0=正常,3=售后中,6=售后完成") * @ApiParams(name = "auth_status", type = "string",required=false,description = "售后结果状态:0=待审核,1=同意退款,2=拒绝退款") + * @ApiParams(name = "invoice_status", type = "string",required=false,description = "发票申请状态:0=未申请,1=申请中,2=已开票") + * @ApiParams(name = "have_invoice", type = "int",required=false,description = "是否查可开票:1是") * @ApiParams(name = "activity_id", type = "int",required=false,description = "活动id") * @ApiReturn({ * @@ -90,6 +92,10 @@ class Order extends Base $status = $this->request->get('status/s', ''); //搜索关键字 $params =[]; $params["auth_status"] = $this->request->get('auth_status/s', ''); //搜索关键字 + + $params["invoice_status"] = $this->request->get('invoice_status/s', ''); //搜索关键字 + $params["have_invoice"] = $this->request->get('have_invoice/d', 0); //搜索关键字 + $server_status = $this->request->get('server_status/s', ''); //搜索关键字 $activity_id = $this->request->get('activity_id/s', ''); //搜索关键字 diff --git a/application/common/controller/Api.php b/application/common/controller/Api.php index 2d09369..bb1add0 100644 --- a/application/common/controller/Api.php +++ b/application/common/controller/Api.php @@ -75,7 +75,7 @@ class Api /** 检测敏感词 * @return void */ - public function checkSensitivewords($sensitivewords_field = []){ + protected function checkSensitivewords($sensitivewords_field = []){ $sensitivewords = new \bw\sensitivewords\Sensitivewords(); try { $get = $this->request->param(); diff --git a/application/common/model/school/activity/Activity.php b/application/common/model/school/activity/Activity.php index d937a13..ce32605 100644 --- a/application/common/model/school/activity/Activity.php +++ b/application/common/model/school/activity/Activity.php @@ -76,13 +76,6 @@ class Activity extends BaseModel return $imagesArray; } - public function getImageAttr($value, $data) - { - if (!empty($value)) return cdnurl($value,true); - } - - - public function setImagesAttr($value, $data) @@ -95,6 +88,16 @@ class Activity extends BaseModel return $imagesArray; } + public function getImageAttr($value, $data) + { + if (!empty($value)) return cdnurl($value,true); + } + + + + + + public function getDistanceTextAttr($value, $data) { diff --git a/application/common/model/school/activity/order/Order.php b/application/common/model/school/activity/order/Order.php index ed5986b..6880830 100644 --- a/application/common/model/school/activity/order/Order.php +++ b/application/common/model/school/activity/order/Order.php @@ -329,6 +329,18 @@ class Order extends BaseModel + if (isset($whereData['invoice_status']) && $whereData['invoice_status']!=="" && $whereData['invoice_status']!==null) $model = $model->where("{$alisa}invoice_status", 'in', $whereData['invoice_status']); + if (isset($whereData['not_invoice_status'])&& $whereData['not_invoice_status']!=="" && $whereData['not_invoice_status']!==null) $model = $model->where("{$alisa}invoice_status", 'not in', $whereData['not_invoice_status']); + + + if(isset($whereData['have_invoice']) && $whereData["have_invoice"]){ + //查可开票的单 + $model = $model->where("{$alisa}status","in",["9"])->where("{$alisa}sub_refundprice",">",0)->where("{$alisa}user_invoice_apply_id",0); + + } + + + if (isset($whereData['keywords'])&&$whereData['keywords']){ $model = $model->where("{$alisa}order_no|{$alisa}pay_no|user.nickname|user.realname|user.mobile|detail.title|detail.address|detail.address_detail", 'LIKE', "%{$whereData['keywords']}%" ); } diff --git a/application/common/model/user/invoice/Apply.php b/application/common/model/user/invoice/Apply.php index 2c18086..bb1baf8 100644 --- a/application/common/model/user/invoice/Apply.php +++ b/application/common/model/user/invoice/Apply.php @@ -36,10 +36,10 @@ class Apply extends BaseModel ]; - + public function getStatusList() { - return ['1' => __('Status 1'), '2' => __('Status 2')]; + return ['1' => __('Status 1'), '2' => __('Status 2'), '-3' => __('Status -3')]; } public function getApplyTypeList() @@ -102,6 +102,33 @@ class Apply extends BaseModel } + + public function getImagesAttr($value, $data) + { + $imagesArray = []; + if (!empty($value)) { + $imagesArray = explode(',', $value); + foreach ($imagesArray as &$v) { + $v = cdnurl($v, true); + } + return $imagesArray; + } + return $imagesArray; + } + + + + public function setImagesAttr($value, $data) + { + $imagesArray = $value; + if (!empty($value) && is_array($value)) { + //转成逗号拼接字符串 + $imagesArray = implode(',', $value); + } + return $imagesArray; + } + + public function user() { return $this->belongsTo('app\admin\model\User', 'user_id', 'id', [], 'LEFT')->setEagerlyType(0); @@ -129,7 +156,7 @@ class Apply extends BaseModel throw new \Exception(__('Parameter %s can not be empty', '')); } - + $params['type'] = $params['type'] ?? '1'; //默认新开 $rule = [ // 'user_id'=>'require', @@ -160,6 +187,7 @@ class Apply extends BaseModel if($params['head_type']=='corporate'){ $rule = [ 'tax_id'=>'require', + 'type'=>'require', 'bank_deposit'=>'require', 'bank_number'=>'require', 'enterprise_address'=>'require', @@ -167,6 +195,7 @@ class Apply extends BaseModel ]; $rule_msg = [ 'tax_id.require' => '纳税人识别号必填', + 'type.require' => '开票类型必填', 'bank_deposit.require' => '开户银行必填', 'bank_number.require' => '银行账号必填', 'enterprise_address.require' => '企业地址必填', @@ -206,8 +235,7 @@ class Apply extends BaseModel - //是否已提交发票申请 - if($order->invoiceaplpy) throw new \Exception('订单已提交发票申请,请勿重复提交!'); + //计算合开金额 @@ -216,8 +244,19 @@ class Apply extends BaseModel //平台手续费 $params['fee_price'] = Order::where( "id","in",$order_ids)->sum("fee_price"); if(!$params['price']) throw new \Exception('订单金额异常,该订单无可申请发票金额'); + //$order_ids 按字典序排序后重新合并成字符串再保存 + //int数组字典序排序 + sort($order_ids,SORT_NUMERIC); + $order_ids = implode(',',$order_ids); + //如果是换开,orderIds不能变 + if($params['type']=='2'){ + $invoiceaplpy = self::where( "order_ids",$order_ids)->find(); + if(!$invoiceaplpy){ + throw new \Exception('换开失败,请选择已经开票的记录操作换开'); + } + } //判断逻辑 @@ -233,9 +272,14 @@ class Apply extends BaseModel // $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.add' : $name) : $this->modelValidate; // $this->validateFailException()->validate($validate); // } + + + $params["order_ids"] = $order_ids; //添加发票申请 $self = new self; $result = $self->allowField(true)->save($params); + + //更新订单发票申请状态 Order::where( "id","in",$order_ids)->update([ 'invoice_status'=>'1', @@ -243,7 +287,18 @@ class Apply extends BaseModel ]); //逐个发订单日志 foreach ($orders as $order){ - OrderLog::log($order['id'],"活动订单发起了发票申请{$typeinfo},等待系统开票",$oper_id ,$oper_type); + $invoiceaplpy = $order->invoiceaplpy; + if($invoiceaplpy){ + $invoiceaplpy["status"] = '-3'; + $invoiceaplpy->save(); + //换开 + OrderLog::log($order['id'],"活动订单重新发起了发票申请{$typeinfo},等待发票换开",$oper_id ,$oper_type); + }else{ + //新开 + OrderLog::log($order['id'],"活动订单发起了发票申请{$typeinfo},等待系统开票",$oper_id ,$oper_type); + } + + } //合并调用开发票事件 $data = [ @@ -270,11 +325,12 @@ class Apply extends BaseModel /** 发票开票(线下) * @param $id 申请的发票id + * @param $images 发票展示 * @param $desc 开票备注 * @param $trans * @throws \Exception */ - public function examine($id,$desc,$oper_id = 0,$oper_type='user',$check=true,$trans=false) + public function examine($id,$images,$desc,$oper_id = 0,$oper_type='user',$check=true,$trans=false) { $self = self::get($id); if(!$self) throw new \Exception('发票申请不存在'); @@ -283,10 +339,12 @@ class Apply extends BaseModel return $self; } if(! $desc) throw new \Exception('请填写开票备注'); + if(! $images) throw new \Exception( '请上传发票图片'); // $params = [ 'status' => '2', 'desc' => $desc, + 'images' => $images, 'invoicingtime' => time(), ]; diff --git a/application/common/model/user/invoice/Header.php b/application/common/model/user/invoice/Header.php index 1773251..d272d07 100644 --- a/application/common/model/user/invoice/Header.php +++ b/application/common/model/user/invoice/Header.php @@ -79,4 +79,339 @@ class Header extends BaseModel { return $this->belongsTo('app\admin\model\User', 'user_id', 'id', [], 'LEFT')->setEagerlyType(0); } + + + + + + + /** 通用新增(后台api版本) + * @param $params + * @param $trans + * @return $this + * @throws \Exception + */ + public function add($params,$trans=false){ + + if (empty($params)) { + throw new \Exception(__('Parameter %s can not be empty', '')); + } + + + + + $rule = [ + 'user_id'=>'require', + 'head_type'=>'require', + 'invoice_type'=>'require', + 'invoice_header' => 'require', + 'invoice_reservation_phone' => 'require', + 'invoice_reservation_email' => 'require', + ]; + + $rule_msg = [ + "user_id.require"=>'提交用户必填', + "head_type.require"=>'抬头类型必填', + "invoice_type.require"=>'发票类型必填', + 'invoice_header.require' => '发票抬头必填', + 'invoice_reservation_phone.require' => '发票预留电话必填', + 'invoice_reservation_email.require' => '发票预留邮箱必填', + ]; + + self::check($params,$rule,$rule_msg); + + //个人无法开专用发票 + if($params['head_type']=='personal' && $params['invoice_type']=='special'){ + throw new \Exception('个人用户无法开专用发票'); + } + + //企业需要填写纳税人识别号等信息 + if($params['head_type']=='corporate'){ + $rule = [ + 'tax_id'=>'require', + 'bank_deposit'=>'require', + 'bank_number'=>'require', + 'enterprise_address'=>'require', + 'enterprise_phone'=>'require', + ]; + $rule_msg = [ + 'tax_id.require' => '纳税人识别号必填', + 'bank_deposit.require' => '开户银行必填', + 'bank_number.require' => '银行账号必填', + 'enterprise_address.require' => '企业地址必填', + 'enterprise_phone.require' => '企业电话必填', + ]; + self::check($params,$rule,$rule_msg); + } + + + + + + +//判断逻辑 + if($trans){ + self::beginTrans(); + } + $res = true; + try{ + + //是否采用模型验证 + $params["is_default"] = $params["is_default"] ?? '0'; + if($params["is_default"] == '1'){ + self::where('user_id',$params['user_id'])->update(['is_default'=>'0']); + } + + + $result = $this->allowField(true)->save($params); + + + if($trans){ + self::commitTrans(); + } + }catch (\Exception $e){ + if($trans){ + self::rollbackTrans(); + } + throw new \Exception($e->getMessage().$e->getFile().$e->getLine()); + } + return $this; + } + + + /** 通用编辑(后台api版本) + * @param $params + * @param $trans + * @return $this + * @throws \Exception + */ + public function edit($id,$params,$trans=false){ + + $row = $this->get($id); + if (!$row) { + throw new \Exception(__('No Results were found')); + } + + + + if (empty($params)) { + throw new \Exception(__('Parameter %s can not be empty', '')); + } + + + + + + $rule = [ + 'user_id'=>'require', + 'head_type'=>'require', + 'invoice_type'=>'require', + 'invoice_header' => 'require', + 'invoice_reservation_phone' => 'require', + 'invoice_reservation_email' => 'require', + ]; + + $rule_msg = [ + "user_id.require"=>'提交用户必填', + "head_type.require"=>'抬头类型必填', + "invoice_type.require"=>'发票类型必填', + 'invoice_header.require' => '发票抬头必填', + 'invoice_reservation_phone.require' => '发票预留电话必填', + 'invoice_reservation_email.require' => '发票预留邮箱必填', + ]; + + self::check($params,$rule,$rule_msg); + + //个人无法开专用发票 + if($params['head_type']=='personal' && $params['invoice_type']=='special'){ + throw new \Exception('个人用户无法开专用发票'); + } + + //企业需要填写纳税人识别号等信息 + if($params['head_type']=='corporate'){ + $rule = [ + 'tax_id'=>'require', + 'bank_deposit'=>'require', + 'bank_number'=>'require', + 'enterprise_address'=>'require', + 'enterprise_phone'=>'require', + ]; + $rule_msg = [ + 'tax_id.require' => '纳税人识别号必填', + 'bank_deposit.require' => '开户银行必填', + 'bank_number.require' => '银行账号必填', + 'enterprise_address.require' => '企业地址必填', + 'enterprise_phone.require' => '企业电话必填', + ]; + self::check($params,$rule,$rule_msg); + } + + + + +//判断逻辑 + if($trans){ + self::beginTrans(); + } + $res = true; + try{ + $params["is_default"] = $params["is_default"] ?? '0'; + if($params["is_default"] == '1'){ + self::where('user_id',$params['user_id'])->update(['is_default'=>'0']); + } + + $result = $row->allowField(true)->save($params); + + if($trans){ + self::commitTrans(); + } + }catch (\Exception $e){ + if($trans){ + self::rollbackTrans(); + } + throw new \Exception($e->getMessage().$e->getFile().$e->getLine()); + } + return $row; + } + + + /** 通用详情(后台api版本) + * @param $params + * @param $trans + * @return $this + * @throws \Exception + */ + public function detail($id,$show_field=[],$except_field=[]){ + $row = $this->get($id); + if (!$row) { + throw new \Exception(__('No Results were found')); + } + if($show_field){ + $row->visible($show_field); + } + if($except_field){ + $row->hidden($except_field); + } + return $row; + } + +// public function index($page,$limit,$where=[]) +// { +// $adminIds = $this->getDataLimitAdminIds(); +// $aliasName = "" ; +// if (is_array($adminIds)) { +// $where[] = [$aliasName . $this->dataLimitField, 'in', $adminIds]; +// } +// +// } + + + /** 通用删除(后台api版本) + * @param $params + * @param $trans + * @return $this + * @throws \Exception + */ + public function del($ids = null,$trans=false){ + if (empty($ids)) { + throw new \Exception(__('Parameter %s can not be empty', 'ids')); + } +//判断逻辑 + + $pk = $this->getPk(); + + $list = $this->where($pk, 'in', $ids)->select(); + $count = 0; + if($trans){ + self::beginTrans(); + } + $res = true; + try{ + + foreach ($list as $item) { + $count += $item->delete(); + } + + if($trans){ + self::commitTrans(); + } + }catch (\Exception $e){ + if($trans){ + self::rollbackTrans(); + } + throw new \Exception($e->getMessage().$e->getFile().$e->getLine()); + } + return $count; + } + + + + + + /**得到基础条件 + * @param $status + * @param null $model + * @param string $alisa + */ + public static function getBaseWhere($whereData = [], $model = null, $alisa = '',$with = false) + { + + if (!$model) { + $model = new static; + if ($alisa&&!$with) $model = $model->alias($alisa); + } + if ($alisa) $alisa = $alisa . '.'; + $tableFields = (new static)->getTableFields(); + foreach ($tableFields as $fields) + { + if(in_array($fields, ["user_id"]))continue; +// if (isset($whereData[$fields]) && $whereData[$fields]) $model = $model->where("{$alisa}{$fields}", '=', $whereData[$fields]); + + if (isset($whereData[$fields]) && $whereData[$fields]){ + if(is_array($whereData[$fields])){ + $model = $model->where("{$alisa}{$fields}", $whereData[$fields][0], $whereData[$fields][1]); + }else{ + $model = $model->where("{$alisa}{$fields}", '=', $whereData[$fields]); + } + + } + + + } + if (isset($whereData['user_id']) && $whereData['user_id']) $model = $model->where("{$alisa}user_id", 'in', $whereData['user_id']); + + if (isset($whereData['keywords'])&&$whereData['keywords']) $model = $model->where("{$alisa}invoice_header|{$alisa}tax_id|{$alisa}bank_number|{$alisa}invoice_reservation_phone|{$alisa}invoice_reservation_email", 'like', "%". $whereData['keywords']."%"); + + if (isset($whereData['time'])&&$whereData['time']){ + $model = $model->time(["{$alisa}createtime",$whereData['time']]); + } + + + + + + return $model; + } + + + + + public static function headerList($page, $limit,$params=[]){ + $with_field = [ + 'base'=>['*'], + ]; +// $alisa = (new self)->getWithAlisaName(); +// $sort = "{$alisa}.id desc"; + + $sort = "id desc"; + + $serch_where = []; + $serch_where = array_merge($serch_where,$params); + return (new self)->getBaseList($serch_where, $page, $limit,$sort,$with_field); + } + + + + + } diff --git a/application/extra/upload.php b/application/extra/upload.php index d8bbcdc..c126db0 100644 --- a/application/extra/upload.php +++ b/application/extra/upload.php @@ -9,8 +9,8 @@ return [ /** * CDN地址 */ - 'cdnurl' => 'https://qingchunta.hschool.com.cn', -//'cdnurl' => '', +// 'cdnurl' => 'https://qingchunta.hschool.com.cn', +'cdnurl' => '', /** * 文件保存格式 */ diff --git a/application/manystore/lang/zh-cn/user/invoice/apply.php b/application/manystore/lang/zh-cn/user/invoice/apply.php index 4e2a44a..e7886e4 100644 --- a/application/manystore/lang/zh-cn/user/invoice/apply.php +++ b/application/manystore/lang/zh-cn/user/invoice/apply.php @@ -5,6 +5,8 @@ return [ 'Status' => '申请状态', 'Status 1' => '申请中', 'Status 2' => '已开票', + 'Status -3' => '已作废', + 'Apply_type' => '申请类型', 'Apply_type 1' => '单开', 'Apply_type 2' => '连开', @@ -24,9 +26,11 @@ return [ 'Enterprise_address' => '企业地址', 'Enterprise_phone' => '企业电话', 'Invoice_reservation_phone' => '发票预留电话', + 'Invoice_reservation_email' => '发票预留邮箱', 'Invoicingtime' => '开票时间', 'Createtime' => '创建时间', + 'Images' => '发票图片展示', 'Updatetime' => '修改时间', 'User.nickname' => '昵称', 'User.mobile' => '手机号', diff --git a/application/manystore/model/user/invoice/Apply.php b/application/manystore/model/user/invoice/Apply.php index 7db145e..88b91a1 100644 --- a/application/manystore/model/user/invoice/Apply.php +++ b/application/manystore/model/user/invoice/Apply.php @@ -37,7 +37,7 @@ class Apply extends BaseModel public function getStatusList() { - return ['1' => __('Status 1'), '2' => __('Status 2')]; + return ['1' => __('Status 1'), '2' => __('Status 2'), '-3' => __('Status -3')]; } public function getApplyTypeList() diff --git a/application/manystore/view/user/invoice/apply/edit.html b/application/manystore/view/user/invoice/apply/edit.html index 8b9735c..a529909 100644 --- a/application/manystore/view/user/invoice/apply/edit.html +++ b/application/manystore/view/user/invoice/apply/edit.html @@ -126,6 +126,24 @@
+ +
+ +
+
+ +
+ + +
+ +
+ + +
+
+ +
diff --git a/public/assets/js/backend/user/invoice/apply.js b/public/assets/js/backend/user/invoice/apply.js index 305b5a7..9686fb9 100644 --- a/public/assets/js/backend/user/invoice/apply.js +++ b/public/assets/js/backend/user/invoice/apply.js @@ -29,10 +29,18 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin {checkbox: true}, {field: 'id', title: __('Id')}, {field: 'user_id', title: __('User_id')}, - {field: 'status', title: __('Status'), searchList: {"1":__('Status 1'),"2":__('Status 2')}, formatter: Table.api.formatter.status}, + {field: 'status', title: __('Status'), searchList: {"1":__('Status 1'),"2":__('Status 2'),"-3":__('Status -3')}, formatter: Table.api.formatter.status}, + + {field: 'type', title: __('开票类型'), searchList: {"1":__('新开'),"2":__('换开')}, formatter: Table.api.formatter.normal}, + + {field: 'apply_type', title: __('Apply_type'), searchList: {"1":__('Apply_type 1'),"2":__('Apply_type 2')}, formatter: Table.api.formatter.normal}, {field: 'price', title: __('Price'), operate:'BETWEEN'}, {field: 'fee_price', title: __('Fee_price'), operate:'BETWEEN'}, + + {field: 'images', title: __('Images'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.images}, + + {field: 'desc', title: __('Desc'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content}, diff --git a/public/assets/js/manystore/user/invoice/apply.js b/public/assets/js/manystore/user/invoice/apply.js index 3d9caa5..642607a 100644 --- a/public/assets/js/manystore/user/invoice/apply.js +++ b/public/assets/js/manystore/user/invoice/apply.js @@ -22,15 +22,26 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin url: $.fn.bootstrapTable.defaults.extend.index_url, pk: 'id', sortName: 'id', + fixedColumns: true, + fixedRightNumber: 1, columns: [ [ {checkbox: true}, {field: 'id', title: __('Id')}, {field: 'user_id', title: __('User_id')}, - {field: 'status', title: __('Status'), searchList: {"1":__('Status 1'),"2":__('Status 2')}, formatter: Table.api.formatter.status}, + {field: 'status', title: __('Status'), searchList: {"1":__('Status 1'),"2":__('Status 2'),"-3":__('Status -3')}, formatter: Table.api.formatter.status}, + + + {field: 'type', title: __('开票类型'), searchList: {"1":__('新开'),"2":__('换开')}, formatter: Table.api.formatter.normal}, + + + + {field: 'apply_type', title: __('Apply_type'), searchList: {"1":__('Apply_type 1'),"2":__('Apply_type 2')}, formatter: Table.api.formatter.normal}, {field: 'price', title: __('Price'), operate:'BETWEEN'}, {field: 'fee_price', title: __('Fee_price'), operate:'BETWEEN'}, + {field: 'images', title: __('Images'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.images}, + {field: 'desc', title: __('Desc'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},