Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -4,24 +4,32 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
import com.vci.ubcs.code.bo.CodeTemplateAttrSqlBO;
import com.vci.ubcs.code.constant.FrameWorkDefaultValueConstant;
import com.vci.ubcs.code.constant.MdmBtmTypeConstant;
import com.vci.ubcs.code.dto.CodeDeleteBatchDTO;
import com.vci.ubcs.code.dto.CodeOrderDTO;
import com.vci.ubcs.code.dto.datapush.BaseModelDTO;
import com.vci.ubcs.code.entity.*;
import com.vci.ubcs.code.enumpack.*;
import com.vci.ubcs.code.mapper.CodeOsbtmtypeMapper;
import com.vci.ubcs.code.mapper.CodeWupinMapper;
import com.vci.ubcs.code.mapper.CommonsMapper;
import com.vci.ubcs.code.service.*;
import com.vci.ubcs.code.vo.CodeKeyAttrRepeatVO;
import com.vci.ubcs.code.vo.pagemodel.*;
import com.vci.ubcs.code.vo.pagemodel.UITableFieldVO;
import com.vci.ubcs.code.vo.pagemodel.UITablePageVO;
import com.vci.ubcs.code.vo.pagemodel.*;
import com.vci.ubcs.omd.feign.IAttributeClient;
import com.vci.ubcs.omd.feign.IBtmTypeClient;
import com.vci.ubcs.omd.feign.IEnumClient;
import com.vci.ubcs.omd.feign.IRevisionRuleClient;
import com.vci.ubcs.omd.vo.BtmTypeAttributeVO;
import com.vci.ubcs.omd.vo.BtmTypeVO;
import com.vci.ubcs.omd.vo.EnumVO;
import com.vci.ubcs.omd.vo.RevisionRuleVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.revision.model.BaseModel;
import com.vci.ubcs.starter.revision.model.TreeWrapperOptions;
import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
import com.vci.ubcs.starter.web.constant.QueryOptionConstant;
@@ -31,25 +39,44 @@
import com.vci.ubcs.starter.web.enumpck.VciFieldTypeEnum;
import com.vci.ubcs.starter.web.pagemodel.*;
import com.vci.ubcs.starter.web.toolmodel.DateConverter;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.starter.web.util.VciDateUtil;
import com.vci.ubcs.starter.web.util.VciQueryWrapperForDO;
import com.vci.ubcs.starter.web.util.WebUtil;
import com.vci.ubcs.starter.web.util.*;
import com.vci.ubcs.system.entity.DictBiz;
import com.vci.ubcs.system.entity.Menu;
import com.vci.ubcs.system.feign.IDictBizClient;
import com.vci.ubcs.system.feign.ISysClient;
import com.vci.ubcs.system.user.entity.User;
import com.vci.ubcs.system.user.feign.IUserClient;
import net.logstash.logback.encoder.org.apache.commons.lang3.StringUtils;
import oracle.sql.TIMESTAMP;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springblade.core.cache.utils.CacheUtil;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springframework.beans.BeanUtils;
import org.springblade.core.tool.utils.StringPool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.Cache;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import static com.vci.ubcs.code.constant.FrameWorkLangCodeConstant.DATA_OID_NOT_EXIST;
@@ -71,23 +98,37 @@
    */
   @Resource
   private CodeClstemplateServiceImpl templateService;
   /**
    * 模板的服务
    */
   @Resource
   private CodeOsbtmtypeMapper codeOsbtmtypeMapper;
   @Resource
   private CodeOsattributeServiceImpl attributeService;
   private IAttributeClient attributeClient;
   /**
    * 生成编码的服务
    */
   @Resource
   private MdmProductCodeService productCodeService;
   /**
    * 可输可选的服务
    */
   @Resource
   IDictBizClient iDictBizClient;
   /**
    * 系统的服务
    */
   @Resource
   ISysClient iSysClient;
   /**
    * 用户服务
    */
   @Resource
   IUserClient iUserClient;
   /**
    * 字典的服务
    */
   @Resource
   IDictBizClient iDictBizClient;
   IEnumClient enumClient;
   /**
    * 公式的服务
    */
@@ -111,6 +152,16 @@
    */
   @Autowired
   private ICodePhaseAttrService phaseAttrService;
   /**
    * 业务类型的服务
    */
   @Autowired
   private IBtmTypeClient btmTypeClient;
   /**
    * 版本规则的服务
    */
   @Resource
   private IRevisionRuleClient revisionRuleClient;
