对账功能修改(修复历史遗留问题:中药对账没有按照贴数*克数计算)

This commit is contained in:
2025-04-07 10:31:51 +08:00
parent 601cabb393
commit 869431e982
3 changed files with 91 additions and 51 deletions

View File

@@ -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,