This commit is contained in:
xman 2025-04-25 14:05:47 +08:00
parent 5aba36fe1b
commit 82447b27ad
10 changed files with 405 additions and 666 deletions

View File

@ -390,6 +390,7 @@ class Order extends Backend
$order->status = \app\admin\model\Order::STATUS_DISPATCHED;
$order->dispatch_time = date('Y-m-d H:i:s');
// $order->dispatch_admin_id = $this->auth->id;
$order->worker_id = $worker_id;
$order->save();
//日志

View File

@ -155,6 +155,7 @@ class Dispatch extends Backend
$order->status = Order::STATUS_DISPATCHED;
$order->dispatch_time = date('Y-m-d H:i:s');
$order->dispatch_admin_id = $this->auth->id;
$order->worker_id = $worker->id;
$order->save();
//order log

View File

@ -116,12 +116,12 @@ class Dispatcher extends Backend
return $newData;
}
//图表统计
public function chart($filter,$getAll=false){
/**
* @throws DbException
*/
public function orderSubSql()
{
$orderValid = implode(',',$this->model->tabStatus(Order::TAB_VALID));
//"COUNT(CASE WHEN status IN (".$orderValid.") THEN 1 END) AS ing_num",
@ -140,39 +140,9 @@ class Dispatcher extends Backend
// "SUM(CASE WHEN status = 60 THEN (field1 + field2) END) AS performance",
];
$builder = $this->model
->field($fields);
//->where('dispatch_admin_id','>',0);
return $this->model->field($fields)->group('worker_id')->buildSql();
if(!empty($filter['admin_id'])){
$builder->where('dispatch_admin_id',$filter['admin_id']);
}
if(!empty($filter['start_time']) && !empty($filter['end_time'])){
$time_by = $filter['time_by'] ??1;
if($time_by == 1){ //按派单时间
$time_field = 'dispatch_time';
}else{ //按录单时间
$time_field = 'create_time';
}
$builder->whereBetween($time_field,[$filter['start_time'],$filter['end_time']]);
}
//城市
if(!empty($filter['area_id'])){
$builder->where('area_id',$filter['area_id']);
}
//项目
if(!empty($filter['item_id'])){
$builder->where('item_id',$filter['item_id']);
}
if($getAll){
$data = $builder->group('dispatch_admin_id')->limit(50)->select();
}else{
$data = $builder->group('dispatch_admin_id')->paginate();
}
$newData = [];
/* $newData = [];
if(!empty($data)){
foreach ($data as &$datum){
@ -203,7 +173,7 @@ class Dispatcher extends Backend
return $newData;
}else{
return $data;
}
}*/
//dump($newData);exit;
}
@ -211,10 +181,11 @@ class Dispatcher extends Backend
/**
* @param $a
* @param $b
* @param $scale
* @param int $scale
* @return int|string
*/
private function _calc($a,$b,$scale=4,$is_percent=false){
private function _calc($a, $b, int $scale=4, $is_percent=false): int|string
{
$val = $b > 0 ? bcdiv($a,$b,$scale) : 0;
if($is_percent){

View File

@ -0,0 +1,191 @@
<?php
namespace app\admin\controller\statistics;
use app\admin\model\Admin;
use app\admin\model\Order;
use app\admin\model\OrderDispatch;
use app\common\controller\Backend;
use think\Exception;
use think\exception\DbException;
use think\response\Json;
/**
* 师傅列管理
*
* @icon fa fa-circle-o
*/
class Worker extends Backend
{
/**
* Sworker模型对象
* @var \app\admin\model\Worker
*/
protected $model = null;
/**
* @var Order
*/
private Order $OrderModel;
/**
* @var OrderDispatch
*/
private OrderDispatch $DispatchModel;
public function _initialize()
{
parent::_initialize();
$this->model = new \app\admin\model\Worker();
$this->OrderModel = new Order();
$this->DispatchModel = new OrderDispatch();
}
/**
* 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
* 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
* 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
*/
/**
* 查看
*
* @return string|Json
* @throws Exception
* @throws DbException
*/
public function index()
{
//设置过滤方法
$this->request->filter(['strip_tags', 'trim']);
if (false === $this->request->isAjax()) {
return $this->view->fetch();
}
//如果发送的来源是 Selectpage则转发到 Selectpage
if ($this->request->request('keyField')) {
return $this->selectpage();
}
[$where, $sort, $order, $offset, $limit] = $this->buildparams();
$list = $this->model
->where($where)
->order($sort, $order)
->paginate($limit);
$result = ['total' => $list->total(), 'rows' => $list->items()];
return json($result);
}
//图表统计
public function chart($filter,$getAll=false){
$orderValid = implode(',',$this->model->tabStatus(Order::TAB_VALID));
//"COUNT(CASE WHEN status IN (".$orderValid.") THEN 1 END) AS ing_num",
$fields = [
'dispatch_admin_id',
"COUNT(CASE WHEN status = 60 THEN 1 END) AS finish_num", //完成数
"COUNT(CASE WHEN status IN (".$orderValid.") THEN 1 END) AS count_num", //总订单数 (排除取消 和草稿)
"SUM(CASE WHEN status = 60 THEN total END) AS total", //成效额
"SUM(CASE WHEN status = 60 THEN performance END) AS performance", //业绩
"SUM(CASE WHEN status = 60 THEN (cost + material_cost) END) AS cost_total", //总成本
"SUM(CASE WHEN status = 60 THEN (refund_amount + worker_refund_amount) END) AS refund_total", //退款总数
"COUNT(CASE WHEN refund_amount > 0 OR worker_refund_amount > 0 THEN 1 END) AS refund_count", //退款订单数量
"AVG(CASE WHEN status > 10 THEN UNIX_TIMESTAMP(dispatch_time) - UNIX_TIMESTAMP(create_time) END) AS avg_time_diff", //派单时效
// "SUM(CASE WHEN status = 60 THEN (field1 + field2) END) AS performance",
];
$builder = $this->model
->field($fields);
//->where('dispatch_admin_id','>',0);
if(!empty($filter['admin_id'])){
$builder->where('dispatch_admin_id',$filter['admin_id']);
}
if(!empty($filter['start_time']) && !empty($filter['end_time'])){
$time_by = $filter['time_by'] ??1;
if($time_by == 1){ //按派单时间
$time_field = 'dispatch_time';
}else{ //按录单时间
$time_field = 'create_time';
}
$builder->whereBetween($time_field,[$filter['start_time'],$filter['end_time']]);
}
//城市
if(!empty($filter['area_id'])){
$builder->where('area_id',$filter['area_id']);
}
//项目
if(!empty($filter['item_id'])){
$builder->where('item_id',$filter['item_id']);
}
if($getAll){
$data = $builder->group('dispatch_admin_id')->limit(50)->select();
}else{
$data = $builder->group('dispatch_admin_id')->paginate();
}
$newData = [];
if(!empty($data)){
foreach ($data as &$datum){
//利润率 = 总业绩/总成效额
$datum->performance_rate = $this->_calc($datum->performance,$datum->total,4,true);
//转化率 = 完单数 / 总订单数
$datum->trans_rate = $this->_calc($datum->finish_num,$datum->count_num,4,true);
//变现值 = 总业绩 / 总订单数
$datum->cash_value = $this->_calc($datum->performance,$datum->count_num,2);
//客单利润 = 总利润 / 完单数
$datum->performance_avg = $this->_calc($datum->performance,$datum->finish_num,2);
//客单价 = 总成效额 / 完单数
$datum->total_avg = $this->_calc($datum->total,$datum->finish_num,2);
if(!empty($datum->dispatch_admin_id)){
$datum->admin_user = Admin::where($datum->dispatch_admin_id)->value('nickname')??'系统';
}else{
$datum->admin_user = '系统';
}
$datum->avg_time_diff = $this->_calc($datum->avg_time_diff,3600*24,2);
$datum->id = $datum->dispatch_admin_id;
$newData[] = $datum->toArray();
}
}
if($getAll){
return $newData;
}else{
return $data;
}
//dump($newData);exit;
}
/**
* @param $a
* @param $b
* @param $scale
* @return int|string
*/
private function _calc($a,$b,$scale=4,$is_percent=false){
$val = $b > 0 ? bcdiv($a,$b,$scale) : 0;
if($is_percent){
return bcmul($val,100,2);
}
return $val;
}
}

View File

@ -0,0 +1,22 @@
<?php
return [
'Id' => 'ID',
'Type' => '1 自营 2 非自营',
'Name' => '师傅姓名',
'Tel' => '师傅电话',
'Status' => '师傅状态',
'Status 1' => '激活',
'Set status to 1' => '设为激活',
'Status 0' => '冻结',
'Set status to 0' => '设为冻结',
'Area_id' => '所在地区',
'Lng' => '经度',
'Lat' => '纬度',
'Location_update_time' => '位置更新时间',
'Deposit_amount' => '保证金金额',
'Star' => '信用(5星制)',
'Create_time' => '创建时间',
'Update_time' => '更新时间',
'Deletetime' => '删除时间'
];

View File

@ -0,0 +1,27 @@
<?php
namespace app\admin\validate;
use think\Validate;
class Sworker extends Validate
{
/**
* 验证规则
*/
protected $rule = [
];
/**
* 提示消息
*/
protected $message = [
];
/**
* 验证场景
*/
protected $scene = [
'add' => [],
'edit' => [],
];
}

View File

@ -1,313 +0,0 @@
<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Order_no')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-order_no" data-rule="required" class="form-control" name="row[order_no]" type="text" value="">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Customer')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-customer" class="form-control" name="row[customer]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Tel')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-tel" data-rule="required" class="form-control" name="row[tel]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="radio">
{foreach name="statusList" item="vo"}
<label for="row[status]-{$key}"><input id="row[status]-{$key}" name="row[status]" type="radio" value="{$key}" {in name="key" value="0"}checked{/in} /> {$vo}</label>
{/foreach}
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Area_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-area_id" data-rule="required" data-source="area/index" class="form-control selectpage" name="row[area_id]" type="text" value="">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Address')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-address" data-rule="required" class="form-control" name="row[address]" type="text" value="">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Lng')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-lng" class="form-control" step="0.000001" name="row[lng]" type="number">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Lat')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-lat" class="form-control" step="0.000001" name="row[lat]" type="number">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Work_tel_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-work_tel_id" data-rule="required" data-source="work/tel/index" class="form-control selectpage" name="row[work_tel_id]" type="text" value="">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Source_shop')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-source_shop" data-rule="required" class="form-control" name="row[source_shop]" type="text" value="">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Source')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-source" data-rule="required" class="form-control" name="row[source]" type="number" value="0">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Source_uid')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-source_uid" class="form-control" name="row[source_uid]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Item_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-item_id" data-rule="required" data-source="item/index" class="form-control selectpage" name="row[item_id]" type="text" value="">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Item_title')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-item_title" data-rule="required" class="form-control" name="row[item_title]" type="text" value="">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Detail')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-detail" class="form-control" name="row[detail]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Remark')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-remark" class="form-control" name="row[remark]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Images')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="input-group">
<input id="c-images" class="form-control" size="50" name="row[images]" type="text">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="faupload-images" class="btn btn-danger faupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right" for="c-images"></span>
</div>
<ul class="row list-inline faupload-preview" id="p-images"></ul>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Plan_time')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-plan_time" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[plan_time]" type="text" value="{:date('Y-m-d H:i:s')}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Coupon_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-coupon_id" data-rule="required" data-source="coupon/index" class="form-control selectpage" name="row[coupon_id]" type="text" value="">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Total')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-total" data-rule="required" class="form-control" step="0.01" name="row[total]" type="number" value="0.00">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Online_amount')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-online_amount" data-rule="required" class="form-control" step="0.01" name="row[online_amount]" type="number" value="0.00">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Offline_amount')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-offline_amount" data-rule="required" class="form-control" step="0.01" name="row[offline_amount]" type="number" value="0.00">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Online_amount_last')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-online_amount_last" data-rule="required" class="form-control" step="0.01" name="row[online_amount_last]" type="number" value="0.00">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Offline_amount_type')}:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-offline_amount_type" data-rule="required" class="form-control selectpicker" name="row[offline_amount_type]">
{foreach name="offlineAmountTypeList" item="vo"}
<option value="{$key}" {in name="key" value="0"}selected{/in}>{$vo}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Discount_amount')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-discount_amount" data-rule="required" class="form-control" step="0.01" name="row[discount_amount]" type="number" value="0.00">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Refund_amount')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-refund_amount" data-rule="required" class="form-control" step="0.01" name="row[refund_amount]" type="number" value="0.00">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Worker_refund_amount')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-worker_refund_amount" data-rule="required" class="form-control" step="0.01" name="row[worker_refund_amount]" type="number" value="0.00">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Real_amount')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-real_amount" data-rule="required" class="form-control" step="0.01" name="row[real_amount]" type="number" value="0.00">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Cost')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-cost" data-rule="required" class="form-control" step="0.01" name="row[cost]" type="number" value="0.00">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Material_cost')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-material_cost" data-rule="required" class="form-control" step="0.01" name="row[material_cost]" type="number" value="0.00">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Performance')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-performance" data-rule="required" class="form-control" step="0.01" name="row[performance]" type="number" value="0.00">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Cancel_reason_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-cancel_reason_id" data-rule="required" data-source="cancel/reason/index" class="form-control selectpage" name="row[cancel_reason_id]" type="text" value="">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Cancel_detail')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-cancel_detail" class="form-control" name="row[cancel_detail]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Audit_remark')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-audit_remark" class="form-control" name="row[audit_remark]" type="text" value="">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Audit_admin_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-audit_admin_id" data-rule="required" data-source="audit/admin/index" class="form-control selectpage" name="row[audit_admin_id]" type="text" value="">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Create_time')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-create_time" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[create_time]" type="text" value="{:date('Y-m-d H:i:s')}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Update_time')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-update_time" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[update_time]" type="text" value="{:date('Y-m-d H:i:s')}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Delete_time')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-delete_time" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[delete_time]" type="text" value="{:date('Y-m-d H:i:s')}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Dispatch_type')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-dispatch_type" class="form-control" name="row[dispatch_type]" type="number">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Receive_type')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-receive_type" class="form-control" name="row[receive_type]" type="number">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Revisit_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-revisit_id" data-rule="required" data-source="revisit/index" class="form-control selectpage" name="row[revisit_id]" type="text" value="">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Dispatch_admin_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-dispatch_admin_id" data-rule="required" data-source="dispatch/admin/index" class="form-control selectpage" name="row[dispatch_admin_id]" type="text" value="">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Dispatch_admin_user')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-dispatch_admin_user" class="form-control" name="row[dispatch_admin_user]" type="text">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Dispatch_time')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-dispatch_time" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[dispatch_time]" type="text" value="{:date('Y-m-d H:i:s')}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Aftersale_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-aftersale_id" data-rule="required" data-source="aftersale/index" class="form-control selectpage" name="row[aftersale_id]" type="text" value="">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Amount_images')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="input-group">
<input id="c-amount_images" class="form-control" size="50" name="row[amount_images]" type="text">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="faupload-amount_images" class="btn btn-danger faupload" data-input-id="c-amount_images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="true" data-preview-id="p-amount_images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-amount_images" class="btn btn-primary fachoose" data-input-id="c-amount_images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right" for="c-amount_images"></span>
</div>
<ul class="row list-inline faupload-preview" id="p-amount_images"></ul>
</div>
</div>
<div class="form-group layer-footer">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">
<button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
</div>
</div>
</form>

