sb
This commit is contained in:
parent
bcef5370b8
commit
2d871656ac
|
|
@ -30,6 +30,7 @@ class OrderDispatchLog
|
||||||
'status' => $dispatch->status,
|
'status' => $dispatch->status,
|
||||||
'status_text' => $statusList[$dispatch->status],
|
'status_text' => $statusList[$dispatch->status],
|
||||||
'remark' => $remark,
|
'remark' => $remark,
|
||||||
|
'images' => $dispatch->record_images??'',
|
||||||
'admin_user' => $dispatch->admin_user??'系统',
|
'admin_user' => $dispatch->admin_user??'系统',
|
||||||
];
|
];
|
||||||
\app\admin\model\OrderDispatchLog::create($data);
|
\app\admin\model\OrderDispatchLog::create($data);
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ class AutoDispatchLogic
|
||||||
$worker = (new Worker())->where('id', $worker_id)->find();
|
$worker = (new Worker())->where('id', $worker_id)->find();
|
||||||
$insert ['worker_name'] = $worker['name'];
|
$insert ['worker_name'] = $worker['name'];
|
||||||
$insert ['worker_tel'] = $worker['tel'];
|
$insert ['worker_tel'] = $worker['tel'];
|
||||||
|
$insert['follow'] = 1;
|
||||||
$orderDispatch = new OrderDispatch();
|
$orderDispatch = new OrderDispatch();
|
||||||
$res = $orderDispatch->allowField(true)->save($insert);
|
$res = $orderDispatch->allowField(true)->save($insert);
|
||||||
$order->status = \app\admin\model\Order::STATUS_DISPATCHED;
|
$order->status = \app\admin\model\Order::STATUS_DISPATCHED;
|
||||||
|
|
|
||||||
|
|
@ -85,16 +85,23 @@ class Dispatch2 extends Backend
|
||||||
$row->btn_record = in_array($row->status, $this->model->btnActiveStatusList('btn_record')) && $this->auth->check('orders/dispatchrecord/add');
|
$row->btn_record = in_array($row->status, $this->model->btnActiveStatusList('btn_record')) && $this->auth->check('orders/dispatchrecord/add');
|
||||||
|
|
||||||
if(!in_array($row->status, $this->model->btnActiveStatusList('btn_record')) ){
|
if(!in_array($row->status, $this->model->btnActiveStatusList('btn_record')) ){
|
||||||
|
//正常情况,执行不到这里来,不用担心循环执行问题
|
||||||
$row->follow = 2;
|
$row->follow = 2;
|
||||||
OrderDispatch::where('id',$row->id)->update(['follow'=>2]);
|
OrderDispatch::where('id',$row->id)->update(['follow'=>2]);
|
||||||
}
|
}
|
||||||
if($row->btn_record){
|
if($row->btn_record){
|
||||||
|
|
||||||
if($row->follow == 0 ){
|
if($row->btn_record != 2){
|
||||||
|
return true;
|
||||||
|
}else{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*if($row->follow == 0 ){
|
||||||
$row->btn_record = true;
|
$row->btn_record = true;
|
||||||
}else{
|
}else{
|
||||||
$row->btn_record = false;
|
$row->btn_record = false;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
// if($row->type == 2)
|
// if($row->type == 2)
|
||||||
// {
|
// {
|
||||||
|
|
|
||||||
|
|
@ -126,10 +126,10 @@ class Dispatchrecord extends Backend
|
||||||
|
|
||||||
$params['need_notice'] = 0;
|
$params['need_notice'] = 0;
|
||||||
$params['status'] = 1;
|
$params['status'] = 1;
|
||||||
if(!empty($params['rate'])){ //修改任务的状态
|
/* if(!empty($params['rate'])){ //修改任务的状态
|
||||||
if($dispatch->status != $params['rate']){
|
if($dispatch->status != $params['rate']){
|
||||||
$dispatch->status = $params['rate'];
|
$dispatch->status = $params['rate'];
|
||||||
$dispatch->save();
|
$dispatch->save();*/
|
||||||
|
|
||||||
$groups = $this->auth->getGroups($this->auth->id);
|
$groups = $this->auth->getGroups($this->auth->id);
|
||||||
$groupName = '';
|
$groupName = '';
|
||||||
|
|
@ -139,17 +139,18 @@ class Dispatchrecord extends Backend
|
||||||
}
|
}
|
||||||
|
|
||||||
$dispatch->admin_user = $groupName.':'. $this->auth->nickname;
|
$dispatch->admin_user = $groupName.':'. $this->auth->nickname;
|
||||||
|
$dispatch->record_images = $params['images'];
|
||||||
$hookParams = [
|
$hookParams = [
|
||||||
'dispatch' => $dispatch,
|
'dispatch' => $dispatch,
|
||||||
'remark' => '人工跟进,备注内容:'.$params['remark'],
|
'remark' => '跟进订单,跟进内容:'.$params['remark'],
|
||||||
];
|
];
|
||||||
Hook::listen('order_dispatch_change', $hookParams);
|
Hook::listen('order_dispatch_change', $hookParams);
|
||||||
|
|
||||||
if($params['rate'] == 10){
|
/* if($params['rate'] == 10){
|
||||||
$dispatch->got_time = date('Y-m-d H:i:s', time());
|
$dispatch->got_time = date('Y-m-d H:i:s', time());
|
||||||
}
|
}*/
|
||||||
}
|
/* }
|
||||||
}
|
}*/
|
||||||
$dispatch->follow = 1;
|
$dispatch->follow = 1;
|
||||||
}
|
}
|
||||||
$dispatch->record_count ++;
|
$dispatch->record_count ++;
|
||||||
|
|
|
||||||
|
|
@ -98,6 +98,18 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- 图片预览弹窗 -->
|
||||||
|
<div id="image-preview-overlay" style="display:none;position:fixed;top:0;left:0;width:100vw;height:100vh;background:rgba(0,0,0,0.6);z-index:9999;justify-content:center;align-items:center;">
|
||||||
|
<img id="image-preview-img" src="" style="max-width:90%;max-height:90%;box-shadow:0 0 20px #000;border-radius:6px;" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.progress-images img:hover {
|
||||||
|
box-shadow: 0 0 4px rgba(0, 0, 0, 0.4);
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
const logs = {$logs}; // 后端传入的数据,格式保持和你的一致
|
const logs = {$logs}; // 后端传入的数据,格式保持和你的一致
|
||||||
|
|
||||||
|
|
@ -129,9 +141,10 @@
|
||||||
return `
|
return `
|
||||||
<div class="timeline-progress-item">
|
<div class="timeline-progress-item">
|
||||||
<span class="progress-time">${progress.create_time}</span>
|
<span class="progress-time">${progress.create_time}</span>
|
||||||
<span class="progress-user">${progress.status_text}</span>
|
<span class="progress-user">${progress.status_text}</span>
|
||||||
<span class="progress-user">${innerUserDisplay}</span>
|
<span class="progress-user">${innerUserDisplay}</span>
|
||||||
<span class="progress-remark">${progress.remark || '无内容'}</span>
|
<span class="progress-remark">${progress.remark || '无内容'}</span>
|
||||||
|
${renderProgressImages(progress.images)}
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
}).join('');
|
}).join('');
|
||||||
|
|
@ -152,4 +165,45 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
renderTimeline(logs);
|
renderTimeline(logs);
|
||||||
|
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
|
const overlay = document.getElementById('image-preview-overlay');
|
||||||
|
const previewImg = document.getElementById('image-preview-img');
|
||||||
|
|
||||||
|
// 事件委托:图片点击弹窗
|
||||||
|
document.body.addEventListener('click', function (e) {
|
||||||
|
if (e.target.tagName === 'IMG' && e.target.dataset.preview === 'true') {
|
||||||
|
previewImg.src = e.target.src;
|
||||||
|
overlay.style.display = 'flex';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 点击遮罩关闭
|
||||||
|
overlay.addEventListener('click', function () {
|
||||||
|
overlay.style.display = 'none';
|
||||||
|
previewImg.src = '';
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function renderProgressImages(imageStr) {
|
||||||
|
if (!imageStr || typeof imageStr !== 'string') return '';
|
||||||
|
|
||||||
|
const imageList = imageStr.split(',')
|
||||||
|
.map(url => url.trim())
|
||||||
|
.filter(Boolean);
|
||||||
|
|
||||||
|
if (!imageList.length) return '';
|
||||||
|
|
||||||
|
return `
|
||||||
|
<div class="progress-images" style="margin-top: 6px;">
|
||||||
|
${imageList.map(img => `
|
||||||
|
<img src="${img}" data-preview="true"
|
||||||
|
style="width:40px;height:40px;border-radius:4px;border:1px solid #ccc;margin-right:5px;"
|
||||||
|
onerror="this.style.display='none'" />
|
||||||
|
`).join('')}
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('跟进依据')}:</label>
|
<label class="control-label col-xs-12 col-sm-2">{:__('跟进依据')}:</label>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="col-xs-12 col-sm-8">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input id="c-images" class="form-control" size="50" name="row[images]" type="text">
|
<input data-rule="required" id="c-images" class="form-control" size="50" name="row[images]" type="text">
|
||||||
<div class="input-group-addon no-border no-padding">
|
<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="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>
|
<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>
|
||||||
|
|
@ -44,6 +44,7 @@
|
||||||
{if condition='$dispatch.type eq 1'}
|
{if condition='$dispatch.type eq 1'}
|
||||||
|
|
||||||
|
|
||||||
|
<!--
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="control-label col-xs-12 col-sm-2">{:__('任务进度')}:</label>
|
<label class="control-label col-xs-12 col-sm-2">{:__('任务进度')}:</label>
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="col-xs-12 col-sm-8">
|
||||||
|
|
@ -54,12 +55,13 @@
|
||||||
<label><input type="radio" {if condition="$dispatch.status eq 30"}checked{/if} name="row[rate]" value="30"> 服务中</label>
|
<label><input type="radio" {if condition="$dispatch.status eq 30"}checked{/if} name="row[rate]" value="30"> 服务中</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- const STATUS_GOTIT = 10; //已接-->
|
<!– const STATUS_GOTIT = 10; //已接–>
|
||||||
<!-- const STATUS_PLANIT = 20; //已预约-->
|
<!– const STATUS_PLANIT = 20; //已预约–>
|
||||||
<!-- const STATUS_OVERTIME = 25; //超时(过了预约时间)-->
|
<!– const STATUS_OVERTIME = 25; //超时(过了预约时间)–>
|
||||||
<!-- const STATUS_CLOCK = 30; //已打卡-->
|
<!– const STATUS_CLOCK = 30; //已打卡–>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
|
@ -70,6 +72,9 @@
|
||||||
<label><input type="radio" name="row[notice_time]" value="2"> 2天后</label>
|
<label><input type="radio" name="row[notice_time]" value="2"> 2天后</label>
|
||||||
<label><input type="radio" name="row[notice_time]" value="3"> 3天后</label>
|
<label><input type="radio" name="row[notice_time]" value="3"> 3天后</label>
|
||||||
<label><input type="radio" name="row[notice_time]" value="4"> 4天后</label>
|
<label><input type="radio" name="row[notice_time]" value="4"> 4天后</label>
|
||||||
|
<label><input type="radio" name="row[notice_time]" value="5"> 5天后</label>
|
||||||
|
<label><input type="radio" name="row[notice_time]" value="6"> 6天后</label>
|
||||||
|
<label><input type="radio" name="row[notice_time]" value="7"> 7天后</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ use think\Hook;
|
||||||
class CheckOrderDispatchGotCommand extends Command
|
class CheckOrderDispatchGotCommand extends Command
|
||||||
{
|
{
|
||||||
protected $title = '【自动派单未接单检测,五分钟未接单,重派派单】/【自动派接单五分钟未预约,重新派单】/【自动派单上门时间已到,未完成上门】,每分钟执行一次';
|
protected $title = '【自动派单未接单检测,五分钟未接单,重派派单】/【自动派接单五分钟未预约,重新派单】/【自动派单上门时间已到,未完成上门】,每分钟执行一次';
|
||||||
|
|
||||||
protected function configure()
|
protected function configure()
|
||||||
{
|
{
|
||||||
$this->setName('check:dispatch-toget')
|
$this->setName('check:dispatch-toget')
|
||||||
|
|
@ -27,6 +28,8 @@ class CheckOrderDispatchGotCommand extends Command
|
||||||
$this->_toget();
|
$this->_toget();
|
||||||
$this->_toplan();
|
$this->_toplan();
|
||||||
$this->_toarrive();
|
$this->_toarrive();
|
||||||
|
$this->_tofinished();
|
||||||
|
|
||||||
$output->info('OVER');
|
$output->info('OVER');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -127,4 +130,23 @@ class CheckOrderDispatchGotCommand extends Command
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private function _tofinished(): void
|
||||||
|
{
|
||||||
|
|
||||||
|
//https://f1jo9ghdket.feishu.cn/wiki/PCK8wtWnSihQrukCRq1c3nCynyd
|
||||||
|
//5.自动订单派单完之后不需要进入待跟进状态,当师傅确认上门之后10分钟之内没有更新进度(首次更新进度),则需要进入待跟进状态,需要人为跟进。
|
||||||
|
|
||||||
|
$Model = new OrderDispatch();
|
||||||
|
$now = date('Y-m-d H:i:s', time() -600); //创建三十分名以
|
||||||
|
$count = $Model->where('status', OrderDispatch::STATUS_CLOCK)
|
||||||
|
->where('type', 2)
|
||||||
|
->where('follow', 1)
|
||||||
|
->whereNull('estimated_finish_time')
|
||||||
|
->where('arrive_time', '<=', $now)
|
||||||
|
->update(['follow'=>0]);
|
||||||
|
|
||||||
|
echo '已上门未更新:'. $count. PHP_EOL;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -123,11 +123,11 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form','layer'], function ($,
|
||||||
|
|
||||||
//{field: 'order.source_shop', title: __('Order.source_shop'), operate: '='},
|
//{field: 'order.source_shop', title: __('Order.source_shop'), operate: '='},
|
||||||
// {field: 'order.source', title: __('Order.source')},
|
// {field: 'order.source', title: __('Order.source')},
|
||||||
{field: 'orderb.customer', title: __('Order.customer'), operate: false},
|
{field: 'orderb.customer', title: __('Order.customer'), operate: 'like'},
|
||||||
{field: 'orderb.tel', title: __('Order.tel'), operate: 'like'},
|
{field: 'orderb.tel', title: __('Order.tel'), operate: 'like'},
|
||||||
{field: 'orderb.address', title: __('Order.address'), operate: false, table: table, class: 'autocontent', formatter: Table.api.formatter.content},
|
{field: 'orderb.address', title: __('Order.address'), operate: false, table: table, class: 'autocontent', formatter: Table.api.formatter.content},
|
||||||
|
|
||||||
{field: 'orderb.item_title', title: __('Order.item_title'), operate: false},
|
{field: 'orderb.item_title', title: __('Order.item_title'), operate: 'like'},
|
||||||
{field: 'orderb.detail', title: __('Order.detail'), operate: false, table: table, class: 'autocontent', formatter: Table.api.formatter.content},
|
{field: 'orderb.detail', title: __('Order.detail'), operate: false, table: table, class: 'autocontent', formatter: Table.api.formatter.content},
|
||||||
|
|
||||||
{field: 'order.images', title: __('Order.images'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.images},
|
{field: 'order.images', title: __('Order.images'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.images},
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user