星瀚API2.0完整模型展示三层架构,客户批量新增OR修改
Controller层(batch_save(保存),batch_change(批量更改),query(批量查询))
package com.gjt.main.ext.cloud.bamp.webapi.controller;
import com.alibaba.fastjson.JSON;
import com.gjt.main.ext.cloud.bamp.webapi.handler.CustomerHandler;
import com.gjt.main.ext.cloud.bamp.webapi.model.request.ChangeRequestCustomerModel;
import com.gjt.main.ext.cloud.bamp.webapi.model.request.QueryRequestCustomerModel;
import com.gjt.main.ext.cloud.bamp.webapi.model.request.SaveRequestCustomerEntryBankModel;
import com.gjt.main.ext.cloud.bamp.webapi.model.request.SaveRequestCustomerModel;
import com.gjt.main.ext.cloud.bamp.webapi.model.response.ChangeResponseCustomerModel;
import com.gjt.main.ext.cloud.bamp.webapi.model.response.QueryResponseCustomerModel;
import com.gjt.main.ext.cloud.bamp.webapi.model.response.SaveResponseCustomerModel;
import com.gjt.main.ext.common.constants.SourceTypeConstant;
import com.gjt.main.ext.common.utils.OpenAPILogUtil;
import dm.jdbc.util.StringUtil;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dlock.DLock;
import kd.bos.dlock.DLockInfo;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.openapi.common.constant.ApiErrorCode;
import kd.bos.openapi.common.custom.annotation.*;
import kd.bos.openapi.common.result.CustomApiResult;
import kd.bos.orm.query.QFilter;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ApiController(value = "bd_customer", desc = "客户")
@ApiMapping(value = "bd_customer")
public class CustomerController implements Serializable {
private final static Log logger = LogFactory.getLog(CustomerController.class);
private static final String CUSTOMER = "bd_customer";
private SaveResponseCustomerModel.DataEntity validateModel(SaveRequestCustomerModel customerModel, DynamicObject companyOrgDynamicObject, DynamicObject groupDynamicObject, DynamicObject userDynamicObject, DynamicObject countryDynamicObject, DynamicObject admindivisionDynamicObject, DynamicObject currencyDynamicObject,Map<String, DynamicObject> bankNumberMap,Map<String, DynamicObject> currencyMap) throws Exception {
SaveResponseCustomerModel.DataEntity result = null;
long valibegin = System.currentTimeMillis();
boolean validSourceType = false;
for (Field field : SourceTypeConstant.class.getFields()) {
if (StringUtils.equals(field.get(null).toString(), customerModel.getSourcetype())) {
validSourceType = true;
break;
}
}
if (!validSourceType) {
result = CustomerHandler.buildSaveDataEntity(false, null,null, customerModel.getSourcetype(),customerModel.getSourcenumber() , "来源类型编码不合法!");
}
long valiend = System.currentTimeMillis();
if(logger.isInfoEnabled()){
logger.info("验证来源耗时==>"+(valiend - valibegin) + "ms");
}
long typeBegin = System.currentTimeMillis();
if(StringUtil.isEmpty(customerModel.getType())){
result = CustomerHandler.buildSaveDataEntity(false, null,null, customerModel.getSourcetype(),customerModel.getSourcenumber() , "伙伴类型类型不能为空!");
}
if(null == result && StringUtils.equals("4",customerModel.getType())){
if(null == result && null ==customerModel.getBizpartnerPhone()){
result = CustomerHandler.buildSaveDataEntity(false, null,null, customerModel.getSourcetype(),customerModel.getSourcenumber() , "伙伴类型类型为个人,则联系电话为必录!");
}
if(null !=customerModel.getSocietycreditcode() && !customerModel.getSocietycreditcode().isEmpty()){
if(!StringUtils.equals(customerModel.getSocietycreditcode(),customerModel.getBizpartnerPhone())){
result = CustomerHandler.buildSaveDataEntity(false, null,null, customerModel.getSourcetype(),customerModel.getSourcenumber() , "伙伴类型类型为个人,则传入的统一社会信用代码需和联系电话保持一致!");
}
}
}
long typeEnd = System.currentTimeMillis();
if(logger.isInfoEnabled()){
logger.info("验证伙伴类型耗时==>"+(typeEnd - typeBegin) + "ms");
}
long groupBegin = System.currentTimeMillis();
if (null == result && null == groupDynamicObject) {
result = CustomerHandler.buildSaveDataEntity(false, null,null, customerModel.getSourcetype(),customerModel.getSourcenumber(), "客户分类编码不合法!");
}
long groupend = System.currentTimeMillis();
if(logger.isInfoEnabled()){
logger.info("验证客户分类耗时==>"+(groupend - groupBegin) + "ms");
}
long userbegin = System.currentTimeMillis();
if (null == result && null == userDynamicObject) {
result = CustomerHandler.buildSaveDataEntity(false, null,null, customerModel.getSourcetype(),customerModel.getSourcenumber(), "人员编码不合法!");
}
long userEed = System.currentTimeMillis();
if(logger.isInfoEnabled()){
logger.info("验证人员编码耗时==>"+(userEed - userbegin) + "ms");
}
long counbegin = System.currentTimeMillis();
if(StringUtils.isNotBlank(customerModel.getCountry())){
if (null == result && null == countryDynamicObject) {
result = CustomerHandler.buildSaveDataEntity(false, null,null, customerModel.getSourcetype(),customerModel.getSourcenumber(), "国家地区编码不合法!");
}
}
long counend = System.currentTimeMillis();
if(logger.isInfoEnabled()){
logger.info("验证国家地区耗时==>"+(counend - counbegin) + "ms");
}
long curbegin = System.currentTimeMillis();
if(StringUtils.isNotBlank(customerModel.getCuregcapital())) {
if (null == result && null == currencyDynamicObject) {
result = CustomerHandler.buildSaveDataEntity(false, null, null, customerModel.getSourcetype(), customerModel.getSourcenumber(), "币别编码不合法!");
}
}
long curend = System.currentTimeMillis();
if(logger.isInfoEnabled()){
logger.info("验证币别耗时==>"+(curend - curbegin) + "ms");
}
long adminbegin = System.currentTimeMillis();
if(StringUtils.isNotBlank(customerModel.getAdmindivision())) {
if (null == result && null == admindivisionDynamicObject) {
result = CustomerHandler.buildSaveDataEntity(false, null, null, customerModel.getSourcetype(), customerModel.getSourcenumber(), "行政区划不合法!");
}
}
long adminend = System.currentTimeMillis();
if(logger.isInfoEnabled()){
logger.info("验证行政区域耗时==>"+(adminend - adminbegin) + "ms");
}
long entrybegin = System.currentTimeMillis();
if(customerModel.getEntryBank().size()>0 && customerModel.getEntryBank() !=null){
List<SaveRequestCustomerEntryBankModel> entryBankList = customerModel.getEntryBank();
for(SaveRequestCustomerEntryBankModel entryBankModel :entryBankList){
if(null == result && StringUtils.isEmpty(entryBankModel.getBank())){
result = CustomerHandler.buildSaveDataEntity(false, null, null, customerModel.getSourcetype(), customerModel.getSourcenumber(), "开户银行不能为空!");
}else{
if(null == result && null== bankNumberMap.get(entryBankModel.getBank())){
result = CustomerHandler.buildSaveDataEntity(false, null, null, customerModel.getSourcetype(), customerModel.getSourcenumber(), "开户银行编码不正确!");
}
}
if(null == result && StringUtils.isEmpty(entryBankModel.getCurrency())){
result = CustomerHandler.buildSaveDataEntity(false, null, null, customerModel.getSourcetype(), customerModel.getSourcenumber(), "银行币别不能为空!");
}else{
if(null == result && null== currencyMap.get(entryBankModel.getCurrency())){
result = CustomerHandler.buildSaveDataEntity(false, null, null, customerModel.getSourcetype(), customerModel.getSourcenumber(), "银行币别不正确!");
}
}
if(null == result && StringUtils.isEmpty(entryBankModel.getBankaccount())){
result = CustomerHandler.buildSaveDataEntity(false, null, null, customerModel.getSourcetype(), customerModel.getSourcenumber(), "银行账号不能为空!");
}
if(null == result && StringUtils.isEmpty(entryBankModel.getAccountname())){
result = CustomerHandler.buildSaveDataEntity(false, null, null, customerModel.getSourcetype(), customerModel.getSourcenumber(), "账户名称不能为空!");
}
}
}
long entryEnd = System.currentTimeMillis();
if(logger.isInfoEnabled()){
logger.info("验证银行耗时==>"+(entryEnd - entrybegin) + "ms");
}
return result;
}
private ChangeResponseCustomerModel.DataEntity validateChangeModel(ChangeRequestCustomerModel changeRequestCustomerModel) throws Exception {
ChangeResponseCustomerModel.DataEntity result = null;
boolean validSourceType = false;
for (Field field : SourceTypeConstant.class.getFields()) {
if (StringUtils.equalsIgnoreCase(field.get(null).toString(), changeRequestCustomerModel.getSourceType())) {
validSourceType = true;
break;
}
}
if (!validSourceType) {
result = CustomerHandler.buildChangeDataEntity(false, null,null, changeRequestCustomerModel.getSourceType(),changeRequestCustomerModel.getSourceNumber(), "来源类型不合法!");
}
return result;
}
@Validated
@ApiPostMapping(value = "/batch_save", desc = "批量保存")
public CustomApiResult<@ApiResponseBody("返回结果") SaveResponseCustomerModel> batchSave(@Valid @NotNull @ApiParam(value = "customerModelList") List<SaveRequestCustomerModel> customerModelList) {
Date reqDate = new Date();
SaveResponseCustomerModel messages = new SaveResponseCustomerModel();
try {
if (!customerModelList.isEmpty()) {
if(logger.isInfoEnabled()){
logger.info(this.getClass().getName()+"入参:"+ JSON.toJSONString(customerModelList));
}
if(logger.isInfoEnabled()){
logger.info("入参条数:"+customerModelList.size());
}
List<String> lockKeyList = new ArrayList<String>();
try {
Map<String, Map<String, DynamicObject>> baseDateResult = CustomerHandler.getBaseDateResult(customerModelList);
Map<String, DynamicObject> societycreditcodeMapResult = baseDateResult.get("societycreditcode");
Map<String, DynamicObject> idMapResult = baseDateResult.get("id");
Map<String,DynamicObject> orgMapRes = baseDateResult.get("org");
Map<String,DynamicObject> userMapRes = baseDateResult.get("user");
Map<String,DynamicObject> groupMapRes = baseDateResult.get("group");
Map<String,DynamicObject> standardMapRes = baseDateResult.get("standard");
Map<String,DynamicObject> countryMapRes = baseDateResult.get("country");
Map<String,DynamicObject> currencyMapRes = baseDateResult.get("currency");
Map<String,DynamicObject> admindivisionMapRes = baseDateResult.get("admindivision");
Map<String,DynamicObject> rootOrgObjMapRes = baseDateResult.get("rootOrgObj");
Map<String, DynamicObject> bankNumberMap= CustomerHandler.getBankNumberMap();
Map<String, DynamicObject> currencyMap = CustomerHandler.getCurrencyMap();
List<DynamicObject> batchAddList = new ArrayList<DynamicObject>();
List<DynamicObject> batchUpdateList = new ArrayList<DynamicObject>();
List<SaveRequestCustomerEntryBankModel> addCusBankList = new ArrayList<SaveRequestCustomerEntryBankModel>();
for (SaveRequestCustomerModel customerModel : customerModelList) {
String lockKey = "bamp-er-basedata-customer/" + customerModel.getSocietycreditcode()+customerModel.getSourcetype();
DLockInfo lockInfo = DLock.getLockInfo(lockKey);
if (null != lockInfo) {
messages.getDataEntities().add(CustomerHandler.buildSaveDataEntity(false, null, customerModel.getSocietycreditcode(),customerModel.getSourcetype(),customerModel.getSourcenumber() , "来源统一社会信用代码相同报文数据正在处理中,请稍后重试!"));
} else {
DLock lock = DLock.create(lockKey, lockKey);
lock.lock();
lockKeyList.add(lockKey);
DynamicObject companyOrgDynamicObject= orgMapRes.get(customerModel.getInternalCompany());
DynamicObject userDynamicObject = userMapRes.get(customerModel.getCreator());
DynamicObject groupDynamicObject = groupMapRes.get(customerModel.getGroup());
DynamicObject standardDynamicObject= standardMapRes.get("JBFLBZ");
DynamicObject countryDynamicObject = countryMapRes.get(customerModel.getCountry());
DynamicObject currencyDynamicObject= currencyMapRes.get(customerModel.getCuregcapital());
DynamicObject admindivisionDynamicObject = admindivisionMapRes.get(customerModel.getAdmindivision());
DynamicObject rootOrgObj= rootOrgObjMapRes.get("rootOrgObj");
long vabegin = System.currentTimeMillis();
SaveResponseCustomerModel.DataEntity validateMessage = this.validateModel(customerModel, companyOrgDynamicObject, groupDynamicObject,userDynamicObject, countryDynamicObject,admindivisionDynamicObject, currencyDynamicObject,bankNumberMap,currencyMap);
long vaend = System.currentTimeMillis();
if(logger.isInfoEnabled()){
logger.info("验证模型耗时==>"+(vaend - vabegin) + "ms");
}
if (null != validateMessage) {
messages.getDataEntities().add(validateMessage);
} else {
long vaaddbegin = System.currentTimeMillis();
DynamicObject queryCusObject = societycreditcodeMapResult.get(customerModel.getSocietycreditcode());
if(queryCusObject ==null) {
queryCusObject = BusinessDataServiceHelper.newDynamicObject(CUSTOMER);
CustomerHandler.buildCusDynamicObject(queryCusObject,customerModel,companyOrgDynamicObject, groupDynamicObject,standardDynamicObject,userDynamicObject,countryDynamicObject,admindivisionDynamicObject,currencyDynamicObject,rootOrgObj,true);
batchAddList.add(queryCusObject);
long vaaddend = System.currentTimeMillis();
if(logger.isInfoEnabled()){
logger.info("构建新增对象耗时==>"+(vaaddend - vaaddbegin) + "ms");
}
} else {
long vaupdatebegin = System.currentTimeMillis();
if (StringUtils.equals(queryCusObject.getString("ki40_sourcetype"), customerModel.getSourcetype())) {
CustomerHandler.buildCusDynamicObject(queryCusObject, customerModel,companyOrgDynamicObject, groupDynamicObject,standardDynamicObject,userDynamicObject, countryDynamicObject,admindivisionDynamicObject,currencyDynamicObject,rootOrgObj,false);
batchUpdateList.add(queryCusObject);
}else{
Map<String,List<SaveRequestCustomerEntryBankModel>> resultBankMap = CustomerHandler.isAddBankEntity(customerModel.getEntryBank(),queryCusObject.getDynamicObjectCollection("entry_bank"));
if(!resultBankMap.isEmpty()){
addCusBankList = resultBankMap.get("bankaccount");
CustomerHandler.buildCusDynamicObjectByEntity(queryCusObject, addCusBankList);
batchUpdateList.add(queryCusObject);
}else{
SaveResponseCustomerModel.DataEntity returnMessage = CustomerHandler.buildSaveDataEntity(false, null,null, customerModel.getSourcetype(),customerModel.getSourcenumber() , "来源系统类型不匹配的情况且也没有需要追加的银行信息");
messages.getDataEntities().add(returnMessage);
}
}
long vaupdateend = System.currentTimeMillis();
if(logger.isInfoEnabled()){
logger.info("构建更新对象耗时==>"+(vaupdateend - vaupdatebegin) + "ms");
}
}
}
}
}
if(!batchAddList.isEmpty()) {
long vaaddlist = System.currentTimeMillis();
messages.getDataEntities().addAll(CustomerHandler.saveCustomerDynamicObject(batchAddList, true,idMapResult));
long vaaddlistend = System.currentTimeMillis();
if(logger.isInfoEnabled()){
logger.info("批量新增耗时"+(vaaddlistend - vaaddlist) + "ms");
}
}
if(!batchUpdateList.isEmpty()) {
long vaupdatelist = System.currentTimeMillis();
messages.getDataEntities().addAll(CustomerHandler.saveCustomerDynamicObject(batchUpdateList, false,idMapResult));
long vaupdatelistend = System.currentTimeMillis();
if(logger.isInfoEnabled()){
logger.info("批量更新耗时"+(vaupdatelistend - vaupdatelist));
}
}
if(batchUpdateList.isEmpty() && batchAddList.isEmpty()){
if(logger.isInfoEnabled()){
logger.info("没有需要新增和更新的数据需要处理"+new Date());
}
}
} catch (Exception e) {
throw e;
} finally {
if(logger.isInfoEnabled()){
logger.info("进入finally"+new Date());
}
DLock.forceUnlock(lockKeyList.toArray(new String[lockKeyList.size()]));
}
}
return CustomApiResult.success(messages);
} catch (Exception e) {
if(logger.isErrorEnabled()) {
logger.error(e.toString(), e);
}
return CustomApiResult.fail(ApiErrorCode.ERROR.getStatusCode(), e.toString());
}finally{
if(logger.isInfoEnabled()){
logger.info("进入日志finally"+new Date());
}
Date resDate = new Date();
OpenAPILogUtil.record(reqDate,customerModelList,customerModelList,resDate,messages,messages.getDataEntities());
}
}
@Validated
@ApiPostMapping(value = "/batch_change", desc = "客商批量更改")
public CustomApiResult<@ApiResponseBody("返回结果") ChangeResponseCustomerModel> batchChange(@Valid @NotNull @ApiParam(value = "数据列表") List<ChangeRequestCustomerModel> changeCustomerModels) {
Date reqDate = new Date();
ChangeResponseCustomerModel messages = new ChangeResponseCustomerModel();
try {
if(logger.isInfoEnabled()) {
logger.info(this.getClass().getName() + "入参:" + JSON.toJSONString(changeCustomerModels));
}
if (!changeCustomerModels.isEmpty()) {
List<String> lockKeyList = new ArrayList<String>();
try {
Map<String, Map<String, DynamicObject>> baseDateResult = CustomerHandler.getSocieCodeResult(changeCustomerModels);
Map<String, DynamicObject> societycreditcodeMapResult = baseDateResult.get("societycreditcode");
List<DynamicObject> batchEnableList = new ArrayList<DynamicObject>();
List<DynamicObject> batchDisableList = new ArrayList<DynamicObject>();
boolean initSourceNumberMap = false;
for (ChangeRequestCustomerModel changeCustomerModel : changeCustomerModels) {
String lockKey = "bamp-er-basedata-customer/" + changeCustomerModel.getSocietycreditcode();
DLockInfo lockInfo = DLock.getLockInfo(lockKey);
if (null != lockInfo) {
messages.getDataEntities().add(CustomerHandler.buildChangeDataEntity(false, null, changeCustomerModel.getSocietycreditcode(),changeCustomerModel.getSourceType(),changeCustomerModel.getSourceNumber() , "来源统一社会信用代码相同报文数据正在处理中,请稍后重试!"));
} else {
DLock lock = DLock.create(lockKey, lockKey);
lock.lock();
lockKeyList.add(lockKey);
DynamicObject customerDynamicObject = societycreditcodeMapResult.get(changeCustomerModel.getSocietycreditcode());
ChangeResponseCustomerModel.DataEntity validateMessage = this.validateChangeModel(changeCustomerModel);
if (null != validateMessage) {
messages.getDataEntities().add(validateMessage);
} else {
if (changeCustomerModel.getEnable()) {
batchEnableList.add(customerDynamicObject);
} else {
batchDisableList.add(customerDynamicObject);
}
}
}
}
messages.getDataEntities().addAll(CustomerHandler.changeCustomerDynamicObject(batchEnableList, true));
messages.getDataEntities().addAll(CustomerHandler.changeCustomerDynamicObject(batchDisableList, false));
} catch (Exception e) {
throw e;
} finally {
DLock.forceUnlock(lockKeyList.toArray(new String[lockKeyList.size()]));
}
}
return CustomApiResult.success(messages);
} catch (Exception e) {
if(logger.isErrorEnabled()) {
logger.error(e.toString(), e);
}
return CustomApiResult.fail(ApiErrorCode.ERROR.getStatusCode(), e.toString());
}finally{
Date resDate = new Date();
OpenAPILogUtil.record(reqDate,changeCustomerModels,changeCustomerModels,resDate,messages,messages.getDataEntities());
}
}
@Validated
@ApiPostMapping(value = "/query", desc = "客户批量查询")
public CustomApiResult<@ApiResponseBody("返回结果") QueryResponseCustomerModel> query(@Valid @NotNull @ApiParam(value = "数据条件") QueryRequestCustomerModel queryRequestCustomerModel) {
Date reqDate = new Date();
QueryResponseCustomerModel result = new QueryResponseCustomerModel();
try {
result.setCurrentPage(queryRequestCustomerModel.getPageIndex());
QFilter[] qFilters = CustomerHandler.getCustomerQfilters(queryRequestCustomerModel);
Integer pageSize = queryRequestCustomerModel.getPageSize();
if(null == queryRequestCustomerModel.getPageSize()){
pageSize = CustomerHandler.CUSTOMER_SELECT_PAGE_SIZE;
}
int count = CustomerHandler.getCustomerCount(qFilters);
if (0 < count) {
result.setCount(count);
if (0 == count % pageSize) {
result.setTotalPage(count / pageSize);
} else {
result.setTotalPage(count / pageSize + 1);
}
result.setPageSize(pageSize);
}
DynamicObject[] customerDynamicObjects = CustomerHandler.getCustomerDynamicObjects(qFilters, queryRequestCustomerModel.getPageIndex(),pageSize);
if (null != customerDynamicObjects) {
for (int i = 0; i < customerDynamicObjects.length; i++) {
result.getDataEntities().add(CustomerHandler.buildCustomerDataEntity(customerDynamicObjects[i]));
}
}
return CustomApiResult.success(result);
} catch (Exception e) {
if(logger.isErrorEnabled()) {
logger.error(e.toString(), e);
}
return CustomApiResult.fail(ApiErrorCode.ERROR.getStatusCode(), e.toString());
}finally{
Date resDate = new Date();
OpenAPILogUtil.record(reqDate,queryRequestCustomerModel,null,resDate,result,result.getDataEntities());
}
}
}