View File

@ -1,313 +0,0 @@
<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Order_no')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-order_no" data-rule="required" class="form-control" name="row[order_no]" type="text" value="{$row.order_no|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Customer')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-customer" class="form-control" name="row[customer]" type="text" value="{$row.customer|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Tel')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-tel" data-rule="required" class="form-control" name="row[tel]" type="text" value="{$row.tel|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="radio">
{foreach name="statusList" item="vo"}
<label for="row[status]-{$key}"><input id="row[status]-{$key}" name="row[status]" type="radio" value="{$key}" {in name="key" value="$row.status"}checked{/in} /> {$vo}</label>
{/foreach}
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Area_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-area_id" data-rule="required" data-source="area/index" class="form-control selectpage" name="row[area_id]" type="text" value="{$row.area_id|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Address')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-address" data-rule="required" class="form-control" name="row[address]" type="text" value="{$row.address|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Lng')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-lng" class="form-control" step="0.000001" name="row[lng]" type="number" value="{$row.lng|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Lat')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-lat" class="form-control" step="0.000001" name="row[lat]" type="number" value="{$row.lat|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Work_tel_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-work_tel_id" data-rule="required" data-source="work/tel/index" class="form-control selectpage" name="row[work_tel_id]" type="text" value="{$row.work_tel_id|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Source_shop')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-source_shop" data-rule="required" class="form-control" name="row[source_shop]" type="text" value="{$row.source_shop|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Source')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-source" data-rule="required" class="form-control" name="row[source]" type="number" value="{$row.source|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Source_uid')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-source_uid" class="form-control" name="row[source_uid]" type="text" value="{$row.source_uid|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Item_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-item_id" data-rule="required" data-source="item/index" class="form-control selectpage" name="row[item_id]" type="text" value="{$row.item_id|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Item_title')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-item_title" data-rule="required" class="form-control" name="row[item_title]" type="text" value="{$row.item_title|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Detail')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-detail" class="form-control" name="row[detail]" type="text" value="{$row.detail|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Remark')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-remark" class="form-control" name="row[remark]" type="text" value="{$row.remark|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Images')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="input-group">
<input id="c-images" class="form-control" size="50" name="row[images]" type="text" value="{$row.images|htmlentities}">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="faupload-images" class="btn btn-danger faupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right" for="c-images"></span>
</div>
<ul class="row list-inline faupload-preview" id="p-images"></ul>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Plan_time')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-plan_time" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[plan_time]" type="text" value="{$row.plan_time}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Coupon_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-coupon_id" data-rule="required" data-source="coupon/index" class="form-control selectpage" name="row[coupon_id]" type="text" value="{$row.coupon_id|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Total')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-total" data-rule="required" class="form-control" step="0.01" name="row[total]" type="number" value="{$row.total|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Online_amount')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-online_amount" data-rule="required" class="form-control" step="0.01" name="row[online_amount]" type="number" value="{$row.online_amount|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Offline_amount')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-offline_amount" data-rule="required" class="form-control" step="0.01" name="row[offline_amount]" type="number" value="{$row.offline_amount|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Online_amount_last')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-online_amount_last" data-rule="required" class="form-control" step="0.01" name="row[online_amount_last]" type="number" value="{$row.online_amount_last|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Offline_amount_type')}:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-offline_amount_type" data-rule="required" class="form-control selectpicker" name="row[offline_amount_type]">
{foreach name="offlineAmountTypeList" item="vo"}
<option value="{$key}" {in name="key" value="$row.offline_amount_type"}selected{/in}>{$vo}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Discount_amount')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-discount_amount" data-rule="required" class="form-control" step="0.01" name="row[discount_amount]" type="number" value="{$row.discount_amount|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Refund_amount')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-refund_amount" data-rule="required" class="form-control" step="0.01" name="row[refund_amount]" type="number" value="{$row.refund_amount|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Worker_refund_amount')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-worker_refund_amount" data-rule="required" class="form-control" step="0.01" name="row[worker_refund_amount]" type="number" value="{$row.worker_refund_amount|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Real_amount')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-real_amount" data-rule="required" class="form-control" step="0.01" name="row[real_amount]" type="number" value="{$row.real_amount|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Cost')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-cost" data-rule="required" class="form-control" step="0.01" name="row[cost]" type="number" value="{$row.cost|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Material_cost')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-material_cost" data-rule="required" class="form-control" step="0.01" name="row[material_cost]" type="number" value="{$row.material_cost|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Performance')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-performance" data-rule="required" class="form-control" step="0.01" name="row[performance]" type="number" value="{$row.performance|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Cancel_reason_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-cancel_reason_id" data-rule="required" data-source="cancel/reason/index" class="form-control selectpage" name="row[cancel_reason_id]" type="text" value="{$row.cancel_reason_id|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Cancel_detail')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-cancel_detail" class="form-control" name="row[cancel_detail]" type="text" value="{$row.cancel_detail|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Audit_remark')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-audit_remark" class="form-control" name="row[audit_remark]" type="text" value="{$row.audit_remark|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Audit_admin_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-audit_admin_id" data-rule="required" data-source="audit/admin/index" class="form-control selectpage" name="row[audit_admin_id]" type="text" value="{$row.audit_admin_id|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Create_time')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-create_time" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[create_time]" type="text" value="{$row.create_time}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Update_time')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-update_time" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[update_time]" type="text" value="{$row.update_time}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Delete_time')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-delete_time" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[delete_time]" type="text" value="{$row.delete_time}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Dispatch_type')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-dispatch_type" class="form-control" name="row[dispatch_type]" type="number" value="{$row.dispatch_type|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Receive_type')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-receive_type" class="form-control" name="row[receive_type]" type="number" value="{$row.receive_type|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Revisit_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-revisit_id" data-rule="required" data-source="revisit/index" class="form-control selectpage" name="row[revisit_id]" type="text" value="{$row.revisit_id|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Dispatch_admin_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-dispatch_admin_id" data-rule="required" data-source="dispatch/admin/index" class="form-control selectpage" name="row[dispatch_admin_id]" type="text" value="{$row.dispatch_admin_id|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Dispatch_admin_user')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-dispatch_admin_user" class="form-control" name="row[dispatch_admin_user]" type="text" value="{$row.dispatch_admin_user|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Dispatch_time')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-dispatch_time" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[dispatch_time]" type="text" value="{$row.dispatch_time}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Aftersale_id')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-aftersale_id" data-rule="required" data-source="aftersale/index" class="form-control selectpage" name="row[aftersale_id]" type="text" value="{$row.aftersale_id|htmlentities}">
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Amount_images')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="input-group">
<input id="c-amount_images" class="form-control" size="50" name="row[amount_images]" type="text" value="{$row.amount_images|htmlentities}">
<div class="input-group-addon no-border no-padding">
<span><button type="button" id="faupload-amount_images" class="btn btn-danger faupload" data-input-id="c-amount_images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="true" data-preview-id="p-amount_images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-amount_images" class="btn btn-primary fachoose" data-input-id="c-amount_images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
</div>
<span class="msg-box n-right" for="c-amount_images"></span>
</div>
<ul class="row list-inline faupload-preview" id="p-amount_images"></ul>
</div>
</div>
<div class="form-group layer-footer">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">
<button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
</div>
</div>
</form>

