You've already forked guangan
维修人员上报
This commit is contained in:
@ -4,6 +4,7 @@ namespace plugin\inspection\controller\api\auth;
|
||||
|
||||
use plugin\inspection\controller\api\Auth;
|
||||
use plugin\inspection\model\InspectionRecord;
|
||||
use plugin\ticket\model\TicketInspectionShare;
|
||||
use plugin\ticket\model\TicketTicket;
|
||||
|
||||
class Ticket extends Auth
|
||||
@ -12,15 +13,15 @@ class Ticket extends Auth
|
||||
{
|
||||
$record_id = $this->request->post('record_id');
|
||||
$record = null;
|
||||
if (!empty($record_id)) {
|
||||
if (!empty($record_id) && $record_id != 'undefined') {
|
||||
/** @var InspectionRecord $record */
|
||||
$record = InspectionRecord::mk()->where('id', $record_id)->find();
|
||||
if (empty($record)) {
|
||||
$this->error('记录不存在');
|
||||
}
|
||||
}
|
||||
$lat = $this->request->post('lat');
|
||||
$lng = $this->request->post('lng');
|
||||
$lat = $this->request->post('ticket_lat');
|
||||
$lng = $this->request->post('ticket_lng');
|
||||
$type_id = $this->request->post('type_id');
|
||||
$title = $this->request->post('title');
|
||||
$content = $this->request->post('content');
|
||||
@ -29,33 +30,25 @@ class Ticket extends Auth
|
||||
$imgs = $this->request->post('imgs');
|
||||
$ticket_work_use = $this->request->post('ticket_work_use');
|
||||
$data = [
|
||||
'uid' => $this->staff->id,
|
||||
'utype' => $this->staff->id,
|
||||
'user_id' => $this->staff->id,
|
||||
'type_id' => $type_id,
|
||||
'title' => $title,
|
||||
'content' => $content,
|
||||
'contact_name' => $this->staff->name,
|
||||
'contact_phone' => $this->staff->phone,
|
||||
'imgs' => $imgs,
|
||||
'ticket_region' => $ticket_region,
|
||||
'ticket_address' => $ticket_address,
|
||||
'lat' => $lat,
|
||||
'lng' => $lng,
|
||||
'imgs' => $imgs,
|
||||
'status' => 1,
|
||||
'state' => 0,
|
||||
'ticket_lat' => $lat,
|
||||
'ticket_lng' => $lng,
|
||||
'contact_name' => $this->staff->name,
|
||||
'contact_phone' => $this->staff->phone,
|
||||
'status' => 0,
|
||||
'work_days' => $ticket_work_use
|
||||
];
|
||||
if (!empty($record)) {
|
||||
$ticket = $record->ticket()->save($data);
|
||||
} else {
|
||||
$ticket = TicketTicket::create($data);
|
||||
$ticket = TicketInspectionShare::create($data);
|
||||
}
|
||||
$ticket->verify()->save([
|
||||
'staff_id' => $this->staff->id,
|
||||
'content' => $content,
|
||||
'imgs' => $imgs,
|
||||
'work_days' => $ticket_work_use
|
||||
]);
|
||||
$ticket->save();
|
||||
$this->success("工单创建成功", $ticket);
|
||||
}
|
||||
|
||||
|
125
plugs/think-plugs-ticket/src/controller/InspectionShare.php
Normal file
125
plugs/think-plugs-ticket/src/controller/InspectionShare.php
Normal file
@ -0,0 +1,125 @@
|
||||
<?php
|
||||
|
||||
namespace plugin\ticket\controller;
|
||||
|
||||
use plugin\ticket\model\TicketCommonReply;
|
||||
use plugin\ticket\model\TicketInspectionShare;
|
||||
use plugin\ticket\model\TicketTicket;
|
||||
use plugin\ticket\model\TicketType;
|
||||
use think\admin\Controller;
|
||||
use think\admin\helper\QueryHelper;
|
||||
use think\admin\model\SystemUser;
|
||||
|
||||
/**
|
||||
* 维修人员上报
|
||||
*/
|
||||
class InspectionShare extends Controller
|
||||
{
|
||||
/**
|
||||
* 维修人员上报列表
|
||||
* @auth true
|
||||
* @menu true
|
||||
* @return void
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
public function index()
|
||||
{
|
||||
$this->title = '维修人员上报';
|
||||
$this->type_list = TicketType::getList();
|
||||
TicketInspectionShare::mQuery()->layTable(function () {
|
||||
|
||||
}, function (QueryHelper $query) {
|
||||
$query->like(['title|content|ticket_address|contact_phone#keyword'])
|
||||
->dateBetween(['create_at'])
|
||||
->equal(['status', 'type_id']);
|
||||
$query->append(['imgs_arr', 'type_name']);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 维修人员上报详情
|
||||
* @auth true
|
||||
* @menu true
|
||||
* @return void
|
||||
*/
|
||||
public function detail()
|
||||
{
|
||||
$this->title = '维修人员上报详情';
|
||||
$where = $this->_vali([
|
||||
'id.require' => '维修人员上报ID不能为空',
|
||||
]);
|
||||
$this->vo = TicketInspectionShare::mk()->where($where)->with(['linked_ticket'])->findOrEmpty();
|
||||
if ($this->vo->isEmpty()) $this->error('维修人员上报不存在!');
|
||||
if (!$this->vo->linked_ticket_id) {
|
||||
$this->ticket_list = TicketTicket::mk()->scope(['avail'])->select();
|
||||
} else {
|
||||
$this->ticket_list = [];
|
||||
}
|
||||
$this->type_list = TicketType::getList();
|
||||
$this->user_list = SystemUser::query()->select();
|
||||
$this->common_reply_list = TicketCommonReply::query()->scope(['avail'])->select();
|
||||
$this->fetch('detail');
|
||||
}
|
||||
|
||||
public function link()
|
||||
{
|
||||
$basic_data = $this->_vali([
|
||||
'id.require' => '维修人员上报ID不能为空',
|
||||
'_type.require' => '类型不能为空',
|
||||
'content.require' => '请简要填写说明!',
|
||||
]);
|
||||
$share = TicketInspectionShare::mk()->where(['id' => $basic_data['id']])->findOrEmpty();
|
||||
if ($share->isEmpty()) $this->error('维修人员上报不存在!');
|
||||
if ($share->status !== 0) $this->error('维修人员上报已处理!');
|
||||
$ticket_id = null;
|
||||
switch ($basic_data['_type']) {
|
||||
case 'new':
|
||||
$data = $this->_vali([
|
||||
'type_id.require' => '类型不能为空',
|
||||
'user_id.require' => '请选择处理人员',
|
||||
]);
|
||||
$ticket = TicketTicket::mk()->create([
|
||||
'source_type' => 2,
|
||||
'type_id' => $data['type_id'],
|
||||
'user_type' => 'staff',
|
||||
'user_id' => $share->user_id,
|
||||
'current_admin_id' => $data['user_id'],
|
||||
'title' => $share->title,
|
||||
'content' => $share->content,
|
||||
'ticket_region' => $share->ticket_region,
|
||||
'ticket_address' => $share->ticket_address,
|
||||
'contact_name' => $share->contact_name,
|
||||
'contact_phone' => $share->contact_phone,
|
||||
'lat' => $share->lat,
|
||||
'lng' => $share->lng,
|
||||
'imgs' => $share->imgs,
|
||||
'status' => 0,
|
||||
]);
|
||||
$ticket->source = $share;
|
||||
$ticket->save();
|
||||
$ticket_id = $ticket->id;
|
||||
break;
|
||||
case 'exist':
|
||||
$data = $this->_vali([
|
||||
'ticket_id.require' => '请选择处理工单',
|
||||
]);
|
||||
$ticket = TicketTicket::mk()->where(['id' => $data['ticket_id']])->findOrEmpty();
|
||||
if ($ticket->isEmpty()) $this->error('工单不存在!');
|
||||
$ticket_id = $data['ticket_id'];
|
||||
$ticket->source = $share;
|
||||
$ticket->save();
|
||||
break;
|
||||
case 'skip':
|
||||
break;
|
||||
default:
|
||||
$this->error('参数错误');
|
||||
}
|
||||
$share->linked_ticket_id = $ticket_id;
|
||||
$share->status = 1;
|
||||
$share->content = $basic_data['content'];
|
||||
$share->save();
|
||||
$this->success('处理成功!');
|
||||
}
|
||||
}
|
259
plugs/think-plugs-ticket/src/view/inspection_share/detail.html
Normal file
259
plugs/think-plugs-ticket/src/view/inspection_share/detail.html
Normal file
@ -0,0 +1,259 @@
|
||||
<div class="layui-tab layui-tab-brief">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this">基本信息</li>
|
||||
<li>处理上报内容</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<div class="layui-tab-item layui-show">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">维修人员上报内容</div>
|
||||
<div class="layui-card-body">
|
||||
<table class="layui-table">
|
||||
<tbody class="layui-table-body">
|
||||
<tr>
|
||||
<td style="width: 120px">维修人员上报编号</td>
|
||||
<td>{$vo.id|default=""}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>维修人员上报类型</td>
|
||||
<td>{$vo.type_name|default=""}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>联系方式</td>
|
||||
<td>{$vo.contact_phone|default="未填写联系方式"}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>维修人员上报地址</td>
|
||||
<td>{$vo.ticket_address|default=""}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>维修人员上报内容</td>
|
||||
<td>{$vo.content|default=""}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>维修人员上报图片</td>
|
||||
<td>
|
||||
<div>
|
||||
{if count($vo.imgs_arr) > 0}
|
||||
{foreach $vo.imgs_arr as $img}
|
||||
<img data-tips-image src="{$img}" alt="image" style="height: 100px;">
|
||||
<span> </span>
|
||||
{/foreach}
|
||||
{else}
|
||||
无图片
|
||||
{/if}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{if $vo.ticket_lat && $vo.ticket_lng}
|
||||
<tr>
|
||||
<td>位置</td>
|
||||
<td>
|
||||
<div id="map" style="height: 320px;"></div>
|
||||
</td>
|
||||
</tr>
|
||||
{/if}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{if $vo.ticket_lat && $vo.ticket_lng}
|
||||
<script src="https://map.qq.com/api/gljs?v=1.exp&key=T6XBZ-L33CB-TMFUL-JQ4D6-MKBTK-KNBED"></script>
|
||||
<script>
|
||||
function initMap() {
|
||||
//定义地图中心点坐标
|
||||
var center = new TMap.LatLng("{$vo.ticket_lat}", "{$vo.ticket_lng}")
|
||||
//定义map变量,调用 TMap.Map() 构造函数创建地图
|
||||
var map = new TMap.Map(document.getElementById('map'), {
|
||||
center: center,//设置地图中心点坐标
|
||||
zoom: 17.2, //设置地图缩放级别
|
||||
pitch: 30, //设置俯仰角
|
||||
});
|
||||
var marker = new TMap.MultiMarker({
|
||||
map: map,
|
||||
styles: {
|
||||
// 点标记样式
|
||||
marker: new TMap.MarkerStyle({
|
||||
width: 20, // 样式宽
|
||||
height: 30, // 样式高
|
||||
anchor: { x: 10, y: 30 }, // 描点位置
|
||||
}),
|
||||
},
|
||||
geometries: [
|
||||
// 点标记数据数组
|
||||
{
|
||||
// 标记位置(纬度,经度,高度)
|
||||
position: center,
|
||||
id: 'marker',
|
||||
},
|
||||
],
|
||||
});
|
||||
}
|
||||
var mapInit = setInterval(function () {
|
||||
if (window.TMap) {
|
||||
clearInterval(mapInit)
|
||||
initMap()
|
||||
}
|
||||
}, 500)
|
||||
</script>
|
||||
{/if}
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
{if $vo.status eq 1}
|
||||
{if $vo.linked_ticket_id}
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">关联工单</div>
|
||||
<div class="layui-card-body">
|
||||
<table class="layui-table">
|
||||
<tbody class="layui-table-body">
|
||||
<tr>
|
||||
<td style="width: 120px">工单编号</td>
|
||||
<td>{$vo.linked_ticket.id|default=""}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>工单类型</td>
|
||||
<td>{$vo.linked_ticket.type_name|default=""}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>工单标题</td>
|
||||
<td>{$vo.linked_ticket.title|default=""}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>工单内容</td>
|
||||
<td>{$vo.linked_ticket.content|default=""}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{else}
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">不予处理</div>
|
||||
<div class="layui-card-body">
|
||||
<table class="layui-table">
|
||||
<tbody class="layui-table-body">
|
||||
<tr>
|
||||
<td style="width: 120px">说明</td>
|
||||
<td>{$vo.content|default=""}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
{else}
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">处理上报内容</div>
|
||||
<div class="layui-card-body">
|
||||
<form action="{:url('link')}" method="post" class="layui-form">
|
||||
<input type="hidden" name="id" value="{$vo.id}">
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label label-required">处置方式</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="_type" lay-verify="required" lay-filter="Type">
|
||||
<option value="">请选择处置方式</option>
|
||||
<option value="skip">不予处理</option>
|
||||
<option value="new">创建工单</option>
|
||||
<option value="exist">关联工单</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item exist_ticket">
|
||||
<label class="layui-form-label">关联工单</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="ticket_id" lay-search="{caseSensitive:false, fuzzy: false}">
|
||||
<option value="">请选择已有工单</option>
|
||||
{foreach $ticket_list as $ticket}
|
||||
<option value="{$ticket.id}">{$ticket.id} - {$ticket.content}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item new_ticket">
|
||||
<label class="layui-form-label">工单类型</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="type_id">
|
||||
<option value="">请选择工单类型</option>
|
||||
{foreach $type_list as $type}
|
||||
<option value="{$type.id}">{$type.name}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label label-required">说明</label>
|
||||
<div class="layui-input-block">
|
||||
<textarea name="content" placeholder="请输入处理说明" class="layui-textarea" lay-verify="required"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<div class="layui-input-block">
|
||||
<button class="layui-btn" lay-submit lay-filter="submit">提交</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
const $new = $(".new_ticket");
|
||||
const $exist = $(".exist_ticket");
|
||||
$new.hide()
|
||||
$exist.hide()
|
||||
layui.use(['form'], function () {
|
||||
var form = layui.form;
|
||||
form.on('select(Type)', function (data) {
|
||||
$new.hide()
|
||||
$exist.hide()
|
||||
switch (data.value) {
|
||||
case 'new':
|
||||
$new.show();
|
||||
break;
|
||||
case 'exist':
|
||||
$exist.show();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
});
|
||||
form.on('select(CommonReply)', function (data) {
|
||||
$("textarea[name='content']").val(data.value)
|
||||
});
|
||||
form.on('submit(submit)', function (data) {
|
||||
const field = data.field
|
||||
const _type = field._type
|
||||
switch (_type) {
|
||||
case 'new':
|
||||
if (!field.type_id) {
|
||||
layer.msg('请选择工单类型')
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case 'exist':
|
||||
if (!field.ticket_id) {
|
||||
layer.msg('请选择工单')
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
console.log(data)
|
||||
$.post("{:url('link')}", field, function (res) {
|
||||
if (res.code === 1) {
|
||||
layer.msg(res.info, {icon: 1, time: 1500}, function () {
|
||||
layer.closeAll();
|
||||
window.location.reload();
|
||||
});
|
||||
} else {
|
||||
layer.msg(res.info, {icon: 2, anim: 6, time: 3000}, function () {
|
||||
});
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
@ -0,0 +1,74 @@
|
||||
{extend name="table"}
|
||||
|
||||
{block name="button"}
|
||||
{/block}
|
||||
|
||||
{block name="content"}
|
||||
<div class="layui-tab">
|
||||
<div class="layui-row">
|
||||
<div class="layui-col">
|
||||
<div class="article_list think-bg-white">
|
||||
{include file='inspection_share/index_search'}
|
||||
<table class="layui-hide" data-url="{$request->url()}" data-target-search="form.form-search" id="userShareTable" lay-filter="userShareTable"></table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/html" id="toolbar">
|
||||
<!--{if auth("detail")}-->
|
||||
<a data-modal="{:url('detail')}?id={{ d.id }}" data-height="90%" data-width="60%" class="layui-btn layui-btn-xs layui-btn-normal" title="详情">详情</a>
|
||||
<!--{/if}-->
|
||||
<!--{if auth("move")}-->
|
||||
<!-- <a data-modal="{:url('move')}?ticket_id={{ d.id }}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs" title="流转">流转</a>-->
|
||||
<!--{/if}-->
|
||||
</script>
|
||||
{/block}
|
||||
|
||||
{block name='style'}
|
||||
<style>
|
||||
</style>
|
||||
{/block}
|
||||
|
||||
{block name='script'}
|
||||
<script>
|
||||
$(function () {
|
||||
$('#userShareTable').layTable({
|
||||
height: 'full-250',
|
||||
toolbar: true,
|
||||
sort: {field: 'create_at', type: 'desc'},
|
||||
title: '维修人员上报列表',
|
||||
cols: [[
|
||||
{field: 'create_at', title: '创建时间', width: 160, sort: true},
|
||||
{field:'title', title:'标题', width:160},
|
||||
{field:'type_name', title:'工单类型', width:120},
|
||||
{field:'content', title:'上报内容', minWidth:100},
|
||||
{field:'ticket_address', title:'上报地址', width:200, templet:function(item){
|
||||
if (item.ticket_address) {
|
||||
return `${item.ticket_region} ${item.ticket_address}`;
|
||||
} else {
|
||||
return '未填写地址';
|
||||
}
|
||||
}},
|
||||
{field: 'imgs', title: '上报图片', width: 100, templet:function(item){
|
||||
if (item.imgs) {
|
||||
return item.imgs.split("|").map((img) => {
|
||||
return laytpl('<a target="_blank" data-tips-hover data-tips-image="{{d}}"><i class="layui-icon layui-icon-picture"></i></a>').render(img)
|
||||
}).concat(' ')
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
}},
|
||||
{field:'status', title:'处理状态', width:100, templet:function(item){
|
||||
if (item.status == 0) {
|
||||
return '<span class="layui-badge layui-bg-red">未处理</span>';
|
||||
} else {
|
||||
return '<span class="layui-badge layui-bg-green">已处理</span>';
|
||||
}
|
||||
}},
|
||||
{fixed: 'right', title:'操作', toolbar: '#toolbar', width:200}
|
||||
]],
|
||||
page: true
|
||||
})
|
||||
})
|
||||
</script>
|
||||
{/block}
|
@ -0,0 +1,43 @@
|
||||
<fieldset>
|
||||
<legend>条件搜索</legend>
|
||||
<form class="layui-form layui-form-pane form-search" action="{:request()->url()}" onsubmit="return false" method="get" autocomplete="off">
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">关键字</label>
|
||||
<div class="layui-input-inline">
|
||||
<input name="keyword" value="{:input('get.keyword')}" placeholder="标题、内容、地址、电话" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">工单类型</label>
|
||||
<div class="layui-input-inline">
|
||||
<select class="layui-select" name="type_id">
|
||||
<option value=''>-- 全部 --</option>
|
||||
{foreach $type_list as $type}
|
||||
<option value='{$type.id}'>{$type.name}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">创建时间</label>
|
||||
<div class="layui-input-inline">
|
||||
<input data-date-range name="create_at" value="{:input('get.create_at')}" placeholder="请选择创建时间" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-inline">
|
||||
<label class="layui-form-label">回复状态</label>
|
||||
<div class="layui-input-inline">
|
||||
<select class="layui-select" name="status">
|
||||
<option value=''>-- 全部 --</option>
|
||||
<option value='0'>未回复</option>
|
||||
<option value='1'>已回复</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="layui-form-item layui-inline">
|
||||
<button class="layui-btn layui-btn-primary" lay-submit lay-filter="searchData"><i class="layui-icon"></i> 搜 索</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</fieldset>
|
@ -159,8 +159,8 @@
|
||||
<select name="_type" lay-verify="required" lay-filter="Type">
|
||||
<option value="">请选择处置方式</option>
|
||||
<option value="skip">直接回复</option>
|
||||
<option value="new">新建工单</option>
|
||||
<option value="exist">已有工单</option>
|
||||
<option value="new">创建工单</option>
|
||||
<option value="exist">关联工单</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
Reference in New Issue
Block a user