237 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			237 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | |||
|  | 
 | |||
|  | namespace app\api\logic; | |||
|  | 
 | |||
|  | use app\api\validate\PlaceOrderInvoiceValidate; | |||
|  | use app\common\basics\Logic; | |||
|  | use app\common\enum\OrderInvoiceEnum; | |||
|  | use app\common\enum\ShopEnum; | |||
|  | use app\common\model\order\Order; | |||
|  | use app\common\model\order\OrderInvoice; | |||
|  | use app\common\model\shop\Shop; | |||
|  | 
 | |||
|  | /** | |||
|  |  * 订单发票逻辑 | |||
|  |  * Class OrderInvoiceLogic | |||
|  |  * @package app\api\logic | |||
|  |  */ | |||
|  | class OrderInvoiceLogic extends Logic | |||
|  | { | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 添加发票 | |||
|  |      * @param $params | |||
|  |      * @return bool | |||
|  |      * @author 段誉 | |||
|  |      * @date 2022/4/12 10:11 | |||
|  |      */ | |||
|  |     public static function add($params): bool | |||
|  |     { | |||
|  |         try { | |||
|  |             $order = Order::with(['shop'])->findOrEmpty($params['order_id']); | |||
|  | 
 | |||
|  |             OrderInvoice::create([ | |||
|  |                 'shop_id' => $order['shop']['id'], | |||
|  |                 'user_id' => $order['user_id'], | |||
|  |                 'order_id' => $order['id'], | |||
|  |                 'type' => $params['type'], | |||
|  |                 'header_type' => $params['header_type'], | |||
|  |                 'name' => $params['name'], | |||
|  |                 'duty_number' => $params['duty_number'] ?? '', | |||
|  |                 'email' => $params['email'], | |||
|  |                 'mobile' => $params['mobile'] ?? '', | |||
|  |                 'address' => $params['address'] ?? '', | |||
|  |                 'bank' => $params['bank'] ?? '', | |||
|  |                 'bank_account' => $params['bank_account'] ?? '', | |||
|  |                 'invoice_amount' => $order['order_amount'], | |||
|  |                 'create_time' => time() | |||
|  |             ]); | |||
|  | 
 | |||
|  |             return true; | |||
|  | 
 | |||
|  |         } catch (\Exception $e) { | |||
|  |             self::$error = $e->getMessage(); | |||
|  |             return false; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 编辑发票 | |||
|  |      * @param $params | |||
|  |      * @return bool | |||
|  |      * @author 段誉 | |||
|  |      * @date 2022/4/12 10:30 | |||
|  |      */ | |||
|  |     public static function edit($params) : bool | |||
|  |     { | |||
|  |         try { | |||
|  |             OrderInvoice::update([ | |||
|  |                 'type' => $params['type'], | |||
|  |                 'header_type' => $params['header_type'], | |||
|  |                 'name' => $params['name'], | |||
|  |                 'duty_number' => $params['duty_number'] ?? '', | |||
|  |                 'email' => $params['email'], | |||
|  |                 'mobile' => $params['mobile'] ?? '', | |||
|  |                 'address' => $params['address'] ?? '', | |||
|  |                 'bank' => $params['bank'] ?? '', | |||
|  |                 'bank_account' => $params['bank_account'] ?? '', | |||
|  |                 'create_time' => time() | |||
|  |             ], ['id' => $params['id']]); | |||
|  | 
 | |||
|  |             return true; | |||
|  | 
 | |||
|  |         } catch (\Exception $e) { | |||
|  |             self::$error = $e->getMessage(); | |||
|  |             return false; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 发票详情 | |||
|  |      * @param $params | |||
|  |      * @return array|\think\Model | |||
|  |      * @author 段誉 | |||
|  |      * @date 2022/4/12 12:12 | |||
|  |      */ | |||
|  |     public static function detail($params) | |||
|  |     { | |||
|  |         return OrderInvoice::findOrEmpty($params['id'])->toArray(); | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 通过订单id获取发票信息 | |||
|  |      * @param $id | |||
|  |      * @return array | |||
|  |      * @author 段誉 | |||
|  |      * @date 2022/4/12 9:24 | |||
|  |      */ | |||
|  |     public static function getInvoiceDetailByOrderId($id): array | |||
|  |     { | |||
|  |         $result = Order::field(['id', 'order_sn', 'shop_id', 'order_amount', 'order_status', 'create_time']) | |||
|  |             ->with([ | |||
|  |                 'shop', | |||
|  |                 'order_goods', | |||
|  |                 'invoice' => function ($query) { | |||
|  |                     $query->withoutField(['invoice_time', 'update_time']); | |||
|  |                     $query->append(['status_text', 'type_text', 'header_type_text']); | |||
|  |                 } | |||
|  |             ]) | |||
|  |             ->append(['order_status_text']) | |||
|  |             ->findOrEmpty($id)->toArray(); | |||
|  | 
 | |||
|  |         return $result; | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 校验订单发票 | |||
|  |      * @param $params | |||
|  |      * @return array|false | |||
|  |      * @author 段誉 | |||
|  |      * @date 2022/4/11 15:34 | |||
|  |      */ | |||
|  |     public static function checkOrderInvoice($params, $type = null) | |||
|  |     { | |||
|  |         if (empty($params['invoice'])) { | |||
|  |             return []; | |||
|  |         } | |||
|  | 
 | |||
|  |         try { | |||
|  |             if($type == 'team') { | |||
|  |                 $invoiceParams = $params['invoice']; | |||
|  |             } else { | |||
|  |                 $invoiceParams = json_decode($params['invoice'], true); | |||
|  |             } | |||
|  | 
 | |||
|  |             $invoiceParams = array_column($invoiceParams, null, 'shop_id'); | |||
|  | 
 | |||
|  |             $shops = Shop::whereIn('id', array_keys($invoiceParams))->column('*', 'id'); | |||
|  | 
 | |||
|  |             foreach ($invoiceParams as $shopId => $item) { | |||
|  |                 if (!isset($shops[$shopId])) { | |||
|  |                     continue; | |||
|  |                 } | |||
|  | 
 | |||
|  |                 $shop = $shops[$shopId]; | |||
|  | 
 | |||
|  |                 // 商家不支持开发票
 | |||
|  |                 if ($shop['open_invoice'] == ShopEnum::INVOICE_CLOSE) { | |||
|  |                     throw new \Exception($shop['name'] . '店铺不支持开具发票'); | |||
|  |                 } | |||
|  | 
 | |||
|  |                 // 选择的发票类型为专票但是该店铺不支持专票
 | |||
|  |                 if ($item['type'] == OrderInvoiceEnum::TYPE_SPEC && $shop['spec_invoice'] == ShopEnum::SPEC_INVOICE_UNABLE) { | |||
|  |                     throw new \Exception($shop['name'] . '不支持开具专票'); | |||
|  |                 } | |||
|  | 
 | |||
|  |                 // 校验参数
 | |||
|  |                 validate(PlaceOrderInvoiceValidate::class)->check($item); | |||
|  |             } | |||
|  | 
 | |||
|  |             return $invoiceParams; | |||
|  | 
 | |||
|  |         } catch (\Exception $e) { | |||
|  |             self::$error = $e->getMessage(); | |||
|  |             return false; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 下单时添加发票 | |||
|  |      * @param $shopId | |||
|  |      * @param $userId | |||
|  |      * @param $orderId | |||
|  |      * @param $invoice // 订单中提交的发票信息,以门店id为键
 | |||
|  |      * @return OrderInvoice|\think\Model|void | |||
|  |      * @author 段誉 | |||
|  |      * @date 2022/4/11 17:46 | |||
|  |      */ | |||
|  |     public static function insertOrderInvoice($shopId, $userId, $orderId, $invoice) | |||
|  |     { | |||
|  |         $order = Order::findOrEmpty($orderId); | |||
|  | 
 | |||
|  |         foreach ($invoice as $key => $item) { | |||
|  |             // 此处$key 为 店铺id
 | |||
|  |             if ($shopId != $key) { | |||
|  |                 continue; | |||
|  |             } | |||
|  |             return OrderInvoice::create([ | |||
|  |                 'shop_id' => $shopId, | |||
|  |                 'user_id' => $userId, | |||
|  |                 'order_id' => $orderId, | |||
|  |                 'type' => $item['type'], | |||
|  |                 'header_type' => $item['header_type'], | |||
|  |                 'name' => $item['name'], | |||
|  |                 'duty_number' => $item['duty_number'] ?? '', | |||
|  |                 'email' => $item['email'], | |||
|  |                 'mobile' => $item['mobile'] ?? '', | |||
|  |                 'address' => $item['address'] ?? '', | |||
|  |                 'bank' => $item['bank'] ?? '', | |||
|  |                 'bank_account' => $item['bank_account'] ?? '', | |||
|  |                 'invoice_amount' => $order['order_amount'], | |||
|  |                 'create_time' => time() | |||
|  |             ]); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 获取商家发票设置 | |||
|  |      * @param $params | |||
|  |      * @return array | |||
|  |      * @author 段誉 | |||
|  |      * @date 2022/4/12 15:32 | |||
|  |      */ | |||
|  |     public static function getInvoiceSetting($params) | |||
|  |     { | |||
|  |         return Shop::field('id,open_invoice,spec_invoice')->findOrEmpty($params['shop_id'])->toArray(); | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  | } |