新增财务数据
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user