request->post(); $query = Prescription::find()->alias('p')->with('userPatient')->where([ 'p.su_id' => \Yii::$app->user->identity->id, 'p.is_deleted' => 0, 'p.store_id' => $post['store_id'] ])->orderBy('p.created_at DESC'); $this->field = [ Prescription::class => [ 'id','up_id','prescription_type', 'type','is_pay','refund_status','prescription_no','status','created_at', 'patient' => function ($model) { return [ 'id' => $model->userPatient['id'], 'name' =>$model->userPatient['name'], 'sex' => $model->userPatient['sex'], 'age' => FuncHelper::getAgeFromIdNo($model->userPatient['id_card']), ]; } ] ]; $patient_name = $post['patient_name']?? ''; $query->joinWith(['userPatient' => function ($q) use ($patient_name) { $q->alias('up'); //搜索就诊人姓名 if (!empty($patient_name)) { $q->andWhere(['like', 'up.name', $patient_name]); } }]); if($post['prescription_no']?? false){ $query->andWhere(['p.prescription_no'=> $post['prescription_no']]); } if($post['status']?? false ){ $query->andWhere(['p.status'=> $post['status']]); }elseif($post['status']==='0'){ $query->andWhere(['p.status'=> $post['status']]); }else{ $query->andWhere(['p.status'=> [0,1,2]]); } if($post['type']?? false){ $query->andWhere(['p.type'=>$post['type']]); } if($post['prescription_type']?? false){ $query->andWhere(['p.prescription_type'=>$post['prescription_type']]); } $post['start_time'] = $post['start_time']?? false; $post['end_time'] = $post['end_time']?? false; if($post['start_time']&&!$post['end_time']){ $query->andWhere(['>=','p.created_at',strtotime($post['start_time'])]); } if(!$post['start_time']&&$post['end_time']){ $query->andWhere(['<=','p.created_at',strtotime($post['end_time'])]); } if($post['start_time']&&$post['end_time']){ $query->andWhere(['between','p.created_at',strtotime($post['start_time']),strtotime($post['end_time'])]); } return $this->create($query, \Yii::$app->request->post()); } /** * 处方详情 */ public function actionDetail(){ $post = \Yii::$app->request->post(); $this->requestValidate($post, [ ['prescription_id','required'], ['store_id', 'required'] ]); return (new PrescriptionService())->detail('', $post['prescription_id']); } /** * 开处方-常用方 */ public function actionCommonUse() { return $this->commonUseResponseLikeXkApi(\Yii::$app->request->post()); } /** * @doc-name 开处方-常用方详情(中药) * @doc-param int id 处方id */ public function actionCommonChinese() { return $this->commonChineseDetailLikeXkApi(\Yii::$app->request->post()); } /** * @doc-name 开处方-常用方详情(颗粒药) * @doc-param int id 处方id */ public function actionCommonGranular() { return $this->commonGranularDetailLikeXkApi(\Yii::$app->request->post()); } /** * @doc-name 开处方-常用方详情(西药) * @doc-param int id 处方id */ public function actionCommonWest() { return $this->commonWestDetailLikeXkApi(\Yii::$app->request->post()); } protected function commonUseResponseLikeXkApi(array $post): array { $this->requestValidate($post, [ ['store_id', 'required'], ]); $storeId = (int) $post['store_id']; // $checkPrice = !isset($post['check_price']) || (int) $post['check_price'] === 1; $checkPrice = 1; $chinese = PrescriptionChinese::find()->where([ 'type' => 2, 'store_id' => $storeId, ])->andWhere(['su_id' => \Yii::$app->user->identity->id])->asArray()->all(); $west = PrescriptionWest::find()->where([ 'type' => 2, 'store_id' => $storeId, ])->andWhere(['su_id' => \Yii::$app->user->identity->id])->asArray()->all(); $granular = PrescriptionGranular::find()->where([ 'type' => 2, 'store_id' => $storeId, ])->andWhere(['su_id' => \Yii::$app->user->identity->id])->asArray()->all(); if (!$chinese && !$west && !$granular) { throw new Exception('没有常用方'); } $chineseRepice = []; foreach ($chinese as &$chineseRow) { $ids = array_filter(explode(',', (string) $chineseRow['cr_ids'])); $recipes = ChineseRepice::find()->where(['in', 'id', $ids])->asArray()->all(); $syncResult = $this->syncChineseCommonRecipesWithStorePrices($storeId, $chineseRow, $recipes, $checkPrice); $recipes = $syncResult['recipes']; $chineseRow['price_adjusted'] = $syncResult['price_adjusted'] ? 1 : 0; if (!empty($recipes[0])) { $this->attachChineseMetaForList($chineseRow, $recipes[0]); } foreach ($recipes as &$recipeRow) { $recipeRow = $this->normalizeChineseRecipeRow($recipeRow); } unset($recipeRow); $chineseRepice[] = $recipes; } unset($chineseRow); $westRepice = []; foreach ($west as $westRow) { $ids = array_filter(explode(',', (string) $westRow['wr_ids'])); $recipes = WestRepice::find()->where(['in', 'id', $ids]) ->with(['usetime', 'usetype', 'frequency', 'westUnit']) ->asArray()->all(); $westRepice[] = $this->buildCommonWestRecipeRowsLikeXkApi($recipes); } $granularRepice = []; foreach ($granular as $granularRow) { $ids = array_filter(explode(',', (string) $granularRow['gr_ids'])); $recipes = GranularRepice::find()->where(['in', 'id', $ids])->asArray()->all(); $granularRepice[] = $this->buildCommonGranularRecipeRowsLikeXkApi($recipes); } return [ 'chin_prescription' => $chinese, 'chinese' => $chineseRepice, 'west_prescription' => $west, 'west' => $westRepice, 'granular_prescription' => $granular, 'granular' => $granularRepice, ]; } protected function commonChineseDetailLikeXkApi(array $post): array { $this->requestValidate($post, [ ['id', 'required'], ['store_id', 'required'], ]); $chinese = PrescriptionChinese::find()->where([ 'id' => $post['id'], 'store_id' => $post['store_id'], ])->andWhere(['type' => 2])->asArray()->one(); if (!$chinese) { throw new Exception('没有该处方'); } $ids = array_filter(explode(',', (string) $chinese['cr_ids'])); $recipes = ChineseRepice::find()->where(['in', 'id', $ids])->asArray()->all(); $syncResult = $this->syncChineseCommonRecipesWithStorePrices((int) $chinese['store_id'], $chinese, $recipes, true); $recipes = $syncResult['recipes']; foreach ($recipes as &$recipeRow) { $recipeRow = $this->normalizeChineseRecipeRow($recipeRow); } unset($recipeRow); return $recipes; } protected function commonGranularDetailLikeXkApi(array $post): array { $this->requestValidate($post, [ ['id', 'required'], ['store_id', 'required'], ]); $granular = PrescriptionGranular::find()->where([ 'id' => $post['id'], 'store_id' => $post['store_id'], ])->andWhere(['type' => 2])->asArray()->one(); if (!$granular) { throw new Exception('没有该处方'); } $ids = array_filter(explode(',', (string) $granular['gr_ids'])); $recipes = GranularRepice::find()->where(['in', 'id', $ids])->asArray()->all(); return $this->buildCommonGranularRecipeRowsLikeXkApi($recipes); } protected function commonWestDetailLikeXkApi(array $post): array { $this->requestValidate($post, [ ['id', 'required'], ['store_id', 'required'], ]); $west = PrescriptionWest::find()->where([ 'id' => $post['id'], 'store_id' => $post['store_id'], ])->andWhere(['type' => 2])->asArray()->one(); if (!$west) { throw new Exception('没有该处方'); } $ids = array_filter(explode(',', (string) $west['wr_ids'])); $recipes = WestRepice::find()->where(['in', 'id', $ids]) ->with(['usetime', 'usetype', 'frequency', 'westUnit']) ->asArray()->all(); return $this->buildCommonWestRecipeRowsLikeXkApi($recipes); } protected function syncChineseCommonRecipesWithStorePrices(int $storeId, array $prescriptionRow, array $recipeRows, bool $persist): array { $priceAdjusted = false; if (empty($recipeRows)) { return ['recipes' => $recipeRows, 'price_adjusted' => false]; } $time = time(); $transaction = \Yii::$app->db->beginTransaction(); try { foreach ($recipeRows as &$recipeRow) { $contentList = Json::decode($recipeRow['content'] ?? '', true); if (!is_array($contentList)) { continue; } $cmIds = array_values(array_filter(explode(',', (string) ($recipeRow['cm_id'] ?? '')))); $dosage = max(1, (int) ($recipeRow['dosage'] ?? 1)); $drugTotal = 0.0; $recipeChanged = false; foreach ($contentList as $idx => &$drugRow) { $drugRow = $this->normalizeChineseDrugRow($drugRow); $drugId = (int) ($drugRow['drug_id'] ?? $drugRow['id'] ?? 0); $price = (float) ($drugRow['price'] ?? 0); $buyPrice = (float) ($drugRow['buy_price'] ?? 0); if ($drugId > 0) { $drug = Drug::find()->alias('d')->select('d.*')->where([ 'd.id' => $drugId, ])->joinWith(['drugStoreDrug dsd' => function ($q) { $q->andWhere(['dsd.status' => 2]); }])->joinWith(['drugStoreRelation dsr' => function ($q) use ($storeId) { $q->andWhere(['dsr.store_id' => $storeId]); $q->andWhere(['dsr.status' => 2]); }])->asArray()->one(); if ($drug && !empty($drug['drugStoreRelation'])) { $latestPrice = (float) $drug['drugStoreRelation']['price']; $latestBuyPrice = (float) $drug['drugStoreRelation']['buy_price']; if ($latestPrice !== $price || $latestBuyPrice !== $buyPrice) { $priceAdjusted = true; $recipeChanged = true; } $price = $latestPrice; $buyPrice = $latestBuyPrice; $drugRow['price'] = $latestPrice; $drugRow['buy_price'] = $latestBuyPrice; if ($persist && isset($cmIds[$idx]) && is_numeric($cmIds[$idx])) { ChineseMedicine::updateAll([ 'price' => $latestPrice, 'buy_price' => $latestBuyPrice, 'updated_at' => $time, ], ['id' => (int) $cmIds[$idx]]); } } } $drugTotal += (float) ($drugRow['number'] ?? 0) * $price * $dosage; } unset($drugRow); if ($persist && $recipeChanged) { $recipeRow['content'] = Json::encode($contentList); $recipeRow['total_price'] = round($drugTotal, 4); ChineseRepice::updateAll([ 'content' => $recipeRow['content'], 'total_price' => $recipeRow['total_price'], 'updated_at' => $time, ], ['id' => $recipeRow['id']]); } else { $recipeRow['content'] = Json::encode($contentList); $recipeRow['total_price'] = round($drugTotal, 4); } } unset($recipeRow); if ($persist && $priceAdjusted && !empty($prescriptionRow['id'])) { PrescriptionChinese::updateAll(['updated_at' => $time], ['id' => $prescriptionRow['id']]); } $transaction->commit(); return ['recipes' => $recipeRows, 'price_adjusted' => $priceAdjusted]; } catch (\Throwable $e) { $transaction->rollBack(); throw $e; } } protected function normalizeChineseRecipeRow(array $recipeRow): array { $contentList = Json::decode($recipeRow['content'] ?? '', true); if (is_array($contentList)) { foreach ($contentList as &$drugRow) { $drugRow = $this->normalizeChineseDrugRow($drugRow); } unset($drugRow); $recipeRow['content'] = Json::encode($contentList); } return $recipeRow; } protected function normalizeChineseDrugRow(array $drugRow): array { $name = $drugRow['drug_name'] ?? ($drugRow['name'] ?? ''); $drugRow['name'] = $name; $drugRow['drug_name'] = $name; if (isset($drugRow['way_id']) && !isset($drugRow['order'])) { $drugRow['order'] = $drugRow['way_id']; } if (isset($drugRow['order']) && !isset($drugRow['way_id'])) { $drugRow['way_id'] = $drugRow['order']; } if (!isset($drugRow['unit']) || empty($drugRow['unit'])) { $drugRow['unit'] = ['name' => 'g']; } return $drugRow; } protected function attachChineseMetaForList(array &$prescriptionRow, array $firstRecipeRow): void { $prescriptionRow['rule_type'] = (int) ($firstRecipeRow['deployment'] ?? 1); $prescriptionRow['dosage'] = (int) ($firstRecipeRow['dosage'] ?? 7); $prescriptionRow['day_dosage'] = (int) ($firstRecipeRow['consumption'] ?? 2); $prescriptionRow['process_rule_id'] = (int) ($firstRecipeRow['process_rule_id'] ?? 0); $prescriptionRow['process_rule_note'] = $firstRecipeRow['process_rule_note'] ?? ''; $prescriptionRow['package_method_id'] = (int) ($firstRecipeRow['package_method_id'] ?? 0); if ($prescriptionRow['process_rule_id']) { $processRule = ProcessRule::findOne($prescriptionRow['process_rule_id']); $prescriptionRow['process_rule_name'] = $processRule ? $processRule->name : ''; } if ($prescriptionRow['process_rule_note']) { $processRuleNote = ProcessRuleNote::find()->where(['note' => $prescriptionRow['process_rule_note']])->one(); $prescriptionRow['process_rule_note_name'] = $processRuleNote ? $processRuleNote->note : $prescriptionRow['process_rule_note']; } if ($prescriptionRow['package_method_id']) { $packageMethod = PackageMethod::findOne($prescriptionRow['package_method_id']); $prescriptionRow['package_method_name'] = $packageMethod ? $packageMethod->name : ''; } } protected function buildCommonWestRecipeRowsLikeXkApi(array $recipeRows): array { foreach ($recipeRows as &$recipeRow) { $content = Json::decode($recipeRow['content'] ?? '', true); if (is_array($content)) { $recipeRow['drug_name'] = $content['drug_name'] ?? ''; $recipeRow['drug_id'] = $content['id'] ?? 0; $recipeRow['image'] = $content['image'] ?? ''; $recipeRow['price'] = $content['price'] ?? ($recipeRow['total_price'] ?? 0); } $recipeRow['frequency_id'] = $recipeRow['f_id'] ?? 0; $recipeRow['unit_id'] = $recipeRow['wu_id'] ?? 0; $recipeRow['number'] = $recipeRow['grain_number'] ?? ($recipeRow['number'] ?? 1); } unset($recipeRow); return $recipeRows; } protected function buildCommonGranularRecipeRowsLikeXkApi(array $recipeRows): array { foreach ($recipeRows as &$recipeRow) { $contentList = Json::decode($recipeRow['content'] ?? '', true); if (!is_array($contentList)) { continue; } foreach ($contentList as &$drugRow) { $name = $drugRow['drug_name'] ?? ($drugRow['name'] ?? ''); $drugRow['name'] = $name; $drugRow['drug_name'] = $name; if (isset($drugRow['way_id']) && !isset($drugRow['order'])) { $drugRow['order'] = $drugRow['way_id']; } if (isset($drugRow['order']) && !isset($drugRow['way_id'])) { $drugRow['way_id'] = $drugRow['order']; } if (!isset($drugRow['unit']) || empty($drugRow['unit'])) { $drugRow['unit'] = ['name' => 'g']; } } unset($drugRow); $recipeRow['content'] = Json::encode($contentList); } unset($recipeRow); return $recipeRows; } protected function actionCommonUseLegacy() { $post = \YII::$app->request->post(); $chinese = PrescriptionChinese::find()->where([ 'type' => 2, 'store_id' => $post['store_id'] ])->andWhere(['su_id' => \Yii::$app->user->identity->id])->all(); $west = PrescriptionWest::find()->where([ 'type' => 2, 'store_id' => $post['store_id'] ])->andWhere(['su_id' => \Yii::$app->user->identity->id])->all(); $granular = PrescriptionGranular::find()->where([ 'type' => 2, 'store_id' => $post['store_id'] ])->andWhere(['su_id' => \Yii::$app->user->identity->id])->all(); if (!$chinese && !$west && !$granular) throw new Exception('没有常用方'); $chineseRepice = $westRepice = $granularRepice = []; if($chinese){ foreach ($chinese as $value) { $ids = explode(',', $value['cr_ids']); $chineseRepice[] = ChineseRepice::find()->where(['in', 'id', $ids])->asArray()->all(); } } if($west){ foreach ($west as $value) { $ids = explode(',', $value['wr_ids']); $westRepice[] = WestRepice::find()->where(['in', 'id', $ids])->with(['usetime', 'usetype', 'frequency', 'westUnit'])->asArray()->all(); } } if($granular){ foreach ($granular as $value) { $ids = explode(',', $value['gr_ids']); $granularRepice[] = GranularRepice::find()->where(['in', 'id', $ids])->asArray()->all(); } } return [ 'chin_prescription' => $chinese, 'chinese' => $chineseRepice, 'west_prescription' => $west, 'west' => $westRepice, 'granular_prescription' => $granular, 'granular' => $granularRepice ]; } protected function actionCommonChineseLegacy() { $post = \Yii::$app->request->post(); $this->requestValidate($post,[ ['id','required'] ]); $chinese = PrescriptionChinese::find()->where([ 'id' => $post['id'], 'store_id' => $post['store_id'] ])->andWhere(['type' => 2])->one(); if (!$chinese) { throw new Exception('没有该处方'); } $ids = explode(',', $chinese['cr_ids']); return ChineseRepice::find()->where(['in', 'id', $ids])->asArray()->all(); } protected function actionCommonGranularLegacy() { $post = \Yii::$app->request->post(); $this->requestValidate($post,[ ['id','required'] ]); $granular = PrescriptionGranular::find()->where([ 'id' => $post['id'], 'store_id' => $post['store_id'] ])->andWhere(['type' => 2])->one(); if (!$granular) { throw new Exception('没有该处方'); } $ids = explode(',', $granular['gr_ids']); return GranularRepice::find()->where(['in', 'id', $ids])->asArray()->all(); } protected function actionCommonWestLegacy() { $post = \Yii::$app->request->post(); $this->requestValidate($post,[ ['id','required'] ]); $west = PrescriptionWest::find()->where([ 'id' => $post['id'], 'store_id' => $post['store_id'] ])->andWhere(['type' => 2])->one(); if (!$west) { throw new Exception('没有该处方'); } $ids = explode(',', $west['wr_ids']); return WestRepice::find()->where(['in', 'id', $ids])->with(['usetime', 'usetype', 'frequency', 'westUnit'])->asArray()->all(); } /** * 开处方-中药常用方 * @doc-param string clinical_diagnose 临床诊断 * @doc-param int up_id 就诊人id * @doc-param string doctor_order 医嘱 * @doc-param int category 类别1自费2医保 * @doc-param string cr_ids 拼接药方id */ public function actionSaveChinCommon() { $id = \Yii::$app->user->identity->id; $request = \Yii::$app->request; $param = $request->post(); $this->requestValidate($param, [ ['name', 'required'], ['store_id', 'required'], //['clinical_diagnose', 'required'], //['category', 'required'], //['doctor_order', 'required'], ['cr_ids', 'required'], ]); $store_id = $param['store_id']; try { $chineseRepice = new PrescriptionChinese(); $chineseRepice->su_id = $id; $chineseRepice->name = $param['name']; $chineseRepice->clinical_diagnose = $param['clinical_diagnose']??''; $chineseRepice->prescription_no = 'ZY'.rand(111111, 999999) . time(); $chineseRepice->up_id = 0; $chineseRepice->store_id = $store_id; $chineseRepice->status = 0; $chineseRepice->category = $param['category']??''; $chineseRepice->doctor_order = $param['doctor_order']??''; $chineseRepice->cr_ids = $param['cr_ids']; $chineseRepice->type = 2; $chineseRepice->saveOrFail(); return [ 'id' => $chineseRepice->id, 'issue_time' => time(), 'clinical_diagnose' => $param['clinical_diagnose'] ]; } catch (Exception $e) { throw new Exception($e->getMessage()); } } /** * 开处方-中药常用方 * @doc-param string clinical_diagnose 临床诊断 * @doc-param int up_id 就诊人id * @doc-param string doctor_order 医嘱 * @doc-param int category 类别1自费2医保 * @doc-param string cr_ids 拼接药方id */ public function actionSaveGranularCommon() { $id = \Yii::$app->user->identity->id; $request = \Yii::$app->request; $param = $request->post(); $this->requestValidate($param, [ ['store_id', 'required'], ['name', 'required'], //['clinical_diagnose', 'required'], //['category', 'required'], //['doctor_order', 'required'], ['gr_ids', 'required'], ]); $store_id = $param['store_id']; try { $granularRepice = new PrescriptionGranular(); $granularRepice->su_id = $id; $granularRepice->name = $param['name']; $granularRepice->clinical_diagnose = $param['clinical_diagnose']??''; $granularRepice->prescription_no = 'ZY'.rand(111111, 999999) . time(); $granularRepice->up_id = 0; $granularRepice->store_id = $store_id; $granularRepice->status = 0; $granularRepice->category = $param['category']??''; $granularRepice->doctor_order = $param['doctor_order']??''; $granularRepice->gr_ids = $param['gr_ids']; $granularRepice->type = 2; $granularRepice->saveOrFail(); return [ 'id' => $granularRepice->id, 'issue_time' => time(), 'clinical_diagnose' => $param['clinical_diagnose'] ]; } catch (Exception $e) { throw new Exception($e->getMessage()); } } /** * @doc-name 开处方-西药常用方 * @doc-param string doctor_order 医嘱 * @doc-param string clinical_diagnose 临床诊断 * @doc-param int up_id 就诊人id * @doc-param int category 类别1自费2医保 * @doc-param string wr_ids 关联西药药方表 * @doc-return string aa bb */ public function actionSaveWestCommon() { $id = \Yii::$app->user->identity->id; $param = \Yii::$app->request->post(); try { $this->requestValidate($param, [ ['store_id', 'required'], ['name', 'required'], //['doctor_order', 'required'], //['clinical_diagnose', 'required'], //['category', 'required'], ['wr_ids', 'required'], ]); $store_id = $param['store_id']; $westRepice = new PrescriptionWest(); $westRepice->su_id = $id; $westRepice->name = $param['name']; $westRepice->clinical_diagnose = $param['clinical_diagnose']??''; $westRepice->prescription_no = 'XY'.rand(111111, 999999) . time(); $westRepice->up_id = 0; $westRepice->store_id = $store_id; $westRepice->status = 0; $westRepice->category = $param['category']??''; $westRepice->doctor_order = $param['doctor_order']??''; $westRepice->wr_ids = $param['wr_ids']; $westRepice->type = 2; $westRepice->saveOrFail(); return [ 'id' => $westRepice->id, 'issue_time' => time(), 'clinical_diagnose' => $param['clinical_diagnose'] ]; } catch (Exception $e) { throw new Exception($e->getMessage()); } } public function actionDeleteCommon(){ $param = \Yii::$app->request->post(); $this->requestValidate($param, [ ['id', 'required'], ['type', 'required'] ]); try { switch ($param['type']) { case 'west': # code... $prescription = PrescriptionWest::findOne([ 'id' => $param['id'], 'su_id' => \Yii::$app->user->identity->id, 'type' => 2 ]); break; case 'chinese': # code... $prescription = PrescriptionChinese::findOne([ 'id' => $param['id'], 'su_id' => \Yii::$app->user->identity->id, 'type' => 2 ]); break; case 'granular': # code... $prescription = PrescriptionGranular::findOne([ 'id' => $param['id'], 'su_id' => \Yii::$app->user->identity->id, 'type' => 2 ]); break; default: throw new Exception('错误的type'); break; } if(!$prescription) throw new Exception('常用方不存在'); $prescription->delete(); } catch (\Exception $e) { throw $e; } return ['删除成功']; } }