first commit

This commit is contained in:
2026-07-23 09:40:36 +08:00
commit 090abf48fa
989 changed files with 145728 additions and 0 deletions
+107
View File
@@ -0,0 +1,107 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="p-page layui-form">
<h3 class="pb-3">新增跟进记录</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">客户名称</td>
<td colspan="5">{$customer_name}</td>
</tr>
<tr>
<td class="layui-td-gray">联 系 人<font>*</font></td>
<td>
<select name="contact_id" lay-verify="required" lay-reqText="请选择联系人">
<option value="">请选择</option>
{volist name=":customer_contact($customer_id)" id="v"}
<option value="{$v.id}">{$v.name}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">跟进方式<font>*</font></td>
<td>
<select name="types" lay-verify="required" lay-reqText="请选择跟进方式">
<option value="">请选择</option>
{volist name=":get_base_type_data('basic_customer',3)" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">跟进时间<font>*</font></td>
<td><input type="text" name="follow_time" readonly lay-verify="required" lay-reqText="请选择跟进时间" placeholder="请选择跟进时间" class="layui-input tool-time" data-type="datetime" data-format="yyyy-MM-dd HH:mm"></td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top">沟通内容<font>*</font></td>
<td colspan="5"><textarea name="content" placeholder="请输入沟通内容" lay-verify="required" lay-reqText="请输入沟通内容" class="layui-textarea"></textarea></td>
</tr>
<tr>
<td class="layui-td-gray">当前阶段<font>*</font></td>
<td>
<select name="stage" lay-verify="required" lay-reqText="请选择">
<option value="">请选择</option>
{volist name=":get_base_type_data('basic_customer',4)" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">销售机会</td>
<td>
<select name="chance_id">
<option value="">请选择</option>
{volist name=":customer_chance($customer_id)" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray-2">下次沟通时间<font>*</font></td>
<td><input type="text" name="next_time" readonly lay-verify="required" lay-reqText="请选择下次沟通时间" placeholder="请选择下次沟通时间" class="layui-input tool-time" data-type="datetime" data-format="yyyy-MM-dd HH:mm"></td>
</tr>
<tr>
<td class="layui-td-gray">
<div>相关附件</div>
<div><button type="button" class="layui-btn layui-btn-xs" id="uploadBtn">附件上传</button></div>
</td>
<td colspan="5">
<div class="layui-row" id="uploadBox">
<input type="hidden" data-type="file" name="file_ids" value="">
</div>
</td>
</tr>
</table>
<div class="pt-4">
<input type="hidden" name="cid" value="{$customer_id}">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','uploadPlus'];
function gouguInit() {
var form = layui.form,tool=layui.tool,uploadPlus=layui.uploadPlus;
var attachment = new uploadPlus({
"title":'上传文件',
"target":'uploadBtn',
"targetBox":'uploadBox'
});
//监听提交
form.on('submit(webform)', function (data) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000,'traceTable');
}
}
tool.post("/customer/trace/add", data.field, callback);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+104
View File
@@ -0,0 +1,104 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<form class="layui-form gg-form-bar border-t border-x" lay-filter="barsearchform">
{gt name="$is_auth" value="0"}
<div class="layui-input-inline user-name" style="width:100px;">
<input type="text" name="username" placeholder="选择跟进人" class="layui-input picker-admin" readonly />
<input type="text" name="uid" value="" style="display:none" />
</div>
{/gt}
<div class="layui-input-inline" style="width:175px;">
<input type="text" class="layui-input" id="follow_time" placeholder="下次跟进日期" readonly name="follow_time">
</div>
<div class="layui-input-inline" style="width:300px">
<input type="text" name="keywords" placeholder="关键字,沟通内容/销售机会/客户名称" class="layui-input" autocomplete="off" />
</div>
<div class="layui-input-inline" style="width:150px">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="table-search"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="table-reset">清空</button>
</div>
</form>
<table class="layui-hide" id="table_customer_trace" lay-filter="table_customer_trace"></table>
</div>
<script type="text/html" id="toolbarDemo">
<div>
<h3>跟进记录</h3>
</div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','oaPicker','laydatePlus','tablePlus'];
function gouguInit() {
var table = layui.tablePlus, tool = layui.tool, form = layui.form,laydatePlus=layui.laydatePlus;
var follow_time = new laydatePlus({'target':'follow_time'});
layui.traceTable = table.render({
elem: "#table_customer_trace"
, toolbar: "#toolbarDemo"
,url: "/customer/trace/datalist"
,page: true
,limit: 20
,cellMinWidth: 80
,is_excel: true
,height: 'full-114'
,cols: [[
{field:'id',width:80, title: 'ID号', align:'center'}
,{field:'stage_name',title: '当前阶段',width:100,align:'center'}
,{field:'content',title: '沟通内容',minWidth:300}
,{field:'chance',title: '销售机会',width:200}
,{field:'type_name',title: '跟进方式',width:80,align:'center'}
,{field:'admin_name',title: '跟进人',width:80,align:'center'}
,{field:'follow_time', title: '跟进日期',width:150,align:'center'}
,{field:'next_time', title: '下次跟进日期',width:150,align:'center',style:'color:#16b777'}
,{field:'customer',title: '关联客户',width: 300}
,{width:120,fixed:'right',title: '操作', align:'center',ignoreExport:true,templet: function(d){
var html='';
var btn1='<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详细</a>';
var btn2='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>';
var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
if(d.admin_id == login_admin){
return '<div class="layui-btn-group">'+btn1+btn2+btn3+'</div>';
}
else{
return '<div class="layui-btn-group">'+btn1+'</div>';
}
}}
]]
});
table.on('tool(table_customer_trace)',function (obj) {
var checkStatus = table.checkStatus(obj.config.id); //获取选中行状态
var data = obj.data;
if (obj.event === 'view') {
tool.side("/customer/trace/view?id="+data.id);
return;
}
if (obj.event === 'edit') {
tool.side("/customer/trace/add?id="+data.id);
return;
}
if (obj.event === 'del') {
layer.confirm('确定要删除该线索机会吗?', { icon: 3, title: '提示' }, function (index) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
obj.del();
}
}
tool.delete("/customer/trace/del", { id: data.id }, callback);
layer.close(index);
});
return;
}
});
}
</script>
{/block}
<!-- /脚本 -->
+113
View File
@@ -0,0 +1,113 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="p-page layui-form">
<h3 class="pb-3">编辑跟进记录</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">客户名称</td>
<td colspan="5">{$detail.customer}</td>
</tr>
<tr>
<td class="layui-td-gray">联 系 人<font>*</font></td>
<td>
<select name="contact_id" lay-verify="required" lay-reqText="请选择联系人">
<option value="">请选择</option>
{volist name=":customer_contact($detail.cid)" id="v"}
<option value="{$v.id}" {eq name="$v.id" value="$detail.contact_id"} selected{/eq}>{$v.name}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">跟进方式<font>*</font></td>
<td>
<select name="types" lay-verify="required" lay-reqText="请选择跟进方式">
<option value="">请选择</option>
{volist name=":get_base_type_data('basic_customer',3)" id="v"}
<option value="{$v.id}" {eq name="v.id" value="$detail.types"} selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">跟进时间<font>*</font></td>
<td><input type="text" name="follow_time" value="{$detail.follow_time|date='Y-m-d H:i'}" readonly lay-verify="required" lay-reqText="请选择跟进时间" placeholder="请选择跟进时间" class="layui-input tool-time" data-type="datetime" data-format="yyyy-MM-dd HH:mm"></td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top">沟通内容<font>*</font></td>
<td colspan="5"><textarea name="content" placeholder="请输入沟通内容" lay-verify="required" lay-reqText="请输入沟通内容" class="layui-textarea">{$detail.content}</textarea></td>
</tr>
<tr>
<td class="layui-td-gray">当前阶段<font>*</font></td>
<td>
<select name="stage" lay-verify="required" lay-reqText="请选择">
<option value="">请选择</option>
{volist name=":get_base_type_data('basic_customer',4)" id="v"}
<option value="{$v.id}" {eq name="v.id" value="$detail.stage"} selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray">销售机会</td>
<td>
<select name="chance_id">
<option value="">请选择</option>
{volist name=":customer_chance($detail.cid)" id="v"}
<option value="{$v.id}" {eq name="$v.id" value="$detail.chance_id"} selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray-2">下次沟通时间<font>*</font></td>
<td><input type="text" name="next_time" value="{$detail.next_time|date='Y-m-d H:i'}" readonly lay-verify="required" lay-reqText="请选择下次沟通时间" placeholder="请选择下次沟通时间" class="layui-input tool-time" data-type="datetime" data-format="yyyy-MM-dd HH:mm"></td>
</tr>
<tr>
<td class="layui-td-gray">
<div>相关附件</div>
<div><button type="button" class="layui-btn layui-btn-xs" id="uploadBtn">附件上传</button></div>
</td>
<td colspan="5">
<div class="layui-row" id="uploadBox">
<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
{notempty name="$detail.file_ids"}
{volist name="$detail.file_array" id="vo"}
<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo)}</div>
{/volist}
{/notempty}
</div>
</td>
</tr>
</table>
<div class="pt-4">
<input type="hidden" name="id" value="{$detail.id}">
<input type="hidden" name="cid" value="{$detail.cid}">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','uploadPlus'];
function gouguInit() {
var form = layui.form,tool=layui.tool,uploadPlus=layui.uploadPlus;
var attachment = new uploadPlus({
"title":'上传文件',
"target":'uploadBtn',
"targetBox":'uploadBox'
});
//监听提交
form.on('submit(webform)', function (data) {
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000,'traceTable');
}
}
tool.post("/customer/trace/add", data.field, callback);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+57
View File
@@ -0,0 +1,57 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-page">
<h3 class="pb-3">跟进记录详细</h3>
<table class="layui-table layui-table-form">
<tr>
<td class="layui-td-gray">客户名称</td>
<td colspan="5">{$detail.customer}</td>
</tr>
<tr>
<td class="layui-td-gray">联 系 人</td>
<td>{$detail.contact}</td>
<td class="layui-td-gray">跟进方式</td>
<td>{$detail.types_name}</td>
<td class="layui-td-gray">跟进时间</td>
<td>{$detail.follow_time|date='Y-m-d H:i'}</td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top">沟通内容</td>
<td colspan="5">{$detail.content}</td>
</tr>
<tr>
<td class="layui-td-gray">当前阶段</td>
<td>{$detail.stage_name}</td>
<td class="layui-td-gray">销售机会</td>
<td>{$detail.chance}</td>
<td class="layui-td-gray-2">下次沟通时间</td>
<td>{$detail.next_time|date='Y-m-d H:i'}</td>
</tr>
{notempty name="$detail.file_ids"}
<tr>
<td class="layui-td-gray">相关附件</td>
<td colspan="5">
<div class="layui-row" id="uploadBox">
{volist name="$detail.file_array" id="vo"}
<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo,'view')}</div>
{/volist}
</div>
</td>
</tr>
{/notempty}
</table>
</div>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
}
</script>
{/block}
<!-- /脚本 -->