From 869431e9828046cb19ea797631df254dd1d2cf60 Mon Sep 17 00:00:00 2001 From: lq Date: Mon, 7 Apr 2025 10:31:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E8=B4=A6=E5=8A=9F=E8=83=BD=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=88=E4=BF=AE=E5=A4=8D=E5=8E=86=E5=8F=B2=E9=81=97?= =?UTF-8?q?=E7=95=99=E9=97=AE=E9=A2=98=EF=BC=9A=E4=B8=AD=E8=8D=AF=E5=AF=B9?= =?UTF-8?q?=E8=B4=A6=E6=B2=A1=E6=9C=89=E6=8C=89=E7=85=A7=E8=B4=B4=E6=95=B0?= =?UTF-8?q?*=E5=85=8B=E6=95=B0=E8=AE=A1=E7=AE=97=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/StatementAccountController.php | 94 +++++++++++-------- admin/controllers/doctor/DoctorController.php | 28 +++++- common/forms/LedgerForm.php | 20 ++-- 3 files changed, 91 insertions(+), 51 deletions(-) diff --git a/admin/controllers/base/StatementAccountController.php b/admin/controllers/base/StatementAccountController.php index 675d43a..f60482c 100644 --- a/admin/controllers/base/StatementAccountController.php +++ b/admin/controllers/base/StatementAccountController.php @@ -132,47 +132,59 @@ class StatementAccountController extends BaseAdminController */ public function actionDuiZhangDan() { + // TODO 这里有问题,中药完全没有兼容 + // 获取GET请求参数 $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'); } - //诊所 + // 根据请求参数中的type值判断查询类型 if ($get['type'] == 1) { + // 如果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) {//筛选某一天 + 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', @@ -190,30 +202,29 @@ class StatementAccountController extends BaseAdminController }, '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 {//药品 + } else { + // 如果type不为1,则查询药品对账记录 // 设置查询条件,查找状态为1的对账记录,按ID降序排序 $query = Reconciliation::find()->alias('r')->where(['r.status' => 1]); - // 获取搜索参数:和药品名称 + // 获取搜索参数:药品名称 $drug_name = $get['drug_name']; - // 根据药品名称过滤药品 - $query->joinWith(['drug' => function ($d) use ($drug_name) { - $d->alias('d'); - if (!empty($drug_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'])) { @@ -236,21 +247,14 @@ class StatementAccountController extends BaseAdminController // 根据开始时间和结束时间过滤对账记录 if (!empty($start_time) && !empty($end_time)) { - - if ($start_time == $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 => [ @@ -272,20 +276,19 @@ class StatementAccountController extends BaseAdminController 'treatement_fee' => 'productOrder.treatement_price' ] ]; -// $list = $this->create($query, $get)->getModels(); + + // 执行查询并处理结果 $list = $query->asArray()->all(); - // 总销量 sale_number - // 单个销量 number 不知道要这个干嘛 - // 总价 total_price - // 总供货价 total_buy_price $result = []; foreach ($list as $value) { if (!empty($result[$value['drug_id']])) { + // 如果结果中已存在该药品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 { + // 如果结果中不存在该药品ID的记录,则添加新的记录 $result[$value['drug_id']] = [ 'id' => $value['drug_id'], 'drug_number' => $value['drug']['drug_number'], @@ -300,6 +303,8 @@ class StatementAccountController extends BaseAdminController ]; } } + + // 返回处理后的结果 return [ 'list' => array_values($result), 'pageSize' => 1000, @@ -308,7 +313,9 @@ class StatementAccountController extends BaseAdminController ]; } + // 执行查询并返回结果 return $this->create($query, $get); + } /** @@ -856,7 +863,7 @@ class StatementAccountController extends BaseAdminController // 计算门店收入 $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); + $all_sum = bcadd($drug_sale_price, $register_price, 2); // 返回统计结果 return [ @@ -888,43 +895,56 @@ class StatementAccountController extends BaseAdminController */ public function actionDrugStatistic() { - // TODO 这里有问题(统计金额-药品) + // 获取GET请求参数 $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) {//筛选某一天 + // 检查开始时间是否等于结束时间,即筛选某一天的数据 + 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) { + // 店铺管理员查询时添加店铺ID条件 $resData = Reconciliation::find() ->andWhere(['status' => 1, 'store_id' => $admin->store_id]) - ->andWhere($data ?? '') - ->all(); + ->andWhere($data ?? ''); } else { + // 非店铺管理员查询时不添加店铺ID条件 $resData = Reconciliation::find() ->andWhere(['status' => 1]) - ->andWhere($data ?? '') - ->all(); + ->andWhere($data ?? ''); } + + // 初始化统计变量 $allSale = 0; $totalPrice = 0; + ds($resData->asArray()->all()); + // 遍历查询结果进行统计 foreach ($resData as $key => $value) { + // 累加销售数量 $allSale += $value->number; + // 累加总价格,使用bcadd函数进行高精度计算 $totalPrice = bcadd($totalPrice, $value->total_price, 3); } - + // 返回统计结果 return [ 'all_sale' => $allSale ?? 0, 'all_total_price' => $totalPrice ?? 0, diff --git a/admin/controllers/doctor/DoctorController.php b/admin/controllers/doctor/DoctorController.php index 96dac41..4be8538 100644 --- a/admin/controllers/doctor/DoctorController.php +++ b/admin/controllers/doctor/DoctorController.php @@ -801,11 +801,33 @@ class DoctorController extends BaseAdminController ['<>', 'refund_status', 3], ['=', 'is_pay', 1], ['<>', 'status', '4'], - ])->andWhere($data)->andWhere($where)->select('sum(total_pay_price) as total_sale_price,sum(market_price+trans_expenses+process_price) as total_market_price')->asArray()->one(); +// ])->andWhere($data)->andWhere($where)->select('sum(total_pay_price) as total_sale_price,sum(market_price+trans_expenses+process_price) as total_market_price')->asArray()->one(); + ])->andWhere($data)->andWhere($where)->select('total_pay_price,market_price,trans_expenses,process_price')->asArray()->all(); + + $totalPrice = 0; + $storeIncome = 0; + + foreach ($total as $v) { + $totalPrice = bcadd($totalPrice, $v['total_pay_price'], 2); + // 将所有金额转换为字符串以确保高精度计算 + $totalPayPrice = (string)$v['total_pay_price']; + $marketPrice = (string)$v['market_price']; + $transExpenses = (string)$v['trans_expenses']; + $processPrice = (string)$v['process_price']; + + // 分步计算,提高可读性 + $profit = bcsub($totalPayPrice, $marketPrice, 2); // 总支付价格减去市场价 + $profit = bcsub($profit, $transExpenses, 2); // 再减去运输费用 + $profit = bcsub($profit, $processPrice, 2); // 最后减去加工费用 + + // 累加到门诊收入 + $storeIncome = bcadd($storeIncome, $profit, 2); + } + return [ - 'order_sale' => $total['total_sale_price'] ?? 0, - 'store_income' => bcsub($total['total_sale_price'], $total['total_market_price'], 2), + 'order_sale' => $totalPrice, + 'store_income' => $storeIncome, ]; } } diff --git a/common/forms/LedgerForm.php b/common/forms/LedgerForm.php index aa18bae..bd266b3 100644 --- a/common/forms/LedgerForm.php +++ b/common/forms/LedgerForm.php @@ -191,6 +191,9 @@ class LedgerForm extends BaseModel $totalPrice = round($number * $v['price'], 4); $totalBuyPrice = round($number * $v['buy_price'], 4); + /* + * 医保支付(走月付) + */ if ($productOrder['prescription']['category'] == 2) { $model = new MonthlyPaymentModel(); $model->store_id = $productOrder->store_id; @@ -198,14 +201,6 @@ class LedgerForm extends BaseModel $model->amount = $productOrder->market_price; $model->created_at = $time; $model->save(); - -// (new MonthlyPaymentModel)->save([ -// 'store_id' => $productOrder->store_id, -// 'order_id' => $productOrder->id, -// 'amount' => $totalBuyPrice, -// 'created_at' => $time, -// ]); - } else { $ledger[] = [ 'order_id' => $this->order_id, @@ -511,6 +506,7 @@ class LedgerForm extends BaseModel $productOrderItems = ProductOrderItems::find()->with(['drug.supplier'])->where(['product_order_id' => $productOrder->id])->asArray()->all(); $Reconciliation = new Reconciliation(); foreach($productOrderItems as $v){ + $number = $v['dosage'] === 0 ? $v['number'] : $v['number'] * $v['dosage']; $item = clone $Reconciliation; $item->store_id = $productOrder->store_id; $item->order_id = $productOrder->id; @@ -518,9 +514,11 @@ class LedgerForm extends BaseModel $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->number = $number; +// $item->total_buy_price = $v['number'] * $v['buy_price']; + $item->total_buy_price = bcmul($number, $v['buy_price'], 6); +// $item->total_price = $v['number'] * $v['price']; + $item->total_price = bcmul($number, $v['price'], 6); $item->created_at = $time; $item->updated_at = $time; $item->saveOrFail();