This commit is contained in:
xman 2025-06-16 14:43:25 +08:00
parent bcef5370b8
commit 2d871656ac
8 changed files with 108 additions and 17 deletions

View File

@ -30,6 +30,7 @@ class OrderDispatchLog
'status' => $dispatch->status,
'status_text' => $statusList[$dispatch->status],
'remark' => $remark,
'images' => $dispatch->record_images??'',
'admin_user' => $dispatch->admin_user??'系统',
];
\app\admin\model\OrderDispatchLog::create($data);

View File

@ -41,6 +41,7 @@ class AutoDispatchLogic
$worker = (new Worker())->where('id', $worker_id)->find();
$insert ['worker_name'] = $worker['name'];
$insert ['worker_tel'] = $worker['tel'];
$insert['follow'] = 1;
$orderDispatch = new OrderDispatch();
$res = $orderDispatch->allowField(true)->save($insert);
$order->status = \app\admin\model\Order::STATUS_DISPATCHED;

View File

@ -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');
if(!in_array($row->status, $this->model->btnActiveStatusList('btn_record')) ){
//正常情况,执行不到这里来,不用担心循环执行问题
$row->follow = 2;
OrderDispatch::where('id',$row->id)->update(['follow'=>2]);
}
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;
}else{
$row->btn_record = false;
}
}*/
// if($row->type == 2)
// {

View File

@ -126,10 +126,10 @@ class Dispatchrecord extends Backend
$params['need_notice'] = 0;
$params['status'] = 1;
if(!empty($params['rate'])){ //修改任务的状态
/* if(!empty($params['rate'])){ //修改任务的状态
if($dispatch->status != $params['rate']){
$dispatch->status = $params['rate'];
$dispatch->save();
$dispatch->save();*/
$groups = $this->auth->getGroups($this->auth->id);
$groupName = '';
@ -139,17 +139,18 @@ class Dispatchrecord extends Backend
}
$dispatch->admin_user = $groupName.''. $this->auth->nickname;
$dispatch->record_images = $params['images'];
$hookParams = [
'dispatch' => $dispatch,
'remark' => '人工跟进,备注内容:'.$params['remark'],
'remark' => '跟进订单,跟进内容:'.$params['remark'],
];
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->follow = 1;
}
$dispatch->record_count ++;

View File

@ -98,6 +98,18 @@
</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>
const logs = {$logs}; // 后端传入的数据,格式保持和你的一致
@ -129,9 +141,10 @@
return `
<div class="timeline-progress-item">
<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-remark">${progress.remark || '无内容'}</span>
${renderProgressImages(progress.images)}
</div>
`;
}).join('');
@ -152,4 +165,45 @@
}
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>

View File

@ -17,7 +17,7 @@
<label class="control-label col-xs-12 col-sm-2">{:__('跟进依据')}:</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">
<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">
<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>
@ -44,6 +44,7 @@
{if condition='$dispatch.type eq 1'}
<!--
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('任务进度')}:</label>
<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>
</div>
<!-- const STATUS_GOTIT = 10; //已接-->
<!-- const STATUS_PLANIT = 20; //已预约-->
<!-- const STATUS_OVERTIME = 25; //超时(过了预约时间)-->
<!-- const STATUS_CLOCK = 30; //已打卡-->
&lt;!&ndash; const STATUS_GOTIT = 10; //已接&ndash;&gt;
&lt;!&ndash; const STATUS_PLANIT = 20; //已预约&ndash;&gt;
&lt;!&ndash; const STATUS_OVERTIME = 25; //超时(过了预约时间)&ndash;&gt;
&lt;!&ndash; const STATUS_CLOCK = 30; //已打卡&ndash;&gt;
</div>
</div>
-->
<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="3"> 3天后</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>

View File

@ -16,6 +16,7 @@ use think\Hook;
class CheckOrderDispatchGotCommand extends Command
{
protected $title = '【自动派单未接单检测,五分钟未接单,重派派单】/【自动派接单五分钟未预约,重新派单】/【自动派单上门时间已到,未完成上门】,每分钟执行一次';
protected function configure()
{
$this->setName('check:dispatch-toget')
@ -27,6 +28,8 @@ class CheckOrderDispatchGotCommand extends Command
$this->_toget();
$this->_toplan();
$this->_toarrive();
$this->_tofinished();
$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;
}
}

View File

@ -123,11 +123,11 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form','layer'], function ($,
//{field: 'order.source_shop', title: __('Order.source_shop'), operate: '='},
// {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.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: 'order.images', title: __('Order.images'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.images},