[1,2]] ]; } public function create($type = 'productorder'){ switch ($type) { case 'register': RegisterLog::saveLog($this->order_id, '挂号订单增加待结算记录开始'); $t = \Yii::$app->db->beginTransaction(); try { $register = Register::find()->where(['id' => $this->order_id])->one(); if(!$register){ throw new Exception('挂号订单不存在'); } $store = Store::findOne(['id' => $register->store_id]); if(!$store){ throw new Exception('门店不存在'); } $time = time(); $ledger[] = [ 'order_id' => $this->order_id, 'user_id' => $store->id, 'user_type' => 1, //诊所 'order_type' => 2,//挂号订单 'fee_type' => 2,//挂号费用 'su_id' => $register->service_user_id, 'drugstore_id' => 0, 'drug_id' =>0, 'xd_time' => strtotime($register->created_at), 'number' => 1, 'money' => $register->price, 'status' => 0, 'created_at' => $time, 'updated_at' => $time ]; \Yii::$app->db->createCommand()->batchInsert(Ledger::tableName(), [ 'order_id', 'user_id', 'user_type', 'order_type', 'fee_type', 'su_id', 'drugstore_id', 'drug_id','xd_time', 'number', 'money', 'status', 'created_at', 'updated_at' ], $ledger)->execute(); $t->commit(); } catch (\Exception $e) { $t->rollBack(); RegisterLog::saveLog($this->order_id, '挂号订单增加待结算记录异常:'.$e->getMessage()); throw $e; } break; default: //产品订单 ProductOrderLog::saveLog($this->order_id, '产品订单增加待结算记录开始'); $t = \Yii::$app->db->beginTransaction(); try { $productOrder = ProductOrder::find()->where(['id' => $this->order_id])->one(); if(!$productOrder){ throw new Exception('产品订单不存在'); } $store = Store::findOne(['id' => $productOrder->store_id]); if(!$store){ throw new Exception('仓库不存在'); } $isLegder = Ledger::find()->where(['order_id' => $this->order_id])->one(); if(!empty($isLegder)){ throw new Exception('该订单已增加待结算记录'); } $time = time(); $ledgerData = []; if($productOrder->decoct_price > 0){ $ledgerData[] = [ 'order_id' => $this->order_id, 'user_id' => 0, 'user_type' => 2, //平台 'order_type' => 1,//产品订单 'fee_type' => 4,//代煎费用 'su_id' => $productOrder->su_id, 'drugstore_id' => $productOrder->store_id, 'drug_id' => 0, 'xd_time' => $productOrder->created_at, 'number' => 1, 'money' => $productOrder->decoct_price, 'status' => 0, 'created_at' => $time, 'updated_at' => $time ]; } if($productOrder->process_price > 0){ $ledgerData[] = [ 'order_id' => $this->order_id, 'user_id' => 0, 'user_type' => 2, //平台 'order_type' => 1,//产品订单 'fee_type' => 5,//加工费用 'su_id' => $productOrder->su_id, 'drugstore_id' => $productOrder->store_id, 'drug_id' => 0, 'xd_time' => $productOrder->created_at, 'number' => 1, 'money' => $productOrder->process_price, 'status' => 0, 'created_at' => $time, 'updated_at' => $time ]; } if($productOrder->treatement_price > 0){ $ledgerData[] = [ 'order_id' => $this->order_id, 'user_id' => $store->id, 'user_type' => 1, //门店 'order_type' => 1,//产品订单 'fee_type' => 6,//诊疗费用 'su_id' => $productOrder->su_id, 'drugstore_id' => $productOrder->store_id, 'drug_id' => 0, 'xd_time' => $productOrder->created_at, 'number' => 1, 'money' => $productOrder->treatement_price, 'status' => 0, 'created_at' => $time, 'updated_at' => $time ]; } if($productOrder->trans_expenses > 0){ $ledgerData[] = [ 'order_id' => $this->order_id, 'user_id' => 0, 'user_type' => 2, //平台 'order_type' => 1,//产品订单 'fee_type' => 3,//快递费用 'su_id' => $productOrder->su_id, 'drugstore_id' => $productOrder->store_id, 'drug_id' => 0, 'xd_time' => $productOrder->created_at, 'number' => 1, 'money' => $productOrder->trans_expenses, 'status' => 0, 'created_at' => $time, 'updated_at' => $time ]; } if(!empty($ledgerData)){ \Yii::$app->db->createCommand()->batchInsert(Ledger::tableName(), [ 'order_id', 'user_id', 'user_type', 'order_type', 'fee_type', 'su_id', 'drugstore_id', 'drug_id', 'xd_time','number','money', 'status', 'created_at', 'updated_at' ], $ledgerData)->execute(); } $productOrderItems = ProductOrderItems::find()->where(['product_order_id' => $productOrder->id])->all(); switch ($productOrder->prescription_type) { case '1':case '3': //中药/颗粒药分佣 foreach($productOrderItems as $v){ $ledger = []; $number = $v['number']; $totalPrice = round($number * $v['price'], 4); $totalBuyPrice = round($number * $v['buy_price'], 4); $ledger[] = [ 'order_id' => $this->order_id, 'user_id' => $store->id, 'user_type' => 1, //门店 'order_type' => 1,//产品订单 'fee_type' => 1,//药品费用 'su_id' => $productOrder->su_id, 'drugstore_id' => $productOrder->store_id, 'drug_id' => $v['drug_id'], 'xd_time' => $productOrder->created_at, 'number' => $number, 'money' => $totalPrice - $totalBuyPrice, 'status' => 0, 'created_at' => $time, 'updated_at' => $time ]; $ledger[] = [ 'order_id' => $this->order_id, 'user_id' => 0, 'user_type' => 2, //平台 'order_type' => 1,//产品订单 'fee_type' => 1,//药品费用 'su_id' => $productOrder->su_id, 'drugstore_id' => $productOrder->store_id, 'drug_id' => $v['drug_id'], 'xd_time' => $productOrder->created_at, 'number' => $number, 'money' => $totalBuyPrice, 'status' => 0, 'created_at' => $time, 'updated_at' => $time ]; \Yii::$app->db->createCommand()->batchInsert(Ledger::tableName(), [ 'order_id', 'user_id', 'user_type', 'order_type', 'fee_type', 'su_id', 'drugstore_id', 'drug_id','xd_time', 'number', 'money', 'status', 'created_at', 'updated_at' ], $ledger)->execute(); } break; case '2': //西药分佣 $ledger = []; foreach($productOrderItems as $v){ $totalPrice = round($v['number'] * $v['price'], 4); $totalBuyPrice = round($v['number'] * $v['buy_price'], 4); $ledger[] = [ 'order_id' => $this->order_id, 'user_id' => $store->id, 'user_type' => 1, //门店 'order_type' => 1,//产品订单 'fee_type' => 1,//药品费用 'su_id' => $productOrder->su_id, 'drugstore_id' => $productOrder->store_id, 'xd_time' => $productOrder->created_at, 'drug_id' => $v['drug_id'], 'number' => $v['number'], 'money' => $totalPrice - $totalBuyPrice, 'status' => 0, 'created_at' => $time, 'updated_at' => $time ]; $ledger[] = [ 'order_id' => $this->order_id, 'user_id' => 0, 'user_type' => 2, //平台 'order_type' => 1,//产品订单 'fee_type' => 1,//药品费用 'su_id' => $productOrder->su_id, 'drugstore_id' => $productOrder->store_id, 'drug_id' => $v['drug_id'], 'xd_time' => $productOrder->created_at, 'number' => $v['number'], 'money' => $totalBuyPrice, 'status' => 0, 'created_at' => $time, 'updated_at' => $time ]; \Yii::$app->db->createCommand()->batchInsert(Ledger::tableName(), [ 'order_id', 'user_id', 'user_type', 'order_type', 'fee_type', 'su_id', 'drugstore_id', 'drug_id','xd_time', 'number','money', 'status', 'created_at', 'updated_at' ], $ledger)->execute(); } break; default: throw new Exception('错误的处方类型'); break; } $t->commit(); $ledgerForm = new LedgerForm(); $ledgerForm->order_id = $this->order_id; $ledgerForm->status = 1; // 已结算 $ledgerForm->update(); ProductOrderLog::saveLog($this->order_id, '产品订单增加待结算记录结束'); } catch (\Exception $e) { $t->rollBack(); ProductOrderLog::saveLog($this->order_id, '产品订单增加待结算记录异常:'.$e->getMessage().'——'.$e->getLine()); throw $e; } break; } } //更新记录状态 1已结算 2已取消 public function update($type = 'productorder'){ switch ($type) { case 'register': //挂号订单 RegisterLog::saveLog($this->order_id, '挂号订单结算更新开始'); $Register = Register::find()->where(['id' => $this->order_id])->one(); if(!$Register){ throw new Exception('产品订单不存在'); } $store = Store::findOne(['id' => $Register->store_id]); if(!$store){ throw new Exception('门店不存在'); } $time = time(); $t = \Yii::$app->db->beginTransaction(); $model = new LedgerLog(); try { switch ($this->status) { case 1: // 已结算 //更新挂号订单为已结算 $Register->is_settled = 1; $Register->created_at = strtotime($Register->created_at); $Register->updated_at = $time; $Register->saveOrFail(); //分账表批量更新状态为已结算 Ledger::updateAll(['status' => 1, 'updated_at' => $time], ['order_id' => $this->order_id, 'order_type' => 2]); //1产品订单 2挂号订单 /******************************************** 门店 ********************************************** */ $storeTotal = Ledger::find()->where(['order_id' => $this->order_id, 'user_id' => $store->id, 'user_type' => 1, 'order_type' => 2, 'fee_type' => 2])->sum('money'); // 该订单门店分佣总金额 $storeTotal = round($storeTotal, 2);//4舍5入 //增加门店分佣 $log = clone $model; $log->order_id = $this->order_id; $log->user_id = $store->id; $log->user_type = 1;// 门店 $log->order_type = 2; //挂号订单 $log->fee_type = 2; //挂号费用 $log->type = 1;// 增加 $log->amount = $storeTotal; $log->content = '挂号订单结算后增加挂号分佣金额'; $log->created_at = $time; $log->updated_at = $time; $log->saveOrFail(); //门店可提现及累计金额更新 CashAccount::updateAllCounters(['able_cash' => $storeTotal, 'total_cash' => $storeTotal],['user_type' => 1, 'user_id' => $store->id]); //门店 break; case 2://已取消 if($Register->is_settled == 1){ //已结算回退 //已结算对账单状态更新 Reconciliation::updateAll(['status' => -1], ['order_id' => $this->order_id]); //分账表批量更新状态为已取消 Ledger::updateAll(['status' => 2, 'updated_at' => $time], ['order_id' => $this->order_id, 'order_type' => 1]);//1产品订单 2挂号订单 $ledgerLog = LedgerLog::find()->where(['order_id' => $this->order_id])->asArray()->all(); foreach($ledgerLog as $v){ $log = clone $model; $log->order_id = $v['order_id']; $log->user_id = $v['user_id']; $log->user_type = $v['user_type']; $log->order_type = $v['order_type']; $log->fee_type = $v['fee_type']; $log->type = 2;// 扣减 $log->amount = $v['amount']; $log->content = '订单结算后用户退货退款,扣减金额'; $log->created_at = $time; $log->updated_at = $time; $log->saveOrFail(); //可提现及累计金额更新 CashAccount::updateAllCounters(['able_cash' => $v['amount'] * -1, 'total_cash' => $v['amount'] * -1],['user_type' => $v['user_type'], 'user_id' => $v['user_id'], 'order_type' => $v['order_type'], 'fee_type' => $v['fee_type']]); } } else { // 未结算 Ledger::updateAll(['status' => 2, 'updated_at' => $time], ['order_id' => $this->order_id, 'order_type' => 2]); } break; default: # code... break; } $t->commit(); ProductOrderLog::saveLog($this->order_id, '挂号订单结算更新结束'); } catch (\Exception $e){ $t->rollBack(); ProductOrderLog::saveLog($this->order_id, '挂号订单结算更新异常:'.$e->getMessage().'——'.$e->getLine()); throw $e; } break; default: //产品订单 ProductOrderLog::saveLog($this->order_id, '产品订单结算更新开始'); $productOrder = ProductOrder::find()->where(['id' => $this->order_id])->one(); if(!$productOrder){ throw new Exception('产品订单不存在'); } $store = Store::findOne(['id' => $productOrder->store_id]); if(!$store){ throw new Exception('门店不存在'); } $time = time(); $t = \Yii::$app->db->beginTransaction(); $model = new LedgerLog(); try { switch ($this->status) { case 1: // 已结算 //更新产品订单为已结算 $productOrder->is_settled = 1; $productOrder->saveOrFail(); $productOrderItems = ProductOrderItems::find()->where(['product_order_id' => $productOrder->id])->asArray()->all(); $Reconciliation = new Reconciliation(); foreach($productOrderItems as $v){ $item = clone $Reconciliation; $item->store_id = $productOrder->store_id; $item->order_id = $productOrder->id; $item->pay_time = $productOrder->pay_time; $item->xd_time = $productOrder->created_at; $item->drug_id = $v['drug_id']; $item->drug_type = $v['type']; $item->number = $v['number']; $item->total_buy_price = $v['number'] * $v['buy_price']; $item->total_price = $v['number'] * $v['price']; $item->created_at = $time; $item->updated_at = $time; $item->saveOrFail(); } //分账表批量更新状态为已结算 Ledger::updateAll(['status' => 1, 'updated_at' => $time], ['order_id' => $this->order_id, 'order_type' => 1]); //1产品订单 2挂号订单 /******************************************** 平台 ********************************************** */ $platformDrugTotal = Ledger::find()->where(['order_id' => $this->order_id, 'user_type' => 2, 'order_type' => 1, 'fee_type' => 1])->sum('money'); // 该订单平台分佣总金额 //增加药品分佣 $log = clone $model; $log->order_id = $this->order_id; $log->user_id = 0; $log->user_type = 2;// 平台 $log->order_type = 1; //产品订单 $log->fee_type = 1; //药品费用 $log->type = 1;// 增加 $log->amount = round($platformDrugTotal, 2); $log->content = '订单结算后增加药品分佣金额'; $log->created_at = $time; $log->updated_at = $time; $log->saveOrFail(); //增加代煎费 if($productOrder->decoct_price > 0){ $platformDecoctTotal = Ledger::find()->where(['order_id' => $this->order_id, 'user_type' => 2, 'order_type' => 1, 'fee_type' => 4])->sum('money'); // 该订单代煎费用 $logDecoct = clone $model; $logDecoct->order_id = $this->order_id; $logDecoct->user_id = 0; $logDecoct->user_type = 2;// 平台 $logDecoct->order_type = 1; //产品订单 $logDecoct->fee_type = 4; //代煎费用 $logDecoct->type = 1;// 增加 $logDecoct->amount = round($platformDecoctTotal, 2); $logDecoct->content = '订单结算后增加代煎费用'; $logDecoct->created_at = $time; $logDecoct->updated_at = $time; $logDecoct->saveOrFail(); } //增加加工费 if($productOrder->process_price > 0){ $platformProcessTotal = Ledger::find()->where(['order_id' => $this->order_id, 'user_type' => 2, 'order_type' => 1, 'fee_type' => 5])->sum('money'); // 该订单加工费用 $logProcess = clone $model; $logProcess->order_id = $this->order_id; $logProcess->user_id = 0; $logProcess->user_type = 2;// 平台 $logProcess->order_type = 1; //产品订单 $logProcess->fee_type = 5; //代煎费用 $logProcess->type = 1;// 增加 $logProcess->amount = round($platformProcessTotal, 2); $logProcess->content = '订单结算后增加加工费用'; $logProcess->created_at = $time; $logProcess->updated_at = $time; $logProcess->saveOrFail(); } $platformDeliveryTotal = 0; //增加快递记录 if($productOrder->trans_expenses > 0){ $platformDeliveryTotal = Ledger::find()->where(['order_id' => $this->order_id, 'user_type' => 2, 'order_type' => 1, 'fee_type' => 3])->sum('money'); // 该订单快递费用 $logDelivery = clone $model; $logDelivery->order_id = $this->order_id; $logDelivery->user_id = 0; $logDelivery->user_type = 2;// 平台 $logDelivery->order_type = 1; //产品订单 $logDelivery->fee_type = 3; //快递费用 $logDelivery->type = 1;// 增加 $logDelivery->amount = round($platformDeliveryTotal, 2);; $logDelivery->content = '订单结算后增加快递费用'; $logDelivery->created_at = $time; $logDelivery->updated_at = $time; $logDelivery->saveOrFail(); } $platformTotal = round($platformDrugTotal+$platformDeliveryTotal?? 0+$platformDecoctTotal, 2); //该订单平台分佣总金额 //可提现金额表更新 CashAccount::updateAllCounters(['able_cash' => $platformTotal, 'total_cash' => $platformTotal],['user_type' => 2]); //平台 /******************************************** 门店 ********************************************** */ $storeTotal = Ledger::find()->where(['order_id' => $this->order_id, 'user_id' => $store->id, 'user_type' => 1, 'order_type' => 1, 'fee_type' => 1])->sum('money'); // 该订单门店分佣总金额 $storeTotal = round($storeTotal, 2);//4舍5入 //增加门店分佣 $log = clone $model; $log->order_id = $this->order_id; $log->user_id = $store->id; $log->user_type = 1;// 门店 $log->order_type = 1; //产品订单 $log->fee_type = 1; //药品费用 $log->type = 1;// 增加 $log->amount = $storeTotal; $log->content = '订单结算后增加药品分佣金额'; $log->created_at = $time; $log->updated_at = $time; $log->saveOrFail(); //增加诊疗费 if($productOrder->treatement_price > 0){ $platformTreatementTotal = Ledger::find()->where(['order_id' => $this->order_id, 'user_type' => 2, 'order_type' => 1, 'fee_type' => 6])->sum('money'); // 该订单诊疗费用 $logTreatement = clone $model; $logTreatement->order_id = $this->order_id; $logTreatement->user_id = $store->id; $logTreatement->user_type = 1;// 门店 $logTreatement->order_type = 1; //产品订单 $logTreatement->fee_type = 6; //诊疗费用 $logTreatement->type = 1;// 增加 $logTreatement->amount = round($platformTreatementTotal, 2); $logTreatement->content = '订单结算后增加诊疗费用'; $logTreatement->created_at = $time; $logTreatement->updated_at = $time; $logTreatement->saveOrFail(); } //门店可提现及累计金额更新 CashAccount::updateAllCounters(['able_cash' => $storeTotal, 'total_cash' => $storeTotal],['user_type' => 1, 'user_id' => $store->id]); //门店 break; case 2://已取消 if($productOrder->is_settled == 1){ //已结算回退 //已结算对账单状态更新 Reconciliation::updateAll(['status' => -1], ['order_id' => $this->order_id]); //分账表批量更新状态为已取消 Ledger::updateAll(['status' => 2, 'updated_at' => $time], ['order_id' => $this->order_id, 'order_type' => 1]);//1产品订单 2挂号订单 $ledgerLog = LedgerLog::find()->where(['order_id' => $this->order_id])->asArray()->all(); foreach($ledgerLog as $v){ $log = clone $model; $log->order_id = $v['order_id']; $log->user_id = $v['user_id']; $log->user_type = $v['user_type']; $log->order_type = $v['order_type']; $log->fee_type = $v['fee_type']; $log->type = 2;// 扣减 $log->amount = $v['amount']; $log->content = '订单结算后用户退货退款,扣减金额'; $log->created_at = $time; $log->updated_at = $time; $log->saveOrFail(); //可提现及累计金额更新 CashAccount::updateAllCounters(['able_cash' => $v['amount'] * -1, 'total_cash' => $v['amount'] * -1],['user_type' => $v['user_type'], 'user_id' => $v['user_id']]); } } else { // 未结算 Ledger::updateAll(['status' => 2, 'updated_at' => $time], ['order_id' => $this->order_id, 'order_type' => 1]);//order_type 1产品订单 2挂号订单 } break; default: # code... break; } $t->commit(); ProductOrderLog::saveLog($this->order_id, '产品订单结算更新结束'); } catch (\Exception $e){ $t->rollBack(); ProductOrderLog::saveLog($this->order_id, '产品订单结算更新异常'.$e->getMessage().'——'.$e->getLine()); throw $e; } break; } } }