//
   /**
    * 通用查询
@@ -171,6 +222,14 @@
    * 空格
    */
   public static final String SPACE = " ";
   /**
    * 缓存key
    */
   public static final String BTM_INIT_CACHE = "ubcs-code:btm";
   /**
    *
    */
   public static final String BTM_NAME = "btm:name";
   /**
    * 密级的字段
@@ -244,19 +303,19 @@
    */
   @Override
   public List<KeyValue> listComboboxItems(CodeClassifyTemplateAttrVO attrVO) {
      List<KeyValue> comboboxKVs = null;
      List<KeyValue> comboboxKVs = new ArrayList<>();
      if (StringUtils.isNotBlank(attrVO.getEnumString())) {
         comboboxKVs = JSONObject.parseArray(attrVO.getEnumString(), KeyValue.class);
      } else {
//         comboboxKVs = enumService.getEnum(attrVO.getEnumid());
//          Dict dict = new Dict();
//         dict.setParentId(Long.valueOf(attrVO.getEnumid()));
         R<List<DictBiz>> list = iDictBizClient.getList(attrVO.getEnumId());
         R<List<EnumVO>> list = enumClient.getList(attrVO.getEnumId());
         if(list.isSuccess()){
            for (DictBiz datum : list.getData()) {
            for (EnumVO datum : list.getData()) {
               KeyValue keyValue = new KeyValue();
               keyValue.setKey(datum.getDictKey());
               keyValue.setValue(datum.getDictValue());
               keyValue.setKey(datum.getItemValue());
               keyValue.setValue(datum.getItemName());
               comboboxKVs.add(keyValue);
            }
         }
@@ -268,16 +327,21 @@
    *
    * @param baseModelDTO 数据传输对象
    */
   @Transactional
   @Override
   public void changeStatus(BaseModelDTO baseModelDTO) {
      VciBaseUtil.alertNotNull(baseModelDTO, "数据信息", baseModelDTO.getOid(), "主键", baseModelDTO.getBtmname(), "业务类型", baseModelDTO.getLcStatus(), "目标状态");
      List<String> oids = VciBaseUtil.str2List(baseModelDTO.getOid());
//      List<ClientBusinessObject> cboList = boService.selectCBOByOidCollection(oids, baseModelDTO.getBtmname());
      //插个点 业务类型完成后需要修改
      QueryWrapper<CodeOsbtmtypeEntity> wrapper = new QueryWrapper<>();
      wrapper.eq("BTMNAME",baseModelDTO.getBtmname());
      wrapper.in("OID",oids);
      List<CodeOsbtmtypeEntity> cboList = codeOsbtmtypeMapper.selectList(wrapper);
//      QueryWrapper<BtmTypeVO> wrapper = new QueryWrapper<>();
      List<BaseModel> baseModels = new ArrayList<>();
      baseModels = selectByTypeAndOid(baseModelDTO.getBtmname(), baseModelDTO.getOid());
      if(baseModels.size() == 0){
         throw new VciBaseException("未查询到相关数据。");
      }
      // 待完善
      List<BtmTypeVO> cboList =  null;  // btmTypeClient.selectList(wrapper);
      //还需要修改allCode的生命周期
//      Map<String, String> conditionMap = new HashMap<>();
      QueryWrapper<CodeAllCode> allCodeWrapper = new QueryWrapper<>();
@@ -289,16 +353,25 @@
//      List<ClientBusinessObject> codeCbos = boService.queryCBO(MdmBtmTypeConstant.CODE_ALL_CODE, conditionMap);
      // 回收需要业务数据删除
      if (CodeDefaultLC.TASK_BACK.getValue().equals(baseModelDTO.getLcStatus())) {
//         BatchCBO batchCBO = new BatchCBO();
//         batchCBO.getDeleteCbos().addAll(cboList);
         codeOsbtmtypeMapper.deleteBatchIds(cboList);
//         boService.persistenceBatch(batchCBO);
         R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(baseModelDTO.getBtmname()));
//         String referTable = listR.getData().get(0).getTableName();
         commonsMapper.deleteByTaleAndOid(listR.getData().get(0).getTableName(),VciBaseUtil.toInSql(baseModelDTO.getOid()));
         // BatchCBO batchCBO = new BatchCBO();
         // batchCBO.getDeleteCbos().addAll(cboList);
         //boService.persistenceBatch(batchCBO);
      } else {
//         lifeCycleService.transCboStatus(cboList, baseModelDTO.getLcStatus());
         for (BaseModel baseModel : baseModels) {
            baseModel.setLcStatus(baseModelDTO.getLcStatus());
         }
         updateBatchByBaseModel(baseModelDTO.getBtmname(),baseModels);
         // lifeCycleService.transCboStatus(cboList, baseModelDTO.getLcStatus());
      }
//      lifeCycleService.transCboStatus(codeCbos, baseModelDTO.getLcStatus());
      for (CodeAllCode codeCbo : codeCbos) {
         codeCbo.setLcStatus(baseModelDTO.getLcStatus());
      }
      codeAllCodeService.updateBatchById(codeCbos);
      // lifeCycleService.transCboStatus(codeCbos, baseModelDTO.getLcStatus());
   }
   /**
    * 申请单一编码
@@ -307,7 +380,7 @@
    * @return 返回编码的内容
    */
   @Override
   public String addSaveCode(CodeOrderDTO orderDTO) {
   public String addSaveCode(CodeOrderDTO orderDTO) throws Exception {
      VciBaseUtil.alertNotNull(orderDTO, "编码申请相关的属性和码段的内容都为空", orderDTO.getCodeClassifyOid(), "主题库分类的主键",
         orderDTO.getTemplateOid(), "模板的主键", orderDTO.getCodeRuleOid(), "编码规则的主键");
      CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
@@ -331,14 +404,14 @@
      switchDateAttrOnOrder(templateVO, orderDTO);
      //9.生成编码的信息
//      ClientBusinessObject cbo = boService.createCBOByBtmName(classifyFullInfo.getTopClassifyVO().getBtmtypeid());
      CodeWupin cbo = createCBOByBtmName(classifyFullInfo.getTopClassifyVO().getBtmtypeid());
      BaseModel cbo = createCBOByBtmName(classifyFullInfo.getTopClassifyVO().getBtmtypeid());
//      //默认的属性都不用从前端拷贝
//      //设置编码需要的默认属性的内容
      copyValueToCBO(classifyFullInfo, cbo, orderDTO, templateVO, false);
//      //TODO:因为默认的属性都不拷贝,目前集团码叫name,并没有从DTO拷贝到cbo里。增加一个单独处理,以后再看要不要调整
      cbo.setName(orderDTO.getName() == null ? "" : orderDTO.getName());
//      //end -- modify by lihang @20220407
      List<CodeWupin> cboList = new ArrayList<>();
      List<BaseModel> cboList = new ArrayList<>();
      //备注
      cbo.setDescription(orderDTO.getDescription());
@@ -349,8 +422,8 @@
      List<String> charList = new ArrayList<>();
      for (CodeWupin wupinEntity : cboList) {
         charList.add(wupinEntity.getId());
      for (BaseModel baseModel : cboList) {
         charList.add(baseModel.getId());
      }
      batchSaveSelectChar(templateVO, charList);
      return codeList.size() > 0 ? codeList.get(0) : "";
@@ -563,7 +636,9 @@
      //没有限制分类,但是一个模板只可能在一个业务类型里面,所以直接查询这个业务类型即可
      if (!CollectionUtils.isEmpty(conditionMap)) {
         final String[] sql = {"select count(*) from " + VciBaseUtil.getTableName(classifyFullInfo.getTopClassifyVO().getBtmtypeid()) + " t where 1 = 1 "};
         //表需要改
//         final String[] sql = {"select count(*) from " + VciBaseUtil.getTableName(classifyFullInfo.getTopClassifyVO().getBtmtypeid()) + " t where 1 = 1 "};
         final String[] sql = {"select count(*) from pl_code_wupin t where 1 = 1 "};
         conditionMap.forEach((key, value) -> {
            sql[0] += " and " + key + " = " + value;
         });
@@ -698,9 +773,9 @@
    * @param templateVO       模板的显示对象
    * @param edit             是否为修改
    */
   private void copyValueToCBO(CodeClassifyFullInfoBO classifyFullInfo, CodeWupin cbo,
   private void copyValueToCBO(CodeClassifyFullInfoBO classifyFullInfo, BaseModel cbo,
                        CodeOrderDTO orderDTO, CodeClassifyTemplateVO templateVO,
                        boolean edit) {
                        boolean edit)  {
      String fullPath = "";
      if (!CollectionUtils.isEmpty(classifyFullInfo.getParentClassifyVOs())) {
         fullPath = classifyFullInfo.getParentClassifyVOs().stream().sorted(((o1, o2) -> o2.getDataLevel().compareTo(o1.getDataLevel())))
@@ -710,8 +785,8 @@
      }
//      BeanUtils.
      BeanUtils.copyProperties(orderDTO.getData(),cbo);
      cbo.setMaterialtype(Short.valueOf("1001"));
//      BeanUtils.copyProperties(orderDTO.getData(),cbo);
//      cbo.setMaterialtype(Short.valueOf("1001"));
//      orderDTO.getData().forEach((key, value) -> {
//         if (!edit || (!checkUnAttrUnEdit(key) &&
//            !VciQueryWrapperForDO.LC_STATUS_FIELD.equalsIgnoreCase(key))) {
@@ -722,25 +797,35 @@
//            }
//         }
//      });
//      BeanMap beanMap = BeanMap.create(cbo);
//      beanMap.putAll(orderDTO.getData());
      try {
         cbo.setCodeclsfid(classifyFullInfo.getCurrentClassifyVO().getOid());
         cbo.setCodetemplateoid(templateVO.getOid());
         cbo.setCodeclsfpath(fullPath);
//         cbo.setMaterialclassify("model_type");
//         cbo.setMaterialname(orderDTO.getData().get("materialname"));
//         cbo.setShifoupihaoguanli("true");
//         cbo.setKucunwl("true");
//         cbo.setXiaoshouwl("false");
         BeanUtilForVCI.copyPropertiesIgnoreNull(BeanUtilForVCI.convertMap(BaseModel.class,orderDTO.getData()),cbo);
         Map<String,String> data = new HashMap<>();
         data.put(CODE_CLASSIFY_OID_FIELD,classifyFullInfo.getCurrentClassifyVO().getOid());
         data.put(CODE_TEMPLATE_OID_FIELD,templateVO.getOid());
         data.put(CODE_FULL_PATH_FILED,fullPath);
         cbo.setData(data);
         cbo.setOid(VciBaseUtil.getPk());
         cbo.setCreateTime(new Date());
         cbo.setLastModifyTime(new Date());
         cbo.setCreator(AuthUtil.getUser().getUserName());
         cbo.setLastModifier(AuthUtil.getUser().getUserName());
//         cbo.setCodeclsfid(classifyFullInfo.getCurrentClassifyVO().getOid());
//         cbo.setTemplateOid(templateVO.getOid());
//         cbo.setCodeclsfpath(fullPath);
         cbo.setTs(new Date());
         if (!edit && StringUtils.isBlank(orderDTO.getLcStatus())) {
            //找生命周期的起始状态,插个点,看生命周期是否需要创建
            //先写固定,后面生命周期好了在编写
            if (StringUtils.isNotBlank(cbo.getLctid())) {
//               OsLifeCycleVO lifeCycleVO = lifeCycleService.getLifeCycleById(cbo.getLctid());
//               if (lifeCycleVO != null) {
//                  cbo.setLcStatus("Editing");
////                  cbo.setLcStatus(lifeCycleVO.getStartStatus());
//               } else {
                  cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
               cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
//               }
            } else {
               cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
@@ -748,8 +833,8 @@
         }
         int secret = VciBaseUtil.getInt(cbo.getSecretGrade().toString());
         //插个点,后续看密级服务是否可用
         int secret = VciBaseUtil.getInt(String.valueOf(cbo.getSecretGrade()));
         //后续看密级服务是否可用
//         if (secret == 0 || !secretService.checkDataSecret(secret)) {
         if (secret == 0 ) {
            Integer userSecret = VciBaseUtil.getCurrentUserSecret();
@@ -770,72 +855,67 @@
    * @throws VciBaseException 初始化出错的是会抛出异常
    */
   @Override
   public CodeWupin createCBOByBtmName(String btmName)
   public BaseModel createCBOByBtmName(String btmName)
      throws VciBaseException {
      if(btmName!=null){
         btmName = btmName.trim().toLowerCase();
      }
      String userid = AuthUtil.getUser().getUserName();
//      if(!hasCreatedCbos.containsKey(btmName)){
//         if(StringUtils.isEmpty(userid)){
//            throw new VciBaseException(msgCodePrefix +"noHasUserid");
//         }
//         try {
//            hasCreatedCbos.put(btmName, createBusinessObject(btmName));
//         } catch (Exception e) {
//            logger.error("创建业务类型对象",e);
//            throw new VciBaseException(msgCodePrefix + "initBoError",new String[]{btmName});
//         }
//      }
//      ClientBusinessObject cbo = cloneClientBusinessObject(hasCreatedCbos.get(btmName));
      QueryWrapper<CodeOsbtmtypeEntity> btmWrapper = new QueryWrapper<>();
      btmWrapper.eq("ID",btmName);
      CodeOsbtmtypeEntity btmTypeVO = codeOsbtmtypeMapper.selectOne(btmWrapper);
//      OsBtmTypeVO btmTypeVO = btmService.getBtmById(boName);
      String userName = AuthUtil.getUser().getUserName();
      CodeWupin wupinEntity = new CodeWupin();
      wupinEntity.setOid(null);
//      bo.setRevisionid((new ObjectUtility()).getNewObjectID36());
//      bo.setNameoid((new ObjectUtility()).getNewObjectID36());
      wupinEntity.setBtmname(btmName);
      wupinEntity.setLastR(String.valueOf(1));
      wupinEntity.setFirstR(String.valueOf(1));
      wupinEntity.setFirstV(String.valueOf(1));
      wupinEntity.setLastV(String.valueOf(1));
      wupinEntity.setCreator(userName);
      wupinEntity.setCreateTime(new Date());
      wupinEntity.setLastModifier(userName);
      wupinEntity.setLastModifyTime(new Date());
      wupinEntity.setRevisionRule(btmTypeVO.getRevisionruleid());
      wupinEntity.setVersionRule(String.valueOf(btmTypeVO.getVersionRule()));
      if(StringUtils.isNotBlank(btmTypeVO.getRevisionruleid())){
         //插个点,需要问勇哥版本问题,展示默认为1
//         OsRevisionRuleVO revisionRuleVO = revisionRuleService.getRevisionRuleById(btmTypeVO.getRevisionruleid());
         wupinEntity.setRevisionValue("1");
      try {
         String keyPrefix = BTM_INIT_CACHE.concat(StringPool.COLON).concat(AuthUtil.getTenantId()).concat(StringPool.COLON);
//         String finalBtmName = btmName;
         Cache.ValueWrapper valueWrapper = CacheUtil.getCache(keyPrefix).get(keyPrefix.concat(String.valueOf(btmName)));
         if(valueWrapper == null){
            CacheUtil.getCache(keyPrefix).put(keyPrefix.concat(String.valueOf(btmName)), createBaseModel(btmName));
            valueWrapper = CacheUtil.getCache(keyPrefix).get(keyPrefix.concat(String.valueOf(btmName)));
         }
         return (BaseModel) valueWrapper.get();
      } catch (Exception e) {
         logger.error("创建业务类型对象",e);
         throw new VciBaseException("initBtmError",new String[]{btmName});
      }
      wupinEntity.setRevisionSeq(1);
      wupinEntity.setVersionSeq(1);
      //插个点,需要问勇哥版本问题,展示默认为1
      wupinEntity.setVersionValue("1");
      wupinEntity.setLctid("wupinLC");
      wupinEntity.setLcStatus("Editing");
      wupinEntity.setId("");
      wupinEntity.setName("");
      wupinEntity.setDescription("");
      wupinEntity.setOwner(userName);
      wupinEntity.setCheckinby(userName);
      wupinEntity.setCopyFromVersion("");
      wupinEntity.setMaterialtype((short) 1001);
      wupinEntity.setCaigouwl("true");
      wupinEntity.setShifoupihaoguanli("true");
      wupinEntity.setKucunwl("true");
      wupinEntity.setXiaoshouwl("false");
      wupinEntity.setPassing("true");
//      String userName = AuthUtil.getUser().getUserName();
//      CodeWupin wupinEntity = new CodeWupin();
//      wupinEntity.setOid(VciBaseUtil.getPk());
////      bo.setRevisionid((new ObjectUtility()).getNewObjectID36());
////      bo.setNameoid((new ObjectUtility()).getNewObjectID36());
//      wupinEntity.setBtmname(btmName);
//      wupinEntity.setLastR(String.valueOf(1));
//      wupinEntity.setFirstR(String.valueOf(1));
//      wupinEntity.setFirstV(String.valueOf(1));
//      wupinEntity.setLastV(String.valueOf(1));
//      wupinEntity.setCreator(userName);
//      wupinEntity.setCreateTime(new Date());
//      wupinEntity.setLastModifier(userName);
//      wupinEntity.setLastModifyTime(new Date());
//      wupinEntity.setRevisionRule("numberversionrule");
//      wupinEntity.setVersionRule("0");
////      if(StringUtils.isNotBlank(btmTypeVO.getRevisionruleid())){
//         //
////         OsRevisionRuleVO revisionRuleVO = revisionRuleService.getRevisionRuleById(btmTypeVO.getRevisionruleid());
//      wupinEntity.setRevisionValue("1");
////      }
//
//      wupinEntity.setRevisionSeq(1);
//      wupinEntity.setVersionSeq(1);
//      //插个点,需要问勇哥版本问题,展示默认为1
//      wupinEntity.setVersionValue("1");
//      wupinEntity.setLctid("wupinLC");
//      wupinEntity.setLcStatus("Editing");
//      wupinEntity.setId("");
//      wupinEntity.setName("");
//      wupinEntity.setDescription("");
//      wupinEntity.setOwner(userName);
//      wupinEntity.setCheckinby(userName);
//      wupinEntity.setCopyFromVersion("");
//      wupinEntity.setMaterialtype(1001);
//      wupinEntity.setCaigouwl("true");
//      wupinEntity.setShifoupihaoguanli("true");
//      wupinEntity.setKucunwl("true");
//      wupinEntity.setXiaoshouwl("false");
//      wupinEntity.setPassing("true");
//      this.initTypeAttributeValue(wupinEntity,btmTypeVO);
      return wupinEntity;
//      return wupinEntity;
//      return cbo;
@@ -895,15 +975,15 @@
      }
   }
    @Override
    public MdmUIInfoVO getFormDefineByTemplateOid(String templateOid, String codeClassifyOid) {
   @Override
   public MdmUIInfoVO getFormDefineByTemplateOid(String templateOid, String codeClassifyOid) {
      CodeClassifyTemplateVO templateVO = templateService.getObjectHasAttrByOid(templateOid);
      MdmUIInfoVO uiInfoVO = new MdmUIInfoVO();
      uiInfoVO.setTemplateVO(templateVO);
      uiInfoVO.setFormDefineVO(wrapperFormDefineByTemplate(templateVO, codeClassifyOid));
      wrapperResemble(templateVO, uiInfoVO);
      return uiInfoVO;
    }
   }
   /**
@@ -1022,6 +1102,7 @@
      itemVO.setPrefix(attrVO.getPrefixValue());
      itemVO.setSuffix(attrVO.getSuffixValue());
      itemVO.setTooltips(attrVO.getExplain());
      itemVO.setInputTip(attrVO.getInputTip());
      itemVO.setSelectLibFlag(attrVO.getLibraryIdentification());
      //看看是否有枚举
      if ((StringUtils.isNotBlank(attrVO.getEnumString())
@@ -1224,10 +1305,10 @@
      //没有限制分类,但是一个模板只可能在一个业务类型里面,所以直接查询这个业务类型即可
      if (!CollectionUtils.isEmpty(conditionMap)) {
         Map<String, String> andConditionMap = new HashMap<>();
         andConditionMap.put("islastr", "1");
         andConditionMap.put("islastv", "1");
         andConditionMap.put("t.lastr", "1");
         andConditionMap.put("t.lastv", "1");
         if (StringUtils.isNotBlank(orderDTO.getOid())) {
            andConditionMap.put("oid", QueryOptionConstant.NOTEQUAL + orderDTO.getOid());
            andConditionMap.put("t.oid", QueryOptionConstant.NOTEQUAL + orderDTO.getOid());
         }
         conditionMap.putAll(andConditionMap);
         PageHelper pageHelper = new PageHelper(-1);
@@ -1334,23 +1415,49 @@
   public DataGrid<Map<String, String>> queryGrid(String btmType, CodeClassifyTemplateVO templateVO, Map<String, String> conditionMap, PageHelper pageHelper) {
      CodeTemplateAttrSqlBO sqlBO = getSqlByTemplateVO(btmType, templateVO, conditionMap, pageHelper);
//      List<Map> maps = boService.queryByOnlySqlForMap(sqlBO.getSqlHasPage());
      List<Map> maps = commonsMapper.selectBySql(sqlBO.getSqlHasPage());
      List<Map<String,String>> maps = commonsMapper.queryByOnlySqlForMap(sqlBO.getSqlHasPage());
      DataGrid<Map<String, String>> dataGrid = new DataGrid<>();
      List<Map<String, String>> dataList = new ArrayList<>();
      if (!CollectionUtils.isEmpty(maps)) {
         maps.stream().forEach(map -> {
            Map<String, String> data = new HashMap<>();
            map.forEach((key, value) -> {
               data.put(((String) key).toLowerCase(Locale.ROOT), (String) value);
            });
            for (String s : map.keySet()) {
               data.put(s.toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
            }
//            map.forEach((key, value) -> {
//               data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
//            });
            dataList.add(data);
         });
         wrapperData(dataList, templateVO, sqlBO.getSelectFieldList(), false);
//         maps.stream().forEach(map -> {
//            Map<String, String> data = new HashMap<>();
////            map.forEach((key, value) -> {
////               data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
////            });
//            for (String s : map.keySet()) {
//               data.put(((String) s).toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
//            }
//            dataList.add(data);
//         });
      }
//      dataGrid.setData(dataList);
//      if (!CollectionUtils.isEmpty(maps)) {
//         wrapperData(maps, templateVO, sqlBO.getSelectFieldList(), false);
//         maps.stream().forEach(map -> {
//            Map<String, String> data = new HashMap<>();
////            map.forEach((key, value) -> {
////               data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
////            });
//            for (String s : map.keySet()) {
//               data.put(((String) s).toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
//            }
//            dataList.add(data);
//         });
      dataGrid.setData(dataList);
      if (!CollectionUtils.isEmpty(dataList)) {
         wrapperData(dataGrid.getData(), templateVO, sqlBO.getSelectFieldList(), false);
         dataGrid.setTotal(Long.parseLong(commonsMapper.selectBySql(sqlBO.getSqlCount()).get(0).values().toArray()[0].toString()));
      }
      dataGrid.setTotal(Long.parseLong(commonsMapper.selectBySql(sqlBO.getSqlCount()).get(0).values().toArray()[0].toString()));
//      }
      return dataGrid;
   }
@@ -1411,17 +1518,27 @@
         }
      });
      if (!CollectionUtils.isEmpty(userIds)) {
         Map<String, User> userVOMap = new HashMap<>();
         for (String userId : userIds) {
            if(!StringUtils.isNumeric(userId)){
               continue;
            }
            User data = iUserClient.userInfoById(Long.valueOf(userId)).getData();
            if(data != null){
               userVOMap.put(String.valueOf(data.getId()),data);
            }
         }
//         Map<String, SmUserVO> userVOMap = Optional.ofNullable(userQueryService.listUserByUserIds(userIds)).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
//         dataMap.stream().forEach(data -> {
//            String creator = data.getOrDefault("creator", null);
//            if (StringUtils.isNotBlank(creator) && userVOMap.containsKey(creator.toLowerCase(Locale.ROOT))) {
//               data.put("creator", creator + "(" + userVOMap.get(creator.toLowerCase(Locale.ROOT)).getName() + ")");
//            }
//            String lastmodifier = data.getOrDefault("lastmodifier", null);
//            if (StringUtils.isNotBlank(lastmodifier) && userVOMap.containsKey(lastmodifier.toLowerCase(Locale.ROOT))) {
//               data.put("lastmodifier", lastmodifier + "(" + userVOMap.get(lastmodifier.toLowerCase(Locale.ROOT)).getName() + ")");
//            }
//         });
         dataMap.stream().forEach(data -> {
            String creator = data.getOrDefault("creator", null);
            if (StringUtils.isNotBlank(creator) && userVOMap.containsKey(creator.toLowerCase(Locale.ROOT))) {
               data.put("creator", creator + "(" + userVOMap.get(creator.toLowerCase(Locale.ROOT)).getRealName() + ")");
            }
            String lastmodifier = data.getOrDefault("lastmodifier", null);
            if (StringUtils.isNotBlank(lastmodifier) && userVOMap.containsKey(lastmodifier.toLowerCase(Locale.ROOT))) {
               data.put("lastmodifier", lastmodifier + "(" + userVOMap.get(lastmodifier.toLowerCase(Locale.ROOT)).getRealName() + ")");
            }
         });
      }
   }
@@ -1464,8 +1581,9 @@
      //处理枚举的内容,为了兼容以前的数据,如果数据不能使用枚举转换的话,那还是显示以前的值
      if (!CollectionUtils.isEmpty(enumAttrVOs)) {
         enumAttrVOs.stream().forEach(enumAttrVO -> {
//            String attrId = enumAttrVO.getId().toUpperCase(Locale.ROOT);
            String attrId = enumAttrVO.getId().toLowerCase(Locale.ROOT);
            String oldValue = data.getOrDefault(attrId, null);
            String oldValue = String.valueOf(data.getOrDefault(attrId, null));
            if (StringUtils.isNotBlank(oldValue)) {
               List<KeyValue> comboxKVs = listComboboxItems(enumAttrVO);
               String newValue = oldValue;
@@ -1514,8 +1632,11 @@
               referVO.setValueField(VciQueryWrapperForDO.OID_FIELD);
               referVO.setTextField("name");
            }
            String referTable = VciBaseUtil.getTableName(referVO.getReferType());
            //使用传入的业务类型查询表
            R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(referVO.getReferType()));
//            String referTable = VciBaseUtil.getTableName(referVO.getReferType());
            String referTable = listR.getData().get(0).getTableName();
//            String referTable = "pl_code_classify";
            String referTableNick = attrVO.getId() + "0";
            String left = " left join " + referTable + " " + referTableNick + " on " + referTableNick + "." + referVO.getValueField() + " =  t." + attrVO.getId();
            joinTableList.put(attrVO.getId(), left);
@@ -1531,11 +1652,20 @@
            selectFieldList.add(referTableNick + "." + showFieldInSource + " as " + referShowField);
         });
      }
      Optional.ofNullable(attributeService.getDefaultAttributeVOMap()).orElseGet(() -> new HashMap<>()).keySet().stream().forEach(attrId -> {
         if (!selectFieldList.contains(attrId) && !"secretgrade".equalsIgnoreCase(attrId)) {
            selectFieldList.add(attrId);
      R<BtmTypeVO> allAttributeByBtmId = btmTypeClient.getDefaultAttrByBtmId(btmType);
//      Optional.ofNullable(allAttributeByBtmId.getData()).orElseGet(allAttributeByBtmId.getData().getAttributes()).stream().forEach(attrId -> {
//         if (!selectFieldList.contains(attrId.getOid()) && !"secretgrade".equalsIgnoreCase(attrId.getOid())) {
//            selectFieldList.add(attrId.getOid());
//         }
//      });
      if(allAttributeByBtmId.getData() != null ){
         for (BtmTypeAttributeVO attribute : allAttributeByBtmId.getData().getAttributes()) {
            if (!selectFieldList.contains(attribute.getId()) && !"secretgrade".equalsIgnoreCase(attribute.getId())) {
               selectFieldList.add(attribute.getId());
            }
         }
      });
      }
      if (!selectFieldList.contains(CODE_FIELD)) {
         selectFieldList.add(CODE_FIELD);
      }
@@ -1603,7 +1733,12 @@
         }
         whereSql += " and ( t.secretGrade <= " + userSecret + ") ";
      }
      String tableName = VciBaseUtil.getTableName(btmType);
      //要改,表明获取有问题
//      String tableName = VciBaseUtil.getTableName(btmType);
//      String tableName = "pl_code_wupin";
      R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(btmType));
//            String referTable = VciBaseUtil.getTableName(referVO.getReferType());
      String tableName = listR.getData().get(0).getTableName();
      String sql = "select " + selectFieldList.stream().map(s -> (s.contains(".") ? s : ("t." + s))).collect(Collectors.joining(","))
         + " from " + tableName + SPACE + "t" + SPACE
         + joinTableList.values().stream().collect(Collectors.joining(SPACE))
@@ -1736,9 +1871,10 @@
    */
   private String getSqlByValue(String selectKey, String value, Map<String, CodeClassifyTemplateAttrVO> attrVOMap) {
      StringBuilder sql = new StringBuilder();
      if (!selectKey.contains(".") && (attrVOMap.containsKey(selectKey.toLowerCase(Locale.ROOT)) || attributeService.isDefaultAttr(selectKey) || selectKey.matches(RegExpConstant.LETTER))) {
         sql.append("t.");
      }
      //待完善
//      if (!selectKey.contains(".") && (attrVOMap.containsKey(selectKey.toLowerCase(Locale.ROOT)) || attributeService.isDefaultAttr(selectKey) || selectKey.matches(RegExpConstant.LETTER))) {
//         sql.append("t.");
//      }
      if (value.startsWith(QueryOptionConstant.IN)) {
         sql.append(selectKey)
            .append(SPACE)
@@ -2047,14 +2183,15 @@
      //pageHelper.addDefaultDesc("createTime");
      pageHelper.addDefaultDesc("id");
      if (!classifyService.checkHasChild(codeClassifyOid)) {
         conditionMap.put(CODE_CLASSIFY_OID_FIELD, codeClassifyOid);
         conditionMap.put("t."+CODE_CLASSIFY_OID_FIELD, codeClassifyOid);
      } else {
         conditionMap.put(CODE_CLASSIFY_OID_FIELD, QueryOptionConstant.IN + "(select oid from " + VciBaseUtil.getTableName(MdmBtmTypeConstant.CODE_CLASSIFY)
            + " where lcstatus='" + FrameWorkDefaultValueConstant.FRAMEWORK_DATA_ENABLED +
         //表需要改
//         conditionMap.put(CODE_CLASSIFY_OID_FIELD, QueryOptionConstant.IN + "(select oid from " + VciBaseUtil.getTableName(MdmBtmTypeConstant.CODE_CLASSIFY)
         conditionMap.put("t."+CODE_CLASSIFY_OID_FIELD, QueryOptionConstant.IN + "(select oid from pl_code_classify where lcstatus='" + FrameWorkDefaultValueConstant.FRAMEWORK_DATA_ENABLED +
            "' start with parentCodeClassifyOid = '" + codeClassifyOid + "' CONNECT BY PRIOR OID = parentCodeClassifyOid )");
      }
      conditionMap.put("islastr", "1");
      conditionMap.put("islastv", "1");
      conditionMap.put("t.lastr", "1");
      conditionMap.put("t.lastv", "1");
      return queryGrid(btmTypeId, templateVO, conditionMap, pageHelper);
//        List<String> selectFieldList = templateVO.getAttributes().stream().map(CodeClassifyTemplateAttrVO::getId).collect(Collectors.toList());
//        //参照让平台直接查询就行
@@ -2368,10 +2505,20 @@
      CodeClassifyVO topClassifyVO = classifyService.getTopClassifyVO(templateVO.getCodeclassifyoid());
      String btmId = topClassifyVO.getBtmtypeid();
      //查询数据
      Map<String, String> conditionMap = WebUtil.getOidQuery(oid);
      Map<String, String> conditionMap = new HashMap<>();
      conditionMap.put("t.oid",oid);
      CodeTemplateAttrSqlBO sqlBO = getSqlByTemplateVO(btmId, templateVO, conditionMap, new PageHelper(-1));
      //我们使用和业务类型的来查询
      List<Map> cbos = commonsMapper.selectBySql(sqlBO.getSqlUnPage());
      List<Map> cbosB = commonsMapper.selectBySql(sqlBO.getSqlUnPage());
      List<Map<String,String>> cbos = new ArrayList<>();
      cbosB.stream().forEach(map -> {
         Map<String, String> data = new HashMap<>();
         for (Object o : map.keySet()) {
            data.put(((String) o).toLowerCase(Locale.ROOT), String.valueOf(map.get(o)));
         }
         cbos.add(data);
      });
//      List<ClientBusinessObject> cbos = boService.queryByOnlySql(sqlBO.getSqlUnPage());
      if (CollectionUtils.isEmpty(cbos)) {
         throw new VciBaseException("数据在系统中不存在,是否因为修改过业务类型?");
@@ -2384,7 +2531,7 @@
      wrapperData(dataList, templateVO, sqlBO.getSelectFieldList(), true);
      R<List<Map<String, String>>> result = R.data(Collections.singletonList(cbo));
      //我们要看是否不是升版的,升版的话,需要对比不相等的属性
      String copy = String.valueOf(cbo.get("COPYFROMVERSION"));
      String copy = cbo.get("copyfromversion");
//      if (StringUtils.isBlank(copy)) {
//         copy = cbo.getAttributeValue("copyfromversion");
//      }
@@ -2437,7 +2584,7 @@
         executionId = executionId.substring(0, executionId.lastIndexOf("."));
      }
      String sql = "select wm_concat(distinct (t.codetempattrOidArr)) codetempattroidarr\n" +
         "from " + VciBaseUtil.getTableName(MdmBtmTypeConstant.CODE_CLASSIFY_PROCESS_TEMPLATE) + " t\n" +
         "from pl_code_wupin t\n" +
         "join PLFLOWINSTANCE plfi on t.ID = plfi.PLTEMPLATEPUID\n" +
         "where plfi.PLEXECUTIONID = '" + executionId + "' and t.CLASSIFYTEMPLATEOID = '" + templateOid + "' and t.CODEPROCESSUSE = '" + processUse + "'";
//      List<ClientBusinessObject> tempAttrOidArr = boService.queryByOnlySql(sql);
@@ -2808,27 +2955,31 @@
      MdmUIInfoVO uiInfoVO = getTableDefineByTemplateVO(getUsedTemplateByClassifyOid(codeClassifyOid));
      uiInfoVO.setLeaf(classifyService.countChildrenByClassifyOid(codeClassifyOid) == 0);
      if (StringUtils.isNotBlank(functionId) && !"~".equalsIgnoreCase(functionId)) {
         List<Menu> buttonVOS = iSysClient.getMenuButtonByType(uiInfoVO.getTemplateVO().getBtmTypeId()).getData();
         //功能按钮服务还未实现,等实现了,在进行调用
         //List<SmOperationVO> operationVOS = operationService.listButtonByFunctionId(functionId);
//         List<SmOperationVO> operationVOS = operationService.listButtonByFunctionId(functionId);
//         if (operationVOS == null) {
//            operationVOS = new ArrayList<>();
//         }
         //查询扩展按钮
//         //查询扩展按钮
//         List<CodeButtonVO> buttonVOS = listButtonInToolbarByClassifyOid(codeClassifyOid);
//         if (!CollectionUtils.isEmpty(buttonVOS)) {
//            for (int i = 0; i < buttonVOS.size(); i++) {
//               CodeButtonVO buttonVO = buttonVOS.get(i);
//               SmOperationVO operationVO = new SmOperationVO();
//               operationVO.setModuleNo(functionId);
//               operationVO.setUniqueFlag(buttonVO.getId());
//               operationVO.setName(buttonVO.getName());
//               operationVO.setAlias(operationVO.getName());
//               operationVO.setExecuteJs(buttonVO.getExecutejs());
//               operationVO.setIconCls(buttonVO.getIconcls());
//               operationVOS.add(operationVO);
//            }
//         }
//         uiInfoVO.setButtons(operationVOS);
         List<SmOperationVO> operationVOS = new ArrayList<>();
         if (!CollectionUtils.isEmpty(buttonVOS)) {
            for (int i = 0; i < buttonVOS.size(); i++) {
               Menu buttonVO = buttonVOS.get(i);
               SmOperationVO operationVO = new SmOperationVO();
               operationVO.setModuleNo(functionId);
               operationVO.setUniqueFlag(buttonVO.getCode());
               operationVO.setName(buttonVO.getName());
               operationVO.setAlias(buttonVO.getAlias());
               operationVO.setOrderNo(String.valueOf(buttonVO.getSort()));
//               operationVO.setExecuteJs(buttonVO.getExecuteJs());
//               operationVO.setIconCls(buttonVO.getIconCls());
               operationVOS.add(operationVO);
            }
         }
         uiInfoVO.setButtons(operationVOS);
      }
      return uiInfoVO;
   }
@@ -2867,4 +3018,188 @@
      }
      return buttonVOList;
   }
   /**
    * 传入业务类型以及相关数据进行批量插入操作
    *
    * @param btmType 业务类型
    * @param baseModels      处理数据
    * @return 处理成功数据条数
    */
   @Override
   public Integer insertBatchByType(String btmType, List<BaseModel> baseModels) {
      //使用传入的业务类型查询表
      R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(btmType));
      if(listR.getData().size() == 0){
         throw new VciBaseException("传入业务类型未查询到相应表单,请检查!");
      }
      //将bean转为map,mybatis统一处理
      List<Map<String,String>> maps = new ArrayList<>();
      baseModels.stream().forEach(model-> {
         try {
            maps.add(VciBaseUtil.convertBean2Map(model));
         } catch (Exception e) {
            throw new VciBaseException("类型转换错误:" + e.toString());
         }
      });
      return commonsMapper.insertByBaseModel(listR.getData().get(0).getTableName(), maps.get(0), maps);
   }
   /**
    * 传入业务类型以及相oid集合查询数据进行返回
    *
    * @param btmType 业务类型
    * @param oids      需要查询的oid集合 逗号分开
    * @return 查询出的数据
    */
   @Override
   public List<BaseModel> selectByTypeAndOid(String btmType, String oids)  {
      //使用传入的业务类型查询表
      R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(btmType));
      if(listR.getData().size() == 0){
         throw new VciBaseException("传入业务类型未查询到相应表单,请检查!");
      }
      //查询数据
      List<Map> maps = commonsMapper.selectBySql("select * from " + listR.getData().get(0).getTableName() + " where oid in ("
         + VciBaseUtil.toInSql(oids.toString()) + ")");
      List<BaseModel> baseModels = new ArrayList<>();
      //将查询到的数据转换为basemodel,使用的反射方式来进行创建的
      try{
         for (Map map : maps) {
            Object obj = BaseModel.class.newInstance();
            BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor property : propertyDescriptors) {
               Method setter = property.getWriteMethod();
               if (setter != null) {
                  //oracle的时间为TIMESTAMP的,需要进行转换成data,否则将报错
                  if(map.get(property.getName().toUpperCase()) instanceof TIMESTAMP){
                     LocalDateTime localDateTime = ((TIMESTAMP) map.get(property.getName().toUpperCase())).toLocalDateTime();
                     ZoneId zoneId = ZoneId.systemDefault();
                     ZonedDateTime zdt = localDateTime.atZone(zoneId);
                     Date date = Date.from(zdt.toInstant());
                     setter.invoke(obj,date);
                     map.remove(property.getName().toUpperCase());
                  } //oracle的数字为BigDecimal的,需要进行转换成Integer,否则将报错
                  else if (map.get(property.getName().toUpperCase()) instanceof BigDecimal
                     && ("Integer").equals(setter.getParameterTypes()[0].getSimpleName())){
                     setter.invoke(obj, ((BigDecimal)map.get(property.getName().toUpperCase())).intValue());
                     map.remove(property.getName().toUpperCase());
                  }else if(map.get(property.getName().toUpperCase()) != null){
                     setter.invoke(obj, map.get(property.getName().toUpperCase()));
                     map.remove(property.getName().toUpperCase());
                  }
               }
            }
            for (Object key : map.keySet()) {
               map.put(key,String.valueOf(map.get(key)));
            }
            ((BaseModel) obj).setData(map);
            baseModels.add((BaseModel) obj);
         }
      }catch (Exception e){
         throw new VciBaseException("查询失败:" + e.getMessage());
      }
      return baseModels;
   }
   /**
    * 根据业务类型名称创建业务数据源对象
    * @param boName 业务类型名称
    * @return 业务数据对象
    */
   public BaseModel createBaseModel(String boName)  {
      R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(boName));
      String userName = AuthUtil.getUser().getUserName();
      BaseModel bo = new BaseModel();
//      bo.setOid(VciBaseUtil.getPk());
//      bo.setRevisionid(VciBaseUtil.getPk());
//      bo.setNameoid(VciBaseUtil.getPk());
      bo.setBtmname(boName);
      bo.setLastR("1");
      bo.setFirstR("1");
      bo.setFirstV("1");
      bo.setLastV("1");
      bo.setCreator(userName);
      bo.setCreateTime(new Date());
      bo.setLastModifier(userName);
      bo.setLastModifyTime(new Date());
      bo.setRevisionRule(listR.getData().get(0).getRevisionRuleId());
      bo.setVersionRule(String.valueOf(listR.getData().get(0).getVersionRule()));
      if(StringUtils.isNotBlank(listR.getData().get(0).getRevisionRuleId())){
         R<List<RevisionRuleVO>> revisionRuleVO = revisionRuleClient
            .selectByIdCollection(Collections.singletonList(listR.getData().get(0).getRevisionRuleId()));
         bo.setRevisionValue(revisionRuleVO.getData().get(0).getStartCode());
      }
      bo.setRevisionSeq(1);
      bo.setVersionSeq(1);
      bo.setVersionValue(getVersionValue(WebUtil.getInt(listR.getData().get(0).getVersionRule())));
      bo.setLctid(listR.getData().get(0).getLifeCycleId());
//      if(StringUtils.isNotBlank(listR.getData().get(0).getLifeCycleId())){
//         OsLifeCycleVO lifeCycleVO = lifeService.getLifeCycleById(listR.getData().get(0).getLifeCycleId());
      bo.setLcStatus("Editing");
//      }
      bo.setId("");
      bo.setName("");
      bo.setDescription("");
      bo.setOwner(userName);
//      bo.setCheckinby(userName);
      bo.setCopyFromVersion("");
//      this.initTypeAttributeValue(bo,btmTypeVO);
      return bo;
   }
   /**
    * 获取版次的值
    * @param verRuleName 版次的规则
    * @return 版次的值,没有规则则为空
    */
   private String getVersionValue(int verRuleName) {
      if (verRuleName == 0) {
         return "1";
      } else if (verRuleName == 1) {
         return "a";
      } else if (verRuleName == 2) {
         return "0";
      }
      return "";
   }
   /**
    * 传入业务类型以及相关数据进行批量更新操作
    *
    * @param btmType 业务类型
    * @param baseModels      处理数据
    * @return 处理状态
    */
   @Override
   public R updateBatchByBaseModel(String btmType, List<BaseModel> baseModels) {
      //使用传入的业务类型查询表
      R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(btmType));
      if(listR.getData().size() == 0){
         throw new VciBaseException("传入业务类型未查询到相应表单,请检查!");
      }
      //将bean转为map,mybatis统一处理
      List<Map<String,String>> maps = new ArrayList<>();
      baseModels.stream().forEach(model-> {
         try {
            maps.add(VciBaseUtil.convertBean2Map(model));
         } catch (Exception e) {
            throw new VciBaseException("类型转换错误:" + e.getMessage());
         }
      });
      try {
         //注意此处更新成功是返回的-1
         commonsMapper.updateBatchByBaseModel(listR.getData().get(0).getTableName(), maps);
      }catch (Exception e){
         return R.fail("更新失败!"+e.getMessage());
      }
      return R.success("更新成功!");
   }
}