View File

@ -0,0 +1,26 @@
<div class="panel panel-default panel-intro">
<div class="panel-heading">
</div>
<div class="panel-body">
<div id="myTabContent" class="tab-content">
<div class="tab-pane fade active in" id="one">
<div class="widget-body no-padding">
<div id="toolbar" class="toolbar">
<a href="javascript:;" class="btn btn-primary btn-refresh" title="{:__('Refresh')}" ><i class="fa fa-refresh"></i> </a>
</div>
<table id="table" class="table table-striped table-bordered table-hover table-nowrap"
data-operate-edit="{:$auth->check('statistics/worker/edit')}"
data-operate-del="{:$auth->check('statistics/worker/del')}"
width="100%">
</table>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,126 @@
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
var Controller = {
index: function () {
// 初始化表格参数配置
Table.api.init({
extend: {
index_url: 'statistics/worker/index' + location.search,
add_url: 'statistics/worker/add',
edit_url: 'statistics/worker/edit',
del_url: 'statistics/worker/del',
multi_url: 'statistics/worker/multi',
import_url: 'statistics/worker/import',
table: 'worker',
}
});
var table = $("#table");
// 初始化表格
table.bootstrapTable({
url: $.fn.bootstrapTable.defaults.extend.index_url,
pk: 'id',
sortName: 'id',
fixedColumns: true,
fixedRightNumber: 1,
columns: [
[
{checkbox: true},
{field: 'id', title: __('Id')},
{field: 'admin_id', title: __('Admin_id')},
{field: 'type', title: __('Type')},
{field: 'name', title: __('Name'), operate: 'LIKE'},
{field: 'tel', title: __('Tel'), operate: 'LIKE'},
{field: 'status', title: __('Status'), searchList: {"1":__('Status 1'),"0":__('Status 0')}, formatter: Table.api.formatter.status},
{field: 'area_id', title: __('Area_id')},
{field: 'lng', title: __('Lng'), operate:'BETWEEN'},
{field: 'lat', title: __('Lat'), operate:'BETWEEN'},
{field: 'location_update_time', title: __('Location_update_time'), operate:'RANGE', addclass:'datetimerange', autocomplete:false},
{field: 'deposit_amount', title: __('Deposit_amount'), operate:'BETWEEN'},
{field: 'star', title: __('Star'), operate:'BETWEEN'},
{field: 'create_time', title: __('Create_time'), operate:'RANGE', addclass:'datetimerange', autocomplete:false},
{field: 'update_time', title: __('Update_time'), operate:'RANGE', addclass:'datetimerange', autocomplete:false},
{field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
]
]
});
// 为表格绑定事件
Table.api.bindevent(table);
},
recyclebin: function () {
// 初始化表格参数配置
Table.api.init({
extend: {
'dragsort_url': ''
}
});
var table = $("#table");
// 初始化表格
table.bootstrapTable({
url: 'statistics/worker/recyclebin' + location.search,
pk: 'id',
sortName: 'id',
columns: [
[
{checkbox: true},
{field: 'id', title: __('Id')},
{field: 'name', title: __('Name'), align: 'left'},
{
field: 'deletetime',
title: __('Deletetime'),
operate: 'RANGE',
addclass: 'datetimerange',
formatter: Table.api.formatter.datetime
},
{
field: 'operate',
width: '140px',
title: __('Operate'),
table: table,
events: Table.api.events.operate,
buttons: [
{
name: 'Restore',
text: __('Restore'),
classname: 'btn btn-xs btn-info btn-ajax btn-restoreit',
icon: 'fa fa-rotate-left',
url: 'statistics/worker/restore',
refresh: true
},
{
name: 'Destroy',
text: __('Destroy'),
classname: 'btn btn-xs btn-danger btn-ajax btn-destroyit',
icon: 'fa fa-times',
url: 'statistics/worker/destroy',
refresh: true
}
],
formatter: Table.api.formatter.operate
}
]
]
});
// 为表格绑定事件
Table.api.bindevent(table);
},
add: function () {
Controller.api.bindevent();
},
edit: function () {
Controller.api.bindevent();
},
api: {
bindevent: function () {
Form.api.bindevent($("form[role=form]"));
}
}
};
return Controller;
});