request->get(); $this->requestValidate($get, [ ['type', 'required'] ]); //诊所 if ($get['type'] == 1) { if (empty($get['store_id'])) { throw new Exception('诊所ID不能为空'); } $query = Store::find()->alias('s')->where(['s.id' => $get['store_id']]); $this->field = [ Store::class => [ 'id', 'name', 'shouzimu', 'position', 'pic', 'contact', 'mobile', 'offical_seal', 'see_rate', 'sale_number' => function ($s) { return $this->actionStoreAllNumber($s->id); }, 'sale_price' => function ($s) { return $this->actionStoreSalePrice($s->id); }, 'give_price' => function ($s) { return $this->actionStoreGivePrice($s->id); }, ] ]; } else {//药品 $query = Ledger::find()->alias('l')->where(['l.status' => 1]); $this->field = [ Ledger::class => [ 'id', 'order_id', 'user_id', 'user_type', 'su_id', 'drugstore_id', 'drug_id', 'money', 'status', 'drug_number' => 'drug.drug_number', 'drug_name' => 'drug.drug_name', 'store_number' => 'productOrder.store.id', 'store' => 'productOrder.store.name', 'sale_number' => function ($s) { return $this->actionEverySaleNumber($s->order_id, $s->drug_id); }, 'sale_price', 'give_price' ] ]; } return $this->create($query, $get); } /** * @doc-name 统计门店所有的药的销量 */ public function actionStoreAllNumber($store_id = null) { $C_Drug = DrugStoreDrug::find()->where(['type' => [1, 3]])->column();//草药 $C_sale = DrugStoreRelations::find()->where(['in', 'drug_id', $C_Drug])->andWhere(['store_id' => $store_id])->sum('sale_number'); $CH_Drug = DrugStoreDrug::find()->where(['type' => [2, 4]])->column();//成药 $CH_sale = DrugStoreRelations::find()->where(['in', 'drug_id', $CH_Drug])->andWhere(['store_id' => $store_id])->sum('sale_number'); return [ 'c_sale' => $C_sale, 'CH_sale' => $CH_sale, ]; } /** * @doc-name 统计每个药的销量 */ public function actionCategorySaleNumber($order_id = null, $drug_id = null) { $order_id = 2; $drug_id = 1; $ProductOrder = ProductOrder::find()->where(['id' => $order_id])->one(); $DrugStoreRelations = DrugStoreRelations::find()->where(['store_id' => $ProductOrder->store_id, 'drug_id' => $drug_id])->one(); return $DrugStoreRelations->sale_number; } /** * @doc-name 统计每个药的销量 */ public function actionEverySaleNumber($order_id = null, $drug_id = null, $start_time = '', $end_time = '') { $ProductOrder = ProductOrder::find()->where(['id' => $order_id])->one(); $DrugStoreRelations = DrugStoreRelations::find()->where(['store_id' => $ProductOrder->store_id, 'drug_id' => $drug_id])->one(); return $DrugStoreRelations->sale_number; } /** * @doc-name 对账单 * @doc-param int type 1诊所2药品 * @doc-param int drug_type 1草药2成药 / optional * @doc-param int store_id 诊所ID / optional * @doc-param int store_name 诊所name / optional * @doc-param int drug_name 药品 / optional * @doc-param string start_time 时间 / optional * @doc-param string end_time 时间 / optional */ public function actionDuiZhangDan() { $get = \Yii::$app->request->get(); $this->requestValidate($get, [ ['type', 'required'] ]); $user = \Yii::$app->user->identity; if (!empty($get['start_time']) && !empty($get['end_time'])) { $start_time = strtotime($get['start_time'] . ' ' . '00:00:00'); $end_time = strtotime($get['end_time'] . ' ' . '23:59:59'); } //诊所 if ($get['type'] == 1) { $query = Store::find()->alias('s'); if ($user->role == UserRoleEnum::STORE_ADMIN) { $query->andWhere(['s.id' => $user->store_id]); } $store_name = $get['store_name']; if (!empty($store_name)) { $query->where(['like', 's.name', $store_name]); } if (!empty($start_time) && !empty($end_time)) { if ($start_time == $end_time) {//筛选某一天 $time = FuncHelper::getDayBE($get['start_time']); $end_time = $time[1]; } //按照下单时按筛选 $query->with(['reconciliation' => function ($r) use ($start_time, $end_time) { $r->alias('re'); $r->andWhere(['between', 're.xd_time', $start_time, $end_time]); }]); //挂号搜索 $register_data = ['between', 'r.xd_time', $start_time, $end_time]; } $this->field = [ Store::class => [ 'id', 'name', 'shouzimu', 'position', 'pic', 'contact', 'mobile', 'offical_seal', 'see_rate', 'sale_number' => function ($s) use ($start_time, $end_time) { return $this->actionSaleNum($s->id, $start_time, $end_time); }, 'trans_fee' => function ($k) use ($start_time, $end_time) { return $this->actionStoreTransFee($k->id, 1, $start_time, $end_time); }, 'work_fee' => function ($m) use ($start_time, $end_time) { return $this->actionStoreTransFee($m->id, 2, $start_time, $end_time); }, 'treatement_fee' => function ($m) use ($start_time, $end_time) { return $this->actionStoreTransFee($m->id, 3, $start_time, $end_time); }, 'register_price' => function ($m) use ($register_data) { $price = Ledger::find()->alias('r')->where(['user_id' => $m->id, 'status' => 1, 'user_type' => 1, 'order_type' => 2])->andWhere($register_data ?? '')->sum('money'); // return $this->actionRegister($m->id,$register_data); return $price ?? 0; } ] ]; } else {//药品 // 设置查询条件,查找状态为1的对账记录,按ID降序排序 $query = Reconciliation::find()->alias('r')->where(['r.status' => 1])->orderBy(['id' => SORT_DESC]); // 获取搜索参数:门店名称和药品名称 $store_name = $get['store_name']; $drug_name = $get['drug_name']; // 根据门店名称过滤门店 $query->joinWith(['store' => function ($s) use ($store_name) { $s->alias('s'); if (!empty($store_name)) { $s->andWhere([ 'or', ['like', 's.name', $store_name], ['like', 's.shouzimu', $store_name], ]); } }]); // 根据药品名称过滤药品 $query->joinWith(['drug' => function ($d) use ($drug_name) { $d->alias('d'); if (!empty($drug_name)) { $d->andWhere([ 'or', ['like', 'd.drug_name', $drug_name], ['like', 'd.pinyin_simple', $drug_name], ]); } }]); // 根据门店ID过滤对账记录 if (!empty($get['store_id'])) { $query->andWhere(['r.store_id' => $get['store_id']]); } // 如果用户是门店管理员,只查询该门店的对账记录 if ($user->role == UserRoleEnum::STORE_ADMIN) { $query->andWhere(['r.store_id' => $user->store_id]); } // 根据药品类型过滤对账记录 if (!empty($get['drug_type'])) { if ($get['drug_type'] == 1) { $query->andWhere(['r.drug_type' => [1, 3]]); } else { $query->andWhere(['r.drug_type' => [2, 4]]); } } // 根据开始时间和结束时间过滤对账记录 if (!empty($start_time) && !empty($end_time)) { if ($start_time == $end_time) {//筛选当天 $time = FuncHelper::getDayBE($get['start_time']); $end_time = $time[1]; } $query->andWhere(['between', 'r.xd_time', $start_time, $end_time]); } // 按药品ID分组 // $query->groupBy('drug_id'); // TODO 这里有问题 // 定义查询字段及格式化函数 $this->field = [ Reconciliation::class => [ 'id', 'order_id', 'store_id', 'pay_time' => function ($m) { return date('Y-m-d H:i:s', $m->pay_time); }, 'drug_id', 'drug_type', 'total_buy_price', 'status', 'drug_number' => 'drug.drug_number', 'drug_name' => 'drug.drug_name', 'store_number' => 'productOrder.store.id', 'store' => 'store.name', 'number', 'total_buy_price', 'total_price', 'sale_number' => 0, 'trans_fee' => 'productOrder.trans_expenses', 'work_fee' => 'productOrder.process_price', 'treatement_fee' => 'productOrder.treatement_price' ] ]; $list = $this->create($query, $get)->getModels(); // 总销量 sale_number // 单个销量 number 不知道要这个干嘛 // 总价 total_price // 总供货价 total_buy_price $result = []; foreach ($list as $value) { if (!empty($result[$value['drug_id']])) { $result[$value['drug_id']]['number'] = bcadd($result[$value['drug_id']]['sale_number'], $value['number'], 0); $result[$value['drug_id']]['sale_number'] = bcadd($result[$value['drug_id']]['sale_number'], $value['number'], 2); $result[$value['drug_id']]['total_buy_price'] = bcadd($result[$value['drug_id']]['total_buy_price'], $value['total_buy_price'], 2); $result[$value['drug_id']]['total_price'] = bcadd($result[$value['drug_id']]['total_price'], $value['total_price'], 2); } else { $result[$value['drug_id']] = [ 'id' => $value['drug_id'], 'drug_number' => $value['drug']['drug_number'], 'drug_name' => $value['drug']['drug_name'], 'number' => $value['number'], 'sale_number' => $value['number'], 'total_price' => $value['total_price'], 'total_buy_price' => $value['total_buy_price'], 'drug_type' => $value['drug_type'], 'drug_id' => $value['drug_id'], 'status' => $value['status'], ]; } } return [ 'list' => array_values($result), 'pageSize' => 10, 'page' => 1, 'total' => count($result) ]; } return $this->create($query, $get); } /** * @doc-name 销量 */ public function actionSaleNum($id = null, $start_time = '', $end_time = '') { // 检查开始时间和结束时间是否已提供 if (!empty($start_time) && !empty($end_time)) { // 格式化开始时间 $get_start_time = date('Y-m-d H:i:s', $start_time); // 如果开始时间与结束时间相同,则只筛选某一天的数据 if ($start_time == $end_time) { $time = FuncHelper::getDayBE($get_start_time); $start_time = strtotime($get_start_time); $end_time = $time[1]; } // 准备查询条件,用于筛选在开始时间和结束时间之间的数据 $data = ['between', 'r.xd_time', $start_time, $end_time]; } // 查询草药和成药的数量、进货价格、销售价格以及挂号收入 $cao_drug_num = Reconciliation::find()->alias('r')->where(['r.status' => 1, 'store_id' => $id, 'drug_type' => [1, 3]]) ->andWhere($data ?? '')->groupBy('r.drug_id')->sum('number'); $cheng_drug_num = Reconciliation::find()->alias('r')->where(['r.status' => 1, 'store_id' => $id, 'drug_type' => [2, 4]])->andWhere($data ?? '')->sum('number'); $cao_give_price = Reconciliation::find()->alias('r')->where(['r.status' => 1, 'store_id' => $id, 'drug_type' => [1, 3]])->andWhere($data ?? '')->sum('total_buy_price'); $cheng_give_price = Reconciliation::find()->alias('r')->where(['r.status' => 1, 'store_id' => $id, 'drug_type' => [2, 4]])->andWhere($data ?? '')->sum('total_buy_price'); $cao_sale_price = Reconciliation::find()->alias('r')->where(['r.status' => 1, 'store_id' => $id, 'drug_type' => [1, 3]])->andWhere($data ?? '')->sum('total_price'); $cheng_sale_price = Reconciliation::find()->alias('r')->where(['r.status' => 1, 'store_id' => $id, 'drug_type' => [2, 4]])->andWhere($data ?? '')->sum('total_price'); $register_price = Ledger::find()->alias('r')->where(['user_id' => $id, 'status' => 1, 'user_type' => 1, 'order_type' => 2])->andWhere($data ?? '')->sum('money'); // 计算总销售价格和总进货价格 $total_sale_price = bcadd($cao_sale_price, $cheng_sale_price, 4); $total_give_price = bcadd($cao_give_price, $cheng_give_price, 4); // 返回包含各种统计数据的数组 return [ 'cao_drug_num' => $cao_drug_num ?? 0, 'cheng_drug_num' => $cheng_drug_num ?? 0, 'cao_give_price' => $cao_give_price ?? 0, 'cheng_give_price' => $cheng_give_price ?? 0, 'cao_sale_price' => $cao_sale_price ?? 0, 'cheng_sale_price' => $cheng_sale_price ?? 0, 'total_give_price' => $total_give_price, 'total_sale_price' => $total_sale_price, 'store_income' => bcadd(bcsub($total_sale_price, $total_give_price, 4), $register_price, 4) ]; } public function actionRegister($store_id, $register_data) { $register_price = Register::find()->alias('r')->where([ 'and', ['<>', 'r.status', 0], ['<>', 'r.status', 4], ['<>', 'r.status', 7], ])->andWhere(['r.store_id' => $store_id])->andWhere($register_data ?? '')->sum('price'); return $register_price ?? 0; } /** * @doc-name 导出对账单 */ public function actionZhangDanExport() { \Yii::$app->response->format = Response::FORMAT_RAW; $get = \Yii::$app->request->get(); $this->requestValidate($get, [ ['type', 'required'] ]); $user = \Yii::$app->user->identity; $get['limit'] = 10000; if (!empty($get['start_time']) && !empty($get['end_time'])) { $start_time = strtotime($get['start_time'] . ' ' . '00:00:00'); $end_time = strtotime($get['end_time'] . ' ' . '23:59:59'); } //诊所 if ($get['type'] == 1) { $query = Store::find()->alias('s'); if ($user->role == UserRoleEnum::STORE_ADMIN) { $query->andWhere(['s.id' => $user->store_id]); } $store_name = $get['store_name']; if (!empty($store_name)) { $query->where(['like', 's.name', $store_name]); } if (!empty($start_time) && !empty($end_time)) { if ($start_time == $end_time) {//筛选某一天 $time = FuncHelper::getDayBE($get['start_time']); $end_time = $time[1]; } //按照下单时按筛选 $query->with(['reconciliation' => function ($r) use ($start_time, $end_time) { $r->alias('re'); $r->andWhere(['between', 're.xd_time', $start_time, $end_time]); }]); //挂号搜索 $register_data = ['between', 'r.xd_time', $start_time, $end_time]; } $parameter['header'] = ['诊所ID', '名称', '草药销量', '草药销售金额', '草药供货金额', '成药销量', '成药销售金额', '成药供货金额', '总销售金额', '总供货金额', '快递费', '加工费', '总诊疗费', '诊所总收入', '总挂号费']; $exportData = ArrayHelper::toArray($this->create($query, $get)->getModels(), [ Store::class => [ 'id', 'name', 'sale_number' => function ($s) use ($start_time, $end_time) { return $this->actionSaleNum($s->id, $start_time, $end_time); }, 'trans_fee' => function ($k) use ($start_time, $end_time) { return $this->actionStoreTransFee($k->id, 1, $start_time, $end_time); }, 'work_fee' => function ($m) use ($start_time, $end_time) { return $this->actionStoreTransFee($m->id, 2, $start_time, $end_time); }, 'treatement_fee' => function ($m) use ($start_time, $end_time) { return $this->actionStoreTransFee($m->id, 3, $start_time, $end_time); }, 'register_price' => function ($m) use ($register_data) { $price = Ledger::find()->alias('r')->where(['user_id' => $m->id, 'status' => 1, 'user_type' => 1, 'order_type' => 2])->andWhere($register_data ?? '')->sum('money'); return $price ?? 0; } ] ]); $data = []; foreach ($exportData as $key => $v) { $data[$key]['id'] = $v['id']; $data[$key]['name'] = $v['name']; $data[$key]['cao_drug_num'] = $v['sale_number']['cao_drug_num']; $data[$key]['cao_sale_price'] = $v['sale_number']['cao_sale_price']; $data[$key]['cao_give_price'] = $v['sale_number']['cao_give_price']; $data[$key]['cheng_drug_num'] = $v['sale_number']['cheng_drug_num']; $data[$key]['cheng_sale_price'] = $v['sale_number']['cheng_sale_price']; $data[$key]['cheng_give_price'] = $v['sale_number']['cheng_give_price']; $data[$key]['total_sale_price'] = $v['sale_number']['total_sale_price']; $data[$key]['total_give_price'] = $v['sale_number']['total_give_price']; $data[$key]['trans_fee'] = $v['trans_fee']; $data[$key]['work_fee'] = $v['work_fee']; $data[$key]['treatement_fee'] = $v['treatement_fee']; $data[$key]['store_income'] = $v['sale_number']['store_income']; $data[$key]['register_price'] = $v['register_price']; } } elseif ($get['type'] == 2) {//药品 $query = Reconciliation::find()->alias('r')->where(['r.status' => 1])->orderBy(['id' => SORT_DESC]); if ($user->role == UserRoleEnum::STORE_ADMIN) { $query->andWhere(['store_id' => $user->store_id]); } $store_name = $get['store_name']; $drug_name = $get['drug_name']; $query->joinWith(['store' => function ($s) use ($store_name) { $s->alias('s'); if (!empty($store_name)) { $s->andWhere([ 'or', ['like', 's.name', $store_name], ['like', 's.shouzimu', $store_name], ]); } }]); $query->joinWith(['drug' => function ($d) use ($drug_name) { $d->alias('d'); if (!empty($drug_name)) { $d->andWhere([ 'or', ['like', 'd.drug_name', $drug_name], ['like', 'd.pinyin_simple', $drug_name], ]); } }]); //门店搜索 if (!empty($get['store_id'])) { $query->andWhere(['r.store_id' => $get['store_id']]); } if (!empty($get['drug_type'])) { if ($get['drug_type'] == 1) { $query->andWhere(['r.drug_type' => [1, 3]]); } else { $query->andWhere(['r.drug_type' => [2, 4]]); } } if (!empty($start_time) && !empty($end_time)) { if ($start_time == $end_time) {//筛选当天 $time = FuncHelper::getDayBE($get['start_time']); $end_time = $time[1]; } $query->andWhere(['between', 'r.xd_time', $start_time, $end_time]); } $query->groupBy('drug_id'); $parameter['header'] = ['药品名称', '药品编号', '销量', '供货金额', '销售金额']; $exportData = ArrayHelper::toArray($this->create($query, $get)->getModels(), [ Reconciliation::class => [ 'drug_name' => 'drug.drug_name', 'drug_number' => 'drug.drug_number', 'number' => function ($model) use ($start_time, $end_time) { return $this->calculateSum($model, 'number', $start_time, $end_time); }, 'total_buy_price' => function ($model) use ($start_time, $end_time) { return $this->calculateSum($model, 'total_buy_price', $start_time, $end_time); }, 'total_price' => function ($model) use ($start_time, $end_time) { return $this->calculateSum($model, 'total_price', $start_time, $end_time); }, ] ]); $data = []; foreach ($exportData as $k => $v) { $data[$k]['drug_name'] = $v['drug_name']; $data[$k]['drug_number'] = $v['drug_number']; $data[$k]['number'] = $v['number']; $data[$k]['total_buy_price'] = $v['total_buy_price']; $data[$k]['total_price'] = $v['total_price']; } } else {//医生 $get = \Yii::$app->request->get(); $this->requestValidate($get, [ ['store_id', 'required'] ]); $store_id = \Yii::$app->request->get(); $store = Store::find()->where(['id' => $get['store_id']])->one(); if (!$store) { throw new \yii\db\Exception('门店不存在!!'); } if (!empty($get['start_time']) && !empty($get['end_time'])) { $start_time = strtotime($get['start_time'] . ' ' . '00:00:00'); $end_time = strtotime($get['end_time'] . ' ' . '23:59:59'); } if (!empty($start_time) && !empty($end_time)) { if ($start_time == $end_time) {//筛选当天 $time = FuncHelper::getDayBE($get['start_time']); $end_time = $time; } } $doctor = StoreDoctor::find()->select('su_id')->where(['store_id' => $get['store_id']])->column(); $query = DoctorInfo::find()->where(['in', 'su_id', $doctor]); $parameter['header'] = ['医生ID', '医生姓名', '总挂号费', '药品销售金额', '总利润']; $exportData = ArrayHelper::toArray($this->create($query, $get)->getModels(), [ DoctorInfo::class => [ 'su_id', 'name', 'register_price' => function ($r) use ($start_time, $end_time, $store_id) { return $this->actionRegisterPrice($r->su_id, $store_id, $start_time, $end_time); }, 'drug_sale_price' => function ($r) use ($start_time, $end_time, $store_id) { return $this->actionDrugSale($r->su_id, $store_id, $start_time, $end_time); }, 'drug_profit_price' => function ($r) use ($start_time, $end_time, $store_id) { return $this->actionDrugProfit($r->su_id, $store_id, $start_time, $end_time); }, ] ]); $data = []; foreach ($exportData as $k => $v) { $data[$k]['su_id'] = $v['su_id']; $data[$k]['name'] = $v['name']; $data[$k]['register_price'] = $v['register_price']; $data[$k]['drug_sale_price'] = $v['drug_sale_price']; $data[$k]['drug_profit_price'] = $v['drug_profit_price']; } } $parameter['data'] = $data; ExportService::ExportByCors($parameter); } public function actionStoreTransFee($store_id = null, $type = null, $start_time = '', $end_time = '') { if (!empty($start_time) && !empty($end_time)) { $get_start_time = date('Y-m-d H:i:s', $start_time); if ($start_time == $end_time) {//筛选某一天 $time = FuncHelper::getDayBE($get_start_time); $start_time = strtotime($get_start_time); $end_time = $time[1]; } $data = ['between', 'pr.created_at', $start_time, $end_time]; } if ($type == 1) { $price = ProductOrder::find()->alias('pr')->where(['pr.store_id' => $store_id, 'pr.is_pay' => 1, 'pr.is_settled' => 1])->andWhere([ 'or', ['<>', 'pr.refund_status', '3'], ['<>', 'pr.status', '4'] ])->andWhere($data ?? '')->sum('trans_expenses'); } elseif ($type == 2) { $price = ProductOrder::find()->alias('pr')->where(['pr.store_id' => $store_id, 'is_pay' => 1, 'pr.is_settled' => 1])->andWhere([ 'or', ['<>', 'pr.refund_status', '3'], ['<>', 'pr.status', '4'] ])->andWhere($data ?? '')->sum('process_price'); } else { $price = ProductOrder::find()->alias('pr')->where(['pr.store_id' => $store_id, 'is_pay' => 1, 'pr.is_settled' => 1])->andWhere([ 'or', ['<>', 'pr.refund_status', '3'], ['<>', 'pr.status', '4'] ])->andWhere($data ?? '')->sum('treatement_price'); } return $price ?? 0; } /** * @doc-name 统计--全部诊所 * @doc-param string start_time 时间 * @doc-param string end_time 时间 */ public function actionStoreStatistic() { // TODO 这里有问题(统计金额-诊所)需要重构 // 获取请求参数和当前用户信息 $get = \Yii::$app->request->get(); $admin = \Yii::$app->user->identity; // 如果请求参数中包含开始时间和结束时间,则进行处理 if (!empty($get['start_time']) && !empty($get['end_time'])) { // 将开始时间字符串转换为时间戳,并设置时间为当天的00:00:00 $start_time = strtotime($get['start_time'] . ' ' . '00:00:00'); // 将结束时间字符串转换为时间戳,并设置时间为当天的23:59:59 $end_time = strtotime($get['end_time'] . ' ' . '23:59:59'); } // 如果开始时间或结束时间不为空,则进行条件筛选 if (!empty($start_time) || !empty($end_time)) { // 如果开始时间和结束时间相同,则表示用户只想筛选某一天的数据 if ($start_time == $end_time) { // 获取筛选当天的开始和结束时间 $time = FuncHelper::getDayBE($get['start_time']); $start_time = $get['start_time']; $end_time = $time[1]; } // 构建产品创建时间的筛选条件 $data = ['between', 'p.created_at', $start_time, $end_time]; // 构建注册时间的筛选条件 $datas = ['between', 'r.xd_time', $start_time, $end_time]; // 构建注册用户时间的筛选条件 $register_data = ['between', 're.xd_time', $start_time, $end_time]; } // 根据当前用户的角色,调用不同的统计方法 if ($admin->role == UserRoleEnum::STORE_ADMIN) { // 如果是店铺管理员,调用获取店铺统计数据的方法 return $this->getStoreSum($admin, $data, $datas, $register_data); } else { // 如果不是店铺管理员,调用获取管理员统计数据的方法 return $this->getAdminSum($data, $datas, $register_data); } } /** * 获取门店总统计数据 * * @param $admin * @param $data * @param $datas * @param $register_data * @return array */ private function getStoreSum($admin, $data, $datas, $register_data) { // 计算草药的总出库数量 $cao_all_num = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1, 'r.store_id' => $admin->store_id, 'drug_type' => [1, 3]])->andWhere($datas ?? '')->sum('number'); // 计算成品药的总出库数量 $cheng_all_num = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1, 'r.store_id' => $admin->store_id, 'drug_type' => [2, 4]])->andWhere($datas ?? '')->sum('number'); // 计算草药的总进货金额 $cao_give_price = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1, 'r.store_id' => $admin->store_id, 'drug_type' => [1, 3]])->andWhere($datas ?? '')->sum('total_buy_price'); // 计算成品药的总进货金额 $cheng_give_price = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1, 'r.store_id' => $admin->store_id, 'drug_type' => [2, 4]])->andWhere($datas ?? '')->sum('total_buy_price'); // 计算草药的总销售金额 $cao_sale_price = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1, 'r.store_id' => $admin->store_id, 'drug_type' => [1, 3]])->andWhere($datas ?? '')->sum('total_price'); // 计算成品药的总销售金额 $cheng_sale_price = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1, 'r.store_id' => $admin->store_id, 'drug_type' => [2, 4]])->andWhere($datas ?? '')->sum('total_price'); // 计算所有产品的运费总和 $trans_expenses_price = ProductOrder::find()->alias('p')->where(['store_id' => $admin->store_id, 'is_pay' => 1, 'is_settled' => 1])->andWhere([ 'or', ['<>', 'refund_status', '3'], ['<>', 'status', '4'], ])->andWhere($data ?? '')->sum('trans_expenses'); // 计算所有产品的加工费总和 $process_price = ProductOrder::find()->alias('p')->where(['store_id' => $admin->store_id, 'is_pay' => 1, 'is_settled' => 1])->andWhere([ 'or', ['<>', 'refund_status', '3'], ['<>', 'status', '4'], ])->andWhere($data ?? '')->sum('process_price'); // 计算所有产品的治疗费总和 $treatement_price = ProductOrder::find()->alias('p')->where(['store_id' => $admin->store_id, 'is_pay' => 1, 'is_settled' => 1])->andWhere([ 'or', ['<>', 'refund_status', '3'], ['<>', 'status', '4'], ])->andWhere($data ?? '')->sum('treatement_price'); // 计算所有代煎药的代煎费总和 $decoct_price_price = ProductOrder::find()->alias('p')->where(['is_decoct' => 1, 'store_id' => $admin->store_id, 'is_pay' => 1, 'is_settled' => 1])->andWhere([ 'or', ['<>', 'refund_status', '3'], ['<>', 'status', '4'] ])->andWhere($data ?? '')->sum('decoct_price'); // 计算所有分账的总金额 $register_price = Ledger::find()->alias('re')->where(['user_id' => $admin->store_id, 'status' => 1, 'user_type' => 1, 'order_type' => 2])->andWhere($register_data ?? '')->sum('money'); // 计算所有药的销售金额 $drug_sale_price = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1, 'r.store_id' => $admin->store_id])->andWhere($datas ?? '')->sum('total_price'); // 计算所有药的进货金额 $drug_give_price = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1, 'r.store_id' => $admin->store_id])->andWhere($datas ?? '')->sum('total_buy_price'); // 计算门店总收入 $store_income = bcadd($treatement_price, bcsub(bcadd($drug_sale_price, $register_price, 4), $drug_give_price, 4), 2); // 计算所有药的销售金额和挂号金额的总和 $all_sum = bcadd($drug_sale_price, $register_price, 4); // 计算所有订单的总支付金额 $total_price = ProductOrder::find()->alias('p')->where(['store_id' => $admin->store_id, 'is_pay' => 1, 'is_settled' => 1])->andWhere([ 'or', ['<>', 'refund_status', '3'], ['<>', 'status', '4'], ])->andWhere($data ?? '')->sum('total_pay_price'); // 返回包含各种统计结果的数组 return [ 'cao_all_num' => $cao_all_num ?? 0, 'cheng_all_num' => $cheng_all_num ?? 0, 'cao_give_price' => $cao_give_price ?? 0, 'cheng_give_price' => $cheng_give_price ?? 0, 'cao_sale_price' => $cao_sale_price ?? 0, 'cheng_sale_price' => $cheng_sale_price ?? 0, 'trans_expenses_price' => $trans_expenses_price ?? 0, 'process_price' => $process_price ?? 0, 'treatement_price' => $treatement_price ?? 0, 'decoct_price_price' => $decoct_price_price ?? 0, 'register_price' => $register_price ?? 0, 'store_income' => $store_income ?? 0, 'all_sum' => $all_sum ?? 0, 'drug_give_price' => $drug_give_price ?? 0, 'drug_sale_price' => $drug_sale_price ?? 0, 'total_price' => $total_price ?? 0 ]; } /** * 获取平台统计数据 * * @param $data * @param $datas * @param $register_data * @return array */ private function getAdminSum($data, $datas, $register_data) { // 计算草药和成品药的销售数量 $cao_all_num = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1, 'drug_type' => [1, 3]])->andWhere($datas ?? '')->sum('number'); $cheng_all_num = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1, 'drug_type' => [2, 4]])->andWhere($datas ?? '')->sum('number'); // 计算草药和成品药的进货金额 $cao_give_price = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1, 'drug_type' => [1, 3]])->andWhere($datas ?? '')->sum('total_buy_price'); $cheng_give_price = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1, 'drug_type' => [2, 4]])->andWhere($datas ?? '')->sum('total_buy_price'); // 计算草药和成品药的销售金额 $cao_sale_price = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1, 'drug_type' => [1, 3]])->andWhere($datas ?? '')->sum('total_price'); $cheng_sale_price = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1, 'drug_type' => [2, 4]])->andWhere($datas ?? '')->sum('total_price'); // 计算物流费用、治疗费、加工费、煎药费和总消费金额 $trans_expenses_price = ProductOrder::find()->alias('p')->where(['is_pay' => 1, 'is_settled' => 1])->andWhere([ 'or', ['<>', 'refund_status', '3'], ['<>', 'status', '4'], ])->andWhere($data ?? '')->sum('trans_expenses'); $treatement_price = ProductOrder::find()->alias('p')->where(['is_pay' => 1, 'is_settled' => 1])->andWhere([ 'or', ['<>', 'refund_status', '3'], ['<>', 'status', '4'], ])->andWhere($data ?? '')->sum('treatement_price'); $process_price = ProductOrder::find()->alias('p')->where(['is_pay' => 1, 'is_settled' => 1])->andWhere([ 'or', ['<>', 'refund_status', '3'], ['<>', 'status', '4'], ])->andWhere($data ?? '')->sum('process_price'); $decoct_price_price = ProductOrder::find()->alias('p')->where(['is_pay' => 1, 'is_settled' => 1, 'is_decoct' => 1])->andWhere([ 'or', ['<>', 'refund_status', '3'], ['<>', 'status', '4'], ])->andWhere($data ?? '')->sum('decoct_price'); $total_price = ProductOrder::find()->alias('p')->where(['is_pay' => 1, 'is_settled' => 1])->andWhere([ 'or', ['<>', 'refund_status', '3'], ['<>', 'status', '4'], ])->andWhere($data ?? '')->sum('total_pay_price'); // 挂号金额 $register_price = Ledger::find()->alias('re')->where(['status' => 1, 'user_type' => 1, 'order_type' => 2])->andWhere($register_data ?? '')->sum('money'); // 所有药的销售金额和进货金额 $drug_sale_price = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1])->andWhere($datas ?? '')->sum('total_price'); $drug_give_price = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1])->andWhere($datas ?? '')->sum('total_buy_price'); // 计算门店收入 $store_income = bcadd($treatement_price, bcsub(bcadd($drug_sale_price, $register_price, 4), $drug_give_price, 4), 2); // 总金额 $all_sum = bcadd($drug_sale_price, $register_price, 4); // 返回统计结果 return [ 'cao_all_num' => $cao_all_num ?? 0, 'cheng_all_num' => $cheng_all_num ?? 0, 'cao_give_price' => $cao_give_price ?? 0, 'cheng_give_price' => $cheng_give_price ?? 0, 'cao_sale_price' => $cao_sale_price ?? 0, 'cheng_sale_price' => $cheng_sale_price ?? 0, 'trans_expenses_price' => $trans_expenses_price ?? 0, 'process_price' => $process_price ?? 0, 'treatement_price' => $treatement_price ?? 0, 'decoct_price_price' => $decoct_price_price ?? 0, 'register_price' => $register_price ?? 0, 'store_income' => $store_income ?? 0, 'all_sum' => $all_sum ?? 0, 'drug_give_price' => $drug_give_price ?? 0, 'drug_sale_price' => $drug_sale_price ?? 0, 'total_price' => $total_price ?? 0 ]; } /** * @doc-name 统计--所有药 * @doc-param string start_time 时间 * @doc-param string end_time 时间 * 平台 诊所 萧康 */ public function actionDrugStatistic() { // TODO 这里有问题(统计金额-药品) $get = \Yii::$app->request->get(); $admin = \Yii::$app->user->identity; if (!empty($get['start_time']) && !empty($get['end_time'])) { $start_time = strtotime($get['start_time'] . ' ' . '00:00:00'); $end_time = strtotime($get['end_time'] . ' ' . '23:59:59'); } if (!empty($start_time) && !empty($end_time)) { if ($start_time == $end_time) {//筛选某一天 $time = FuncHelper::getDayBE($get['start_time']); $start_time = $get['start_time']; $end_time = $time[1]; } $data = ['between', 'xd_time', $start_time, $end_time]; } if ($admin->role == UserRoleEnum::STORE_ADMIN) { $resData = Reconciliation::find() ->andWhere(['status' => 1, 'store_id' => $admin->store_id]) ->andWhere($data ?? '') ->all(); } else { $resData = Reconciliation::find() ->andWhere(['status' => 1]) ->andWhere($data ?? '') ->all(); } $allSale = 0; $totalPrice = 0; foreach ($resData as $key => $value) { $allSale = bcadd($allSale, $value->number, 0); $totalPrice = bcadd($totalPrice, $value->total_price, 0); } return [ 'all_sale' => $allSale ?? 0, 'all_total_price' => $totalPrice ?? 0, ]; } /** * @doc-name 诊所统计 * @doc-param string start_time 时间 * @doc-param string end_time 时间 */ public function actionNewStoreStatistic() { // TODO 为什么写两个统计 $get = \Yii::$app->request->get(); $admin = \Yii::$app->user->identity; if (!empty($get['start_time']) && !empty($get['end_time'])) { $start_time = strtotime($get['start_time'] . ' ' . '00:00:00'); $end_time = strtotime($get['end_time'] . ' ' . '23:59:59'); } if (!empty($start_time) && !empty($end_time)) { if ($start_time == $end_time) {//筛选某一天 $time = FuncHelper::getDayBE($get['start_time']); $end_time = $time[1]; } $datas = ['between', 'r.xd_time', $start_time, $end_time]; $data = ['between', 'p.created_at', $start_time, $end_time]; $register_data = ['between', 're.xd_time', $start_time, $end_time]; } if ($admin->role == UserRoleEnum::STORE_ADMIN) { $cao_sale_price = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1, 'r.store_id' => $admin->store_id, 'drug_type' => [1, 3]])->andWhere($datas ?? '')->sum('total_price'); $cheng_sale_price = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1, 'r.store_id' => $admin->store_id, 'drug_type' => [2, 4]])->andWhere($datas ?? '')->sum('total_price'); $trans_expenses_price = ProductOrder::find()->alias('p')->where(['store_id' => $admin->store_id, 'is_pay' => 1, 'is_settled' => 1])->andWhere([ 'or', ['<>', 'refund_status', '3'], ['<>', 'status', '4'], ])->andWhere($data ?? '')->sum('trans_expenses'); $process_price = ProductOrder::find()->alias('p')->where(['store_id' => $admin->store_id, 'is_pay' => 1, 'is_settled' => 1])->andWhere([ 'or', ['<>', 'refund_status', '3'], ['<>', 'status', '4'], ])->andWhere($data ?? '')->sum('process_price'); $treatement_price = ProductOrder::find()->alias('p')->where(['store_id' => $admin->store_id, 'is_pay' => 1, 'is_settled' => 1])->andWhere([ 'or', ['<>', 'refund_status', '3'], ['<>', 'status', '4'], ])->andWhere($data ?? '')->sum('treatement_price'); $decoct_price_price = ProductOrder::find()->alias('p')->where(['is_decoct' => 1, 'store_id' => $admin->store_id, 'is_pay' => 1, 'is_settled' => 1])->andWhere([ 'or', ['<>', 'refund_status', '3'], ['<>', 'status', '4'], ])->andWhere($data ?? '')->sum('decoct_price'); $register_price = Ledger::find()->alias('re')->where(['user_id' => $admin->store_id, 'status' => 1, 'user_type' => 1, 'order_type' => 2])->andWhere($register_data ?? '')->sum('money'); // //挂号 // $register_price=Register::find()->alias('re')->where([ // 'and', // ['<>','re.status',0], // ['<>','re.status',4], // ['<>','re.status',7], // ])->andWhere($register_data??'')->sum('price'); //所有药的进货金额 $drug_give_price = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1, 'r.store_id' => $admin->store_id])->andWhere($datas ?? '')->sum('total_buy_price'); $drug_price = bcadd($cao_sale_price, $cheng_sale_price, 4); } else { $cao_sale_price = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1, 'drug_type' => [1, 3]])->andWhere($datas ?? '')->sum('total_price'); $cheng_sale_price = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1, 'drug_type' => [2, 4]])->andWhere($datas ?? '')->sum('total_price'); $trans_expenses_price = ProductOrder::find()->alias('p')->where(['is_pay' => 1, 'is_settled' => 1])->andWhere([ 'or', ['<>', 'refund_status', '3'], ['<>', 'status', '4'], ])->andWhere($data ?? '')->sum('trans_expenses'); $process_price = ProductOrder::find()->alias('p')->where(['is_pay' => 1, 'is_settled' => 1])->andWhere([ 'or', ['<>', 'refund_status', '3'], ['<>', 'status', '4'], ])->andWhere($data ?? '')->sum('process_price'); $treatement_price = ProductOrder::find()->alias('p')->where(['is_pay' => 1, 'is_settled' => 1])->andWhere([ 'or', ['<>', 'refund_status', '3'], ['<>', 'status', '4'], ])->andWhere($data ?? '')->sum('treatement_price'); $decoct_price_price = ProductOrder::find()->alias('p')->where(['is_pay' => 1, 'is_settled' => 1, 'is_decoct' => 1])->andWhere([ 'or', ['<>', 'refund_status', '3'], ['<>', 'status', '4'], ])->andWhere($data ?? '')->sum('decoct_price'); //挂号 // $register_price=Register::find()->alias('re')->where([ // 'and', // ['<>','re.status',0], // ['<>','re.status',4], // ['<>','re.status',7], // ])->andWhere($register_data??'')->sum('price'); $register_price = Ledger::find()->alias('re')->where(['status' => 1, 'user_type' => 1, 'order_type' => 2])->andWhere($register_data ?? '')->sum('money'); $drug_price = bcadd($cao_sale_price, $cheng_sale_price, 4); //所有药的进货金额 $drug_give_price = Reconciliation::find()->alias('r')->andWhere(['r.status' => 1])->andWhere($datas ?? '')->sum('total_buy_price'); } $data = [ // '0'=>[ // 'type'=>'草药销售额', // 'value'=>$cao_sale_price ?? "0", // ], // '1'=>[ // 'type'=>'成药销售额', // 'value'=>$cheng_sale_price ?? "0", // ], '1' => [ 'type' => '药品销售金额', 'value' => $drug_price ?? "0", ], '2' => [ 'type' => '供货金额', 'value' => $drug_give_price ?? "0", ], '3' => [ 'type' => '运费', 'value' => $trans_expenses_price ?? "0", ], // '4'=>[ // 'type'=>'代煎费', // 'value'=>$decoct_price_price ?? "0", // ], '5' => [ 'type' => '挂号费', 'value' => $register_price ?? "0", ], '6' => [ 'type' => '加工费', 'value' => $process_price ?? "0", ], '7' => [ 'type' => '诊疗费', 'value' => $treatement_price ?? "0", ], ]; return $data; } // 计算总和的方法 protected function calculateSum($model, $field, $start_time, $end_time) { $where = []; if ($start_time && $end_time) { $where = ['between', 'xd_time', $start_time, $end_time]; } $andWhere = ['drug_id' => $model->drug_id]; if ($model->store_id) { $andWhere['store_id'] = $model->store_id; } return (new \yii\db\Query()) ->from($model::tableName()) ->where($andWhere) ->andWhere($where)->groupBy('drug_id') ->sum($field); } /** * @doc-name 药品总利润 */ public function actionDrugProfit($su_id = null, $store_id = null, $start_time = '', $end_time = '') { if (!empty($start_time) && !empty($end_time)) { $get_start_time = date('Y-m-d H:i:s', $start_time); if ($start_time == $end_time) {//筛选某一天 $time = FuncHelper::getDayBE($get_start_time); $start_time = strtotime($get_start_time); $end_time = $time[1]; } $data = ['between', 'r.xd_time', $start_time, $end_time]; } $order_id = ProductOrder::find()->select('id')->where(['su_id' => $su_id, 'is_pay' => 1, 'store_id' => $store_id])->column(); //销售额 $total_price = Reconciliation::find()->alias('r')->where([ 'in', 'r.order_id', $order_id, 'r.status' => 1 ])->andWhere($data ?? '')->sum('total_price'); //供货金额 $total_buy_price = Reconciliation::find()->alias('r')->where([ 'in', 'r.order_id', $order_id, 'r.status' => 1 ])->andWhere($data ?? '')->sum('total_buy_price'); $profit = bcsub($total_price, $total_buy_price, 4); return $profit ?? 0; } /** * @doc-name 挂号费 * @doc-param int su_id 医生 */ public function actionRegisterPrice($su_id = '', $store_id = '', $start_time = '', $end_time = '') { if (!empty($start_time) && !empty($end_time)) { $get_start_time = date('Y-m-d H:i:s', $start_time); if ($start_time == $end_time) {//筛选某一天 $time = FuncHelper::getDayBE($get_start_time); $start_time = strtotime($get_start_time); $end_time = $time[1]; } $data = ['between', 'r.xd_time', $start_time, $end_time]; } $price = Ledger::find()->alias('r')->where(['r.su_id' => $su_id, 'r.user_id' => $store_id, 'r.status' => 1, 'r.user_type' => 1, 'r.order_type' => 2])->andWhere($data ?? '')->sum('money'); return $price ?? 0; } /** * @doc-name 药品总销售额 */ public function actionDrugSale($su_id = null, $store_id = null, $start_time = '', $end_time = '') { if (!empty($start_time) && !empty($end_time)) { $get_start_time = date('Y-m-d H:i:s', $start_time); if ($start_time == $end_time) {//筛选某一天 $time = FuncHelper::getDayBE($get_start_time); $start_time = strtotime($get_start_time); $end_time = $time[1]; } $data = ['between', 'r.xd_time', $start_time, $end_time]; } $order_id = ProductOrder::find()->select('id')->where(['su_id' => $su_id, 'is_pay' => 1, 'store_id' => $store_id])->column(); $total_price = Reconciliation::find()->alias('r')->where([ 'in', 'r.order_id', $order_id, 'r.status' => 1 ])->andWhere($data ?? '')->sum('total_price'); return $total_price ?? 0; } }