diff --git a/app/adminapi/controller/financial/FinancialInvoiceController.php b/app/adminapi/controller/financial/FinancialInvoiceController.php new file mode 100644 index 000000000..76a80226a --- /dev/null +++ b/app/adminapi/controller/financial/FinancialInvoiceController.php @@ -0,0 +1,113 @@ +dataLists(new FinancialInvoiceLists()); + } + + + /** + * @notes 添加财务管理--开票台账 + * @return \think\response\Json + * @author likeadmin + * @date 2024/03/25 14:09 + */ + public function add() + { + $params = (new FinancialInvoiceValidate())->post()->goCheck('add'); + $result = FinancialInvoiceLogic::add($params); + if (true === $result) { + return $this->success('添加成功', [], 1, 1); + } + return $this->fail(FinancialInvoiceLogic::getError()); + } + + + /** + * @notes 编辑财务管理--开票台账 + * @return \think\response\Json + * @author likeadmin + * @date 2024/03/25 14:09 + */ + public function edit() + { + $params = (new FinancialInvoiceValidate())->post()->goCheck('edit'); + $result = FinancialInvoiceLogic::edit($params); + if (true === $result) { + return $this->success('编辑成功', [], 1, 1); + } + return $this->fail(FinancialInvoiceLogic::getError()); + } + + + /** + * @notes 删除财务管理--开票台账 + * @return \think\response\Json + * @author likeadmin + * @date 2024/03/25 14:09 + */ + public function delete() + { + $params = (new FinancialInvoiceValidate())->post()->goCheck('delete'); + FinancialInvoiceLogic::delete($params); + return $this->success('删除成功', [], 1, 1); + } + + + /** + * @notes 获取财务管理--开票台账详情 + * @return \think\response\Json + * @author likeadmin + * @date 2024/03/25 14:09 + */ + public function detail() + { + $params = (new FinancialInvoiceValidate())->goCheck('detail'); + $result = FinancialInvoiceLogic::detail($params); + return $this->data($result); + } + + public function datas() + { + return $this->data(FinancialInvoiceLogic::datas()); + } + + + } \ No newline at end of file diff --git a/app/adminapi/controller/financial/FinancialRefundController.php b/app/adminapi/controller/financial/FinancialRefundController.php new file mode 100644 index 000000000..e0d2a1208 --- /dev/null +++ b/app/adminapi/controller/financial/FinancialRefundController.php @@ -0,0 +1,108 @@ +dataLists(new FinancialRefundLists()); + } + + + /** + * @notes 添加财务管理--到账台账 + * @return \think\response\Json + * @author likeadmin + * @date 2024/03/25 14:46 + */ + public function add() + { + $params = (new FinancialRefundValidate())->post()->goCheck('add'); + $result = FinancialRefundLogic::add($params); + if (true === $result) { + return $this->success('添加成功', [], 1, 1); + } + return $this->fail(FinancialRefundLogic::getError()); + } + + + /** + * @notes 编辑财务管理--到账台账 + * @return \think\response\Json + * @author likeadmin + * @date 2024/03/25 14:46 + */ + public function edit() + { + $params = (new FinancialRefundValidate())->post()->goCheck('edit'); + $result = FinancialRefundLogic::edit($params); + if (true === $result) { + return $this->success('编辑成功', [], 1, 1); + } + return $this->fail(FinancialRefundLogic::getError()); + } + + + /** + * @notes 删除财务管理--到账台账 + * @return \think\response\Json + * @author likeadmin + * @date 2024/03/25 14:46 + */ + public function delete() + { + $params = (new FinancialRefundValidate())->post()->goCheck('delete'); + FinancialRefundLogic::delete($params); + return $this->success('删除成功', [], 1, 1); + } + + + /** + * @notes 获取财务管理--到账台账详情 + * @return \think\response\Json + * @author likeadmin + * @date 2024/03/25 14:46 + */ + public function detail() + { + $params = (new FinancialRefundValidate())->goCheck('detail'); + $result = FinancialRefundLogic::detail($params); + return $this->data($result); + } + + +} \ No newline at end of file diff --git a/app/adminapi/lists/financial/FinancialInvoiceLists.php b/app/adminapi/lists/financial/FinancialInvoiceLists.php new file mode 100644 index 000000000..7ddb3d5c8 --- /dev/null +++ b/app/adminapi/lists/financial/FinancialInvoiceLists.php @@ -0,0 +1,93 @@ + ['contract_id', 'invoice_type'], + '%like%' => ['invoice_code', 'apply_company'], + + ]; + } + + + /** + * @notes 获取财务管理--开票台账列表 + * @return array + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + * @author likeadmin + * @date 2024/03/25 14:09 + */ + public function lists(): array + { + return FinancialInvoice::where($this->searchWhere) + ->field(['id', 'contract_id', 'invoice_code', 'invoice_type', 'apply_amount', 'apply_company']) + ->limit($this->limitOffset, $this->limitLength) + ->order(['id' => 'desc']) + ->select()->each(function ($data) { + $contract = CostApprovedProject::field('contract_name,contract_type,part_a,part_b,money,create_time')->where('id', $data['contract_id'])->findOrEmpty(); + $data['contract_name'] = $contract['contract_name']; + $data['contract_type'] = $contract->contract_type_text; + $data['part_a'] = $contract['part_a']; + $data['part_b'] = $contract['part_b']; + $data['sign_money'] = $contract['money']; + $data['sign_time'] = $contract['create_time']; + $data['invoice_type_text'] = $data->invoice_type_text; + $refund = FinancialRefund::where('invoice_id', $data['id'])->findOrEmpty(); + $data['is_refund'] = !$refund->isEmpty() ? '已到账' : '未到账'; + $data['refund_amount'] = !$refund->isEmpty() ? FinancialRefund::where('invoice_id', $data['id'])->sum('amount') : 0.00; + }) + ->toArray(); + } + + + /** + * @notes 获取财务管理--开票台账数量 + * @return int + * @author likeadmin + * @date 2024/03/25 14:09 + */ + public function count(): int + { + return FinancialInvoice::where($this->searchWhere)->count(); + } + + } \ No newline at end of file diff --git a/app/adminapi/lists/financial/FinancialRefundLists.php b/app/adminapi/lists/financial/FinancialRefundLists.php new file mode 100644 index 000000000..81f580eac --- /dev/null +++ b/app/adminapi/lists/financial/FinancialRefundLists.php @@ -0,0 +1,89 @@ + ['contract_id', 'invoice_id'], + + ]; + } + + + /** + * @notes 获取财务管理--到账台账列表 + * @return array + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + * @author likeadmin + * @date 2024/03/25 14:46 + */ + public function lists(): array + { + return FinancialRefund::where($this->searchWhere) + ->field(['id', 'contract_id', 'invoice_id', 'amount', 'date', 'remark', 'create_user', 'create_time']) + ->limit($this->limitOffset, $this->limitLength) + ->order(['id' => 'desc']) + ->select()->each(function ($data) { + $contract = CostApprovedProject::field('contract_name,contract_type,part_a,part_b')->where('id', $data['contract_id'])->findOrEmpty(); + $invoice = FinancialInvoice::field('invoice_code,apply_amount')->where('id', $data['invoice_id'])->findOrEmpty(); + $data['contract_name'] = $contract['contract_name']; + $data['contract_type'] = $contract->contract_type_text; + $data['part_a'] = $contract['part_a']; + $data['part_b'] = $contract['part_b']; + $data['invoice_code'] = $invoice['invoice_code']; + $data['apply_amount'] = $invoice['apply_amount']; + }) + ->toArray(); + } + + + /** + * @notes 获取财务管理--到账台账数量 + * @return int + * @author likeadmin + * @date 2024/03/25 14:46 + */ + public function count(): int + { + return FinancialRefund::where($this->searchWhere)->count(); + } + + } \ No newline at end of file diff --git a/app/adminapi/logic/financial/FinancialInvoiceLogic.php b/app/adminapi/logic/financial/FinancialInvoiceLogic.php new file mode 100644 index 000000000..7f0bf0153 --- /dev/null +++ b/app/adminapi/logic/financial/FinancialInvoiceLogic.php @@ -0,0 +1,156 @@ + $params['contract_id'], + 'invoice_code' => data_unique_code('HTKP'), + 'invoice_type' => $params['invoice_type'], + 'apply_amount' => $params['apply_amount'], + 'apply_company' => $params['apply_company'], + 'apply_company_number' => $params['apply_company_number'], + 'apply_company_address' => $params['apply_company_address'] ?? '', + 'apply_company_telephone' => $params['apply_company_telephone'] ?? '', + 'apply_company_bank' => $params['apply_company_bank'] ?? '', + 'apply_company_account' => $params['apply_company_account'] ?? '', + 'apply_contact' => $params['apply_contact'] ?? '', + 'apply_email' => $params['apply_email'] ?? '', + 'pay_type' => $params['pay_type'] ?? '', + 'invoice_content' => $params['invoice_content'] ?? '', + 'create_user' => $params['create_user'], + 'create_time' => !empty($params['create_time']) ? strtotime($params['create_time']) : time() + ]); + + Db::commit(); + return true; + } catch (\Exception $e) { + Db::rollback(); + self::setError($e->getMessage()); + return false; + } + } + + + /** + * @notes 编辑财务管理--开票台账 + * @param array $params + * @return bool + * @author likeadmin + * @date 2024/03/25 14:09 + */ + public static function edit(array $params): bool + { + Db::startTrans(); + try { + FinancialInvoice::where('id', $params['id'])->update([ + 'contract_id' => $params['contract_id'], + 'invoice_type' => $params['invoice_type'], + 'apply_amount' => $params['apply_amount'], + 'apply_company' => $params['apply_company'], + 'apply_company_number' => $params['apply_company_number'], + 'apply_company_address' => $params['apply_company_address'] ?? '', + 'apply_company_telephone' => $params['apply_company_telephone'] ?? '', + 'apply_company_bank' => $params['apply_company_bank'] ?? '', + 'apply_company_account' => $params['apply_company_account'] ?? '', + 'apply_contact' => $params['apply_contact'] ?? '', + 'apply_email' => $params['apply_email'] ?? '', + 'pay_type' => $params['pay_type'] ?? '', + 'invoice_content' => $params['invoice_content'] ?? '', + 'create_user' => $params['create_user'], + 'create_time' => !empty($params['create_time']) ? strtotime($params['create_time']) : time(), + 'update_time' => time() + ]); + + Db::commit(); + return true; + } catch (\Exception $e) { + Db::rollback(); + self::setError($e->getMessage()); + return false; + } + } + + + /** + * @notes 删除财务管理--开票台账 + * @param array $params + * @return bool + * @author likeadmin + * @date 2024/03/25 14:09 + */ + public static function delete(array $params): bool + { + return FinancialInvoice::destroy($params['id']); + } + + + /** + * @notes 获取财务管理--开票台账详情 + * @param $params + * @return array + * @author likeadmin + * @date 2024/03/25 14:09 + */ + public static function detail($params): array + { + $data = FinancialInvoice::withoutField('update_time,delete_time')->findOrEmpty($params['id']); + $contract = CostApprovedProject::field('contract_name,contract_type,part_a,part_b,money,create_time')->where('id', $data['contract_id'])->findOrEmpty(); + $data['invoice_type_text'] = $data->invoice_type_text; + $data['contract_name'] = $contract['contract_name']; + $data['contract_type'] = $contract->contract_type_text; + $data['part_a'] = $contract['part_a']; + $data['part_b'] = $contract['part_b']; + $data['sign_money'] = $contract['money']; + $data['sign_time'] = $contract['create_time']; + $data['total_invoice_amount'] = FinancialInvoice::where('project_id', $data['project_id'])->sum('apply_amount'); + $data['total_refund_amount'] = FinancialRefund::where('project_id', $data['project_id'])->sum('amount'); + return $data->toArray(); + } + + public static function datas() + { + return FinancialInvoice::field(['id', 'invoice_code'])->order(['id' => 'desc'])->select()->each(function ($data) { + $data['projectinfo'] = 'ID:' . $data['id'] . ' / 编号:' . $data['invoice_code']; + })->toArray(); + } + } \ No newline at end of file diff --git a/app/adminapi/logic/financial/FinancialRefundLogic.php b/app/adminapi/logic/financial/FinancialRefundLogic.php new file mode 100644 index 000000000..7818b5ae3 --- /dev/null +++ b/app/adminapi/logic/financial/FinancialRefundLogic.php @@ -0,0 +1,134 @@ + $params['contract_id'], + 'invoice_id' => $params['invoice_id'], + 'amount' => $params['amount'], + 'date' => !empty($params['date']) ? strtotime($params['date']) : 0, + 'remark' => $params['remark'] ?? '', + 'create_user' => $params['create_user'], + 'create_time' => !empty($params['create_time']) ? strtotime($params['create_time']) : time(), + ]); + + Db::commit(); + return true; + } catch (\Exception $e) { + Db::rollback(); + self::setError($e->getMessage()); + return false; + } + } + + + /** + * @notes 编辑财务管理--到账台账 + * @param array $params + * @return bool + * @author likeadmin + * @date 2024/03/25 14:46 + */ + public static function edit(array $params): bool + { + Db::startTrans(); + try { + FinancialRefund::where('id', $params['id'])->update([ + 'contract_id' => $params['contract_id'], + 'invoice_id' => $params['invoice_id'], + 'amount' => $params['amount'], + 'date' => !empty($params['date']) ? strtotime($params['date']) : 0, + 'remark' => $params['remark'] ?? '', + 'create_user' => $params['create_user'], + 'create_time' => !empty($params['create_time']) ? strtotime($params['create_time']) : time(), + 'update_time' => time() + ]); + + Db::commit(); + return true; + } catch (\Exception $e) { + Db::rollback(); + self::setError($e->getMessage()); + return false; + } + } + + + /** + * @notes 删除财务管理--到账台账 + * @param array $params + * @return bool + * @author likeadmin + * @date 2024/03/25 14:46 + */ + public static function delete(array $params): bool + { + return FinancialRefund::destroy($params['id']); + } + + + /** + * @notes 获取财务管理--到账台账详情 + * @param $params + * @return array + * @author likeadmin + * @date 2024/03/25 14:46 + */ + public static function detail($params): array + { + $data = FinancialRefund::withoutField('update_time,delete_time')->findOrEmpty($params['id']); + $contract = CostApprovedProject::field('contract_name,contract_type,part_a,part_b,money,create_time')->where('id', $data['contract_id'])->findOrEmpty(); + $invoice = FinancialInvoice::field('invoice_code,apply_amount')->where('id', $data['invoice_id'])->findOrEmpty(); + $data['contract_name'] = $contract['contract_name']; + $data['contract_type'] = $contract->contract_type_text; + $data['part_a'] = $contract['part_a']; + $data['part_b'] = $contract['part_b']; + $data['sign_money'] = $contract['money']; + $data['sign_time'] = $contract['create_time']; + $data['invoice_code'] = $invoice['invoice_code']; + $data['apply_amount'] = $invoice['apply_amount']; + $data['total_invoice_amount'] = FinancialInvoice::where('project_id', $data['project_id'])->sum('apply_amount');//累计开票金额 + $data['total_refund_amount'] = FinancialRefund::where('project_id', $data['project_id'])->sum('amount');//累计到账金额 + return $data->toArray(); + } + } \ No newline at end of file diff --git a/app/adminapi/validate/financial/FinancialInvoiceValidate.php b/app/adminapi/validate/financial/FinancialInvoiceValidate.php new file mode 100644 index 000000000..ab1176dc9 --- /dev/null +++ b/app/adminapi/validate/financial/FinancialInvoiceValidate.php @@ -0,0 +1,140 @@ + 'require|checkData', + 'contract_id' => 'require|checkContract', + 'invoice_type' => 'require|checkInvoiceType', + 'apply_amount' => 'require|float|gt:0', + 'apply_company' => 'require', + 'apply_company_number' => 'require', + 'apply_email' => 'email', + 'create_user' => 'require', + 'create_time' => 'require|dateFormat:Y-m-d H:i:s' + ]; + + + /** + * 参数描述 + * @var string[] + */ + protected $field = [ + 'id' => 'id', + 'contract_id' => '合同id', + 'invoice_code' => '开票编号', + 'invoice_type' => '发票类型', + 'apply_amount' => '开票申请金额', + 'apply_company' => '开票单位名称', + 'apply_company_number' => '纳税人识别号', + 'apply_company_address' => '开票单位注册地址', + 'apply_company_telephone' => '开票单位电话', + 'apply_company_bank' => '开户银行', + 'apply_company_account' => '开户账号', + 'apply_contact' => '开票联系人', + 'pay_type' => '对应付款方式', + 'invoice_content' => '开票内容', + 'apply_email' => '发票接收邮箱', + 'create_user' => '开票申请人', + 'create_time' => '开票申请时间' + + ]; + + + /** + * @notes 添加场景 + * @return FinancialInvoiceValidate + * @author likeadmin + * @date 2024/03/25 14:09 + */ + public function sceneAdd() + { + return $this->remove('id', true); + } + + + /** + * @notes 编辑场景 + * @return FinancialInvoiceValidate + * @author likeadmin + * @date 2024/03/25 14:09 + */ + public function sceneEdit() + { + return $this->remove('id', 'checkData'); + } + + + /** + * @notes 删除场景 + * @return FinancialInvoiceValidate + * @author likeadmin + * @date 2024/03/25 14:09 + */ + public function sceneDelete() + { + return $this->only(['id'])->remove('id', 'checkData'); + } + + + /** + * @notes 详情场景 + * @return FinancialInvoiceValidate + * @author likeadmin + * @date 2024/03/25 14:09 + */ + public function sceneDetail() + { + return $this->only(['id']); + } + + public function checkData($value): bool|string + { + $data = FinancialInvoice::where('id', $value)->findOrEmpty(); + return $data->isEmpty() ? '数据不存在' : true; + } + + public function checkContract($value): bool|string + { + $data = CostApprovedProject::where('id', $value)->findOrEmpty(); + return $data->isEmpty() ? '合同信息不存在' : true; + } + + public function checkInvoiceType($value): bool|string + { + $dict = DictData::where('type_value', 'zjzx_invoice_type')->column('value'); + return !in_array($value, $dict) ? '发票类型数据值无效' : true; + } + + } \ No newline at end of file diff --git a/app/adminapi/validate/financial/FinancialRefundValidate.php b/app/adminapi/validate/financial/FinancialRefundValidate.php new file mode 100644 index 000000000..42f8b3610 --- /dev/null +++ b/app/adminapi/validate/financial/FinancialRefundValidate.php @@ -0,0 +1,129 @@ + 'require|checkData', + 'contract_id' => 'require|checkContract', + 'invoice_id' => 'require|checkInvoice', + 'amount' => 'require|float|gt:0', + 'date' => 'require|dateFormat:Y-m-d', + 'create_user' => 'require', + 'create_time' => 'require|dateFormat:Y-m-d H:i:s', + + ]; + + + /** + * 参数描述 + * @var string[] + */ + protected $field = [ + 'id' => 'id', + 'contract_id' => '合同id', + 'invoice_id' => '开票id', + 'amount' => '本次到账金额', + 'date' => '到账日期', + 'remark' => '说明', + 'create_user' => '登记人', + 'create_time' => '登记时间', + ]; + + + /** + * @notes 添加场景 + * @return FinancialRefundValidate + * @author likeadmin + * @date 2024/03/25 14:46 + */ + public function sceneAdd() + { + return $this->remove('id', true); + } + + + /** + * @notes 编辑场景 + * @return FinancialRefundValidate + * @author likeadmin + * @date 2024/03/25 14:46 + */ + public function sceneEdit() + { + return $this->only(['id', 'contract_id', 'invoice_id', 'amount', 'date', 'remark', 'create_user', 'create_time']); + } + + + /** + * @notes 删除场景 + * @return FinancialRefundValidate + * @author likeadmin + * @date 2024/03/25 14:46 + */ + public function sceneDelete() + { + return $this->only(['id'])->remove('id', 'checkData'); + } + + + /** + * @notes 详情场景 + * @return FinancialRefundValidate + * @author likeadmin + * @date 2024/03/25 14:46 + */ + public function sceneDetail() + { + return $this->only(['id']); + } + + public function checkData($value): bool|string + { + $data = FinancialRefund::where('id', $value)->findOrEmpty(); + return $data->isEmpty() ? '数据不存在' : true; + } + + public function checkProject($value): bool|string + { + $data = CostApprovedProject::where('id', $value)->findOrEmpty(); + return $data->isEmpty() ? '合同信息不存在' : true; + } + + public function checkInvoice($value, $rule, $params): bool|string + { + $data = FinancialInvoice::where('id', $value)->where('project_id', $params['project_id'])->findOrEmpty(); + return $data->isEmpty() ? '开票单据信息不存在' : true; + } + + } \ No newline at end of file diff --git a/app/common/model/financial/FinancialInvoice.php b/app/common/model/financial/FinancialInvoice.php new file mode 100644 index 000000000..bc025afc9 --- /dev/null +++ b/app/common/model/financial/FinancialInvoice.php @@ -0,0 +1,40 @@ +column('name', 'value'); + return !empty($data['invoice_type']) ? $dict[$data['invoice_type']] : ''; + } + } \ No newline at end of file diff --git a/app/common/model/financial/FinancialRefund.php b/app/common/model/financial/FinancialRefund.php new file mode 100644 index 000000000..681ca5ef5 --- /dev/null +++ b/app/common/model/financial/FinancialRefund.php @@ -0,0 +1,38 @@ +