Преглед изворни кода

优化导出、统一配置、兼容旧方式

liugc пре 1 година
родитељ
комит
36ab0b365f

+ 17 - 1
app/adminapi/controller/master_worker/MasterWorkerServiceOrderController.php

@@ -46,5 +46,21 @@ class MasterWorkerServiceOrderController extends BaseAdminController
         return $this->dataLists(new MasterWorkerCommissionNoticeLists());
     }
 
-
+    public function freeDownload()
+    {
+        $params = $this->request->get();
+        $filename = "免费班工程师统计";
+        $result = ExportLogic::add([
+            'download_type' => 4,
+            'params' => $params,
+            'name' => $filename,
+            'admin_id' => $this->adminId,
+        ]);
+        if (false === $result) {
+            return $this->fail(ExportLogic::getError());
+        }
+        // 暂时 - 立即生成导出文件
+        (new ExcelExportService)->download($result);
+        return $this->success('添加成功-'.$result, [], 1, 1);
+    }
 }

+ 50 - 4
app/adminapi/lists/master_commission/MasterWorkerCommissionNoticeLists.php

@@ -16,8 +16,8 @@ namespace app\adminapi\lists\master_commission;
 
 
 use app\adminapi\lists\BaseAdminDataLists;
-use app\common\model\master_commission\MasterWorkerCommissionNotice;
 use app\common\lists\ListsSearchInterface;
+use app\common\model\master_worker\MasterWorker;
 use think\facade\Db;
 
 
@@ -39,11 +39,36 @@ class MasterWorkerCommissionNoticeLists extends BaseAdminDataLists implements Li
     public function setSearch(): array
     {
         return [
-            '=' => ['commission_config_id', 'master_worker_id', 'day_num', 'order_num', 'signing_date', 'signing_date_end'],
-            'like' => ['worker_number%', 'real_name%', 'mobile%'],
+            '=' => ['n.commission_config_id', 'n.master_worker_id', 'n.day_num', 'n.order_num', 'n.signing_date', 'n.signing_date_end'],
         ];
     }
 
