1
0
mirror of https://github.com/chatopera/cosin.git synced 2025-07-28 12:32:15 +08:00

Enhance entim, visitor comments, health metric api, clean container script, etc.

This commit is contained in:
Hai Liang Wang 2019-12-05 08:43:45 +08:00
parent 2565ff8f6f
commit 15d0063ec2
30 changed files with 426 additions and 189 deletions

View File

@ -19,7 +19,7 @@ RUN chmod +x /opt/install-corretto-8.sh && /opt/install-corretto-8.sh
# install other lib and configure timezone
RUN apt-get update && \
apt-get install --no-install-recommends -y tzdata mysql-client-5.7 zip unzip vim-tiny libfontconfig1 libfreetype6 && \
apt-get install --no-install-recommends -y tzdata iputils-ping mysql-client-5.7 zip unzip vim-tiny libfontconfig1 libfreetype6 && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
DEBIAN_FRONTEND=noninteractive dpkg-reconfigure --frontend noninteractive tzdata && \
rm -rf /var/lib/apt/lists/*

View File

@ -145,6 +145,10 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>

View File

@ -239,7 +239,7 @@ public class SystemConfigController extends Handler {
systemConfig.setConsolelogo(super.saveImageFileWithMultipart(consolelogo));
}
if (favlogo != null && StringUtils.isNotBlank(
favlogo.getOriginalFilename()) && consolelogo.getOriginalFilename().lastIndexOf(".") > 0) {
favlogo.getOriginalFilename()) && favlogo.getOriginalFilename().lastIndexOf(".") > 0) {
systemConfig.setFavlogo(super.saveImageFileWithMultipart(favlogo));
}

View File

@ -242,14 +242,14 @@ public class ContactsController extends Handler {
@RequestMapping("/delete")
@Menu(type = "contacts", subtype = "contacts")
public ModelAndView delete(HttpServletRequest request, @Valid Contacts contacts, @Valid String p) {
public ModelAndView delete(HttpServletRequest request, @Valid Contacts contacts, @Valid String p, @Valid String ckind) {
if (contacts != null) {
contacts = contactsRes.findOne(contacts.getId());
contacts.setDatastatus(true); //客户和联系人都是 逻辑删除
contactsRes.save(contacts);
}
return request(super.createRequestPageTempletResponse(
"redirect:/apps/contacts/index.html?p=" + p + "&ckind=" + contacts.getCkind()));
"redirect:/apps/contacts/index.html?p=" + p + "&ckind=" + ckind));
}
@RequestMapping("/add")
@ -296,8 +296,9 @@ public class ContactsController extends Handler {
@RequestMapping("/edit")
@Menu(type = "contacts", subtype = "contacts")
public ModelAndView edit(ModelMap map, HttpServletRequest request, @Valid String id) {
public ModelAndView edit(ModelMap map, HttpServletRequest request, @Valid String id, @Valid String ckind) {
map.addAttribute("contacts", contactsRes.findOne(id));
map.addAttribute("ckindId", ckind);
return request(super.createRequestPageTempletResponse("/apps/business/contacts/edit"));
}
@ -350,7 +351,7 @@ public class ContactsController extends Handler {
@RequestMapping("/update")
@Menu(type = "contacts", subtype = "contacts")
public ModelAndView update(HttpServletRequest request, @Valid Contacts contacts) {
public ModelAndView update(HttpServletRequest request, @Valid Contacts contacts , @Valid String ckindId) {
final User logined = super.getUser(request);
final String orgi = logined.getOrgi();
Contacts data = contactsRes.findOne(contacts.getId());
@ -372,13 +373,13 @@ public class ContactsController extends Handler {
} else {
//无修改直接点击确定
return request(super.createRequestPageTempletResponse(
"redirect:/apps/contacts/index.html?ckind=" + contacts.getCkind()));
"redirect:/apps/contacts/index.html?ckind=" + ckindId));
}
} else {
logger.info("[contacts edit] errer :The same skypeid exists");
msg = "edit_contacts_fail";
return request(super.createRequestPageTempletResponse(
"redirect:/apps/contacts/index.html?ckind=" + contacts.getCkind() + "&msg=" + msg));
"redirect:/apps/contacts/index.html?ckind=" + ckindId + "&msg=" + msg));
}
@ -411,7 +412,7 @@ public class ContactsController extends Handler {
contactsRes.save(contacts);
}
return request(super.createRequestPageTempletResponse(
"redirect:/apps/contacts/index.html?ckind=" + contacts.getCkind() + "&msg=" + msg));
"redirect:/apps/contacts/index.html?ckind=" + ckindId + "&msg=" + msg));
}

View File

@ -262,25 +262,26 @@ public class CustomerController extends Handler {
@RequestMapping("/delete")
@Menu(type = "customer", subtype = "customer")
public ModelAndView delete(HttpServletRequest request, @Valid EntCustomer entCustomer, @Valid String p) {
public ModelAndView delete(HttpServletRequest request, @Valid EntCustomer entCustomer, @Valid String p, @Valid String ekind) {
if (entCustomer != null) {
entCustomer = entCustomerRes.findOne(entCustomer.getId());
entCustomer.setDatastatus(true); //客户和联系人都是 逻辑删除
entCustomerRes.save(entCustomer);
}
return request(super.createRequestPageTempletResponse("redirect:/apps/customer/index.html?p=" + p + "&ekind=" + entCustomer.getEkind()));
return request(super.createRequestPageTempletResponse("redirect:/apps/customer/index.html?p=" + p + "&ekind=" + ekind));
}
@RequestMapping("/edit")
@Menu(type = "customer", subtype = "customer")
public ModelAndView edit(ModelMap map, HttpServletRequest request, @Valid String id) {
public ModelAndView edit(ModelMap map, HttpServletRequest request, @Valid String id, @Valid String ekind) {
map.addAttribute("entCustomer", entCustomerRes.findOne(id));
map.addAttribute("ekindId", ekind);
return request(super.createRequestPageTempletResponse("/apps/business/customer/edit"));
}
@RequestMapping("/update")
@Menu(type = "customer", subtype = "customer")
public ModelAndView update(HttpServletRequest request, @Valid CustomerGroupForm customerGroupForm) {
public ModelAndView update(HttpServletRequest request, @Valid CustomerGroupForm customerGroupForm, @Valid String ekindId) {
final User logined = super.getUser(request);
EntCustomer customer = entCustomerRes.findOne(customerGroupForm.getEntcustomer().getId());
String msg = "";
@ -306,7 +307,7 @@ public class CustomerController extends Handler {
customerGroupForm.getEntcustomer().setPinyin(PinYinTools.getInstance().getFirstPinYin(customerGroupForm.getEntcustomer().getName()));
entCustomerRes.save(customerGroupForm.getEntcustomer());
return request(super.createRequestPageTempletResponse("redirect:/apps/customer/index.html?ekind=" + customerGroupForm.getEntcustomer().getEkind() + "&msg=" + msg));
return request(super.createRequestPageTempletResponse("redirect:/apps/customer/index.html?ekind=" + ekindId + "&msg=" + msg));
}
@RequestMapping("/imp")

View File

@ -319,6 +319,7 @@ public class IMController extends Handler {
data.setWlsid(sid);
data.setWlsystem_name(system_name);
data.setName(username + '@' + company_name);
data.setShares("all");
data.setPinyin(PinYinTools.getInstance().getFirstPinYin(username));
contactsRes.save(data);

View File

@ -96,11 +96,11 @@ public class AgentSummaryController extends Handler{
list.add(cb.equal(root.get("process").as(boolean.class), 0)) ;
list.add(cb.notEqual(root.get("channel").as(String.class), MainContext.ChannelType.PHONE.toString())) ;
try {
if(!StringUtils.isBlank(begin) && begin.matches("[\\d]{4}-[\\d]{2}-[\\d]{2} [\\d]{2}:[\\d]{2}:[\\d]{2}")){
list.add(cb.greaterThanOrEqualTo(root.get("createtime").as(Date.class), MainUtils.dateFormate.parse(begin))) ;
if(!StringUtils.isBlank(begin) && begin.matches("[\\d]{4}-[\\d]{2}-[\\d]{2}")){
list.add(cb.greaterThanOrEqualTo(root.get("createtime").as(Date.class),MainUtils.simpleDateFormat.parse(begin)));
}
if(!StringUtils.isBlank(end) && end.matches("[\\d]{4}-[\\d]{2}-[\\d]{2} [\\d]{2}:[\\d]{2}:[\\d]{2}")){
list.add(cb.lessThanOrEqualTo(root.get("createtime").as(Date.class), MainUtils.dateFormate.parse(end))) ;
if(!StringUtils.isBlank(end) && end.matches("[\\d]{4}-[\\d]{2}-[\\d]{2}")){
list.add(cb.lessThanOrEqualTo(root.get("createtime").as(Date.class),MainUtils.dateFormate.parse(end + " 23:59:59")));
}
} catch (ParseException e) {
e.printStackTrace();

View File

@ -102,10 +102,10 @@ public class ProcessedSummaryController extends Handler{
}
try {
if(!StringUtils.isBlank(begin) && begin.matches("[\\d]{4}-[\\d]{2}-[\\d]{2}")) {
list.add(cb.greaterThanOrEqualTo(root.get("createtime").as(Date.class), MainUtils.simpleDateFormat.parse(begin))) ;
list.add(cb.greaterThanOrEqualTo(root.get("createtime").as(Date.class), MainUtils.simpleDateFormat.parse(begin)));
}
if(!StringUtils.isBlank(end) && end.matches("[\\d]{4}-[\\d]{2}-[\\d]{2}")){
list.add(cb.lessThanOrEqualTo(root.get("createtime").as(Date.class), MainUtils.dateFormate.parse(end + " 23:59:59")));
list.add(cb.lessThanOrEqualTo(root.get("createtime").as(Date.class),MainUtils.dateFormate.parse(end + " 23:59:59")));
}
} catch (Exception e) {
e.printStackTrace();

View File

@ -502,7 +502,7 @@ public class UserProxy {
*
* @param user
*/
public void processAffiliates(final User user, final Map<String, String> skills, final Organ organ) {
public void processAffiliates(final User user, final Organ organ) {
if (organ == null) {
return;
}
@ -513,15 +513,13 @@ public class UserProxy {
user.getAffiliates().add(organ.getId());
if (organ.isSkill()) skills.put(organ.getId(), organ.getName());
// 获得子部门
List<Organ> y = organRes.findByOrgiAndParent(user.getOrgi(), organ.getId());
for (Organ x : y) {
try {
// 递归调用
processAffiliates(user, skills, x);
processAffiliates(user, x);
} catch (Exception e) {
logger.error("processAffiliates", e);
}
@ -544,9 +542,12 @@ public class UserProxy {
// 添加直属部门到organs
final Organ o = organRes.findOne(organ.getOrgan());
user.getOrgans().put(organ.getOrgan(), o);
if (o.isSkill()) {
skills.put(o.getId(), o.getName());
}
// 添加部门及附属部门
processAffiliates(user, skills, o);
processAffiliates(user, o);
}
user.setSkills(skills);

View File

@ -512,6 +512,8 @@ input,textarea{
border: 1px solid #DDDDDD;
float: left;
min-width: 25px;
max-width: 400px;
word-break: break-all;
}
.chatting-left div.chat-content *{
background-color: #EDEDED !important;

View File

@ -418,7 +418,7 @@ input,textarea{
position: absolute;
right: 5px;
width:70px;
top:5px;
top:9px;
}
.mobile-chat-bottom .send-btn{
width: 96px;
@ -467,8 +467,8 @@ input,textarea{
}
.mobile-chat-bottom #message {
position: absolute;
left: 45px;
width: calc(100% - 130px);
left: 80px;
width: calc(100% - 160px);
border:1px solid #cccccc;
font-size:16px;
height:40px;

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -126,7 +126,7 @@
<div class="col-lg-4" style="text-align:right;position: relative;">
<div class="layui-input-block">
<div class="layui-box layui-upload-button">
<input type="file" name="favlogo" accept="image/ico, image/gif, image/jpeg, image/png" lay-ext="jpg|png|gif" class="layui-upload-file" onchange="$('#favlogo_img').html($(this).val());">
<input type="file" name="favlogo" accept="image/ico, image/icon, image/gif, image/jpeg, image/png" lay-ext="jpg|png|ico|icon|gif" class="layui-upload-file" onchange="$('#favlogo_img').html($(this).val());">
<span class="layui-upload-icon"><i class="layui-icon"></i>上传图片</span>
</div>
</div>

View File

@ -318,7 +318,7 @@
</div>
</div>
</div>
<div class="ukefu-webim-tl">2、自定义LOGO</div>
<div class="ukefu-webim-tl">2、自定义LOGO 建议尺寸220*60</div>
<div class="box-item" style="position: relative;padding-bottom: 40px">
<span class="ukefu-logo">
<img id="webim_show" src="<#if inviteData?? && inviteData.consult_dialog_logo??>/res/image.html?id=${inviteData.consult_dialog_logo?url}<#else>/images/logo2.png</#if>" style="height:40px;">
@ -333,7 +333,7 @@
</div>
</div>
<div class="ukefu-webim-tl">3、自定义客服图标</div>
<div class="ukefu-webim-tl">3、自定义客服图标 建议尺寸80*80</div>
<div class="box-item" style="position: relative;padding-bottom: 40px">
<span class="ukefu-logo">
<img id="agent_show" src="<#if inviteData?? && inviteData.consult_dialog_headimg??>/res/image.html?id=${inviteData.consult_dialog_headimg?url}<#else>/images/agent.png</#if>" style="height:40px;">

View File

@ -166,7 +166,7 @@
</div>
<div class="ukefu-webim-prop">
<div class="ukefu-webim-tl">7、自定义访客邀请框背景图片</div>
<div class="ukefu-webim-tl">7、自定义访客邀请框背景图片 建议尺寸273*230</div>
<div class="box-item" style="position: relative;">
<span class="ukefu-logo">
<img id="invite_show" src="<#if inviteData?? && inviteData.consult_invite_bg??>/res/image.html?id=${inviteData.consult_invite_bg?url}<#else>/im/img/webwxgetmsgimg.jpg</#if>" style="height:175px;">

View File

@ -140,7 +140,7 @@
</div>
<div class="ukefu-webim-prop">
<div class="ukefu-webim-tl">7、自定义形象图片</div>
<div class="ukefu-webim-tl">7、自定义形象图片 建议尺寸276*236</div>
<div class="box-item" style="position: relative;">
<span class="ukefu-logo">
<img id="agent_show" src="<#if inviteData?? && inviteData.dialog_ad??>/res/image.html?id=${inviteData.dialog_ad?url}<#else>/im/img/pic01.jpg</#if>" style="height:130px;">

View File

@ -2,6 +2,7 @@
<div class="uk-layui-form">
<form class="layui-form" action="/apps/contacts/update.html" method="post">
<input type="hidden" name="id" value="${contacts.id!''}">
<input type="hidden" name="ckindId" value="${ckindId!''}">
<input type="hidden" name="wluid" value="${contacts.wluid!''}">
<input type="hidden" name="wlusername" value="${contacts.wlusername!''}">
<input type="hidden" name="wlcid" value="${contacts.wlcid!''}">

View File

@ -25,7 +25,7 @@
<div class="layui-form-item">
<div class="layui-inline">
<div class="layui-input-inline" style="width: 218px;">
<input type="text" name="q" value="${q!''}" style="height: 30px;line-height: 30px;margin-top: 4px;border: 1px solid #32c24d;" placeholder="请输入联系人姓名或电话" autocomplete="off" class="layui-input">
<input type="text" id="q" name="q" value="${q!''}" style="height: 30px;line-height: 30px;margin-top: 4px;border: 1px solid #32c24d;" placeholder="请输入联系人姓名或电话" autocomplete="off" class="layui-input">
<i class="layui-icon" onclick="search.submit()" style="position: absolute;cursor: pointer;right: 3px;top: 4px;font-size: 20px;color:#32c24d;">&#xe615;</i>
</div>
</div>
@ -145,12 +145,12 @@
<i class="layui-icon">&#xe60a;</i> 详情
</a>
<#if user?? && (user.roleAuthMap[ "A02_A01_A02_B06"]?? || user.admin)>
<a href="/apps/contacts/edit.html?id=${contacts.id!''}" data-toggle="ajax" data-width="950" data-height="600" data-title="编辑联系人信息">
<a href="/apps/contacts/edit.html?id=${contacts.id!''}&ckind=${ckind!''}" data-toggle="ajax" data-width="950" data-height="600" data-title="编辑联系人信息">
<i class="layui-icon">&#xe642;</i> 编辑
</a>
</#if>
<#if user?? && (user.roleAuthMap[ "A02_A01_A02_B07"]?? || user.admin)>
<a href="/apps/contacts/delete.html?id=${contacts.id!''}" style="margin-left:10px;" data-toggle="tip" data-title="请确认是否删除联系人?">
<a href="/apps/contacts/delete.html?id=${contacts.id!''}&ckind=${ckind!''}" style="margin-left:10px;" data-toggle="tip" data-title="请确认是否删除联系人?">
<i class="layui-icon" style="color:red;">&#x1006;</i> 删除
</a>
</#if>
@ -211,7 +211,7 @@
,groups : 5 //连续显示分页数
,jump : function(data, first) {
if (!first) {
location.href = "/apps/contacts/${subtype!'index'}.html?p=" + data.curr;
location.href = "/apps/contacts/${subtype!'index'}.html?ckind=${ckind!''}&p=" + data.curr + "&q=" + $("#q").val();
}
}
});

View File

@ -2,6 +2,7 @@
<div class="uk-layui-form">
<form class="layui-form" action="/apps/customer/update.html" method="post">
<input type="hidden" name="entcustomer.id" value="${entCustomer.id!''}">
<input type="hidden" name="ekindId" value="${ekindId!''}">
<div class="layui-collapse">
<div class="layui-colla-item">
<h2 class="layui-colla-title">基本信息</h2>

View File

@ -145,14 +145,14 @@
</td>
<td style="white-space:nowrap;width:1%;" nowrap="nowrap">
<#if user?? && (user.roleAuthMap["A03_A01_A02_B07"]?? || user.admin) >
<a href="/apps/customer/edit.html?id=${entCustomer.id!''}" data-toggle="ajax" data-width="950"
<a href="/apps/customer/edit.html?id=${entCustomer.id!''}&ekind=${ekind!''}" data-toggle="ajax" data-width="950"
data-height="600" data-title="编辑用户信息">
<i class="layui-icon">&#xe642;</i>
编辑
</a>
</#if>
<#if user?? && (user.roleAuthMap["A03_A01_A02_B08"]?? || user.admin) >
<a href="/apps/customer/delete.html?id=${entCustomer.id!''}" style="margin-left:10px;" data-toggle="tip"
<a href="/apps/customer/delete.html?id=${entCustomer.id!''}&ekind=${ekind!''}" style="margin-left:10px;" data-toggle="tip"
data-title="请确认是否删除记录?">
<i class="layui-icon" style="color:red;">&#x1006;</i>
删除
@ -235,7 +235,7 @@
,groups: 5 //连续显示分页数
,jump:function(data , first){
if(!first){
location.href = "/apps/customer/${subtype!'index'}.html?p="+data.curr ;
location.href = "/apps/customer/${subtype!'index'}.html?p="+data.curr + "&ekind=${ekind!''}";
}
}
});

View File

@ -229,6 +229,7 @@
shade: 0,
content: url
});
top.$('#'+id).next().find("a.layui-layer-maxmin").click();
}
</script>
<script>

