mirror of
https://github.com/chatopera/cosin.git
synced 2025-08-01 16:38:02 +08:00
https://gitee.com/cskefu/cskefu/issues/I836RO enable contact as billing resource
Signed-off-by: Hai Liang Wang <hai@chatopera.com>
This commit is contained in:
parent
9d703b1ad2
commit
a14671b70d
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,21 +1,22 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2023 Beijing Huaxia Chunsong Technology Co., Ltd.
|
* Copyright (C) 2023 Beijing Huaxia Chunsong Technology Co., Ltd.
|
||||||
* <https://www.chatopera.com>, Licensed under the Chunsong Public
|
* <https://www.chatopera.com>, Licensed under the Chunsong Public
|
||||||
* License, Version 1.0 (the "License"), https://docs.cskefu.com/licenses/v1.html
|
* License, Version 1.0 (the "License"), https://docs.cskefu.com/licenses/v1.html
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* 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
|
* 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
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
*/
|
*/
|
||||||
package com.cskefu.cc.controller.apps;
|
package com.cskefu.cc.controller.apps;
|
||||||
|
|
||||||
import com.cskefu.cc.basic.MainUtils;
|
import com.cskefu.cc.basic.MainUtils;
|
||||||
import com.cskefu.cc.controller.Handler;
|
import com.cskefu.cc.controller.Handler;
|
||||||
|
import com.cskefu.cc.exception.BillingQuotaException;
|
||||||
import com.cskefu.cc.exception.CSKefuException;
|
import com.cskefu.cc.exception.CSKefuException;
|
||||||
import com.cskefu.cc.model.*;
|
import com.cskefu.cc.model.*;
|
||||||
import com.cskefu.cc.persistence.repository.*;
|
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.HttpServletRequest;
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
import jakarta.validation.Valid;
|
import jakarta.validation.Valid;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.UndeclaredThrowableException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@ -255,13 +258,11 @@ public class ContactsController extends Handler {
|
|||||||
@RequestParam(name = "idselflocation", required = false) String selflocation) {
|
@RequestParam(name = "idselflocation", required = false) String selflocation) {
|
||||||
final User logined = super.getUser(request);
|
final User logined = super.getUser(request);
|
||||||
Organ currentOrgan = super.getOrgan(request);
|
Organ currentOrgan = super.getOrgan(request);
|
||||||
String skypeIDReplace = contactsProxy.sanitizeSkypeId(contacts.getSkypeid());
|
|
||||||
String msg = "";
|
String msg = "";
|
||||||
Contacts contact = contactsRes.findByskypeidAndDatastatus(skypeIDReplace, false);
|
|
||||||
|
|
||||||
// 添加数据
|
// 添加数据
|
||||||
if (contacts.getSkypeid() != null && contact == null) {
|
try {
|
||||||
logger.info("[save] 数据库没有相同skypeid");
|
contacts.setId(null);
|
||||||
contacts.setCreater(logined.getId());
|
contacts.setCreater(logined.getId());
|
||||||
|
|
||||||
if (currentOrgan != null && StringUtils.isBlank(contacts.getOrgan())) {
|
if (currentOrgan != null && StringUtils.isBlank(contacts.getOrgan())) {
|
||||||
@ -274,11 +275,16 @@ public class ContactsController extends Handler {
|
|||||||
}
|
}
|
||||||
contactsRes.save(contacts);
|
contactsRes.save(contacts);
|
||||||
msg = "new_contacts_success";
|
msg = "new_contacts_success";
|
||||||
|
} catch (Exception e) {
|
||||||
return request(super.createView(
|
if (e instanceof UndeclaredThrowableException) {
|
||||||
"redirect:/apps/contacts/index.html?ckind=" + contacts.getCkind() + "&msg=" + msg));
|
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(
|
return request(super.createView(
|
||||||
"redirect:/apps/contacts/index.html?ckind=" + contacts.getCkind() + "&msg=" + msg));
|
"redirect:/apps/contacts/index.html?ckind=" + contacts.getCkind() + "&msg=" + msg));
|
||||||
}
|
}
|
||||||
|
@ -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
|
* 获得春松客服 cskefu001 产品的证书标识 ID
|
||||||
* 春松客服证书基本类型
|
* 春松客服证书基本类型
|
||||||
@ -429,11 +450,20 @@ public class LicenseProxy {
|
|||||||
* 执行配额变更操作
|
* 执行配额变更操作
|
||||||
*
|
*
|
||||||
* @param billingResource
|
* @param billingResource
|
||||||
* @param consume
|
* @param unitNum
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public ExecuteResult writeDownResourceUsageInStore(final MainContext.BillingResource billingResource, int consume) throws BillingQuotaException, BillingResourceException {
|
public void writeDownResourceUsageInStore(final MainContext.BillingResource billingResource,
|
||||||
ExecuteResult er = new ExecuteResult();
|
int unitNum) throws BillingQuotaException, BillingResourceException {
|
||||||
|
|
||||||
|
// 检查是否还在体验阶段
|
||||||
|
if (billingResource == MainContext.BillingResource.CONTACT) {
|
||||||
|
int alreadyUsed = getResourceUsageInMetaKv(billingResource);
|
||||||
|
if (alreadyUsed <= 1) {
|
||||||
|
// 可以免费创建 1 个联系人
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 请求操作配额
|
// 请求操作配额
|
||||||
String licenseId = getLicenseIdAsCskefu001InMetaKv();
|
String licenseId = getLicenseIdAsCskefu001InMetaKv();
|
||||||
@ -442,13 +472,13 @@ public class LicenseProxy {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
Response resp = quotaWdClient.write(licenseId,
|
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) {
|
if (resp.getRc() == 0) {
|
||||||
final JSONObject data = (JSONObject) resp.getData();
|
final JSONObject data = (JSONObject) resp.getData();
|
||||||
|
|
||||||
// 配额操作成功,执行计数
|
// 配额操作成功,执行计数
|
||||||
increResourceUsageInMetaKv(billingResource, consume);
|
increResourceUsageInMetaKv(billingResource, unitNum);
|
||||||
} else if (resp.getRc() == 1 || resp.getRc() == 2) {
|
} else if (resp.getRc() == 1 || resp.getRc() == 2) {
|
||||||
throw new BillingQuotaException(BillingQuotaException.INVALID_REQUEST_BODY);
|
throw new BillingQuotaException(BillingQuotaException.INVALID_REQUEST_BODY);
|
||||||
} else if (resp.getRc() == 3) {
|
} else if (resp.getRc() == 3) {
|
||||||
@ -479,12 +509,7 @@ public class LicenseProxy {
|
|||||||
logger.error("[writeDownResourceUsageInStore] error ", e);
|
logger.error("[writeDownResourceUsageInStore] error ", e);
|
||||||
throw new BillingQuotaException(BillingQuotaException.RESPONSE_UNEXPECTED);
|
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -79,11 +79,6 @@ include /mixins/dic.mixin.pug
|
|||||||
label.layui-form-label 电子邮件:
|
label.layui-form-label 电子邮件:
|
||||||
.layui-input-inline(style='margin-left:5px;')
|
.layui-input-inline(style='margin-left:5px;')
|
||||||
input.layui-input(type='text', name='email', lay-verify='entemail', autocomplete='off')
|
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-form-item
|
||||||
.layui-inline
|
.layui-inline
|
||||||
label.layui-form-label 联系人地址:
|
label.layui-form-label 联系人地址:
|
||||||
|
@ -103,14 +103,6 @@ block content
|
|||||||
td #{contacts.ckind && uKeFuDic[contacts.ckind] ? uKeFuDic[contacts.ckind].name : ""}
|
td #{contacts.ckind && uKeFuDic[contacts.ckind] ? uKeFuDic[contacts.ckind].name : ""}
|
||||||
td #{contacts.user ? contacts.user.username : ""}
|
td #{contacts.user ? contacts.user.username : ""}
|
||||||
td
|
td
|
||||||
if approachable.contains(contacts.id)
|
|
||||||
a(href="#", onclick="openDialogWinByContactid('" + contacts.id + "')")
|
|
||||||
i.layui-icon 
|
|
||||||
| 聊天
|
|
||||||
else
|
|
||||||
a.disabled(href="#", onclick="unreachableDialogWinByContactid('" + contacts.id + "')")
|
|
||||||
i.layui-icon 
|
|
||||||
| 聊天
|
|
||||||
a(href="/apps/contacts/detail.pug?id=" + (contacts.id ? contacts.id : ""), style="margin-left:10px;")
|
a(href="/apps/contacts/detail.pug?id=" + (contacts.id ? contacts.id : ""), style="margin-left:10px;")
|
||||||
i.layui-icon 
|
i.layui-icon 
|
||||||
| 详情
|
| 详情
|
||||||
@ -186,6 +178,8 @@ block content
|
|||||||
layer.msg('联系人编辑成功', {icon: 1, time: 1500})
|
layer.msg('联系人编辑成功', {icon: 1, time: 1500})
|
||||||
else if (msg && msg == 'edit_contacts_fail')
|
else if (msg && msg == 'edit_contacts_fail')
|
||||||
layer.msg('联系人编辑失败,因为存在相同Skype ID', {icon: 2, time: 1500})
|
layer.msg('联系人编辑失败,因为存在相同Skype ID', {icon: 2, time: 1500})
|
||||||
|
else
|
||||||
|
handleGeneralCodeInQueryPathOrApiResp(msg);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -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="/js/select/js/i18n/zh-CN.js")
|
||||||
script(src="/layui.js")
|
script(src="/layui.js")
|
||||||
script(src="/js/cskefu.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/kindeditor.js")
|
||||||
script(type="text/javascript" src="/js/kindeditor/lang/zh-CN.js")
|
script(type="text/javascript" src="/js/kindeditor/lang/zh-CN.js")
|
||||||
script(type="text/javascript" src="/js/kindeditor-suggest.js")
|
script(type="text/javascript" src="/js/kindeditor-suggest.js")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user