+    public function queryWhere()
+    {
+        $where = [];
+        if (isset($this->params['labels']) && !empty($this->params['labels'])) {
+            $sqls = [];
+            foreach ($this->params['labels'] as $item) {
+                $sqls[] = "FIND_IN_SET({$item}, labels) > 0";
+            }
+            $query_sql = implode(' OR ', $sqls);
+            $period_ids = MasterWorker::where('labels','<>', '')->whereRaw($query_sql)->column('id');
+            $where[] = [ 'n.master_worker_id','in',$period_ids?:[0]];
+        }
+        if (isset($this->params['mobile']) && !empty($this->params['mobile'])) {
+            $mw_ids = MasterWorker::where('mobile', $this->params['mobile'])->column('id');
+            $where[] = [ 'n.master_worker_id','in',$mw_ids?:[0]];
+        }
+        if (isset($this->params['worker_number']) && !empty($this->params['worker_number'])) {
+            $mw_ids = MasterWorker::where([[ 'mw.worker_number','like','%'.$this->params['worker_number'].'%']])->column('id');
+            $where[] = [ 'n.master_worker_id','in',$mw_ids?:[0]];
+        }
+        if (isset($this->params['real_name']) && !empty($this->params['real_name'])) {
+            $mw_ids = MasterWorker::where([[ 'mw.worker_number','like','%'.$this->params['real_name'].'%']])->column('id');
+            $where[] = [ 'n.master_worker_id','in',$mw_ids?:[0]];
+        }
+        return $where;
+    }
 
     /**
      * @notes 获取列表
@@ -57,8 +82,8 @@ class MasterWorkerCommissionNoticeLists extends BaseAdminDataLists implements Li
     public function lists(): array
     {
         return Db::name('master_worker_commission_notice')->alias('n')
-            ->leftJoin('service_work sw', 'n.master_worker_id = sw.master_worker_id AND sw.create_time >= n.signing_date AND sw.create_time <= n.signing_date_end')
             ->leftJoin('master_worker mw', 'n.master_worker_id = mw.id')
+            ->leftJoin('service_work sw', 'n.master_worker_id = sw.master_worker_id AND sw.create_time >= n.signing_date AND sw.create_time <= n.signing_date_end')
             ->field([
                 'n.id', 'n.commission_config_id', 'n.master_worker_id', 'n.day_num', 'n.order_num', 'n.signing_date', 'n.signing_date_end',
                 'mw.real_name', 'mw.nickname', 'mw.worker_number', 'mw.mobile',
@@ -66,6 +91,7 @@ class MasterWorkerCommissionNoticeLists extends BaseAdminDataLists implements Li
                 Db::raw("MAX(CASE WHEN sw.service_status = 3 THEN sw.finished_time ELSE null END) max_time")
             ])
             ->where($this->searchWhere)
+            ->where($this->queryWhere())
             ->group('n.master_worker_id, n.id')
             ->limit($this->limitOffset, $this->limitLength)
             ->select()->toArray();
@@ -87,8 +113,28 @@ class MasterWorkerCommissionNoticeLists extends BaseAdminDataLists implements Li
                 Db::raw("MAX(sw.finished_time) max_time")
             ])
             ->where($this->searchWhere)
+            ->where($this->queryWhere())
             ->group('n.master_worker_id, n.id')
             ->count();
     }
 
+    public function setExcelComplexFields(): array
+    {
+        $zh_cn_fields = [
+            '工程师ID','工程师编号', '工程师姓名','工程师手机号','启动时间(签约时间)', '规则天数','应达标时间','单量规则','工单数','是否达标','达标时间'
+        ];
+        $data_fields = ['master_worker_id','worker_number','real_name','mobile',function ($row) {
+            return $row['signing_date']?date('Y-m-d H:i:s',$row['signing_date']):'';
+        },'day_num',function ($row) {
+            return $row['signing_date_end']?date('Y-m-d H:i:s',$row['signing_date_end']):'';
+        },'order_num','order_count',function ($row) {
+            return ($row['order_num']>$row['order_count'])? '否' : '是';
+        },function ($row) {
+            return ($row['order_num']>$row['order_count'])?'':($row['max_time']?date('Y-m-d H:i:s',$row['max_time']):'');
+        }];
+        return [
+            'zh_cn_fields' => $zh_cn_fields,
+            'data_fields' => $data_fields
+        ];
+    }
 }

+ 9 - 0
app/adminapi/lists/master_worker/MasterWorkerServiceOrderLists.php

@@ -42,6 +42,15 @@ class MasterWorkerServiceOrderLists extends BaseAdminDataLists implements ListsS
         if (isset($this->params['recruiting_behalf']) && !empty($this->params['recruiting_behalf'])) {
             $where[] = ['a.recruiting_behalf','like' ,"%".$this->params['recruiting_behalf']."%"];
         }
+        if (isset($this->params['labels']) && !empty($this->params['labels'])) {
+            $sqls = [];
+            foreach ($this->params['labels'] as $item) {
+                $sqls[] = "FIND_IN_SET({$item}, labels) > 0";
+            }
+            $query_sql = implode(' OR ', $sqls);
+            $period_ids = MasterWorker::where('labels','<>', '')->whereRaw($query_sql)->column('id');
+            $where[] = [ 'a.id','IN',$period_ids?:[0]];
+        }
         if (isset($this->params['is_recruiting_behalf']) && !empty($this->params['is_recruiting_behalf'])) {
             if ($this->params['is_recruiting_behalf'] == 1)
                 $where[] = ['a.recruiting_behalf','<>' ,""];

+ 21 - 0
app/common/lists/BaseDataLists.php

@@ -216,5 +216,26 @@ abstract class BaseDataLists implements ListsInterface
         return count($this->lists());
     }
 
+    public function setParams($params): self
+    {
+        $this->params = $params;
+        return $this;
+    }
+
+    public function setExcelComplexFields(): array
+    {
+        return [];
+    }
 
+    public function excelExportList($params = []): array
+    {
+        $this->limitLength = config('export.max_limit_length');
+        $this->setParams($params?:[])->initSearch();
+        return $this->lists();
+    }
+
+    public function setFileName():string
+    {
+        return '';
+    }
 }

+ 1 - 1
app/common/model/export/Export.php

@@ -42,6 +42,6 @@ class Export extends BaseModel
     }
     public function setDownloadFunAttr($value,$data)
     {
-        return (new ExcelExportService)->download_type[$data['download_type']]?:'';
+        return config('export.download_type')[$data['download_type']]?:'';
     }
 }

+ 42 - 15
app/common/service/ExcelExportService.php

@@ -27,6 +27,7 @@ use app\common\model\user\User;
 use app\common\service\storage\Driver as StorageDriver;
 use excel\ExcelWriter;
 use Exception;
+use think\facade\App;
 use think\facade\Db;
 use think\facade\Log;
 
@@ -34,14 +35,13 @@ use think\facade\Log;
 class ExcelExportService
 {
 
-    private $sheet;
-    public $download_type = [
-        '1' =>  'EngineerBillDownload',
-        '2' =>  'MasterWorkerServiceOrderDownload',
-        '3' =>  'UserEquityDownload',
-    ];
+    private ExcelWriter $sheet;
+    protected array $params = [];
+    protected Export $infoExport;
+    public array $download_type = [];
     public function __construct()
     {
+        $this->download_type = config('export.download_type');
         $this->sheet = new ExcelWriter();
     }
     public function download($id)
@@ -50,16 +50,43 @@ class ExcelExportService
             $infoExport = Export::findOrEmpty($id);
             if(!$infoExport->isEmpty()){
                 $download_fun = $infoExport['download_fun'];
-                if(!method_exists($this,$download_fun)){
-                    throw new Exception('下载不存在-1001');
+                $this->infoExport = $infoExport;
+                switch ($infoExport['download_type']){
+                    case 1:
+                    case 2:
+                    case 3:
+                        if(!method_exists($this,$download_fun)){
+                            throw new Exception('下载不存在-1001');
+                        }
+                        $this->$download_fun($infoExport);
+                        break;
+                    default:
+                        $use_file = explode('.',$download_fun);
+                        $this->getDownloadFileUrl(invoke(str_replace('.', '\\', App::getNamespace() . '\\lists\\' . $use_file[0] . '\\'. ucwords($use_file[1]))));
+                       break;
                 }
-                $this->$download_fun($infoExport);
             }
         }catch (\Exception $e){
             Log::info("download-error:{$id}:".$e->getMessage());
             throw new Exception($e->getMessage());
         }
     }
+    // 获取下载文件路径
+    public function getDownloadFileUrl($downloadObj){
+        $lists = $downloadObj->excelExportList($this->infoExport['params']?:[]);
+        $filename = $downloadObj->setFileName()?:($this->infoExport['name']?:'');
+        $fields = $downloadObj->setExcelComplexFields();
+        if(!$lists || !$fields){
+            throw new Exception('lists或fields不存在');
+        }
+        $this->sheet->generateExcelFile($fields['zh_cn_fields'], $lists,$filename.'-'.$this->infoExport->id, $fields['data_fields']);
+        $this->infoExport->file_url = $this->sheet->fileUrl();
+        $this->infoExport->generate_status = 1;
+        $this->infoExport->updatetime = time();
+        $this->infoExport->save();
+        return $this->infoExport->file_url;
+    }
+
 
     /**
      * @notes 工程师 -截止某日最后结算余额 导出
@@ -90,12 +117,12 @@ class ExcelExportService
             ]);
             //生成数据表格 & 更新表 -- 批次编号、状态-待算
             $lists = MasterSettlementDetailsLogic::upBatchStatus($params,$batch_number);
-            $filename = ($filename?($filename.'-批号'.$batch_number):'').('-'.date('YmdHis').'-'.$infoExport->id);
+            $filename = ($filename?($filename.'-批号'.$batch_number):'');
             $this->sheet->generateExcelFile([
                 '工程师ID', '工程师编号', '工程师姓名', '工程师银行卡号', '所属银行', '工程师开户行及支行信息','导出时账号余额',
                 '批次编号',
                 '应发金额', '扣款金额', '扣款说明', '实发金额', '打款时间','备注'
-            ], $lists,$filename, [
+            ], $lists,$filename.'-'.$infoExport->id, [
                 'master_worker_id','worker_number','engineer_name','bank_account','bank_name','opening_branch','original_balance',
                 'batch_number',
                 'total_settlement_amount','','','','',''
@@ -169,10 +196,10 @@ class ExcelExportService
             foreach ($lists as &$item) {
                 $item['category_name'] = $item['category_ids']?implode('、',array_column(get_parent_info($categoryData,explode(',',$item['category_ids'])),'name')):'';
             }
-            $filename = ($filename?:'').('-'.date('YmdHis').'-'.$infoExport->id);
+
             $this->sheet->generateExcelFile([
                 '服务类别', '工程师编号', '工程师姓名', '工程师手机', '代招人姓名', '工程师接单数', '工程师成功单','工程师失败单','工程师成交金额','工程师提成金额'
-            ], $lists,$filename, ['category_name','worker_number','real_name','mobile','recruiting_behalf','all_count','success_count','fail_count','work_total','worker_price']);
+            ], $lists,$filename.'-'.$infoExport->id, ['category_name','worker_number','real_name','mobile','recruiting_behalf','all_count','success_count','fail_count','work_total','worker_price']);
             $infoExport->file_url = $this->sheet->fileUrl();
             $infoExport->generate_status = 1;
             $infoExport->updatetime = time();
@@ -213,10 +240,10 @@ class ExcelExportService
                 ->field(['id', 'user_id', 'equity_id', 'goods_id', 'number', "IF(end_time=0,'',FROM_UNIXTIME(end_time, '%Y-%m-%d %H:%i:%s')) AS end_time",'code','IF(user_id=0,2,1) as is_binding'])
                 ->select()
                 ->toArray();
-            $filename = ($filename?:'').('-'.date('YmdHis').'-'.$infoExport->id);
+
             $this->sheet->generateExcelFile([
                 '用户','编码', '权益卡名称','商品','预售价','权益总次数','剩余次数','权益截止时间'
-            ], $lists,$filename, ['user.nickname','code','equityConfig.equity_name','goods.goods_name','equityConfig.price','equityConfig.number','number','end_time']);
+            ], $lists,$filename.'-'.$infoExport->id, ['user.nickname','code','equityConfig.equity_name','goods.goods_name','equityConfig.price','equityConfig.number','number','end_time']);
             $infoExport->file_url = $this->sheet->fileUrl();
             $infoExport->generate_status = 1;
             $infoExport->updatetime = time();

+ 15 - 0
config/export.php

@@ -0,0 +1,15 @@
+<?php
+// +----------------------------------------------------------------------
+// | 导出配置
+// 1、在字典中添加导出类型
+// 2、配置对应的后台list类
+// +----------------------------------------------------------------------
+return [
+    'max_limit_length'=>50000,
+    'download_type' => [
+        '1' =>  'EngineerBillDownload',
+        '2' =>  'MasterWorkerServiceOrderDownload',
+        '3' =>  'UserEquityDownload',
+        '4' =>  'master_commission.MasterWorkerCommissionNoticeLists',
+    ],
+];

+ 6 - 1
extend/excel/ExcelWriter.php

@@ -69,6 +69,7 @@ class ExcelWriter
      */
     function generateExcelFile(array $headers, array $lists,string $filename, array $map = [],string $suffix = 'xlsx'): void
     {
+        $filename = ($filename?:'').('-'.date('YmdHis'));
         //if(!in_array($suffix,['xlsx','xls'])) throw new \Exception('文件格式不正确');
         $this->setHeaders($headers);
         $data = array_map(function($row) use ($map) {
@@ -77,7 +78,11 @@ class ExcelWriter
             }
             $tmp_arr = [];
             foreach ($map as $value){
-                $tmp_arr[] = $this->getCellValue($row,$value);
+                if (is_callable($value)){
+                    $tmp_arr[] = $value($row);
+                }elseif (is_string($value)){
+                    $tmp_arr[] = $this->getCellValue($row,$value);
+                }
             }
             return $tmp_arr;
         }, $lists);