新增财务数据

This commit is contained in:
2024-10-29 16:08:15 +08:00
parent a59b93449f
commit 2a5f5dc455

View File

@@ -13,6 +13,7 @@ use common\models\FundWater;
use common\models\Ledger;
use common\models\ProductOrder;
use common\models\ProductOrderRefund;
use common\models\Reconciliation;
use common\models\Register;
use common\models\Store;
use common\models\SystemNotice;
@@ -145,7 +146,7 @@ class FinanceController extends BaseAdminController
// 填充退款申请模型的基础信息
$model->order_id = $post['id'];
$model->user_id = \Yii::$app->user->id;
$model->reason = !empty($post['reason'])? $post['reason']:'管理员-'. \Yii::$app->user->id. '-发起退款';
$model->reason = !empty($post['reason']) ? $post['reason'] : '管理员-' . \Yii::$app->user->id . '-发起退款';
// 如果POST数据中包含退款图片则填充退款图片字段
if (!empty($post['refund_images'])) {
@@ -289,8 +290,8 @@ class FinanceController extends BaseAdminController
$get = \Yii::$app->request->get();
$user = \Yii::$app->user->identity;
$start_time=strtotime($get['start_time']);
$end_time=strtotime($get['end_time']);
$start_time = strtotime($get['start_time']);
$end_time = strtotime($get['end_time']);
$doctor = $get['doctor'];
$store = $get['store'];
@@ -304,13 +305,13 @@ class FinanceController extends BaseAdminController
}
if (!empty($start_time) && !empty($end_time)) {
if ($start_time==$end_time){//筛选当天
$time=FuncHelper::getDayBE($get['start_time']);
if ($start_time == $end_time) {//筛选当天
$time = FuncHelper::getDayBE($get['start_time']);
$end_time=$time[1];
$end_time = $time[1];
}
$query->andWhere(['between', 'f.created_at', $start_time,$end_time]);
$query->andWhere(['between', 'f.created_at', $start_time, $end_time]);
}
if (!empty($doctor)) {
@@ -353,7 +354,7 @@ class FinanceController extends BaseAdminController
\Yii::$app->response->format = Response::FORMAT_RAW;
$params = \Yii::$app->request->post();
$parameter['header'] = ['订单类型', '医生', '用户', '价格', '诊所', '时间'];
$parameter['data'] = FundWater::inventory($params,\Yii::$app->user->identity->store_id);
$parameter['data'] = FundWater::inventory($params, \Yii::$app->user->identity->store_id);
ExportService::ExportByCors($parameter);
}
@@ -372,8 +373,8 @@ class FinanceController extends BaseAdminController
$get = \Yii::$app->request->get();
$order_no = $get['order_no'];
$register_no = $get['register_no'];
$start_time=strtotime($get['start_time'].' '.'00:00:00');
$end_time=strtotime($get['end_time'].' '.'23:59:59');
$start_time = strtotime($get['start_time'] . ' ' . '00:00:00');
$end_time = strtotime($get['end_time'] . ' ' . '23:59:59');
$query = Ledger::find()->alias('l')->where(['l.status' => [0, 1]])->orderBy(['id' => SORT_DESC])->groupBy('l.order_id,l.order_type');
if (!empty($order_no)) {
@@ -383,17 +384,17 @@ class FinanceController extends BaseAdminController
}]);
}
if (!empty($register_no)){
$query->joinWith(['register'=>function($p)use($register_no){
$p->where(['order_no'=>$register_no]);
if (!empty($register_no)) {
$query->joinWith(['register' => function ($p) use ($register_no) {
$p->where(['order_no' => $register_no]);
}]);
}
if (!empty($start_time) && !empty($end_time)) {
if ($start_time==$end_time){//筛选当天
$time=FuncHelper::getDayBE($get['start_time']);
if ($start_time == $end_time) {//筛选当天
$time = FuncHelper::getDayBE($get['start_time']);
$end_time=$time[1];
$end_time = $time[1];
}
$query->andWhere(['between', 'l.created_at', $start_time, $end_time]);
@@ -460,8 +461,8 @@ class FinanceController extends BaseAdminController
{
$get = \Yii::$app->request->get();
$order_no = $get['order_no'];
$start_time=strtotime($get['start_time'].' '.'00:00:00');
$end_time=strtotime($get['end_time'].' '.'23:59:59');
$start_time = strtotime($get['start_time'] . ' ' . '00:00:00');
$end_time = strtotime($get['end_time'] . ' ' . '23:59:59');
$query = CashApply::find()->alias('c')->orderBy(['id' => SORT_DESC]);
if (!empty($order_no)) {
@@ -469,16 +470,16 @@ class FinanceController extends BaseAdminController
}
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=date('Y-m-d H:i:s',$time);
}else{
$start_time=$get['start_time'];
$end_time=$get['end_time'];
if ($start_time == $end_time) {//筛选当天
$time = FuncHelper::getDayBE($get['start_time']);
$start_time = $get['start_time'];
$end_time = date('Y-m-d H:i:s', $time);
} else {
$start_time = $get['start_time'];
$end_time = $get['end_time'];
}
$query->andWhere(['between', 'c.apply_time',$start_time,$end_time]);
$query->andWhere(['between', 'c.apply_time', $start_time, $end_time]);
}
@@ -516,22 +517,351 @@ class FinanceController extends BaseAdminController
return $this->create($query, $get);
}
/**
/**
* @doc-name 导出提现、结算记录
*/
public function actionExportSettlement()
{
\Yii::$app->response->format = Response::FORMAT_RAW;
$params = \Yii::$app->request->get();
if($params['type'] == 1){
$parameter['header'] = ['单号','提现方', '提现金额', '到账金额','手续费', '状态', '时间'];
if ($params['type'] == 1) {
$parameter['header'] = ['单号', '提现方', '提现金额', '到账金额', '手续费', '状态', '时间'];
$parameter['data'] = CashApply::inventory1($params);
}else{
$parameter['header'] = ['单号','订单类型', '用户', '金额', '状态', '时间'];
$parameter['data'] = Ledger::inventory($params,\Yii::$app->user->identity->store_id);
} else {
$parameter['header'] = ['单号', '订单类型', '用户', '金额', '状态', '时间'];
$parameter['data'] = Ledger::inventory($params, \Yii::$app->user->identity->store_id);
}
ExportService::ExportByCors($parameter);
}
/**
* 总销售金额统计方法
*
* @return array
* @throws Exception
*/
public function actionSaleMoney()
{
$admin = \Yii::$app->user->identity;
$role = $admin->role;
$timeType = \Yii::$app->request->get('time_type');
$month = [];
$week = [];
switch ($timeType) {
case 1:
$startTime = strtotime(date('Y-m-1 00:00:00'));
$endTime = strtotime(date('Y-m-d H:i:s'));
$week = $this->getWeekList($startTime, $endTime);
break;
case 2:
$startTime = strtotime(date('Y-1-1 00:00:00'));
$endTime = strtotime(date('Y-m-d H:i:s'));
$month = $this->getMonthsList($startTime, $endTime);
break;
case 3:
$thisYear = date('Y');
$lastYear = $thisYear - 1;
$startTime = strtotime($lastYear . '-01-01 00:00:00');
$endTime = strtotime($lastYear . '-12-31 23:59:59');
$month = $this->getMonthsList($startTime, $endTime);
break;
default:
throw new Exception('参数错误');
}
$where = $this->getFinanceWhere($role, $admin);
$result = $this->getSleMoney($startTime, $endTime, $month, $week, $where);
$year = date('Y');
$week = array_map(function ($v) use($year) {
return $year.'-第' . $v . '周';
}, $week);
return [
'line' => [
'month' => !empty($month) ? $month : $week,
'sale_money' => $result['sale_money'],
'legend' => $result['line_legend'],
// 'buy_money' => $result['buy_money'],
],
'drug' => [
'data' => $result['drug_data']
],
'total_money' => $result['total_money'],
];
}
/**
* 获取财务统计条件
*
* @param $role
* @param $admin
* @return array
* @throws Exception
*/
public function getFinanceWhere($role, $admin)
{
// $role = UserRoleEnum::SUPPLY;
// $admin->store_id = 2;
// $admin->province_id = 14;
// $admin->city_id = 1225;
// // F920I5RQ
// // AIV1W807
// // X74G8Q5U
// // AIV1W807
// // 6TXQ576X
// // F920I5RQ
// // U5v7s3b9
// $admin->code = 'AIV1W807';
$where = [];
switch ($role) {
case UserRoleEnum::SUPER_ADMIN:
// 管理员
break;
case UserRoleEnum::STORE_ADMIN:
// 门店
if (empty($admin->store_id)) throw new Exception('门店信息获取失败');
$where[] = ['store_id' => $admin->store_id];
break;
case UserRoleEnum::PROVINCE_DAI:
// 省代
if (empty($admin->province_id)) throw new Exception('省区经理信息获取失败' . $admin->province_id);
$store_id = Store::find()->select(['id'])->where(['province_id' => $admin->province_id])->column();
$where[] = ['in', 'store_id', $store_id];
break;
case UserRoleEnum::CITY_DAI:
// 市代
if (empty($admin->city_id)) throw new Exception('市区经理信息获取失败' . $admin->city_id);
$store_id = Store::find()->select(['id'])->where(['city_id' => $admin->city_id])->column();
$where[] = ['in', 'store_id', $store_id];
break;
case UserRoleEnum::SUPPLY:
// 业务员
if (empty($admin->code)) throw new Exception('市区经理信息获取失败' . $admin->code);
$store_id = Store::find()->select(['id'])->where(['code' => $admin->code])->column();
$where[] = ['in', 'store_id', $store_id];
break;
default:
throw new Exception('角色参数错误');
break;
}
return $where;
}
/**
* @doc-name 统计函数
*
* @param $startTime
* @param $endTime
* @param $month
* @param $week
* @param array $where
* @return array[]
*/
public function getSleMoney($startTime, $endTime, $month, $week, $where = [])
{
// 根据$month列表的月份统计数据
$query = Reconciliation::find()->where(['between', 'created_at', $startTime, $endTime])->andWhere(['status' => 1])->select([
'drug_type',
'total_buy_price',
'total_price',
'created_at',
]);
if (!empty($where)) {
foreach ($where as $v) {
$query->andWhere($v);
}
}
$model = $query->all();
$saleMoney = [];
// 药品分类
$drugType = [
1 => '中药',
2 => '西药',
3 => '颗粒药',
4 => '中成药',
];
$drugSaleMoney = [];
// 总金额
$totalMoney = 0;
// TODO 暂时不统计供货价
// $buyMoney = [];
// 判断获取时间方法
$dateStr = !empty($week) ? 'W' : 'Y-m';
$dateArr = !empty($week) ? $week : $month;
foreach ($model as $v) {
$thisMonth = date($dateStr, $v['created_at']);
$saleMoney[$thisMonth] = bcadd($saleMoney[$thisMonth] ?? '0', $v['total_price'], 2);
$totalMoney = bcadd($totalMoney, $v['total_price'], 2);
// $buyMoney[$thisMonth] = bcadd($buyMoney[$thisMonth]?? '0', $v['total_buy_price'], 3);
// 药品
if (!isset($drugSaleMoney[$v['drug_type']])) {
$drugSaleMoney[$v['drug_type']] = [
'name' => $drugType[$v['drug_type']],
'value' => $v['total_price'],
];
} else {
$drugSaleMoney[$v['drug_type']]['value'] = bcadd($drugSaleMoney[$v['drug_type']]['value'] ?? '0', $v['total_price'], 2);
}
}
foreach ($dateArr as $v) {
if (!isset($saleMoney[$v])) $saleMoney[$v] = '0.00';
// if (!isset($buyMoney[$v])) $buyMoney[$v] = '0.00';
}
return [
'sale_money' => $this->getArrValues($saleMoney),
// 'buy_money' => $this->getArrValues($buyMoney),
'total_money' => $totalMoney,
'line_legend' => ['销售金额'],
// 药品类型统计
'drug_data' => $this->getArrValues($drugSaleMoney),
];
}
/**
* 重置键值
* @param $originalArray
* @return array
*/
public function getArrValues($originalArray)
{
$newArr = [];
foreach ($originalArray as $v) {
$newArr[] = $v;
}
return $newArr;
}
/**
* 地区分类统计方法
*
* @return array[]
* @throws Exception
*/
public function actionAddressStatistics()
{
$admin = \Yii::$app->user->identity;
$role = $admin->role;
$timeType = \Yii::$app->request->get('time_type');
if ($role == UserRoleEnum::STORE_ADMIN) return [];
switch ($timeType) {
case 1:
$startTime = strtotime(date('Y-m-1 00:00:00'));
$endTime = strtotime(date('Y-m-d H:i:s'));
break;
case 2:
$startTime = strtotime(date('Y-1-1 00:00:00'));
$endTime = strtotime(date('Y-m-d H:i:s'));
break;
case 3:
$thisYear = date('Y');
$lastYear = $thisYear - 1;
$startTime = strtotime($lastYear . '-01-01 00:00:00');
$endTime = strtotime($lastYear . '-12-31 23:59:59');
break;
default:
throw new Exception('参数错误');
}
$where = $this->getFinanceWhere($role, $admin);
return $this->getAddress($startTime, $endTime, $where);
}
/**
* @doc-name 统计函数-地区
*
* @param $startTime
* @param $endTime
* @param array $where
* @return array[]
*/
public function getAddress($startTime, $endTime, $where = [])
{
$query = Reconciliation::find()
->where(['between', 'created_at', $startTime, $endTime])
->andWhere(['status' => 1])
->select(['store_id', 'total_price', 'created_at'])
->with(['store.province']); // 预加载关联数据
if (!empty($where)) {
foreach ($where as $condition) {
$query->andWhere($condition);
}
}
// 执行查询并获取结果
$models = $query->asArray()->all();
// 初始化结果数组
$result = [];
foreach ($models as $model) {
$provinceName = $model['store']['province']['name'];
if (!isset($result[$provinceName])) {
$result[$provinceName] = $model['total_price'];
} else {
$result[$provinceName] = bcadd($result[$provinceName], $model['total_price'], 2);
}
}
// 提取地址和金额
$address = [];
$money = [];
foreach ($result as $key => $value) {
$address[] = $key;
$money[] = $value;
}
return [
'address' => $address,
'money' => $money,
];
}
/**
* 获取月份
*
* @param $startTime
* @param $endTime
* @return array
*/
public function getMonthsList($startTime, $endTime)
{
$monthList = [];
$currentTime = $startTime;
while ($currentTime <= $endTime) {
$monthList[] = date('Y-m', $currentTime);
$currentTime = strtotime('+1 month', $currentTime);
}
return $monthList;
}
/**
* 获取选中的时间段有几周
*
* @param $startTime
* @param $endTime
* @return array
*/
public function getWeekList($startTime, $endTime)
{
$weeks = [];
$currentTime = $startTime;
while ($currentTime <= $endTime) {
$weeks[] = date('W', $currentTime);
$currentTime = strtotime('+1 week', $currentTime);
}
return $weeks;
}
}