View File

@ -185,6 +185,7 @@
shade: 0,
content: url
});
top.$('#'+id).next().find("a.layui-layer-maxmin").click();
if($('#msgbox').data("msgbox") - $('.cont_'+id).data("newmsg") > 0){
$('#msgbox').data("newmsg" , $('#msgbox').data("msgbox") - $('.cont_'+id).data("newmsg")) ;
}else{

View File

@ -311,8 +311,10 @@
if(isAgentEnds){
alert("服务评价已提交,请关闭浏览器!");
isAgentEnds = false ;
service_end = true;
}
alert("服务评价已提交");
} , "id="+form.id.value+"&satislevel="+document.getElementById("satislevel_input").value +"&satiscomment="+encodeURIComponent(satisComment));
return false ;
}

View File

@ -245,12 +245,12 @@
<input type="file" name="imgFile" id="imgFile" accept="image/*" onChange="$('#imgForm').submit();$(this).val('');">
</a>
</form>
<img id="evaluation" onclick="popup('block')" src="/im/img/evaluationm.png" style="width:32px;height:32px; margin-left: 40px;margin-top: 5px;"></a>
<textarea id="message" name="content" maxlength="<#if inviteData.maxwordsnum gt 0>${inviteData.maxwordsnum}<#else>300</#if>"></textarea>
<div class="btn-push clearfix" class="tools">
<img id="facedialog" onclick="return openFaceDialog()" src="/im/img/face.png" style="width:32px;height:32px;"></a>
<a href="javascript:void(0)" onClick="sendMessage();return false;"><img src="/im/img/send.png" style="width:32px;height:32px;"></a>
</div>
<div id="faceindex" style="display:none;height:200px;position: absolute;bottom: 0px;width:100%;overflow-x:auto;">
<table class="ke-table" cellpadding="0" cellspacing="0" border="0" style="min-width:100%;">
<tbody>
@ -268,16 +268,199 @@
</div>
</div>
</div>
<#if sessionConfig?? && sessionConfig.satisfaction?? && sessionConfig.satisfaction>
<!--调查问卷弹框-->
<div class="dialogWrap" id="dialogWrap" style="display: none;height: auto;margin:0px;top:0;left: 0;border:none;width: 100%;height: 100%;background-color:#fff;overflow: auto">
<div class="dialogCon">
<form id="commentContent" onSubmit="return submitForm(this)">
<input type="hidden" name="id" id="agentserviceid" name="agentserviceid">
<div style="width: 100%;height: 100%;overflow:auto;">
<h2 class="diaHeader clearfix" style="width: 90%;margin: 0 auto;">
<span>评价</span>
<hr style="width: 100%;">
</h2>
<p class="title" style="width: 90%;margin: 10px auto 0;">您是否对此次服务满意?</p>
<!--评价-->
<div style="width: 90%;margin: 20px auto">
<span style="font-weight: 600;font-size: 16px;">评价:</span>
<span style="position: relative;top: 10px">
<div style="width: 100%;height: auto;margin-bottom: 15px">
<#assign defaultvalue = "">
<#if commentList??>
<#list commentList as comment>
<div style="margin-bottom:15px;width: 188px">
<input type="radio" name="satislevel" value="${comment.code!''}" <#if comment_index == 0>checked="checked"</#if> id="dic_${comment.id!''}" onclick="document.getElementById('satislevel_input').value = this.value">
<label for="dic_${comment.id!''}" class="radio">${comment.name!''}</label>
</div>
<#if defaultvalue == "">
<#assign defaultvalue = comment.code>
</#if>
</#list>
</#if>
<input type="hidden" id="satislevel_input" name="t" value="${defaultvalue}">
</div>
</span>
</div>
<div style="width: 90%;margin: 20px auto">
<span style="font-weight: 600;font-size: 16px;">意见:</span>
<input type="hidden" id="comment_input" name="t">
<span style="position: relative;top: 10px">
<div style="width: 100%;height: auto;margin-bottom: 15px">
<#if commentItemList??>
<#list commentItemList as item>
<div style="margin-bottom:15px;width: 188px">
<input type="radio" name="comment" id="item_${item.id!''}" value="${item.id!''}" contentname="${item.name!''}" onclick="selectOther(this.getAttribute('contentname'),this.value)">
<label for="item_${item.id!''}" class="radio" style="margin-right: 0px">
${item.name!''}
</label>
</div>
</#list>
<textarea name="comment" id="othertxt" placeholder="请输入意见(最大长度为200个字符)" class="layui-textarea" style="resize:none;display: none;height: 85px; width:100%;background: #f7f7f7;border-color: #ccc;font-size: 14px;outline: none;padding-left: 10px;border-radius: 2px;" maxlength="200"></textarea>
</#if>
</div>
</span>
</div>
<div style="width: 100%;height: 85px"></div>
<!--按钮-->
<p class="submitBtnWrap" style="background:#fff;position: fixed;bottom: 0px;left:0px;width: 100%;height:100px;padding-right: 0px;margin-bottom: 0px;z-index: 10">
<input type="submit" class="btn submitBtn" id="submitBtn" style="width: 85% !important;display: block;margin: 0 auto;" value="提 交">
</p>
</div>
</form>
</div>
</div>
</#if>
<script>
var service_end = false;
// 调查问卷
var diaShade = document.getElementById('diaShade');
var dialogWrap = document.getElementById('dialogWrap');
function popup(para) {
diaShade.style.display = para;
dialogWrap.style.display = para;
}
function selectOther(name,value){
var otherTxt = document.getElementById('othertxt');
if (name == "其他"){
otherTxt.style.display="block"
}else{
otherTxt.style.display="none";
}
document.getElementById("comment_input").value = value;
}
var R3Ajax = {
ajax:function(opt){
var xhr = this.createXhrObject();
xhr.onreadystatechange = function(){
if(xhr.readyState!=4) return ;
(xhr.status===200 ?
opt.success(xhr.responseText,xhr.responseXML):
opt.error(xhr.responseText,xhr.status));
}
xhr.open(opt.type,opt.url,true);
if(opt.type!=='post')
opt.data=null;
else
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
opt.data = this.parseQuery(opt.data);
xhr.send(opt.data);
},
post:function(url,success,data){
var popt = {
url:url,
type:'post',
data:data,
success:success,
error:function(data){}
}
this.ajax(popt);
},
get:function(url,success){
var gopt = {
url:url,
type:'get',
success:success,
error:function(){}
}
this.ajax(gopt);
},
createXhrObject:function(){
var methods = [
function(){ return new XMLHttpRequest();},
function(){ return new ActiveXObject('Msxml2.XMLHTTP');},
function(){ return new ActiveXObject('Microsoft.XMLHTTP');}
];
for(var i=0;len=methods.length,i<len;i++){
try{
methods[i]();
}catch(e){
continue;
}
this.createXhrObject = methods[i];
return methods[i]();
}
throw new Error('Could not create an XHR object.');
},
parseQuery:function(json){
if(typeof json == 'object'){
var str = '';
for(var i in json){
str += "&"+i+"="+encodeURIComponent(json[i]);
}
return str.length==0 ? str : str.substring(1);
}else{
return json;
}
},
audioplayer:function(id, file, loop) {
var audioplayer = document.getElementById(id);
if (audioplayer != null) {
document.body.removeChild(audioplayer);
}
if (typeof(file) != 'undefined') {
if (navigator.userAgent.indexOf("MSIE") > 0) { // IE
var player = document.createElement('bgsound');
player.id = id;
player.src = file['mp3'];
player.setAttribute('autostart', 'true');
if (loop) {
player.setAttribute('loop', 'infinite');
}
document.body.appendChild(player);
} else { // Other FF Chome Safari Opera
var player = document.createElement('audio');
player.id = id;
player.setAttribute('autoplay', 'autoplay');
if (loop) {
player.setAttribute('loop', 'loop');
}
document.body.appendChild(player);
var mp3 = document.createElement('source');
mp3.src = file['mp3'];
mp3.type = 'audio/mpeg';
player.appendChild(mp3);
}
}
}
};
function submitForm(form){
var satisComment = "";
var otherVal = document.getElementById('othertxt').value;
var comInputVal = document.getElementById("comment_input").value;
if(otherVal.length>0){
satisComment = otherVal;
}else{
satisComment = comInputVal;
}
R3Ajax.post("/im/satis.html?orgi=${orgi!''}" , function(){
document.getElementById("dialogWrap").style.display = "none" ;
alert("服务评价已提交");
} , "id="+form.id.value+"&satislevel="+document.getElementById("satislevel_input").value +"&satiscomment="+encodeURIComponent(satisComment));
return false ;
}
document.getElementById('above').scrollTop = document
.getElementById('above').scrollHeight; //滚动到 对话内容的 底部
// 参数连接
@ -299,6 +482,9 @@
service_end = true ;
//editor.readonly();
}
if(document.getElementById("agentserviceid")){
document.getElementById("agentserviceid").value = data.agentserviceid;
}
})
socket.on('message', function(data) {
var chat=document.getElementsByClassName('chatting-left').innerText;

View File

@ -9,7 +9,7 @@
content="width=device-width, maximum-scale=1.0, initial-scale=1.0,initial-scale=1.0,user-scalable=no" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<title><#if systemConfig?? && systemConfig.title?? && systemConfig.title != ''>${systemConfig.title}<#else>春松客服-全渠道智能客服</#if></title>
<link rel="shortcut icon" type="image/x-icon" href="<#if systemConfig?? && systemConfig.favlogo?? && systemConfig.favlogo != ''>/res/image.html?id=${systemConfig.favlogo?url}<#else>/images/favicon.ico</#if>?t=${.now?long}"/>
<link rel="shortcut icon" type="image/x-icon" href="<#if systemConfig?? && systemConfig.favlogo?? && systemConfig.favlogo != ''>/res/image.html?id=${systemConfig.favlogo?url}<#else>/images/favicon.ico?t=${.now?long}</#if>"/>
<link rel="stylesheet" href="/css/flexboxgrid.min.css">
<link rel="stylesheet" type="text/css" href="/css/darktooltip.css" />
<link rel="stylesheet" href="css/layui.css">

View File

@ -11,7 +11,7 @@
历史会话<#if agentServiceList??>${agentServiceList.totalElements}</#if>
</h1>
<span>
<form class="layui-form" name="search" action="/service/history/index.html" method="get" style="float: left;margin-right:5px">
<form class="layui-form" name="search" id="search" action="/service/history/index.html" method="get" style="float: left;margin-right:5px">
<div class="layui-form-item" style="width: 700px;padding-left: 5px">
<div class="layui-inline">
<div class="layui-input-inline" style="width: auto;margin-right:0px;">
@ -74,39 +74,30 @@
</#if>
</select>
<label >~</label>
<!-- <select name="allocation" id="allocation" class="layui-input ukefu-input" lay-ignore>-->
<!-- <option value="">请选择坐席</option>-->
<!-- <#if agentList??>-->
<!-- <#list agentList as useragent>-->
<!-- <option value="${useragent.id}" <#if agent?? && agent == useragent.id>selected="selected"</#if>>${useragent.uname!''}</option>-->
<!-- </#list>-->
<!-- </#if>-->
<!-- </select>-->
<select name="allocation" id="allocation" class="layui-input ukefu-input" lay-ignore>
<option value="">请先选择分类</option>
<#if servicetype=="agentno">
<#if userlist?? >
<#list userlist as user >
<#if allocation??>
<option value="${user.id}" <#if allocation?? && allocation == user.id>selected="selected"</#if>>${user.uname}</option>
<#else>
<option value="${user.id}">${user.uname}</option>
</#if>
</#list>
</#if>
<#else>
<#if deptlist?? >
<#list deptlist as dept >
<#if allocation??>
<option value="${dept.id}" <#if allocation?? && allocation == dept.id>selected="selected"</#if>>${dept.name}</option>
<#else>
<option value="${dept.id}">${dept.name}</option>
</#if>
</#list>
</#if>
</#if>
</select>
<select name="allocation" id="allocation" class="layui-input ukefu-input" lay-ignore>
<option value="">请先选择分类</option>
<#if servicetype=="agentno">
<#if userlist?? >
<#list userlist as user >
<#if allocation??>
<option value="${user.id}" <#if allocation?? && allocation == user.id>selected="selected"</#if>>${user.uname}</option>
<#else>
<option value="${user.id}">${user.uname}</option>
</#if>
</#list>
</#if>
<#elseif servicetype=="skill">
<#if deptlist?? >
<#list deptlist as dept >
<#if allocation??>
<option value="${dept.id}" <#if allocation?? && allocation == dept.id>selected="selected"</#if>>${dept.name}</option>
<#else>
<option value="${dept.id}">${dept.name}</option>
</#if>
</#list>
</#if>
</#if>
</select>
</div>
</div>
</div>
@ -193,6 +184,11 @@
var form = layui.form();
form.render(); //更新全部
});
var searchData = $("#search :input").serializeArray()
var searchCondition = "";
$.each(searchData, function() {
searchCondition += '&'+this.name+'='+this.value
});
layui.use(['laypage', 'layer'], function(){
var laypage = layui.laypage
,layer = layui.layer;
@ -203,7 +199,7 @@
,groups: 5 //连续显示分页数
,jump:function(data , first){
if(!first){
location.href = "/service/history/index.html?p="+data.curr ;
location.href = "/service/history/index.html?p="+data.curr+searchCondition;
}
}
});
@ -227,8 +223,6 @@
var currentdate = year + seperator + month + seperator + strDate;
return currentdate;
}
var start = {
format: 'YYYY-MM-DD',
max:getNowFormatDate(),//默认最大值为当前日期
@ -237,7 +231,6 @@
end.min = datas; //开始日选好后,重置结束日的最小日期
}
};
var end = {
format: 'YYYY-MM-DD',
max:getNowFormatDate(),//默认最大值为当前日期
@ -246,7 +239,6 @@
start.max = datas; //结束日选好后,重置开始日的最大日期
}
};
document.getElementById('begin').onclick = function () {
start.elem = this;
laydate(start);
@ -255,7 +247,7 @@
end.elem = this;
laydate(end);
};
function deptorservice(data){
$('#allocation').html("");
if(data=="agentno"){

View File

@ -12,7 +12,7 @@
服务小结列表<#if summaryList??>${summaryList.totalElements}</#if>
<span style="float:right;">
<div class="ukefu-bt-text-content" style="position: absolute;right: 5px;top: 0px;">
<form class="layui-form" name="search" action="/apps/agent/processed/index.html" method="get" style="float: left;margin-right:5px;">
<form class="layui-form" name="search" id="search"action="/apps/agent/processed/index.html" method="get" style="float: left;margin-right:5px;">
<div class="layui-form-item">
<div class="layui-inline" style="margin-right:0px;">
<div class="layui-input-inline" style="width: auto;margin-right:0px;">
@ -173,65 +173,74 @@
});
});
layui.use(['laypage', 'layer' , 'laydate'], function(){
var searchData = $("#search :input").serializeArray()
var searchCondition = "";
$.each(searchData, function() {
searchCondition += '&'+this.name+'='+this.value
});
layui.use(['laypage', 'layer'], function(){
var laypage = layui.laypage
,layer = layui.layer;
var laydate = layui.laydate;
function getNowFormatDate() {
var date = new Date();
var seperator = "-";
var year = date.getFullYear();
var month = date.getMonth() + 1;
var strDate = date.getDate();
if (month >= 1 && month <= 9) {
month = "0" + month;
}
if (strDate >= 0 && strDate <= 9) {
strDate = "0" + strDate;
}
var currentdate = year + seperator + month + seperator + strDate;
return currentdate;
}
var start = {
format: 'YYYY-MM-DD',
max:getNowFormatDate(),//默认最大值为当前日期
istoday: true,
choose: function (datas) {
end.min = datas; //开始日选好后,重置结束日的最小日期
}
};
var end = {
format: 'YYYY-MM-DD',
max:getNowFormatDate(),//默认最大值为当前日期
istoday: true,
choose: function (datas) {
start.max = datas; //结束日选好后,重置开始日的最大日期
}
};
document.getElementById('begin').onclick = function () {
start.elem = this;
laydate(start);
};
document.getElementById('end').onclick = function () {
end.elem = this;
laydate(end);
};
laypage({
laypage({
cont: 'page'
,pages: <#if summaryList??>${summaryList.totalPages}<#else>0</#if> //总页数
,curr:<#if summaryList??>${summaryList.number+1}<#else>0</#if>
,groups: 5 //连续显示分页数
,jump:function(data , first){
if(!first){
location.href = "/apps/agent/processed/index.html?p="+data.curr ;
location.href = "/apps/agent/processed/index.html?p="+data.curr + searchCondition;
}
}
});
});
});
layui.use('laydate', function() {
var laydate = layui.laydate;
});
function getNowFormatDate() {
var date = new Date();
var seperator = "-";
var year = date.getFullYear();
var month = date.getMonth() + 1;
var strDate = date.getDate();
if (month >= 1 && month <= 9) {
month = "0" + month;
}
if (strDate >= 0 && strDate <= 9) {
strDate = "0" + strDate;
}
var currentdate = year + seperator + month + seperator + strDate;
return currentdate;
}
var start = {
format: 'YYYY-MM-DD',
max:getNowFormatDate(),//默认最大值为当前日期
istoday: true,
choose: function (datas) {
end.min = datas; //开始日选好后,重置结束日的最小日期
}
};
var end = {
format: 'YYYY-MM-DD',
max:getNowFormatDate(),//默认最大值为当前日期
istoday: true,
choose: function (datas) {
start.max = datas; //结束日选好后,重置开始日的最大日期
}
};
document.getElementById('begin').onclick = function () {
start.elem = this;
laydate(start);
};
document.getElementById('end').onclick = function () {
end.elem = this;
laydate(end);
};
</script>

View File

@ -12,17 +12,17 @@
服务小结列表<#if summaryList??>${summaryList.totalElements}</#if>
<span style="float:right;">
<div class="ukefu-bt-text-content" style="position: absolute;right: 5px;top: 0px;">
<form class="layui-form" name="search" action="/apps/agent/summary/index.html" method="get" style="float: left;margin-right:5px;">
<form class="layui-form" name="search" id="search" action="/apps/agent/summary/index.html" method="get" style="float: left;margin-right:5px;">
<div class="layui-form-item">
<div class="layui-inline" style="margin-right:0px;">
<div class="layui-input-inline" style="width: auto;margin-right:0px;">
<label class="layui-form-label" style="width: auto;">服务时间:</label>
<div class="layui-input-inline" style="width: auto;margin-right:0px;">
<input name="begin" class="layui-input ukefu-input" placeholder="开始时间" value="${begin!''}" onclick="layui.laydate({elem: this, istime: true, format: 'YYYY-MM-DD hh:mm:ss'})">
<input name="begin" id="begin" class="layui-input ukefu-input" placeholder="开始时间" value="${begin!''}">
</div>
<label class="layui-form-label" style="width: auto;">~</label>
<div class="layui-input-inline" style="width: auto;margin-right:0px;">
<input name="end" class="layui-input ukefu-input" placeholder="结束时间" value="${end!''}" onclick="layui.laydate({elem: this, istime: true, format: 'YYYY-MM-DD hh:mm:ss'})">
<input name="end" id="end" class="layui-input ukefu-input" placeholder="结束时间" value="${end!''}">
</div>
</div>
</div>
@ -173,67 +173,70 @@
});
});
layui.use(['laypage', 'layer' , 'laydate'], function(){
var searchData = $("#search :input").serializeArray()
var searchCondition = "";
$.each(searchData, function() {
searchCondition += '&'+this.name+'='+this.value
});
layui.use(['laypage', 'layer'], function(){
var laypage = layui.laypage
,layer = layui.layer;
var laydate = layui.laydate;
function getNowFormatDate() {
var date = new Date();
var seperator = "-";
var year = date.getFullYear();
var month = date.getMonth() + 1;
var strDate = date.getDate();
if (month >= 1 && month <= 9) {
month = "0" + month;
}
if (strDate >= 0 && strDate <= 9) {
strDate = "0" + strDate;
}
var currentdate = year + seperator + month + seperator + strDate;
return currentdate;
}
var start = {
istime: true,
format: 'YYYY-MM-DD',
max:getNowFormatDate(),//默认最大值为当前日期
istoday: true,
choose: function (datas) {
end.min = datas; //开始日选好后,重置结束日的最小日期
}
};
var end = {
istime: true,
format: 'YYYY-MM-DD',
max:getNowFormatDate(),//默认最大值为当前日期
istoday: true,
choose: function (datas) {
start.max = datas; //结束日选好后,重置开始日的最大日期
}
};
document.getElementById('start_time').onclick = function () {
start.elem = this;
laydate(start);
};
document.getElementById('end_time').onclick = function () {
end.elem = this;
laydate(end);
};
laypage({
cont: 'page'
,pages: <#if summaryList??>${summaryList.totalPages}<#else>0</#if> //总页数
laypage({
cont: 'page'
,pages: <#if summaryList??>${summaryList.totalPages}<#else>0</#if> //总页数
,curr:<#if summaryList??>${summaryList.number+1}<#else>0</#if>
,groups: 5 //连续显示分页数
,jump:function(data , first){
if(!first){
location.href = "/apps/agent/summary/index.html?p="+data.curr ;
location.href = "/apps/agent/summary/index.html?p="+data.curr+searchCondition;
}
}
});
});
});
layui.use('laydate', function() {
var laydate = layui.laydate;
});
function getNowFormatDate() {
var date = new Date();
var seperator = "-";
var year = date.getFullYear();
var month = date.getMonth() + 1;
var strDate = date.getDate();
if (month >= 1 && month <= 9) {
month = "0" + month;
}
if (strDate >= 0 && strDate <= 9) {
strDate = "0" + strDate;
}
var currentdate = year + seperator + month + seperator + strDate;
return currentdate;
}
var start = {
format: 'YYYY-MM-DD',
max:getNowFormatDate(),//默认最大值为当前日期
istoday: true,
choose: function (datas) {
end.min = datas; //开始日选好后,重置结束日的最小日期
}
};
var end = {
format: 'YYYY-MM-DD',
max:getNowFormatDate(),//默认最大值为当前日期
istoday: true,
choose: function (datas) {
start.max = datas; //结束日选好后,重置开始日的最大日期
}
};
document.getElementById('begin').onclick = function () {
start.elem = this;
laydate(start);
};
document.getElementById('end').onclick = function () {
end.elem = this;
laydate(end);
};
</script>

31
scripts/clean.container.sh Executable file
View File

@ -0,0 +1,31 @@
#! /bin/bash
###########################################
#
###########################################
# constants
baseDir=$(cd `dirname "$0"`;pwd)
# functions
# main
[ -z "${BASH_SOURCE[0]}" -o "${BASH_SOURCE[0]}" = "$0" ] || return
cd $baseDir/..
CONTAINER=$1
if [[ -z $CONTAINER ]]; then
echo "No container specified"
exit 1
fi
set -x
if [[ "$(docker ps -aq -f name=^/${CONTAINER}$ 2> /dev/null)" == "" ]]; then
CONTAINER="$(docker-compose ps $CONTAINER 2> /dev/null | awk '{if (NR==3) print $1 fi}')"
if [[ -z $CONTAINER ]]; then
echo "Container \"$1\" does not exist, exiting."
exit 1
fi
fi
log=$(docker inspect -f '{{.LogPath}}' $CONTAINER 2> /dev/null)
truncate -s 0 $log