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();
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
| }
 |