| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- <?php
- namespace addons\UpgradeGift\common\logic\order\purchase;
- use addons\Agent\common\enums\AgentEnum;
- use addons\Mch\common\models\Mch;
- use common\enums\AddonsEnum;
- use common\enums\AppEnum;
- use common\enums\OrderSourceEnum;
- use common\enums\ShippingTypeEnum;
- use common\enums\StatusEnum;
- use common\helpers\ArrayHelper;
- use common\models\goods\Goods;
- use common\models\mall\Mall;
- use common\models\mall\MallAddons;
- use common\models\user\UserAddress;
- use common\traits\ErrorTrait;
- use Exception;
- use yii\helpers\Json;
- // 支付方式接口
- abstract class BasePurchase
- {
- use ErrorTrait;
- public $isNewRecord = false; // 是否是新增操作
- /**
- * 执行
- * @Author bing
- * @DateTime 2021-09-23 09:46:41
- * @copyright: Copyright (c) 2020 广东七件事集团
- * @param $form
- * @return
- */
- abstract public function execute($form);
- /**
- * 获取下单类型
- * @Author bing
- * @DateTime 2021-09-23 09:48:45
- * @copyright: Copyright (c) 2020 广东七件事集团
- * @return string
- */
- abstract public static function getType(): string;
- public function afterExecute($form, string $type)
- {
- try {
- // 重组默认商品信息
- // $default_goods = ArrayHelper::arrayKey($form['default_goods'], 'id');
- $order_goods = $form['order_goods'];
- $group_order_goods = [];
- $mch_arr = [];
- $data = is_array($form->data)?$form->data:Json::decode($form->data,true);
- $mall_id_arr = array_column($order_goods,'mall_id');
- //多商户
- if (MallAddons::isInstall($mall_id_arr[0], AddonsEnum::ADDONS_NAME_MCH)){
- $mch_ids = array_column($order_goods,'mch_id');
- $mch_list = Mch::lists(['where'=>[['id' =>$mch_ids]],'select'=>'id,store_name as name,expire_time','index'=>'id'], true);
- if($mch_list){
- $mch_arr = array_column($mch_list,'name','id');
- }
- }
- $mall_list = Mall::lists(['where'=>[['id' =>$mall_id_arr]],'select'=>'id,name'], true);
- $mall_arr = array_column($mall_list,'name','id');
- // if ($this->checkMarketingType($data) == false) throw new Exception('营销类型有误');
- $extra_info = '';
- $marketing_id = 0;
- $marketing_type = '';
- $order_source = '';
- if(!empty($data['marketing_id'])) $marketing_id = $data['marketing_id'];
- if(!empty($data['order_source'])) $order_source = $data['order_source'];
- if(!empty($data['marketing_type'])) $marketing_type = $data['marketing_type'];
- if(!empty($data['extra_info'])) $extra_info = json_encode($data['extra_info']);
- $supply_chain = [];
- // 产品按照商户重新归类组别
- foreach ($order_goods as $item) {
- if(!isset($group_order_goods[$item['mch_id']])){
- \Yii::error("goods_id {$item['goods_id']} -> {$item['goods_attr_id']} -> " . var_export($item, true));
- $group_order_goods[$item['mch_id']]['mch_order_info']['mch_id'] = $item['mch_id'];
- if(is_string($item['mch_id']) || $item['mch_id'] == 0){
- // 平台
- if(empty($mall_arr[$item['mall_id']]))throw new Exception('商城不存在');
- if (!empty($form->process_extra_data['supply_chain'][$item['goods_id']])) { // 包含供应链商品
- $t_supply_chain_name = $form->process_extra_data['supply_chain'][$item['goods_id']];
- if (empty($supply_chain[$t_supply_chain_name])) {
- $supply_chain[$t_supply_chain_name] =
- $this->getSupplyMallName($item['mall_id'], $t_supply_chain_name, $mall_arr[$item['mall_id']]); // 获取供应链指定名称
- }
- $group_order_goods[$item['mch_id']]['mch_order_info']['mch_name'] = $supply_chain[$t_supply_chain_name];
- $item['mch_id'] = $t_supply_chain_name;
- } else {
- $group_order_goods[$item['mch_id']]['mch_order_info']['mch_name'] = $mall_arr[$item['mall_id']];
- }
- }else{
- // 查询商户信息
- if(!empty($mch_arr[$item['mch_id']])){
- if(!empty($mch_list[$item['mch_id']]['expire_time'])&&$mch_list[$item['mch_id']]['expire_time']<=time()){
- throw new Exception('商户:'.$mch_arr[$item['mch_id']].'已过期');
- }
- $group_order_goods[$item['mch_id']]['mch_order_info']['mch_name'] = $mch_arr[$item['mch_id']];
- }else{
- $group_order_goods[$item['mch_id']]['mch_order_info']['mch_name'] = $mall_arr[$item['mall_id']];
- }
- $marketing_id =$item['mch_id'];
- $marketing_type ='Mch';
- }
- // 主订单信息
- $group_order_goods[$item['mch_id']]['mch_order_info']['user_id'] = $item['user_id'];
- $group_order_goods[$item['mch_id']]['mch_order_info']['mall_id'] = $item['mall_id'];
- $group_order_goods[$item['mch_id']]['mch_order_info']['address_id'] = 0;
- $group_order_goods[$item['mch_id']]['mch_order_info']['order_source'] = $order_source;
- $group_order_goods[$item['mch_id']]['mch_order_info']['remark'] = $data['remark'][$item['mch_id']]??'';
- $group_order_goods[$item['mch_id']]['mch_order_info']['original_goods_price'] = $item['original_goods_price'] ?? 0;
- $group_order_goods[$item['mch_id']]['mch_order_info']['goods_price'] = 0; // TODO 赠送商品0元
- $group_order_goods[$item['mch_id']]['mch_order_info']['pay_money'] = 0; // TODO 赠送商品0元
- $group_order_goods[$item['mch_id']]['mch_order_info']['marketing_type'] = $data['marketing_type'] ?? '';
- $group_order_goods[$item['mch_id']]['mch_order_info']['marketing_id'] = $data['marketing_id'] ?? 0;
- $group_order_goods[$item['mch_id']]['mch_order_info']['shipping_type'] = $data['shipping_type'] ?? ShippingTypeEnum::LOGISTICS;
- }else{
- $group_order_goods[$item['mch_id']]['mch_order_info']['original_goods_price'] += $item['original_goods_price'] ?? 0;
- // $group_order_goods[$item['mch_id']]['mch_order_info']['goods_price'] += $item['goods_price']; // TODO 赠送商品0元
- // $group_order_goods[$item['mch_id']]['mch_order_info']['pay_money'] += $item['goods_price']; // TODO 赠送商品0元
- $group_order_goods[$item['mch_id']]['mch_order_info']['marketing_type'] = $data['marketing_type'] ?? '';
- }
- if (!isset($group_order_goods[$item['mch_id']]['goods'][$item['goods_id']])) {
- $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['goods_id'] = $item['goods_id'];
- $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['goods_price'] = 0;
- $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['num'] = 0;
- $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['goods_name'] = $item['goods_name'];
- $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['goods_details'] = [];
- $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['original_goods_price'] = 0;
- }
- $group_order_goods[$item['mch_id']]['mch_order_info']['marketing_id'] = $marketing_id;
- $group_order_goods[$item['mch_id']]['mch_order_info']['marketing_type'] = $marketing_type;
- $group_order_goods[$item['mch_id']]['mch_order_info']['extra_info'] = $extra_info;
- $group_order_goods[$item['mch_id']]['mch_order_info']['is_virtual'] = $form->is_virtual;
- // $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['goods_price'] += $item['goods_price']; // TODO 赠送商品0元
- $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['original_goods_price'] += $item['original_goods_price'];
- $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['num'] += $item['num'];
- $item['goods_price'] = 0; // TODO 赠送商品0元
- if($order_source === OrderSourceEnum::SOURCE_RESERVE){
- // 预约订单单独处理
- $group_order_goods[$item['mch_id']]['mch_order_info']['order_source'] = OrderSourceEnum::SOURCE_RESERVE;
- // dd($form->sku[$item['goods_id']]);
- $item['unit'] = $form->sku[$item['goods_id']]['goods']['unit'];
- $info = $form->sku[$item['goods_id']];
- $reserve = $info['reserve'] ? ArrayHelper::toArray($info['reserve']) : [];
- unset($info['reserve'],$info['goods']);
- $reserve['sku'] = $info;
- $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['reserve'] = $reserve;
- }
- $group_order_goods[$item['mch_id']]['goods'][$item['goods_id']]['goods_details'][] = $item;
- }
- // 写入组别
- $form['group_order_goods'] = $group_order_goods;
- $form['address_id'] = $data['address_id'];
- return $form;
- }catch(Exception $e){
- $this->setError($e->getMessage());
- return false;
- }
- }
- /**
- * @desc:校验收货地址
- * @Author: hua
- * @Date: 2021/11/23
- * @Time: 10:49
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param $action
- * @param $data
- * @param $user_id
- * @throws Exception
- */
- public function checkAddress($action,$data,$user_id){
- if($action==AppEnum::ACTION_CREATE&&(empty($data['shipping_type'])||$data['shipping_type']!=ShippingTypeEnum::PICKUP)) {
- if (empty($data['address_id'])) throw new Exception('收货地址不能为空');
- $res = UserAddress::findOne(['id' => $data['address_id'], 'status' => StatusEnum::ENABLED, 'user_id' => $user_id]);
- if (empty($res)) throw new Exception('收货地址无效');
- // $orderConfig = \Yii::$app->services->setting->mall->get($data['mall_id'], 'order');
- // if ($orderConfig['is_town'] && !$res['town']) throw new Exception('收货地址缺少镇乡');
- }
- }
- /**
- * 检测营销活动类型
- * @Author: lun
- * @DateTime: 2022/1/10 0010 10:26
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param $data
- * @return bool
- */
- public function checkMarketingType($data)
- {
- if (!empty($data['marketing_type'])) {
- $addons_arr = AddonsEnum::getAddonsNameMap();
- if (empty($addons_arr[$data['marketing_type']])) return false;
- }
- return true;
- }
- protected function getSupplyMallName(int $mall_id, string $addons_name, string $default)
- {
- $service = "\addons\\$addons_name\common\service\SettingService";
- $service = new $service(['mall_id' => $mall_id]);
- $config = $service->getSetting();
- if (empty($config['is_enable_shopping_cart_settle'])) throw new Exception("非法操作");
- return !empty($config['shopping_cart_mall_name']) ? $config['shopping_cart_mall_name'] : $default;
- }
- }
|