diff --git a/admin/controllers/base/FinanceController.php b/admin/controllers/base/FinanceController.php index 551bcf7..d4a8a85 100644 --- a/admin/controllers/base/FinanceController.php +++ b/admin/controllers/base/FinanceController.php @@ -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; + } } \ No newline at end of file