package com.java110.user.smo.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.java110.common.log.LoggerEngine; import com.java110.common.util.ProtocolUtil; import com.java110.entity.user.BoCust; import com.java110.entity.user.BoCustAttr; import com.java110.entity.user.Cust; import com.java110.feign.base.IPrimaryKeyService; import com.java110.user.dao.IUserServiceDao; import com.java110.user.smo.IUserServiceSMO; import com.java110.core.base.smo.BaseServiceSMO; import org.apache.commons.lang.math.NumberUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 用户服务信息管理业务信息实现 * Created by wuxw on 2017/4/5. */ @Service("userServiceSMOImpl") @Transactional public class UserServiceSMOImpl extends BaseServiceSMO implements IUserServiceSMO { @Autowired IPrimaryKeyService iPrimaryKeyService; @Autowired IUserServiceDao iUserServiceDao; //新增用户 private final static String USER_ACTION_ADD = "ADD"; //新增用户 private final static String USER_ACTION_KIP = "KIP"; //新增用户 private final static String USER_ACTION_DEL = "DEL"; /** * 保存用户信息 * * @param userInfoJson 入参为用户信息json传 * @return */ public String saveUser(String userInfoJson) throws Exception{ JSONObject reqUserJSON = null; try { reqUserJSON = this.simpleValidateJSON(userInfoJson); //boCust增加Action (动作) if (reqUserJSON.containsKey("boCust")) { JSONObject boCust = reqUserJSON.getJSONObject("boCust"); boCust.put("state", USER_ACTION_ADD); } //boCustAttr增加Action(动作) if (reqUserJSON.containsKey("boCustAttr")) { JSONArray boCustAttrs = reqUserJSON.getJSONArray("boCustAttr"); for (int attrIndex = 0; attrIndex < boCustAttrs.size(); attrIndex++) { JSONObject boCustAttr = boCustAttrs.getJSONObject(attrIndex); boCustAttr.put("state", USER_ACTION_ADD); } } } catch (RuntimeException e) { //返回异常信息 return e.getMessage(); } return soUserService(reqUserJSON); } /** * 所有服务处理类 * * @param userInfoJson * @return */ public String soUserService(JSONObject userInfoJson) throws Exception{ LoggerEngine.debug("用户服务操作客户入参:" + userInfoJson); JSONObject paramJson = new JSONObject(); JSONObject resultInfo = null; //存放生成的custId 主键为 custId-1 71000010100 Map custIdKey = new HashMap(); if (userInfoJson == null){ throw new IllegalArgumentException("soUserService 入参 为空"+userInfoJson); } // 客户信息处理 if(userInfoJson.containsKey("boCust")){ JSONArray boCusts = userInfoJson.getJSONArray("boCust"); JSONObject boCustObj = new JSONObject(); boCustObj.put("boCust",boCusts); String returnSaveBoCust = this.soBoCust(boCustObj.toJSONString(),custIdKey); if(!ProtocolUtil.validateReturnJson(returnSaveBoCust,paramJson)){ throw new RuntimeException("保存 bo_cust 失败:"+boCustObj+(paramJson != null && paramJson.containsKey("RESULT_MSG")?paramJson.getString("RESULT_MSG"):"未知异常")); } resultInfo = paramJson.getJSONObject("RESULT_INFO"); } //客户属性信息处理 if(userInfoJson.containsKey("boCustAttr")){ JSONArray boCustAttrs = userInfoJson.getJSONArray("boCustAttr"); //首先对custId 进行处理 if(custIdKey != null && custIdKey.size() > 0 ){ for(int boCustAttrIndex = 0 ; boCustAttrIndex < boCustAttrs.size();boCustAttrIndex++){ JSONObject boCustAttr = boCustAttrs.getJSONObject(boCustAttrIndex); boCustAttr.put("custId",custIdKey.get("custId"+boCustAttr.getString("custId"))); } } JSONObject boCustAttrObj = new JSONObject(); boCustAttrObj.put("boCustAttr",boCustAttrs); String returnSaveBoCustAttr = soBoCustAttr(boCustAttrObj.toJSONString()); if(!ProtocolUtil.validateReturnJson(returnSaveBoCustAttr,paramJson)){ throw new RuntimeException("保存 bo_cust 失败:"+boCustAttrObj+(paramJson != null && paramJson.containsKey("RESULT_MSG")?paramJson.getString("RESULT_MSG"):"未知异常")); } } return ProtocolUtil.createResultMsg(ProtocolUtil.RETURN_MSG_SUCCESS,"成功",resultInfo); } /** * { * boCust:[{},{}] * } * 客户信心处理 * * * @param boCusts * @return 成功 会带上处理客户的客户ID * {'RESULT_CODE':'0000','RESULT_MSG':'成功','RESULT_INFO':{'custId':'7000123,718881991}} * @throws Exception */ public String soBoCust(String boCusts) throws Exception{ return soBoCust(boCusts,null); } /** * 将生成的custId 封装在map中返回 * ... * custIdKey.put("custId-1","710020404040"); * * ... * * key 为 custId 加原前的值 * * custIdKey 如果为空不做处理 * @param boCusts 客户信息 * @param custIdKey custIdKeymap * @return * @throws Exception */ public String soBoCust(String boCusts,Map custIdKey) throws Exception{ // 将 jsonArray 转为list 对象 JSONObject jsonObject = JSONObject.parseObject(boCusts); JSONObject resultInfo = new JSONObject(); String custIds = ""; List boCustList = JSONObject.parseArray(jsonObject.getJSONArray("boCust").toJSONString(), BoCust.class); Collections.sort(boCustList); //保存数据 for(BoCust boCust : boCustList){ // for(int boCustIndex = 0 ; boCustIndex < boCustList.size();boCustIndex++){ // BoCust boCust = boCustList.get(boCustIndex); String custId = boCust.getBoId(); //如果客户ID小于0 ,则自己生成客户ID,这个只有在有 主键生成服务时使用,否则为了防止出错,需要前段调用时需要生成custId if(StringUtils.isBlank(custId) || custId.startsWith("-") ){ /*JSONObject data = new JSONObject(); data.put("type","CUST_ID"); //要求接口返回 {"RESULT_CODE":"0000","RESULT_INFO":{"user_id":"7020170411000041"},"RESULT_MSG":"成功"} String custIdJSONStr = iPrimaryKeyService.queryPrimaryKey(data.toJSONString()); JSONObject custIdJSONTmp = JSONObject.parseObject(custIdJSONStr); if(custIdJSONTmp.containsKey("RESULT_CODE") && ProtocolUtil.RETURN_MSG_SUCCESS.equals(custIdJSONTmp.getString("RESULT_CODE")) && custIdJSONTmp.containsKey("RESULT_INFO")){ //从接口生成custId custId = NumberUtils.toInt(custIdJSONTmp.getJSONObject("RESULT_INFO").getString("CUST_ID"),-1); }*/ custId = this.queryPrimaryKey(iPrimaryKeyService,"CUST_ID"); //将 新生成的custId保存至 map中 custId-1 custId-2 主键方式存入 if(custIdKey != null){ custIdKey.put("custId"+boCust.getCustId(),custId); } } boCust.setCustId(custId); //保存数据至 bo_cust 表中 int saveBoCustFlag = iUserServiceDao.saveDataToBoCust(boCust); if(saveBoCustFlag < 1){ // 如果没有保存成功,抛出异常,有事物 回退事物 throw new RuntimeException("保存过程[bo_cust]数据失败,印象记录数为"+saveBoCustFlag+",boCust : "+boCust); } //建档 处理 实例数据 int saveCustFlag = 0; if("ADD".equals(boCust.getState())){ /* List boCustsTmp = boCustList; //在增加之间首先要判断是否有相应删的动作 // for(BoCust boCustTmp : boCustsTmp){ for(int boCustTmpIndex = boCustIndex+1;boCustTmpIndex < boCustsTmp.size();boCustTmpIndex++){ BoCust boCustTmp = boCustsTmp.get(boCustTmpIndex); if(StringUtils.isNotBlank(boCust.getCustId()) && boCust.getCustId().equals(boCustTmp.getCustId()) &&"DEL".equals(boCustTmp.getState())){ //先调用删除客户信息 saveCustFlag = iUserServiceDao.deleteDataToCust(boCust.convert()); if(saveCustFlag < 1){ throw new RuntimeException("删除实例[cust]数据失败,影响记录数为"+saveCustFlag+", cust : "+boCust.convert()); } //则把已经删除过的从list中删除,以防重复删除 boCustList.remove(boCustTmp); } }*/ saveCustFlag = iUserServiceDao.saveDataToCust(boCust.convert()); }else if("DEL".equals(boCust.getState())){ saveCustFlag = iUserServiceDao.deleteDataToCust(boCust.convert()); }else if("KIP".equals(boCust.getState())){ //按理这里到不了,KIP表示实例数据不变,所以这里默认写成1 认为是成功 saveCustFlag = 1; }else{ //这里单独抛出异常,不走下面统一异常抛出,是为了说明更具体点 throw new RuntimeException("入参错误boCust 的 state 目前只支持 [ADD,DEL,KIP] , boCust : " +boCust); } if(saveCustFlag < 1){ throw new RuntimeException("保存实例[cust]数据失败,影响记录数为"+saveCustFlag+", cust : "+boCust.convert()); } custIds +=","+custId; } //去除第一个逗号 if (custIds.length()>0){ custIds = custIds.substring(1); } resultInfo.put("custId",custIds); return ProtocolUtil.createResultMsg(ProtocolUtil.RETURN_MSG_SUCCESS,"成功",resultInfo); } /** * 注意在调用这个接口时,相应的客户信息必须存在 * * * 客户信息属性处理 * 协议: *{ * boCustAttr:[{},{}] * } * @param boCustAttrs * @return * @throws Exception */ @Override public String soBoCustAttr(String boCustAttrs) throws Exception { //这里可以加入基本客户信息是否存在的校验,暂时没有必要实现 // 将 jsonArray 转为list 对象 JSONObject jsonObject = JSONObject.parseObject(boCustAttrs); List boCustAttrList = JSONObject.parseArray(jsonObject.getJSONArray("boCustAttr").toJSONString(), BoCustAttr.class); //先拍个序 先处理DEL 再处理ADD Collections.sort(boCustAttrList); //保存数据 for(BoCustAttr boCustAttr : boCustAttrList) { //保存数据至 bo_cust_attr 表中 int saveBoCustAttrFlag = iUserServiceDao.saveDataToBoCustAttr(boCustAttr); if(saveBoCustAttrFlag < 1){ // 如果没有保存成功,抛出异常,有事物 回退事物 throw new RuntimeException("保存过程[bo_cust_attr]数据失败,印象记录数为"+saveBoCustAttrFlag+",boCustAttr : "+boCustAttr); } //建档 处理 实例数据 int saveCustAttrFlag = 0; if("ADD".equals(boCustAttr.getState())){ saveCustAttrFlag = iUserServiceDao.saveDataToCustAttr(boCustAttr.convert()); }else if("DEL".equals(boCustAttr.getState())){ saveCustAttrFlag = iUserServiceDao.deleteDataToCustAttr(boCustAttr.convert()); }else if("KIP".equals(boCustAttr.getState())){ //按理这里到不了,KIP表示实例数据不变,所以这里默认写成1 认为是成功 saveCustAttrFlag = 1; }else{ //这里单独抛出异常,不走下面统一异常抛出,是为了说明更具体点 throw new RuntimeException("入参错误boCustAttr 的 state 目前只支持 [ADD,DEL,KIP] , boCust : " +boCustAttr); } if(saveCustAttrFlag < 1){ throw new RuntimeException("保存实例[cust_attr]数据失败,影响记录数为"+saveCustAttrFlag+", cust : "+boCustAttr.convert()); } } return ProtocolUtil.createResultMsg(ProtocolUtil.RETURN_MSG_SUCCESS,"成功",null); } /** * 查询客户信息 * 包括 基本信息cust 和 属性信息 custAttr * @param cust * @return * @throws Exception */ public String queryCust(Cust cust) throws Exception{ LoggerEngine.debug("客户信息查询入参:" + cust); if(cust == null || StringUtils.isBlank(cust.getCustId()) ){ throw new IllegalArgumentException("客户信息查询入参为空,custId 为空 "+cust); } Cust newCust = iUserServiceDao.queryDataToCust(cust); if(newCust == null){ return ProtocolUtil.createResultMsg(ProtocolUtil.RETURN_MSG_ERROR,"未找到用户信息",null); } return ProtocolUtil.createResultMsg(ProtocolUtil.RETURN_MSG_SUCCESS,"成功",JSONObject.parseObject(JSONObject.toJSONString(newCust))); } public IPrimaryKeyService getiPrimaryKeyService() { return iPrimaryKeyService; } public void setiPrimaryKeyService(IPrimaryKeyService iPrimaryKeyService) { this.iPrimaryKeyService = iPrimaryKeyService; } public IUserServiceDao getiUserServiceDao() { return iUserServiceDao; } public void setiUserServiceDao(IUserServiceDao iUserServiceDao) { this.iUserServiceDao = iUserServiceDao; } }