1
0
mirror of https://github.com/chatopera/cosin.git synced 2025-08-01 16:38:02 +08:00
Signed-off-by: Hai Liang Wang <hai@chatopera.com>
This commit is contained in:
Hai Liang Wang 2023-09-25 10:41:48 +08:00
parent 9d703b1ad2
commit a14671b70d
6 changed files with 108 additions and 37 deletions

View File

@ -0,0 +1,50 @@
/*
* Copyright (C) 2023 Beijing Huaxia Chunsong Technology Co., Ltd.
* <https://www.chatopera.com>, Licensed under the Chunsong Public
* License, Version 1.0 (the "License"), https://docs.cskefu.com/licenses/v1.html
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.cskefu.cc.aspect;
import com.cskefu.cc.basic.MainContext;
import com.cskefu.cc.basic.MainUtils;
import com.cskefu.cc.exception.BillingQuotaException;
import com.cskefu.cc.exception.BillingResourceException;
import com.cskefu.cc.model.Contacts;
import com.cskefu.cc.model.User;
import com.cskefu.cc.proxy.LicenseProxy;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class ContactsAspect {
private final static Logger logger = LoggerFactory.getLogger(ContactsAspect.class);
@Autowired
private LicenseProxy licenseProxy;
@Before("execution(* com.cskefu.cc.persistence.repository.ContactsRepository.save(..))")
public void beforeSave(final JoinPoint joinPoint) throws BillingResourceException, BillingQuotaException {
final Contacts contacts = (Contacts) joinPoint.getArgs()[0];
logger.info("[save] before contacts id {}", contacts.getId());
if (StringUtils.isBlank(contacts.getId())) {
// 执行配额扣除
licenseProxy.writeDownResourceUsageInStore(MainContext.BillingResource.CONTACT, 1);
contacts.setId(MainUtils.getUUID());
} else {
// update existed user
}
}
}

View File

@ -1,21 +1,22 @@
/*
* Copyright (C) 2023 Beijing Huaxia Chunsong Technology Co., Ltd.
* <https://www.chatopera.com>, Licensed under the Chunsong Public
* Copyright (C) 2023 Beijing Huaxia Chunsong Technology Co., Ltd.
* <https://www.chatopera.com>, Licensed under the Chunsong Public
* License, Version 1.0 (the "License"), https://docs.cskefu.com/licenses/v1.html
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* Copyright (C) 2018- Jun. 2023 Chatopera Inc, <https://www.chatopera.com>, Licensed under the Apache License, Version 2.0,
* Copyright (C) 2018- Jun. 2023 Chatopera Inc, <https://www.chatopera.com>, Licensed under the Apache License, Version 2.0,
* http://www.apache.org/licenses/LICENSE-2.0
* Copyright (C) 2017 优客服-多渠道客服系统, Licensed under the Apache License, Version 2.0,
* Copyright (C) 2017 优客服-多渠道客服系统, Licensed under the Apache License, Version 2.0,
* http://www.apache.org/licenses/LICENSE-2.0
*/
package com.cskefu.cc.controller.apps;
import com.cskefu.cc.basic.MainUtils;
import com.cskefu.cc.controller.Handler;
import com.cskefu.cc.exception.BillingQuotaException;
import com.cskefu.cc.exception.CSKefuException;
import com.cskefu.cc.model.*;
import com.cskefu.cc.persistence.repository.*;
@ -47,8 +48,10 @@ import org.springframework.web.servlet.ModelAndView;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.UndeclaredThrowableException;
import java.text.SimpleDateFormat;
import java.util.*;
@ -255,13 +258,11 @@ public class ContactsController extends Handler {
@RequestParam(name = "idselflocation", required = false) String selflocation) {
final User logined = super.getUser(request);
Organ currentOrgan = super.getOrgan(request);
String skypeIDReplace = contactsProxy.sanitizeSkypeId(contacts.getSkypeid());
String msg = "";
Contacts contact = contactsRes.findByskypeidAndDatastatus(skypeIDReplace, false);
// 添加数据
if (contacts.getSkypeid() != null && contact == null) {
logger.info("[save] 数据库没有相同skypeid");
try {
contacts.setId(null);
contacts.setCreater(logined.getId());
if (currentOrgan != null && StringUtils.isBlank(contacts.getOrgan())) {
@ -274,11 +275,16 @@ public class ContactsController extends Handler {
}
contactsRes.save(contacts);
msg = "new_contacts_success";
return request(super.createView(
"redirect:/apps/contacts/index.html?ckind=" + contacts.getCkind() + "&msg=" + msg));
} catch (Exception e) {
if (e instanceof UndeclaredThrowableException) {
logger.error("[save] BillingQuotaException", e);
if (StringUtils.startsWith(e.getCause().getMessage(), BillingQuotaException.SUFFIX)) {
msg = e.getCause().getMessage();
}
} else {
logger.error("[save] err", e);
}
}
msg = "new_contacts_fail";
return request(super.createView(
"redirect:/apps/contacts/index.html?ckind=" + contacts.getCkind() + "&msg=" + msg));
}

View File

@ -216,6 +216,7 @@ public class LicenseProxy {
}
}
/**
* 生成随机字符串作为服务名称
*
@ -407,6 +408,26 @@ public class LicenseProxy {
}
}
/**
* 获取在 MetaKv 中资源的已经使用的计数
*
* @param billingResource
* @return
*/
private int getResourceUsageInMetaKv(final MainContext.BillingResource billingResource) {
final String key = getResourceUsageKey(billingResource.toString());
try {
MetaKv kv = retrieveMetaKv(key);
int pre = Integer.parseInt(kv.getMetavalue());
return pre;
} catch (MetaKvNotExistException e) {
createMetaKv(key, Integer.toString(0), Constants.METAKV_DATATYPE_INT);
return 0;
} catch (MetaKvInvalidKeyException e) {
return 0;
}
}
/**
* 获得春松客服 cskefu001 产品的证书标识 ID
* 春松客服证书基本类型
@ -429,11 +450,20 @@ public class LicenseProxy {
* 执行配额变更操作
*
* @param billingResource
* @param consume
* @param unitNum
* @return
*/
public ExecuteResult writeDownResourceUsageInStore(final MainContext.BillingResource billingResource, int consume) throws BillingQuotaException, BillingResourceException {
ExecuteResult er = new ExecuteResult();
public void writeDownResourceUsageInStore(final MainContext.BillingResource billingResource,
int unitNum) throws BillingQuotaException, BillingResourceException {
// 检查是否还在体验阶段
if (billingResource == MainContext.BillingResource.CONTACT) {
int alreadyUsed = getResourceUsageInMetaKv(billingResource);
if (alreadyUsed <= 1) {
// 可以免费创建 1 个联系人
return;
}
}
// 请求操作配额
String licenseId = getLicenseIdAsCskefu001InMetaKv();
@ -442,13 +472,13 @@ public class LicenseProxy {
try {
Response resp = quotaWdClient.write(licenseId,
serverinstId, servicename, consume * BILLING_RES_QUOTA_MAPPINGS.get(billingResource));
serverinstId, servicename, unitNum * BILLING_RES_QUOTA_MAPPINGS.get(billingResource));
// 识别操作是否完成并处理
if (resp.getRc() == 0) {
final JSONObject data = (JSONObject) resp.getData();
// 配额操作成功执行计数
increResourceUsageInMetaKv(billingResource, consume);
increResourceUsageInMetaKv(billingResource, unitNum);
} else if (resp.getRc() == 1 || resp.getRc() == 2) {
throw new BillingQuotaException(BillingQuotaException.INVALID_REQUEST_BODY);
} else if (resp.getRc() == 3) {
@ -479,12 +509,7 @@ public class LicenseProxy {
logger.error("[writeDownResourceUsageInStore] error ", e);
throw new BillingQuotaException(BillingQuotaException.RESPONSE_UNEXPECTED);
}
// er.setRc(ExecuteResult.RC_ERR1);
// if (er.getRc() != ExecuteResult.RC_SUCC) {
// throw new BillingQuotaException(BillingQuotaException.NO_LICENSE_FOUND);
// }
return er;
}
}

View File

@ -79,11 +79,6 @@ include /mixins/dic.mixin.pug
label.layui-form-label 电子邮件:
.layui-input-inline(style='margin-left:5px;')
input.layui-input(type='text', name='email', lay-verify='entemail', autocomplete='off')
.layui-form-item
.layui-inline
label.layui-form-label#contacts_skypeid(style='widht:80px;') Skype ID
.layui-input-inline
input#skypeid.layui-input(type='text', name='skypeid', lay-verify='skypeid', autocomplete='off')
.layui-form-item
.layui-inline
label.layui-form-label 联系人地址:

View File

@ -103,14 +103,6 @@ block content
td #{contacts.ckind && uKeFuDic[contacts.ckind] ? uKeFuDic[contacts.ckind].name : ""}
td #{contacts.user ? contacts.user.username : ""}
td
if approachable.contains(contacts.id)
a(href="#", onclick="openDialogWinByContactid('" + contacts.id + "')")
i.layui-icon &#xe606;
| 聊天
else
a.disabled(href="#", onclick="unreachableDialogWinByContactid('" + contacts.id + "')")
i.layui-icon &#xe60f;
| 聊天
a(href="/apps/contacts/detail.pug?id=" + (contacts.id ? contacts.id : ""), style="margin-left:10px;")
i.layui-icon &#xe60a;
| 详情
@ -186,6 +178,8 @@ block content
layer.msg('联系人编辑成功', {icon: 1, time: 1500})
else if (msg && msg == 'edit_contacts_fail')
layer.msg('联系人编辑失败因为存在相同Skype ID', {icon: 2, time: 1500})
else
handleGeneralCodeInQueryPathOrApiResp(msg);
});
});

View File

@ -36,6 +36,7 @@ html(xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xm
script(src="/js/select/js/i18n/zh-CN.js")
script(src="/layui.js")
script(src="/js/cskefu.js")
script(src="/js/CSKeFu_Admin.v1.js")
script(type="text/javascript" src="/js/kindeditor/kindeditor.js")
script(type="text/javascript" src="/js/kindeditor/lang/zh-CN.js")
script(type="text/javascript" src="/js/kindeditor-suggest.js")