diff --git a/app/controller/admin/InvoiceHead.php b/app/controller/admin/InvoiceHead.php index cc29bad..c8245a4 100644 --- a/app/controller/admin/InvoiceHead.php +++ b/app/controller/admin/InvoiceHead.php @@ -3,6 +3,8 @@ namespace app\controller\admin; use app\model\WechatPucode; +use app\service\invoice\InvoiceIssuanceService; +use app\util\ReturnCode; use think\Response; use app\model\InvoiceHead as InvoiceHeadModel; use app\model\WechatUser as WechatUserModel; @@ -25,8 +27,7 @@ class InvoiceHead extends Base $where = []; if (isset($param['pucode']) && !empty($param['pucode'])) { - $wechat_user_ids = WechatPucode::where([['pucode', 'like', "%{$param['pucode']}%"]])->column('wechat_user_id'); - $where[] = ['wechat_user_id', 'in', $wechat_user_ids]; + $where[] = ['pucode', 'in', explode(',',$param['pucode'])]; } $InvoiceHead = new InvoiceHeadModel(); @@ -40,8 +41,8 @@ class InvoiceHead extends Base if ($WechatUser) { $item['wechat_user_name'] = $WechatUser['nickname']; $item['headimgurl'] = $WechatUser['headimgurl']; + $item['phone'] = $WechatUser['phone']; } - $item['pucode'] = WechatPucode::where('wechat_user_id', $item['wechat_user_id'])->value('pucode'); unset($item['wechat_user_id']); })->toArray(); $listInfo = $listObj['data']; @@ -52,4 +53,110 @@ class InvoiceHead extends Base ]); } + public function save(): Response + { + try { + + $params = $this->request->post(); + $id = $params['id'] ?? ''; + $phone = $params['phone']; + $pucode = $params['pucode']; + $type = $params['type']; + $tax_number = $params['tax_number']; + $title = $params['title']; + + // 数据验证 + $tax_number_str = $type == 1 ? '身份证号' :'纳税识别号'; + $tax_number_rule = $type == 1 ? 'idCard' :'alphaNum'; + $rule = [ + 'phone|手机号' => 'require|mobile', + 'type|抬头类型' => 'require|number|in:0,1', + 'title|抬头' => 'require', + "tax_number|{$tax_number_str}" => "require|{$tax_number_rule}|length:18" + ]; + validate()->rule($rule)->check($params); + + if ($type != 1) { + // 验证纳税识别号 + $str = '0-9A-HJ-NPQRTUWXY'; + $pattern = '/^[' . $str . ']{2}\d{6}[' . $str . ']{10}$/'; + if (!preg_match($pattern, $tax_number)) { + throw new \Exception('纳税人编号格式不符合', ReturnCode::PARAM_INVALID); + } + } + + $wechat_user_id = (new WechatUserModel())->where(['phone' => $phone, 'delete_time' => 0])->value('id'); + + if (!$wechat_user_id) { + throw new \Exception('当前手机号用户不存在', ReturnCode::RECORD_NOT_FOUND); + } + + $feeUserInfo = (new InvoiceIssuanceService())->getFeeUserData($pucode); + $address = isset($feeUserInfo['MaillingAddress']) && !empty($feeUserInfo['MaillingAddress']) ? $feeUserInfo['MaillingAddress']: ''; + $telephone = isset($feeUserInfo['Telephone']) && !empty($feeUserInfo['Telephone']) ? $feeUserInfo['Telephone']: ''; + $bank_name = isset($feeUserInfo['BankName']) && !empty($feeUserInfo['BankName']) ? $feeUserInfo['BankName']: ''; + $bank_account = isset($feeUserInfo['BankAccountCode']) && !empty($feeUserInfo['BankAccountCode']) ? $feeUserInfo['BankAccountCode']: ''; + + // 验证手机号和用户编号是否有关联 + if ($telephone) { + $telephoneArr = explode(',', $telephone); + if (!in_array($phone, $telephoneArr)) { + throw new \Exception('当前手机号未关联输入的用户编号', ReturnCode::RECORD_NOT_FOUND); + } + } + + // 保存操作 + $query = [ + 'pucode' => $pucode, + 'wechat_user_id' => $wechat_user_id, + ]; + $InvoiceHeadId = (new InvoiceHeadModel())->where($query)->value('id'); + if (!$id && $InvoiceHeadId) $id = $InvoiceHeadId; + + if ($id) { + if (!is_numeric($id)) { + throw new \Exception('编号数据错误', ReturnCode::RECORD_NOT_FOUND); + } + $InvoiceHeadData = (new InvoiceHeadModel())->where(['id' => $id])->find(); + if (!$InvoiceHeadData) { + throw new \Exception('数据不存在', ReturnCode::RECORD_NOT_FOUND); + } + // 更新 + $InvoiceHeadData->pucode = $pucode; + $InvoiceHeadData->type = $type; + $InvoiceHeadData->title = $title; + $InvoiceHeadData->tax_number = $tax_number; + if (!$InvoiceHeadData->address) { + $InvoiceHeadData->address = $address; + } + if (!$InvoiceHeadData->telephone) { + $InvoiceHeadData->telephone = $telephone; + } + if (!$InvoiceHeadData->bank_name) { + $InvoiceHeadData->bank_name = $bank_name; + } + if (!$InvoiceHeadData->bank_account) { + $InvoiceHeadData->bank_account = $bank_account; + } + $InvoiceHeadData->save(); + } else { + // 新增 + $data['type'] = $type; + $data['title'] = $title; + $data['tax_number'] = $tax_number; + $data['address'] = $address; + $data['telephone'] = $telephone; + $data['bank_name'] = $bank_name; + $data['bank_account'] = $bank_account; + $data['wechat_user_id'] = $wechat_user_id; + $data['create_time'] = time(); + $data['pucode'] = $pucode; + InvoiceHeadModel::create($data); + } + + return $this->buildSuccess(); + } catch (\Exception $e) { + return $this->buildFailed($e->getCode(), $e->getMessage()); + } + } } \ No newline at end of file diff --git a/app/controller/admin/InvoiceIssuance.php b/app/controller/admin/InvoiceIssuance.php index e884fd6..399562f 100644 --- a/app/controller/admin/InvoiceIssuance.php +++ b/app/controller/admin/InvoiceIssuance.php @@ -3,6 +3,7 @@ namespace app\controller\admin; use app\model\InvoiceHead; +use app\model\InvoiceIssuanceData; use app\util\ReturnCode; use think\Response; use app\model\InvoiceIssuance as InvoiceIssuanceModel; @@ -40,7 +41,7 @@ class InvoiceIssuance extends Base $where[] = ['merge', '=', $param['merge']]; } - if (isset($param['status']) && is_numeric($param['status']) && in_array($param['status'], [0, 3, 4])) { + if (isset($param['status']) && is_numeric($param['status']) && in_array($param['status'], [0, 2, 3, 4])) { $where[] = ['status', '=', $param['status']]; } @@ -82,6 +83,8 @@ class InvoiceIssuance extends Base $item->head_type = InvoiceHead::$typeArr[$InvoiceHeadRes['type']]; $item->head_title = $InvoiceHeadRes['title']; } + $invoice_pdf = InvoiceIssuanceData::where(['invoice_issuance_id' => $item->id, 'status' => 1])->value('pdf_filepath'); + $item->invoice_pdf = $invoice_pdf; unset($item->invoice_head_id, $item->project_id); })->toArray(); $listInfo = $listObj['data']; @@ -138,4 +141,26 @@ class InvoiceIssuance extends Base return $this->buildFailed(ReturnCode::EMPTY_PARAMS, $e->getMessage()); } } + + public function restart(): Response + { + try { + $id = $this->request->get('id', ''); + if (!$id) { + throw new \Exception('缺少必要参数'); + } + $InvoiceIssuance = (new InvoiceIssuanceModel())->where('id', $id)->find(); + if ($InvoiceIssuance['status'] != 2) { + throw new \Exception('当前状态无法重新开票'); + } + $data = ['status' => 0]; + $result = $InvoiceIssuance->save($data); + if (!$result) { + throw new \Exception('重新开票失败'); + } + return $this->buildSuccess(); + } catch (\Exception $e) { + return $this->buildFailed(ReturnCode::EMPTY_PARAMS, $e->getMessage()); + } + } } diff --git a/route/app.php b/route/app.php index c7b317d..a1ad4ae 100644 --- a/route/app.php +++ b/route/app.php @@ -68,11 +68,13 @@ Route::group('admin', function() { Route::rule('Login/getAccessMenu', 'admin.Login/getAccessMenu', 'get')->middleware([app\middleware\AdminAuth::class, app\middleware\AdminResponse::class]); Route::rule('WechatUser/index', 'admin.WechatUser/index', 'get')->middleware([app\middleware\AdminAuth::class, app\middleware\AdminPermission::class, app\middleware\AdminLog::class, app\middleware\AdminResponse::class]); Route::rule('WechatUser/exportTemplate', 'admin.WechatUser/exportTemplate', 'get'); - Route::rule('WechatUser/importUser', 'admin.WechatUser/importUser', 'post')->middleware([app\middleware\AdminAuth::class, app\middleware\AdminPermission::class, app\middleware\AdminLog::class, app\middleware\AdminResponse::class]); + Route::rule('WechatUser/importUser', 'admin.WechatUser/importUser', 'post')->middleware([app\middleware\AdminAuth::class, app\middleware\AdminPermission::class, app\middleware\AdminResponse::class]); Route::rule('InvoiceIssuance/index', 'admin.InvoiceIssuance/index', 'get')->middleware([app\middleware\AdminAuth::class, app\middleware\AdminPermission::class, app\middleware\AdminLog::class, app\middleware\AdminResponse::class]); Route::rule('InvoiceIssuance/getIndexData', 'admin.InvoiceIssuance/getIndexData', 'get')->middleware([app\middleware\AdminAuth::class, app\middleware\AdminPermission::class, app\middleware\AdminLog::class, app\middleware\AdminResponse::class]); Route::rule('InvoiceIssuance/cancel', 'admin.InvoiceIssuance/cancel', 'get')->middleware([app\middleware\AdminAuth::class, app\middleware\AdminPermission::class, app\middleware\AdminLog::class, app\middleware\AdminResponse::class]); + Route::rule('InvoiceIssuance/restart', 'admin.InvoiceIssuance/restart', 'get')->middleware([app\middleware\AdminAuth::class, app\middleware\AdminPermission::class, app\middleware\AdminLog::class, app\middleware\AdminResponse::class]); Route::rule('InvoiceHead/index', 'admin.InvoiceHead/index', 'get')->middleware([app\middleware\AdminAuth::class, app\middleware\AdminPermission::class, app\middleware\AdminLog::class, app\middleware\AdminResponse::class]); + Route::rule('InvoiceHead/save', 'admin.InvoiceHead/save', 'post')->middleware([app\middleware\AdminAuth::class, app\middleware\AdminPermission::class, app\middleware\AdminLog::class, app\middleware\AdminResponse::class]); Route::rule('Index/statistics', 'admin.Index/statistics', 'get')->middleware([app\middleware\AdminAuth::class, app\middleware\AdminPermission::class, app\middleware\AdminResponse::class]); Route::rule('Index/getFinalReportData', 'admin.Index/getFinalReportData', 'get')->middleware([app\middleware\AdminAuth::class, app\middleware\AdminPermission::class, app\middleware\AdminResponse::class]); Route::miss('admin.Miss/index');