From aa8db511b7823300bf3312018fbec75a6fa1ccf5 Mon Sep 17 00:00:00 2001
From: ludc
Date: 星期二, 27 六月 2023 16:25:06 +0800
Subject: [PATCH] 提交代码

---
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java | 1526 ++++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 1,105 insertions(+), 421 deletions(-)

diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
index b938916..c2df374 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -1,8 +1,11 @@
 package com.vci.ubcs.code.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
 import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
 import com.vci.ubcs.code.bo.CodeTemplateAttrSqlBO;
 import com.vci.ubcs.code.constant.FrameWorkDefaultValueConstant;
@@ -12,18 +15,27 @@
 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.CodeAllCodeMapper;
-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.constant.BtmTypeLcStatusConstant;
+import com.vci.ubcs.omd.cache.EnumCache;
+import com.vci.ubcs.omd.feign.*;
+import com.vci.ubcs.omd.utils.VciOmdUtil;
+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.TreeQueryObject;
 import com.vci.ubcs.starter.revision.model.TreeWrapperOptions;
 import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
+import com.vci.ubcs.starter.util.UBCSSqlKeyword;
 import com.vci.ubcs.starter.web.constant.QueryOptionConstant;
 import com.vci.ubcs.starter.web.constant.RegExpConstant;
 import com.vci.ubcs.starter.web.enumpck.BooleanEnum;
@@ -31,24 +43,40 @@
 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.launch.constant.AppConstant;
+import org.springblade.core.log.exception.ServiceException;
 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.DateUtil;
+import org.springblade.core.tool.utils.Func;
+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.io.Serializable;
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
@@ -64,7 +92,7 @@
  * @date 2022-2-22
  */
 @Service
-public class MdmEngineServiceImpl extends ServiceImpl<CodeWupinMapper, CodeWupinEntity> implements MdmEngineService {
+public class MdmEngineServiceImpl extends ServiceImpl<CodeWupinMapper, CodeWupin> implements MdmEngineService {
 
 
 	/**
@@ -72,28 +100,54 @@
 	 */
 	@Resource
 	private CodeClstemplateServiceImpl templateService;
-	/**
-	 * 妯℃澘鐨勬湇鍔�
-	 */
-	@Resource
-	private CodeOsbtmtypeMapper codeOsbtmtypeMapper;
-	@Resource
-	private CodeOsattributeServiceImpl attributeService;
+
+
 	/**
 	 * 鐢熸垚缂栫爜鐨勬湇鍔�
 	 */
 	@Resource
 	private MdmProductCodeService productCodeService;
+
+	/**
+	 * 鍙緭鍙�夌殑鏈嶅姟
+	 */
+	@Resource
+	IDictBizClient iDictBizClient;
+	/**
+	 * 绯荤粺鐨勬湇鍔�
+	 */
+	@Resource
+	ISysClient iSysClient;
+	/**
+	 * 瀵嗙骇鏈嶅姟
+	 */
+	@Resource
+	private IWebSecretClient secretService;
+	/**
+	 * 鐢ㄦ埛鏈嶅姟
+	 */
+	@Resource
+	IUserClient iUserClient;
 	/**
 	 * 瀛楀吀鐨勬湇鍔�
 	 */
 	@Resource
-	IDictBizClient iDictBizClient;
+	IEnumClient enumClient;
+
 	/**
 	 * 鍏紡鐨勬湇鍔�
 	 */
 	@Autowired
 	private FormulaServiceImpl formulaService;
+
+
+	/**
+	 *  瀵筼md涓彁渚涚殑feign鎺ュ彛杩涜璋冪敤锛屼互鍙婂鐞嗙浉鍏抽�昏緫
+	 */
+	@Autowired
+	ICodeReferBtmTypeService codeReferBtmTypeService;
+
+
 
 	/**
 	 * 鐩镐技椤规煡璇㈣鍒�
@@ -112,6 +166,16 @@
 	 */
 	@Autowired
 	private ICodePhaseAttrService phaseAttrService;
+	/**
+	 * 涓氬姟绫诲瀷鐨勬湇鍔�
+	 */
+	@Autowired
+	private IBtmTypeClient btmTypeClient;
+	/**
+	 * 鐗堟湰瑙勫垯鐨勬湇鍔�
+	 */
+	@Resource
+	private IRevisionRuleClient revisionRuleClient;
 //
 	/**
 	 * 閫氱敤鏌ヨ
@@ -149,6 +213,9 @@
 	 */
 	@Autowired
 	private ICodeClassifyTemplateButtonService templateButtonService;
+
+	@Autowired
+	private ICodeClassifyTemplateAttrService codeClassifyTemplateAttrService;
 //	/**
 //	 * 鐢ㄦ埛鏌ヨ鐨勬湇鍔�,闇�瑕侀棶涓�涓嬫槸鍚﹂渶瑕侀噸鍐欙紝浣跨敤鏌ヨ姝ゅ钩鍙扮殑鐢ㄦ埛琛�
 //	 */
@@ -169,6 +236,14 @@
 	 * 绌烘牸
 	 */
 	public static final String SPACE = " ";
+	/**
+	 * 缂撳瓨锝嬶絽锝�
+	 */
+	public static final String BTM_INIT_CACHE = "ubcs-code:btm";
+	/**
+	 *
+	 */
+	public static final String BTM_NAME = "btm:name";
 
 	/**
 	 * 瀵嗙骇鐨勫瓧娈�
@@ -204,7 +279,7 @@
 	/**
 	 * 鏇挎崲瀛楃
 	 */
-	public static final String SPECIAL_CHAR  = "VCI";
+	public static final String SPECIAL_CHAR = "VCI";
 //	@Autowired
 //	private CodeOsbtmtypeMapper codeOsbtmtypeMapper;----
 
@@ -242,40 +317,43 @@
 	 */
 	@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());
-			if(list.isSuccess()){
-				for (DictBiz datum : list.getData()) {
+			R<List<EnumVO>> list = enumClient.getList(attrVO.getEnumId());
+			if (list.isSuccess()) {
+				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);
 				}
 			}
 		}
 		return comboboxKVs;
 	}
+
 	/**
 	 * 淇敼鐘舵��
 	 *
 	 * @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);
+		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);
 		//杩橀渶瑕佷慨鏀筧llCode鐨勭敓鍛藉懆鏈�
 //		Map<String, String> conditionMap = new HashMap<>();
 		QueryWrapper<CodeAllCode> allCodeWrapper = new QueryWrapper<>();
@@ -287,16 +365,21 @@
 //		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()));
+			commonsMapper.deleteByTaleAndOid(listR.getData().get(0).getTableName(),VciBaseUtil.toInSql(baseModelDTO.getOid()));
 		} 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());
 	}
-
 
 	/**
 	 * 鐢宠鍗曚竴缂栫爜
@@ -305,7 +388,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());
@@ -329,14 +412,14 @@
 		switchDateAttrOnOrder(templateVO, orderDTO);
 		//9.鐢熸垚缂栫爜鐨勪俊鎭�
 //		ClientBusinessObject cbo = boService.createCBOByBtmName(classifyFullInfo.getTopClassifyVO().getBtmtypeid());
-		CodeWupinEntity cbo = createCBOByBtmName(classifyFullInfo.getTopClassifyVO().getBtmtypeid());
+		BaseModel cbo = createCBOByBtmName(classifyFullInfo.getTopClassifyVO().getBtmtypeid());
 //		//榛樿鐨勫睘鎬ч兘涓嶇敤浠庡墠绔嫹璐�
 //		//璁剧疆缂栫爜闇�瑕佺殑榛樿灞炴�х殑鍐呭
 		copyValueToCBO(classifyFullInfo, cbo, orderDTO, templateVO, false);
 //		//TODO:鍥犱负榛樿鐨勫睘鎬ч兘涓嶆嫹璐濓紝鐩墠闆嗗洟鐮佸彨name锛屽苟娌℃湁浠嶥TO鎷疯礉鍒癱bo閲屻�傚鍔犱竴涓崟鐙鐞嗭紝浠ュ悗鍐嶇湅瑕佷笉瑕佽皟鏁�
 		cbo.setName(orderDTO.getName() == null ? "" : orderDTO.getName());
 //		//end -- modify by lihang @20220407
-		List<CodeWupinEntity> cboList = new ArrayList<>();
+		List<BaseModel> cboList = new ArrayList<>();
 
 		//澶囨敞
 		cbo.setDescription(orderDTO.getDescription());
@@ -346,11 +429,11 @@
 		List<String> codeList = productCodeService.productCodeAndSaveData(classifyFullInfo, templateVO, ruleVO, orderDTO.getSecDTOList(),cboList);
 
 
-		List<String> charList = new ArrayList<>();
-		for (CodeWupinEntity wupinEntity : cboList) {
-			charList.add(wupinEntity.getId());
-		}
-		batchSaveSelectChar(templateVO, charList);
+//		List<String> charList = new ArrayList<>();
+//		for (BaseModel baseModel : cboList) {
+//			charList.add(baseModel.getId());
+//		}
+		batchSaveSelectChar(templateVO, cboList);
 		return codeList.size() > 0 ? codeList.get(0) : "";
 //		return null;
 	}
@@ -561,7 +644,10 @@
 		//娌℃湁闄愬埗鍒嗙被锛屼絾鏄竴涓ā鏉垮彧鍙兘鍦ㄤ竴涓笟鍔$被鍨嬮噷闈紝鎵�浠ョ洿鎺ユ煡璇㈣繖涓笟鍔$被鍨嬪嵆鍙�
 
 		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 "};
+			R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(classifyFullInfo.getTopClassifyVO().getBtmtypeid()));
+//				String referTable = VciBaseUtil.getTableName(referVO.getReferType());
+			final String[] sql = {"select count(*) from "+ listR.getData().get(0).getTableName() +" t where 1 = 1 "};
 			conditionMap.forEach((key, value) -> {
 				sql[0] += " and " + key + " = " + value;
 			});
@@ -571,7 +657,7 @@
 			} else if (StringUtils.isNotBlank(orderDTO.getCopyFromVersion())) {
 				sql[0] += " and oid != '" + orderDTO.getCopyFromVersion() + "'";
 			}
-			sql[0] += " and islastR = '1' and islastV = '1' ";
+			sql[0] += " and lastR = '1' and lastV = '1' ";
 //			if (boService.queryCountBySql(sql[0], new HashMap<>()) > 0) {
 			if (Integer.parseInt(commonsMapper.selectById(sql[0]).get(0)) > 0) {
 				String ruleInfoMsg = keyRuleVO == null ? "" : "鏌ヨ瑙勫垯锛氬幓闄ょ┖鏍�--{0},蹇界暐澶у皬鍐�--{1},蹇界暐鍏ㄥ崐瑙�--{2},蹇界暐鍏ㄩ儴绌烘牸--{3}";
@@ -696,9 +782,9 @@
 	 * @param templateVO       妯℃澘鐨勬樉绀哄璞�
 	 * @param edit             鏄惁涓轰慨鏀�
 	 */
-	private void copyValueToCBO(CodeClassifyFullInfoBO classifyFullInfo, CodeWupinEntity 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())))
@@ -708,8 +794,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))) {
@@ -720,25 +806,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());
@@ -746,10 +842,8 @@
 
 			}
 
-			int secret = VciBaseUtil.getInt(cbo.getSecretGrade().toString());
-			//鎻掍釜鐐癸紝鍚庣画鐪嬪瘑绾ф湇鍔℃槸鍚﹀彲鐢�
-//			if (secret == 0 || !secretService.checkDataSecret(secret)) {
-			if (secret == 0 ) {
+			int secret = VciBaseUtil.getInt(String.valueOf(cbo.getSecretGrade()));
+			if (secret == 0 || !secretService.checkDataSecret(secret).getData()) {
 				Integer userSecret = VciBaseUtil.getCurrentUserSecret();
 //				cbo.setAttributeValue(SECRET_FIELD, String.valueOf((userSecret == null || userSecret == 0) ? UserSecretEnum.NONE.getValue() : userSecret));
 				cbo.setSecretGrade(userSecret == null || userSecret == 0 ? UserSecretEnum.NONE.getValue() : userSecret);
@@ -768,91 +862,26 @@
 	 * @throws VciBaseException 鍒濆鍖栧嚭閿欑殑鏄細鎶涘嚭寮傚父
 	 */
 	@Override
-	public CodeWupinEntity 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();
-		CodeWupinEntity wupinEntity = new CodeWupinEntity();
-		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);
+			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");
-
-//		this.initTypeAttributeValue(wupinEntity,btmTypeVO);
-		return wupinEntity;
-
-
-//		return cbo;
 	}
 
-	/**
-	 * 鏄惁涓轰慨鏀瑰拷鐣ョ殑灞炴��
-	 * @param attrName 灞炴�х殑鍚嶅瓧
-	 * @return true 琛ㄧず搴旇蹇界暐
-	 */
-	boolean checkUnAttrUnEdit(String attrName){
-		return  (VciQueryWrapperForDO.OID_FIELD.equalsIgnoreCase(attrName)
-			||"ts".equalsIgnoreCase(attrName)
-			|| "lastmodifier".equalsIgnoreCase(attrName)
-			|| "lastmodifytime".equalsIgnoreCase(attrName)
-			|| "createtime".equalsIgnoreCase(attrName)
-			|| "checkintime".equalsIgnoreCase(attrName)
-			||"checkouttime".equalsIgnoreCase(attrName));
-	}
+
 
 	/**
 	 * 淇濆瓨鍙緭鍙�夌殑淇℃伅
@@ -862,7 +891,7 @@
 	 */
 	@Override
 	public void batchSaveSelectChar(CodeClassifyTemplateVO templateVO, /*List<ClientBusinessObject> cboList*/
-									List<String> cboList) {
+									List<BaseModel> cboList) {
 		if (templateVO != null && !CollectionUtils.isEmpty(cboList)) {
 			//鏄紓姝ョ殑锛屾墍浠ョ洿鎺ュ惊鐜�
 			List<CodeClassifyTemplateAttrVO> selectAttrVOs = templateVO.getAttributes().stream().filter(s -> StringUtils.isNotBlank(s.getLibraryIdentification())).collect(Collectors.toList());
@@ -870,13 +899,26 @@
 			if (!CollectionUtils.isEmpty(selectAttrVOs)) {
 //				SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
 				selectAttrVOs.parallelStream().forEach(attrVO -> {
-					List<String> valuesList = cboList;
-//					cboList.parallelStream().forEach(cbo -> {
+					List<String> valuesList = new ArrayList<>();
+					cboList.parallelStream().forEach(cbo -> {
 //						String value = cbo.get.getAttributeValue(attrVO.getId());
-//						if (StringUtils.isNotBlank(value)) {
-//							valuesList.add(value);
-//						}
-//					});
+
+						//灏哹ean杞负map,mybatis缁熶竴澶勭悊
+						Map<String,String> map = null;
+
+//						baseModels.stream().forEach(model-> {
+						try {
+							map = VciBaseUtil.convertBean2Map(cbo);
+						} catch (Exception e) {
+							throw new VciBaseException("绫诲瀷杞崲閿欒锛�" + e.getMessage());
+						}
+//						});
+
+						String value = map.get(attrVO.getId());
+						if (StringUtils.isNotBlank(value)) {
+							valuesList.add(value);
+						}
+					});
 					if (!CollectionUtils.isEmpty(valuesList)) {
 						for (String s : valuesList) {
 							DictBiz dictBiz = new DictBiz();
@@ -893,15 +935,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;
-    }
+	}
 
 
 	/**
@@ -1020,6 +1062,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())
@@ -1089,7 +1132,7 @@
 			//澶勭悊鎵�鏈夌殑鍒楋紝杩欎釜妯℃澘娌℃湁鍚堝苟鐨勮〃澶寸殑鎯呭喌
 			List<UITableFieldVO> fieldVOList = new ArrayList<>();
 			resembleAttrList.forEach(attrVO -> {
-				UITableFieldVO tableFieldVO = templateAttr2TableField(attrVO,false);
+				UITableFieldVO tableFieldVO = templateAttr2TableField(attrVO, false);
 				tableFieldVO.setHidden(false);
 				fieldVOList.add(tableFieldVO);
 			});
@@ -1104,12 +1147,12 @@
 	/**
 	 * 妯℃澘灞炴�ц浆鎹负琛ㄦ牸鏄剧ず鐨勯厤缃�
 	 *
-	 * @param attrVO 妯℃澘灞炴��
+	 * @param attrVO  妯℃澘灞炴��
 	 * @param forEdit 鏄惁鏄紪杈戞墍闇�
 	 * @return 琛ㄦ牸鐨勫瓧娈�
 	 */
 	@Override
-	public UITableFieldVO templateAttr2TableField(CodeClassifyTemplateAttrVO attrVO,boolean forEdit) {
+	public UITableFieldVO templateAttr2TableField(CodeClassifyTemplateAttrVO attrVO, boolean forEdit) {
 		UITableFieldVO fieldVO = new UITableFieldVO();
 		if (SECRET_FILED.equalsIgnoreCase(attrVO.getId())) {
 			attrVO.setEnumId(MY_DATA_SECRET);
@@ -1120,9 +1163,9 @@
 		fieldVO.setSort(true);
 		fieldVO.setSortField(fieldVO.getField());
 		fieldVO.setQueryField(fieldVO.getField());
-		if (forEdit){
+		if (forEdit) {
 			fieldVO.setHidden(!VciBaseUtil.getBoolean(attrVO.getFormDisplayFlag()));
-		}else {
+		} else {
 			fieldVO.setHidden(!VciBaseUtil.getBoolean(attrVO.getTableDisplayFlag()));
 		}
 		if (attrVO.getAttrTableWidth() != null && attrVO.getAttrTableWidth() > 0) {
@@ -1142,9 +1185,9 @@
 				if (StringUtils.isBlank(attrVO.getEnumId())) {
 					fieldVO.setComboxKey(fieldVO.getField() + "_data");
 				}
-			}else {
-//				List<KeyValue> osEnumItemVOList= enumService.getEnum(attrVO.getEnumId());
-//				fieldVO.setData(osEnumItemVOList);
+			} else {
+				List<KeyValue> osEnumItemVOList= VciOmdUtil.enumsToListKeyVale(EnumCache.getList(attrVO.getEnumId()));
+				fieldVO.setData(osEnumItemVOList);
 			}
 		}
 		//鐪嬫槸鍚︽湁鍙傜収
@@ -1222,10 +1265,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);
@@ -1312,8 +1355,8 @@
 				}
 			}
 			queryValue = String.format(temp, (trim ? value.trim() : value));
-			temp = temp.replace("to_single_byte('%s')","to_single_byte(%s)");
-			queryKey = String.format(temp, "t."+attrId);
+			temp = temp.replace("to_single_byte('%s')", "to_single_byte(%s)");
+			queryKey = String.format(temp, "t." + attrId);
 			conditionMap.put(queryKey, QueryOptionConstant.OR + queryValue);
 		}
 	}
@@ -1332,23 +1375,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;
 	}
 
@@ -1359,7 +1428,7 @@
 	 * @param dataMap              鏁版嵁鐨勬槧灏�
 	 * @param templateVO           妯℃澘鐨勫睘鎬�
 	 * @param onlySelectAttrIdList 浠呬粎鏌ヨ鐨勫睘鎬у瓧娈�
-	 * @param form 琛ㄥ崟閲屼娇鐢�
+	 * @param form                 琛ㄥ崟閲屼娇鐢�
 	 */
 	@Override
 	public void wrapperData(List<Map<String, String>> dataMap, CodeClassifyTemplateVO templateVO,
@@ -1390,15 +1459,15 @@
 			//澶勭悊鏋氫妇
 			wrapperEnum(enumAttrVOs, data);
 			String lcstatus = data.get(VciQueryWrapperForDO.LC_STATUS_FIELD);
-			String copyFromVersion = data.getOrDefault(COPY_FROM_VERSION,"");
+			String copyFromVersion = data.getOrDefault(COPY_FROM_VERSION, "");
 			if ((CodeDefaultLC.EDITING.getValue().equalsIgnoreCase(lcstatus) || CodeDefaultLC.AUDITING.getValue().equalsIgnoreCase(lcstatus))
 				&& StringUtils.isBlank(copyFromVersion)
 			) {
 				data.put(VciQueryWrapperForDO.ID_FIELD, "******");
 			}
 			data.put(VciQueryWrapperForDO.LC_STATUS_FIELD_TEXT.toLowerCase(Locale.ROOT), CodeDefaultLC.getTextByValue(lcstatus));
-			if(CodeDefaultLC.EDITING.getValue().equalsIgnoreCase(lcstatus)
-				&& StringUtils.isNotBlank(copyFromVersion)){
+			if (CodeDefaultLC.EDITING.getValue().equalsIgnoreCase(lcstatus)
+				&& StringUtils.isNotBlank(copyFromVersion)) {
 				data.put(VciQueryWrapperForDO.LC_STATUS_FIELD_TEXT.toLowerCase(Locale.ROOT), "淇敼涓�");
 			}
 			if (data.containsKey("creator")) {
@@ -1409,17 +1478,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() + ")");
+				}
+			});
 		}
 	}
 
@@ -1462,8 +1541,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;
@@ -1512,8 +1592,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);
@@ -1529,11 +1612,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);
 		}
@@ -1566,10 +1658,10 @@
 			});
 
 			andCondtionMap.forEach((k, v) -> {
-				andSql.add(getConditionSql(k.toLowerCase(), v, referFieldMap, attrVOMap));
+				andSql.add(getConditionSql(k.toLowerCase(), v, referFieldMap, attrVOMap,btmType));
 			});
 			orConditionMap.forEach((k, v) -> {
-				orSql.add(getConditionSql(k.toLowerCase(), v, referFieldMap, attrVOMap));
+				orSql.add(getConditionSql(k.toLowerCase(), v, referFieldMap, attrVOMap,btmType));
 			});
 		}
 		//缁勫悎璧锋潵
@@ -1597,11 +1689,14 @@
 		if (attrVOMap.keySet().contains("secretgrade")) {
 			Integer userSecret = VciBaseUtil.getCurrentUserSecret();
 			if (userSecret == null || userSecret == 0) {
-//				userSecret = secretService.getMinUserSecret();
+				userSecret = secretService.getMinUserSecret().getData();
 			}
 			whereSql += " and ( t.secretGrade <= " + userSecret + ") ";
 		}
-		String tableName = VciBaseUtil.getTableName(btmType);
+//		String tableName = VciBaseUtil.getTableName(btmType);
+		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))
@@ -1638,8 +1733,149 @@
 	 * @param attrVOMap     灞炴�х殑鏄犲皠
 	 * @return Sql璇彞
 	 */
-	private String getConditionSql(String key, String value, Map<String/**鍙傜収鐨勫睘鎬�**/, String/**瀹為檯鐨勫睘鎬�**/> referFieldMap, Map<String, CodeClassifyTemplateAttrVO> attrVOMap) {
-		if (key.endsWith("_begin")) {
+	private String getConditionSql(String key, String value, Map<String/**鍙傜収鐨勫睘鎬�**/, String/**瀹為檯鐨勫睘鎬�**/> referFieldMap, Map<String, CodeClassifyTemplateAttrVO> attrVOMap,String btmType) {
+		if (!Func.hasEmpty(new Object[]{key,value}) && !key.endsWith("_ignore")) {
+			if (key.endsWith("_like")) {
+				String field = UBCSSqlKeyword.getColumn(key, "_like");
+				if (referFieldMap.containsKey(field)) {
+					//璇存槑杩樻槸鍙傜収閲岄潰鐨勶紝鎴戜滑榛樿杩欑鎯呭喌涓嬮兘鏄瓧绗︿覆鍚э紝鍥犱负鍙傜収鐨勫睘鎬т笉涓�瀹氱敤鐨勫钩鍙扮殑灞炴�ф睜閲岀殑锛屾墍浠ュぇ閮ㄥ垎鎯呭喌涓嬶紝鏄剧ず鐨勫睘鎬ч兘鏄瓧绗︿覆鍚�
+					return referFieldMap.get(field) + SPACE + "LIKE" + SPACE + "'%" + value + "%'" + SPACE;
+				} else {
+					return (field.contains(".") ? "" : "t.") + field + SPACE + "LIKE " + "'%" + getStringValueInWhere(field, value, attrVOMap) + "%'" + SPACE;
+				}
+			} else if (key.endsWith("_notequal")) {
+				String field = UBCSSqlKeyword.getColumn(key, "_notequal");
+				if (referFieldMap.containsKey(field)) {
+					return referFieldMap.get(field) + SPACE + " != " + value + SPACE;
+				} else {
+					return (field.contains(".") ? "" : "t.") + field + SPACE + " != " + getStringValueInWhere(field, value, attrVOMap);
+				}
+			} else if (key.endsWith("_likeleft")) {
+				String field = UBCSSqlKeyword.getColumn(key, "_likeleft");
+				if (referFieldMap.containsKey(field)) {
+					return referFieldMap.get(field) + SPACE + "LIKE" + SPACE + "%"+value + SPACE;
+				} else {
+					return (field.contains(".") ? "" : "t.") + field + SPACE + "LIKE " + "%" + getStringValueInWhere(field, value, attrVOMap) + SPACE;
+				}
+			} else if (key.endsWith("_likeright")) {
+				String field = UBCSSqlKeyword.getColumn(key, "_likeright");
+				if (referFieldMap.containsKey(field)) {
+					return referFieldMap.get(field) + SPACE + "LIKE" + SPACE + value + "%" + SPACE;
+				} else {
+					return (field.contains(".") ? "" : "t.") + field + SPACE + "LIKE " + getStringValueInWhere(field, value, attrVOMap)+ "%" + SPACE;
+				}
+			} else if (key.endsWith("_notlike")) {
+				String field = UBCSSqlKeyword.getColumn(key, "_notlike");
+				if (referFieldMap.containsKey(field)) {
+					return referFieldMap.get(field) + SPACE + "NO LIKE" + SPACE + "%" + value + "%" + SPACE;
+				} else {
+					return (field.contains(".") ? "" : "t.") + field + SPACE + "NO LIKE " + "%"+getStringValueInWhere(field, value, attrVOMap)+ "%" + SPACE;
+				}
+			} else if (key.endsWith("_ge")) {
+				String field = UBCSSqlKeyword.getColumn(key, "_ge");
+				if (referFieldMap.containsKey(field)) {
+					return referFieldMap.get(field) + SPACE + " >= " + value + SPACE;
+				} else {
+					return (field.contains(".") ? "" : "t.") + field + SPACE + " >= " + getStringValueInWhere(value, field, attrVOMap) + SPACE;
+				}
+			} else if (key.endsWith("_le")) {
+				//璇存槑鏄�<=鐨勩�傛垜浠渶瑕佸厛鑾峰彇涓�涓�
+				String field = UBCSSqlKeyword.getColumn(key, "_le");
+				if (referFieldMap.containsKey(field)) {
+					return referFieldMap.get(field) + SPACE + " <= " + value + "" + SPACE;
+				} else {
+					return (field.contains(".") ? "" : "t.") + field + SPACE + " <= " + getStringValueInWhere(field, value, attrVOMap) + SPACE;
+				}
+			} else if (key.endsWith("_gt")) {
+				String field = UBCSSqlKeyword.getColumn(key, "_gt");
+				if (referFieldMap.containsKey(field)) {
+					return referFieldMap.get(field) + SPACE + "> " + value + SPACE;
+				} else {
+					return (field.contains(".") ? "" : "t.") + field + SPACE + "> " + getStringValueInWhere(field, value, attrVOMap) + SPACE;
+				}
+			} else if (key.endsWith("_lt")) {
+				String field = UBCSSqlKeyword.getColumn(key, "_lt");
+				if (referFieldMap.containsKey(field)) {
+					return referFieldMap.get(field) + SPACE + "< " + value + SPACE;
+				} else {
+					return (field.contains(".") ? "" : "t.") + field + SPACE + "< " + getStringValueInWhere(field, value, attrVOMap) + SPACE;
+				}
+			} else if (key.endsWith("_datege")) {
+				String field = UBCSSqlKeyword.getColumn(key, "_datege");
+				if (referFieldMap.containsKey(field)) {
+					return referFieldMap.get(field) + SPACE + ">= '" + DateUtil.parse(String.valueOf(value), "yyyy-MM-dd HH:mm:ss") + "'" + SPACE;
+				} else {
+					return (field.contains(".") ? "" : "t.") + field + SPACE + ">= '" + DateUtil.parse(String.valueOf(getStringValueInWhere(field, value, attrVOMap)), "yyyy-MM-dd HH:mm:ss") + "'" + SPACE;
+				}
+			} else if (key.endsWith("_dategt")) {
+				String field = UBCSSqlKeyword.getColumn(key, "_dategt");
+				if (referFieldMap.containsKey(field)) {
+					return referFieldMap.get(field) + SPACE + "> '" + DateUtil.parse(String.valueOf(value), "yyyy-MM-dd HH:mm:ss") + "'" + SPACE;
+				} else {
+					return (field.contains(".") ? "" : "t.") + field + SPACE + "> '" + DateUtil.parse(String.valueOf(getStringValueInWhere(field, value, attrVOMap)), "yyyy-MM-dd HH:mm:ss") + "'" + SPACE;
+				}
+			} else if (key.endsWith("_dateequal")) {
+				String field = UBCSSqlKeyword.getColumn(key, "_dateequal");
+				if (referFieldMap.containsKey(field)) {
+					return referFieldMap.get(field) + SPACE + "= '" + DateUtil.parse(String.valueOf(value), "yyyy-MM-dd HH:mm:ss") + "'" + SPACE;
+				} else {
+					return (field.contains(".") ? "" : "t.") + field + SPACE + "= '" + DateUtil.parse(String.valueOf(getStringValueInWhere(field, value, attrVOMap)), "yyyy-MM-dd HH:mm:ss") + "'" + SPACE;
+				}
+			} else if (key.endsWith("_datele")) {
+				String field = UBCSSqlKeyword.getColumn(key, "_datele");
+				if (referFieldMap.containsKey(field)) {
+					return referFieldMap.get(field) + SPACE + "<= '" + DateUtil.parse(String.valueOf(value), "yyyy-MM-dd HH:mm:ss") + "'" + SPACE;
+				} else {
+					return (field.contains(".") ? "" : "t.") + field + SPACE + "<= '" + DateUtil.parse(String.valueOf(getStringValueInWhere(field, value, attrVOMap)), "yyyy-MM-dd HH:mm:ss") + "'" + SPACE;
+				}
+			} else if (key.endsWith("_datelt")) {
+				String field = UBCSSqlKeyword.getColumn(key, "_datelt");
+				if (referFieldMap.containsKey(field)) {
+					return referFieldMap.get(field) + SPACE + "< '" + DateUtil.parse(String.valueOf(value), "yyyy-MM-dd HH:mm:ss") + "'" + SPACE;
+				} else {
+					return (field.contains(".") ? "" : "t.") + field + SPACE + "< '" + DateUtil.parse(String.valueOf(getStringValueInWhere(field, value, attrVOMap)), "yyyy-MM-dd HH:mm:ss") + "'" + SPACE;
+				}
+			} else if (key.endsWith("_null")) {
+				String field = UBCSSqlKeyword.getColumn(key, "_null");
+				if (referFieldMap.containsKey(field)) {
+					return referFieldMap.get(field) + SPACE + "IS NULL" + SPACE;
+				} else {
+					return (field.contains(".") ? "" : "t.") + field + SPACE + "IS NULL" + SPACE;
+				}
+			} else if (key.endsWith("_notnull")) {
+				String field = UBCSSqlKeyword.getColumn(key, "_null");
+				if (referFieldMap.containsKey(field)) {
+					return referFieldMap.get(field) + SPACE + "IS NOT NULL" + SPACE;
+				} else {
+					return (field.contains(".") ? "" : "t.") + field + SPACE + "IS NOT NULL" + SPACE;
+				}
+			} else if(key.endsWith("_dateequal")) {
+				String field = UBCSSqlKeyword.getColumn(key, "_dateequal");
+				if (referFieldMap.containsKey(field)) {
+					return referFieldMap.get(field) + SPACE + "= '" + DateUtil.parse(String.valueOf(value), "yyyy-MM-dd HH:mm:ss") + "'" + SPACE;
+				} else {
+					return (field.contains(".") ? "" : "t.") + field + SPACE + "= '" + DateUtil.parse(String.valueOf(getStringValueInWhere(field, value, attrVOMap)), "yyyy-MM-dd HH:mm:ss") + "'" + SPACE;
+				}
+			}else if(key.endsWith("_equal")) {
+				String field = UBCSSqlKeyword.getColumn(key, "_equal");
+				if (referFieldMap.containsKey(field)) {
+					return referFieldMap.get(field) + SPACE + "= '" + value + "'" + SPACE;
+				} else {
+					return (field.contains(".") ? "" : "t.") + field + SPACE + "= '" + getStringValueInWhere(field, value, attrVOMap) + "'"  + SPACE;
+				}
+			}else {
+				if (referFieldMap.containsKey(key)) {
+					//璇存槑鏄弬鐓х殑锛屾垜浠弬鐓х殑鏌ヨ閮借涓烘槸瀛楃涓诧紝濡傛灉鏄椂闂存牸寮忕殑鏌ヨ鑲畾鏈夐棶棰橈紝
+					String selectKey = referFieldMap.get(key);
+					return getSqlByValue(selectKey, value, null,btmType);
+				} else {
+					return getSqlByValue(key, value, attrVOMap,btmType);
+				}
+			}
+		}
+		return "";
+
+		/*if (key.endsWith("_begin")) {
 			//璇存槑鏄�>=鐨勩�傛垜浠渶瑕佸厛鑾峰彇涓�涓�
 			String field = (key.substring(0, key.length() - 6).toLowerCase().trim());
 			if (referFieldMap.containsKey(field)) {
@@ -1661,11 +1897,11 @@
 			if (referFieldMap.containsKey(key)) {
 				//璇存槑鏄弬鐓х殑锛屾垜浠弬鐓х殑鏌ヨ閮借涓烘槸瀛楃涓诧紝濡傛灉鏄椂闂存牸寮忕殑鏌ヨ鑲畾鏈夐棶棰橈紝
 				String selectKey = referFieldMap.get(key);
-				return getSqlByValue(selectKey, value, null);
+				return getSqlByValue(selectKey, value, null,btmType);
 			} else {
-				return getSqlByValue(key, value, attrVOMap);
+				return getSqlByValue(key, value, attrVOMap,btmType);
 			}
-		}
+		}*/
 
 	}
 
@@ -1688,7 +1924,7 @@
 			}
 			if (field.contains(".") && attrVOMap != null && attrVOMap.containsKey(field.split("\\.")[0].toLowerCase(Locale.ROOT))) {
 				//鏄弬鐓�
-				return "'" + value + "'";
+				return value;
 			} else {
 				return value;
 			}
@@ -1712,16 +1948,34 @@
 					|| VciFieldTypeEnum.VTInteger.equals(fieldTypeEnum)) {
 					return value;
 				} else {
-					return "'" + value + "'";
+					return value;
 				}
 			} else {
 				if ((value.startsWith("(") && value.endsWith(")")) || (value.startsWith("'") && value.endsWith("'"))) {
 					return value;
 				}
-				return "'" + value + "'";
+				return value;
 			}
 		}
 
+	}
+
+	/**
+	 * 鏌ョ湅鏄惁榛樿灞炴��
+	 * @param selectKey
+	 * @param btmType
+	 * @return
+	 */
+	private boolean isDefaultAttr(String selectKey, String btmType){
+		if(StringUtils.isBlank(btmType)){
+			return false;
+		}
+		R<BtmTypeVO> r = btmTypeClient.getDefaultAttrByBtmId(btmType);
+		List<BtmTypeAttributeVO> attributes = r.getData().getAttributes();
+		if(r.getCode() != 200 || attributes.isEmpty()){
+			return false;
+		}
+		return  attributes.stream().anyMatch(item->item.getId().equals(selectKey));
 	}
 
 	/**
@@ -1732,9 +1986,10 @@
 	 * @param attrVOMap 灞炴�х殑鏄剧ず瀵硅薄鏄犲皠
 	 * @return sql閲岀殑鍊�
 	 */
-	private String getSqlByValue(String selectKey, String value, Map<String, CodeClassifyTemplateAttrVO> attrVOMap) {
+	private String getSqlByValue(String selectKey, String value, Map<String, CodeClassifyTemplateAttrVO> attrVOMap,String btmType) {
 		StringBuilder sql = new StringBuilder();
-		if (!selectKey.contains(".") && (attrVOMap.containsKey(selectKey.toLowerCase(Locale.ROOT)) || attributeService.isDefaultAttr(selectKey) || selectKey.matches(RegExpConstant.LETTER))) {
+		// TODO 宸插畬鍠�
+		if (!selectKey.contains(".") && (attrVOMap.containsKey(selectKey.toLowerCase(Locale.ROOT)) || isDefaultAttr(selectKey,btmType) || selectKey.matches(RegExpConstant.LETTER))) {
 			sql.append("t.");
 		}
 		if (value.startsWith(QueryOptionConstant.IN)) {
@@ -1840,12 +2095,15 @@
 //		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
 		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
 		//鎵句笟鍔$被鍨嬶紝鐒跺悗浣跨敤涓婚敭鍘昏幏鍙栨暟鎹簱閲岀殑鏁版嵁
-//		List<ClientBusinessObject> cbos = boService.queryCBO(classifyFullInfo.getTopClassifyVO().getBtmtypeid(), WebUtil.getOidQuery(orderDTO.getOid()));
+		List<BaseModel> cbos = selectByTypeAndOid(classifyFullInfo.getTopClassifyVO().getBtmtypeid(), orderDTO.getOid());
 
-		QueryWrapper<CodeWupinEntity> btmWrapper = new QueryWrapper<>();
-		btmWrapper.eq("OID",orderDTO.getOid());
-		CodeWupinEntity cbo = codeWupinMapper.selectOne(btmWrapper);
-
+		if (CollectionUtils.isEmpty(cbos)) {
+			throw new VciBaseException(DATA_OID_NOT_EXIST);
+		}
+//		QueryWrapper<CodeWupin> btmWrapper = new QueryWrapper<>();
+//		btmWrapper.eq("OID",orderDTO.getOid());
+//		CodeWupin cbo = codeWupinMapper.selectOne(btmWrapper);
+		BaseModel cbo = cbos.get(0);
 //		CodeClstemplateVO templateVO = templateService.getObjectHasAttrByOid(orderDTO.getTemplateOid());
 //		CodeRuleVO ruleVO = ruleService.getObjectHasSecByOid(orderDTO.getCodeRuleOid());
 
@@ -1883,7 +2141,7 @@
 		cbo.setDescription(orderDTO.getDescription());
 		cbo.setName(orderDTO.getName());
 		try {
-			cbo.setDescription(orderDTO.getDescription());
+			cbo.setDescription( StringUtils.isBlank(orderDTO.getDescription())?"":orderDTO.getDescription());
 			cbo.setName(orderDTO.getName());
 ////			cbo.setAttributeValueWithNoCheck("description", orderDTO.getDescription());
 //			cbo.setAttributeValue("name", orderDTO.getName());
@@ -1891,8 +2149,9 @@
 			e.printStackTrace();
 		}
 		cbo.setLastModifyTime(new Date());
-		cbo.setLastModifier(AuthUtil.getUser().getUserName());
-		codeWupinMapper.updateById(cbo);
+		cbo.setLastModifier(String.valueOf(AuthUtil.getUser().getUserId()));
+		updateBatchByBaseModel(classifyFullInfo.getTopClassifyVO().getBtmtypeid(), Collections.singletonList(cbo));
+//		codeWupinMapper.updateById(cbo);
 //
 //		List<CodeWupinEntity> cboList = new ArrayList<>();
 //
@@ -1912,15 +2171,14 @@
 //		return codeList.size() > 0 ? codeList.get(0) : "";
 
 
-
-
 		//淇敼鐨勬椂鍊欙紝缂栫爜鏄笉鍙樼殑
 //		BatchCBO batchCBO = new BatchCBO();
 //		batchCBO.getUpdateCbos().add(cbo);
 //		List<ClientBusinessObject> cboList = new ArrayList<>();
 //		cboList.add(cbo);
 //		boService.persistenceBatch(batchCBO);
-		batchSaveSelectChar(templateVO, Arrays.asList(cbo.getId()));
+		batchSaveSelectChar(templateVO, Collections.singletonList(cbo));
+//		batchSaveSelectChar(templateVO, Arrays.asList(cbo.getId()));
 	}
 
 	/**
@@ -1934,34 +2192,35 @@
 			deleteBatchDTO.getCodeClassifyOid(), "涓婚搴撳垎绫荤殑涓婚敭");
 		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(deleteBatchDTO.getCodeClassifyOid());
 		//鎵句笟鍔$被鍨嬶紝鐒跺悗浣跨敤涓婚敭鍘昏幏鍙栨暟鎹簱閲岀殑鏁版嵁
-		Collection<String> oidCollection = null;
+		Collection<String> oidCollection = new ArrayList<>();
 		for (Collection<String> strings : VciBaseUtil.switchCollectionForOracleIn(deleteBatchDTO.getOidList())) {
 			oidCollection.addAll(strings);
 		}
 
-		List<CodeWupinEntity> cboList = codeWupinMapper.selectBatchIds(oidCollection);
-		//		List<ClientBusinessObject> cboList = new ArrayList<>();
-//		oidCollection.stream().forEach(oids -> {
-//			Map<String, String> conditionMap = new HashMap<>();
+//		List<CodeWupin> cboList = codeWupinMapper.selectBatchIds(oidCollection);
+		List<BaseModel> cboList = new ArrayList<>();
+		oidCollection.stream().forEach(oids -> {
+			Map<String, String> conditionMap = new HashMap<>();
 //			conditionMap.put("oid", QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(oids.toArray(new String[0])) + ")");
-//			List<ClientBusinessObject> cbos = boService.queryCBO(classifyFullInfo.getTopClassifyVO().getBtmtypeid(), conditionMap);
-//			cboList.addAll(cbos);
-//		});
+			List<BaseModel> cbos = selectByTypeAndOid(classifyFullInfo.getTopClassifyVO().getBtmtypeid(),oids);
+//				boService.queryCBO(classifyFullInfo.getTopClassifyVO().getBtmtypeid(), conditionMap);
+			cboList.addAll(cbos);
+		});
 		if (CollectionUtils.isEmpty(cboList)) {
 			throw new VciBaseException("鏁版嵁鍏ㄩ儴鍦ㄧ郴缁熶腑涓嶅瓨鍦�");
 		}
-		List<CodeWupinEntity> editCBOs = cboList.stream().filter(s -> !CodeDefaultLC.EDITING.getValue().equalsIgnoreCase(s.getLcStatus())).collect(Collectors.toList());
+		List<BaseModel> editCBOs = cboList.stream().filter(s -> !CodeDefaultLC.EDITING.getValue().equalsIgnoreCase(s.getLcStatus())).collect(Collectors.toList());
 		if (!CollectionUtils.isEmpty(editCBOs)) {
-			CodeWupinEntity cbo = editCBOs.get(0);
+			BaseModel cbo = editCBOs.get(0);
 			throw new VciBaseException("缂栫爜涓簕0}绛夊叡{1}鏉℃暟鎹殑鐘舵�佷笉鏄痆{2}]锛屼笉鍏佽鍒犻櫎", new String[]{cbo.getId(), String.valueOf(editCBOs.size()), CodeDefaultLC.EDITING.getText()});
 		}
 
 		//鍙兘鍒犻櫎鑷繁鍒涘缓鐨勬暟鎹�
-		String userId = AuthUtil.getUser().getUserName();
-		for (CodeWupinEntity clientBusinessObject:cboList){
+		String userId = String.valueOf(AuthUtil.getUser().getUserId());
+		for (BaseModel clientBusinessObject : cboList) {
 			String creator = clientBusinessObject.getCreator();
-			if(!userId.equalsIgnoreCase(creator)){
-				throw new VciBaseException("缂栫爜涓�"+clientBusinessObject.getId()+"鐨勬暟鎹笉鏄綋鍓嶇敤鎴峰垱寤猴紝涓嶈兘鍒犻櫎锛�");
+			if (!userId.equalsIgnoreCase(creator)) {
+				throw new VciBaseException("缂栫爜涓�" + clientBusinessObject.getId() + "鐨勬暟鎹笉鏄綋鍓嶇敤鎴峰垱寤猴紝涓嶈兘鍒犻櫎锛�");
 			}
 
 		}
@@ -1970,7 +2229,14 @@
 //		WebUtil.setPersistence(false);
 //		batchCBO.copyFromOther(
 		productCodeService.recycleCode(classifyFullInfo.getCurrentClassifyVO().getBtmtypeid(), deleteBatchDTO.getOidList());
-		baseMapper.deleteBatchIds(cboList);
+//		baseMapper.deleteBatchIds(cboList);
+		//浣跨敤浼犲叆鐨勪笟鍔$被鍨嬫煡璇㈣〃
+		R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(classifyFullInfo.getCurrentClassifyVO().getBtmtypeid()));
+		if (listR.getData().size() == 0) {
+			throw new VciBaseException("浼犲叆涓氬姟绫诲瀷鏈煡璇㈠埌鐩稿簲琛ㄥ崟锛岃妫�鏌ワ紒");
+		}
+		commonsMapper.deleteByTaleAndOid(listR.getData().get(0).getTableName(),
+			"'"+(StringUtils.join(cboList.stream().map(BaseModel::getOid).collect(Collectors.toSet()),"','"))+"'");
 		//		);
 //		WebUtil.setPersistence(true);
 //		boService.persistenceBatch(batchCBO);
@@ -2045,14 +2311,18 @@
 		//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 +
-				"' start with parentCodeClassifyOid = '" + codeClassifyOid + "' CONNECT BY PRIOR OID = parentCodeClassifyOid )");
+//			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 "+
+				btmTypeClient.selectByIdCollection(Collections.singletonList(MdmBtmTypeConstant.CODE_CLASSIFY))
+					.getData().get(0).getTableName() +" 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());
 //        //鍙傜収璁╁钩鍙扮洿鎺ユ煡璇㈠氨琛�
@@ -2084,67 +2354,77 @@
 	 */
 	@Override
 	public R batchUpdateCode(List<CodeOrderDTO> orderDTOList) {
-//		VciBaseUtil.alertNotNull(orderDTOList,"缂栫爜鐢宠鐩稿叧鐨勫睘鎬у唴瀹�");
-//		orderDTOList.forEach(orderDTO -> {
-//			VciBaseUtil.alertNotNull(orderDTO, "缂栫爜鐢宠鐩稿叧鐨勫睘鎬х殑鍐呭閮戒负绌�", orderDTO.getOid(), "鏁版嵁涓婚敭",
-//				orderDTO.getCodeClassifyOid(), "涓婚搴撳垎绫荤殑涓婚敭");
-//		});
-//		Map<String, CodeOrderDTO> orderDTOMap = orderDTOList.stream().filter(orderDTO -> orderDTO != null && StringUtils.isNotBlank(orderDTO.getOid())).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
-//		List<ClientBusinessObject> updateList = new ArrayList<>();
-//		// 搴旇閮芥槸涓�涓垎绫讳笅鐨勪笟鍔℃暟鎹紝鎵剧涓�鏉$殑灏辫
-//		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTOList.get(0).getCodeClassifyOid());
+		VciBaseUtil.alertNotNull(orderDTOList,"缂栫爜鐢宠鐩稿叧鐨勫睘鎬у唴瀹�");
+		orderDTOList.forEach(orderDTO -> {
+			VciBaseUtil.alertNotNull(orderDTO, "缂栫爜鐢宠鐩稿叧鐨勫睘鎬х殑鍐呭閮戒负绌�", orderDTO.getOid(), "鏁版嵁涓婚敭",
+				orderDTO.getCodeClassifyOid(), "涓婚搴撳垎绫荤殑涓婚敭");
+		});
+		Map<String, CodeOrderDTO> orderDTOMap = orderDTOList.stream().filter(orderDTO -> orderDTO != null && StringUtils.isNotBlank(orderDTO.getOid())).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
+		List<BaseModel> updateList = new ArrayList<>();
+		// 搴旇閮芥槸涓�涓垎绫讳笅鐨勪笟鍔℃暟鎹紝鎵剧涓�鏉$殑灏辫
+		CodeClassifyFullInfoBO topClassifyFullInfo = classifyService.getClassifyFullInfo(orderDTOList.get(0).getCodeClassifyOid());
 //		Map<String,String> cboOidMap = new HashMap<>();
-//		if (CollectionUtils.isEmpty(orderDTOMap.keySet())){
-//			throw new VciBaseException(DATA_OID_NOT_EXIST);
-//		}
+		if (CollectionUtils.isEmpty(orderDTOMap.keySet())){
+			throw new VciBaseException(DATA_OID_NOT_EXIST);
+		}
+
+		List<BaseModel> cboList = selectByTypeAndOid(topClassifyFullInfo.getTopClassifyVO().getBtmtypeid(), VciBaseUtil.array2String(orderDTOMap.keySet().toArray(new String[0])));
 //		cboOidMap.put("oid",QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(orderDTOMap.keySet().toArray(new String[0])) + ")");
 //		List<ClientBusinessObject> cboList = boService.queryCBO(classifyFullInfo.getTopClassifyVO().getBtmtypeid(), cboOidMap);
-//		if (CollectionUtils.isEmpty(cboList)){
-//			throw new VciBaseException(DATA_OID_NOT_EXIST);
-//		}
+		if (CollectionUtils.isEmpty(cboList)){
+			throw new VciBaseException(DATA_OID_NOT_EXIST);
+		}
 //		BatchCBO batchCBO = new BatchCBO();
 //		CodeClassifyTemplateVO firstTemplateVO = templateService.getObjectHasAttrByOid(orderDTOMap.values().stream().findFirst().get().getTemplateOid());
-//		Map<String, ClientBusinessObject> cboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
-//		orderDTOMap.keySet().stream().forEach(oid -> {
-//			CodeOrderDTO orderDTO = orderDTOMap.get(oid);
-//			ClientBusinessObject cbo = cboMap.get(oid);
-//			if (!cbo.getTs().contains(VciDateUtil.date2Str(orderDTO.getTs(), VciDateUtil.DateTimeFormat))) {
-//				throw new VciBaseException("鏁版嵁涓嶆槸鏈�鏂扮殑锛屽彲鑳戒粬浜哄凡缁忎慨鏀癸紝璇峰埛鏂板悗鍐嶈瘯");
-//			}
-//			if (!CodeDefaultLC.EDITING.getValue().equalsIgnoreCase(cbo.getLcStatus()) && !orderDTO.isEditInProcess()) {
-//				throw new VciBaseException("鏁版嵁涓嶆槸{0}鐨勭姸鎬侊紝涓嶅厑璁镐慨鏀�", new String[]{CodeDefaultLC.EDITING.getText()});
-//			}
-//			//1. 鍒ゆ柇蹇呰緭椤�
-//			CodeClassifyTemplateVO templateVO = templateService.getObjectHasAttrByOid(orderDTO.getTemplateOid());
-//			checkRequiredAttrOnOrder(templateVO, orderDTO);
-//			//2.鍏堟敞鍏ワ紝鍐嶇粍鍚堬紝鏈�鍚庢牎楠�
-//			switchClassifyLevelOnOrder(templateVO, classifyFullInfo, orderDTO);
-//			//3.澶勭悊缁勫悎瑙勫垯銆傜粍鍚堣鍒欎笉鑳戒娇鐢ㄧ紪鐮佺殑灞炴�э紝鍥犱负缂栫爜鐨勭敓鎴愬彲鑳芥槸闇�瑕佸睘鎬х殑
-//			switchComponentAttrOnOrder(templateVO, orderDTO);
-//			//4.鏍¢獙瑙勫垯
-//			checkVerifyOnOrder(templateVO, orderDTO);
-//			//5.鍒ゆ柇鍏抽敭灞炴��
-//			checkKeyAttrOnOrder(classifyFullInfo, templateVO, orderDTO);
-//			//6.鏍¢獙鏋氫妇鐨勫唴瀹规槸鍚︽纭�
-//			checkEnumOnOrder(templateVO, orderDTO);
-//			//7.澶勭悊鏃堕棿鏍煎紡锛屽湪鏁版嵁搴撻噷闈笉璁烘槸瀛楃涓茶繕鏄棩鏈熸牸寮忥紝閮戒娇鐢ㄧ浉鍚岀殑鏍煎紡瀛樺偍
-//			switchDateAttrOnOrder(templateVO, orderDTO);
-//			//榛樿鐨勫唴瀹逛笉鑳藉彉锛屾墍浠ュ彧闇�瑕佹嫹璐濊嚜瀹氫箟鐨勭浉鍏冲睘鎬у嵆鍙�
-//			copyValueToCBO(classifyFullInfo, cbo, orderDTO, templateVO, true);
-//			//浼佷笟鐮佸拰闆嗗洟鐮佺殑涓嶄慨鏀�
-//			cbo.setDescription(orderDTO.getDescription());
-//			cbo.setName(orderDTO.getName());
+		Map<String, BaseModel> cboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t));
+		orderDTOMap.keySet().stream().forEach(oid -> {
+			CodeOrderDTO orderDTO = orderDTOMap.get(oid);
+			CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
+			CodeClassifyTemplateVO firstTemplateVO = templateService.getObjectHasAttrByOid(orderDTOMap.values().stream().findFirst().get().getTemplateOid());
+			BaseModel cbo = cboMap.get(oid);
+			String code=cbo.getId();
+			if (!cbo.getTs().toString().contains(orderDTO.getTs().toString())) {
+				throw new VciBaseException("鏁版嵁涓嶆槸鏈�鏂扮殑锛屽彲鑳戒粬浜哄凡缁忎慨鏀癸紝璇峰埛鏂板悗鍐嶈瘯");
+			}
+			if (!CodeDefaultLC.EDITING.getValue().equalsIgnoreCase(cbo.getLcStatus()) && !orderDTO.isEditInProcess()) {
+				throw new VciBaseException("鏁版嵁涓嶆槸{0}鐨勭姸鎬侊紝涓嶅厑璁镐慨鏀�", new String[]{CodeDefaultLC.EDITING.getText()});
+			}
+			//1. 鍒ゆ柇蹇呰緭椤�
+			CodeClassifyTemplateVO templateVO = templateService.getObjectHasAttrByOid(orderDTO.getTemplateOid());
+			checkRequiredAttrOnOrder(templateVO, orderDTO);
+			//2.鍏堟敞鍏ワ紝鍐嶇粍鍚堬紝鏈�鍚庢牎楠�
+			switchClassifyLevelOnOrder(templateVO, classifyFullInfo, orderDTO);
+			//3.澶勭悊缁勫悎瑙勫垯銆傜粍鍚堣鍒欎笉鑳戒娇鐢ㄧ紪鐮佺殑灞炴�э紝鍥犱负缂栫爜鐨勭敓鎴愬彲鑳芥槸闇�瑕佸睘鎬х殑
+			switchComponentAttrOnOrder(templateVO, orderDTO);
+			//4.鏍¢獙瑙勫垯
+			checkVerifyOnOrder(templateVO, orderDTO);
+			//5.鍒ゆ柇鍏抽敭灞炴��
+			checkKeyAttrOnOrder(classifyFullInfo, templateVO, orderDTO);
+			//6.鏍¢獙鏋氫妇鐨勫唴瀹规槸鍚︽纭�
+			checkEnumOnOrder(templateVO, orderDTO);
+			//7.澶勭悊鏃堕棿鏍煎紡锛屽湪鏁版嵁搴撻噷闈笉璁烘槸瀛楃涓茶繕鏄棩鏈熸牸寮忥紝閮戒娇鐢ㄧ浉鍚岀殑鏍煎紡瀛樺偍
+			switchDateAttrOnOrder(templateVO, orderDTO);
+			//榛樿鐨勫唴瀹逛笉鑳藉彉锛屾墍浠ュ彧闇�瑕佹嫹璐濊嚜瀹氫箟鐨勭浉鍏冲睘鎬у嵆鍙�
+			copyValueToCBO(classifyFullInfo, cbo, orderDTO, templateVO, true);
+			//浼佷笟鐮佸拰闆嗗洟鐮佺殑涓嶄慨鏀�
+			cbo.setDescription(StringUtils.isBlank(orderDTO.getDescription())?"":orderDTO.getDescription());
+			cbo.setName(orderDTO.getName());
 //			try {
-//				cbo.setAttributeValueWithNoCheck("description", orderDTO.getDescription());
+//				cbo.setAttributeValue("id",code);
+			cbo.setId(code);
+			cbo.setDescription(StringUtils.isBlank(orderDTO.getDescription())?"":orderDTO.getDescription());
+//				cbo.setAttributeValueWithNoCheck("description", StringUtils.isBlank(orderDTO.getDescription())?"":orderDTO.getDescription());
 //				cbo.setAttributeValue("name", orderDTO.getName());
+			cbo.setName(orderDTO.getName());
 //			} catch (VCIError e) {
 //				e.printStackTrace();
 //			}
 //			batchCBO.getUpdateCbos().add(cbo);
-//			updateList.add(cbo);
-//		});
+			updateList.add(cbo);
+			batchSaveSelectChar(firstTemplateVO, cboList);
+		});
 //		boService.persistenceBatch(batchCBO);
-//		batchSaveSelectChar(firstTemplateVO, cboList);
+		updateBatchByBaseModel(topClassifyFullInfo.getTopClassifyVO().getBtmtypeid(),updateList);
 		return R.success("鎿嶄綔鎴愬姛锛�");
 	}
 
@@ -2160,17 +2440,21 @@
 	public R markDataPassing(String oid, String btmName, Boolean pass) {
 		VciBaseUtil.alertNotNull(oid, "涓氬姟鏁版嵁涓婚敭", btmName, "涓氬姟绫诲瀷", pass, "鏍囪绫诲瀷");
 		boolean flag = false;
-//		try {
-//			ClientBusinessObjectOperation operation = new ClientBusinessObjectOperation();
+		try {
+//			QueryWrapper<CodeWupinEntity> wrapper = new QueryWrapper<>();
+//			wrapper.eq("oid",oid);
+			CodeWupin data = baseMapper.selectById(oid);
+			//			ClientBusinessObjectOperation operation = new ClientBusinessObjectOperation();
 //			ClientBusinessObject data = operation.readBusinessObjectById(oid, btmName);
-//			if (data == null || StringUtils.isBlank(data.getOid())) {
-//				return BaseResult.fail(DATA_OID_NOT_EXIST);
-//			}
-//			data.setAttributeValue("passing", String.valueOf(pass));
+			if (data == null || StringUtils.isBlank(data.getOid())) {
+				return R.fail(DATA_OID_NOT_EXIST);
+			}
+			data.setPassing(String.valueOf(pass));
+			flag = SqlHelper.retBool(baseMapper.updateById(data));
 //			flag = operation.updateBuinessObject(data);
-//		} catch (VCIError e) {
-//			e.printStackTrace();
-//		}
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
 		if (flag) {
 			return R.success("鏍囪鎴愬姛锛�");
 		} else {
@@ -2223,64 +2507,76 @@
 	 */
 	@Override
 	public void upSaveCode(CodeOrderDTO orderDTO) {
+		VciBaseUtil.alertNotNull(orderDTO, "缂栫爜鏁版嵁鎵�鍦ㄤ笟鍔$被鍚嶇О", orderDTO.getBtmname());
+		String btmName=orderDTO.getBtmname();
+		//鎵句笟鍔$被鍨嬶紝鐒跺悗浣跨敤涓婚敭鍘昏幏鍙栨暟鎹簱閲岀殑鏁版嵁
+		List<BaseModel> cbos = selectByTypeAndOid(btmName, orderDTO.getCopyFromVersion());
+		if (CollectionUtils.isEmpty(cbos)) {
+			throw new VciBaseException(DATA_OID_NOT_EXIST);
+		}
+		BaseModel oldCbo = cbos.get(0);
+
+		if (!CodeDefaultLC.RELEASED.getValue().equalsIgnoreCase(oldCbo.getLcStatus())) {
+			throw new VciBaseException("鏁版嵁涓嶆槸{0}鐨勭姸鎬侊紝涓嶅厑璁告暟鎹洿鏀�", new String[]{CodeDefaultLC.RELEASED.getText()});
+		}
+
+		//鏍规嵁鏁版嵁鑾峰彇鍒嗙被oid
+		String codeClassifyOid=oldCbo.getData().get(CODE_CLASSIFY_OID_FIELD.toUpperCase());
+		orderDTO.setCodeClassifyOid(codeClassifyOid);
+		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
+		CodeClassifyTemplateVO templateVO= this.getUsedTemplateByClassifyOid(orderDTO.getCodeClassifyOid());
+		orderDTO.setTemplateOid(templateVO.getOid());
 		VciBaseUtil.alertNotNull(orderDTO, "缂栫爜鐢宠鐩稿叧鐨勫睘鎬х殑鍐呭涓虹┖", orderDTO.getCopyFromVersion(), "鍘熷鏁版嵁鐨勪富閿�",
 			orderDTO.getCodeClassifyOid(), "涓婚搴撳垎绫荤殑涓婚敭");
-		CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
-		//鎵句笟鍔$被鍨嬶紝鐒跺悗浣跨敤涓婚敭鍘昏幏鍙栨暟鎹簱閲岀殑鏁版嵁
-//		List<ClientBusinessObject> cbos = boService.queryCBO(classifyFullInfo.getTopClassifyVO().getBtmtypeid(), WebUtil.getOidQuery(orderDTO.getCopyFromVersion()));
-//		if (CollectionUtils.isEmpty(cbos)) {
-//			throw new VciBaseException(DATA_OID_NOT_EXIST);
-//		}
-//		ClientBusinessObject oldCbo = cbos.get(0);
-//		if (!CodeDefaultLC.RELEASED.getValue().equalsIgnoreCase(oldCbo.getLcStatus())) {
-//			throw new VciBaseException("鏁版嵁涓嶆槸{0}鐨勭姸鎬侊紝涓嶅厑璁告暟鎹洿鏀�", new String[]{CodeDefaultLC.RELEASED.getText()});
-//		}
-//		//闇�瑕佸崌鐗�
+
+		//闇�瑕佸崌鐗�
 //		ClientBusinessObjectOperation cboOperation = new ClientBusinessObjectOperation();
-//		ClientBusinessObject cbo = null;
+		BaseModel cbo = null;
 //		try {
 //			//cbo = cboOperation.createBusinessObjectVersion(oldCbo,VciBaseUtil.getCurrentUserId());
-//			cbo = cboOperation.reviseBusinessObject(oldCbo, "");
+		cbo = reviseBusinessObject(oldCbo);
 //		} catch (VCIError e) {
 //			throw new VciBaseException("鍒濆鍖栫浉鍏崇殑鍐呭鍑虹幇浜嗛敊璇�", new String[0], e);
 //		}
-//		//1. 鍒ゆ柇蹇呰緭椤�
-//		CodeClassifyTemplateVO templateVO = templateService.getObjectHasAttrByOid(orderDTO.getTemplateOid());
-//		checkRequiredAttrOnOrder(templateVO, orderDTO);
-//		//2.鍏堟敞鍏ワ紝鍐嶇粍鍚堬紝鏈�鍚庢牎楠�
-//		switchClassifyLevelOnOrder(templateVO, classifyFullInfo, orderDTO);
-//		//3.澶勭悊缁勫悎瑙勫垯銆傜粍鍚堣鍒欎笉鑳戒娇鐢ㄧ紪鐮佺殑灞炴�э紝鍥犱负缂栫爜鐨勭敓鎴愬彲鑳芥槸闇�瑕佸睘鎬х殑
-//		switchComponentAttrOnOrder(templateVO, orderDTO);
-//		//4.鏍¢獙瑙勫垯
-//		checkVerifyOnOrder(templateVO, orderDTO);
-//		//5.鍒ゆ柇鍏抽敭灞炴��
-//		checkKeyAttrOnOrder(classifyFullInfo, templateVO, orderDTO);
-//		//6.鏍¢獙鏋氫妇鐨勫唴瀹规槸鍚︽纭�
-//		checkEnumOnOrder(templateVO, orderDTO);
-//		//7.澶勭悊鏃堕棿鏍煎紡锛屽湪鏁版嵁搴撻噷闈笉璁烘槸瀛楃涓茶繕鏄棩鏈熸牸寮忥紝閮戒娇鐢ㄧ浉鍚岀殑鏍煎紡瀛樺偍
-//		switchDateAttrOnOrder(templateVO, orderDTO);
-//		//榛樿鐨勫唴瀹逛笉鑳藉彉锛屾墍浠ュ彧闇�瑕佹嫹璐濊嚜瀹氫箟鐨勭浉鍏冲睘鎬у嵆鍙�
-//		copyValueToCBO(classifyFullInfo, cbo, orderDTO, templateVO, true);
-//		//浼佷笟鐮佸拰闆嗗洟鐮佺殑涓嶄慨鏀�
-//		cbo.setDescription(orderDTO.getDescription());
-//		cbo.setName(orderDTO.getName());
+		//1. 鍒ゆ柇蹇呰緭椤�
+		//CodeClassifyTemplateVO templateVO = templateService.getObjectHasAttrByOid(orderDTO.getTemplateOid());
+		checkRequiredAttrOnOrder(templateVO, orderDTO);
+		//2.鍏堟敞鍏ワ紝鍐嶇粍鍚堬紝鏈�鍚庢牎楠�
+		switchClassifyLevelOnOrder(templateVO, classifyFullInfo, orderDTO);
+		//3.澶勭悊缁勫悎瑙勫垯銆傜粍鍚堣鍒欎笉鑳戒娇鐢ㄧ紪鐮佺殑灞炴�э紝鍥犱负缂栫爜鐨勭敓鎴愬彲鑳芥槸闇�瑕佸睘鎬х殑
+		switchComponentAttrOnOrder(templateVO, orderDTO);
+		//4.鏍¢獙瑙勫垯
+		checkVerifyOnOrder(templateVO, orderDTO);
+		//5.鍒ゆ柇鍏抽敭灞炴��
+		checkKeyAttrOnOrder(classifyFullInfo, templateVO, orderDTO);
+		//6.鏍¢獙鏋氫妇鐨勫唴瀹规槸鍚︽纭�
+		checkEnumOnOrder(templateVO, orderDTO);
+		//7.澶勭悊鏃堕棿鏍煎紡锛屽湪鏁版嵁搴撻噷闈笉璁烘槸瀛楃涓茶繕鏄棩鏈熸牸寮忥紝閮戒娇鐢ㄧ浉鍚岀殑鏍煎紡瀛樺偍
+		switchDateAttrOnOrder(templateVO, orderDTO);
+		//榛樿鐨勫唴瀹逛笉鑳藉彉锛屾墍浠ュ彧闇�瑕佹嫹璐濊嚜瀹氫箟鐨勭浉鍏冲睘鎬у嵆鍙�
+		copyValueToCBO(classifyFullInfo, cbo, orderDTO, templateVO, true);
+		//浼佷笟鐮佸拰闆嗗洟鐮佺殑涓嶄慨鏀�
+		cbo.setDescription(StringUtils.isBlank(orderDTO.getDescription())?"":orderDTO.getDescription());
+		cbo.setName(orderDTO.getName());
 //		try {
-//			cbo.setAttributeValueWithNoCheck("description", orderDTO.getDescription());
-//			cbo.setAttributeValue("name", orderDTO.getName());
+		cbo.setDescription(StringUtils.isBlank(orderDTO.getDescription())?"":orderDTO.getDescription());
+//		cbo.setAttributeValueWithNoCheck("description", StringUtils.isBlank(orderDTO.getDescription())?"":orderDTO.getDescription());
+		cbo.setName(orderDTO.getName());
 //		} catch (VCIError e) {
 //			e.printStackTrace();
 //		}
-//		//鏁版嵁鐨勬椂鍊欙紝缂栫爜鏄笉鍙樼殑
-//		cbo.setCreateTime(DateUtils.convert2String(new Date(Long.parseLong(cbo.getCreateTime())), "yyyy-MM-dd HH:mm:ss"));
-//		cbo.setLastModifyTime(DateUtils.convert2String(new Date(Long.parseLong(cbo.getLastModifyTime())), "yyyy-MM-dd HH:mm:ss"));
+		//鏁版嵁鐨勬椂鍊欙紝缂栫爜鏄笉鍙樼殑
+		cbo.setCreateTime(cbo.getCreateTime());
+		cbo.setLastModifyTime(cbo.getLastModifyTime());
 //		List<ClientBusinessObject> cboList = new ArrayList<>();
 //		cboList.add(cbo);
-//		try {
+		try {
 //			cboOperation.saveRevisionBuinessObject(cbo);
-//		} catch (VCIError vciError) {
-//			throw new VciBaseException("鏁版嵁鏇存敼淇濆瓨鍑洪敊浜�", new String[0], vciError);
-//		}
-//		batchSaveSelectChar(templateVO, cboList);
+			insertBatchByType(cbo.getBtmname(), Collections.singletonList(cbo));
+		} catch (Exception vciError) {
+			throw new VciBaseException("鏁版嵁鏇存敼淇濆瓨鍑洪敊浜�", new String[0], vciError);
+		}
+		batchSaveSelectChar(templateVO, Collections.singletonList(cbo));
 	}
 
 	/**
@@ -2362,23 +2658,33 @@
 		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("鏁版嵁鍦ㄧ郴缁熶腑涓嶅瓨鍦紝鏄惁鍥犱负淇敼杩囦笟鍔$被鍨嬶紵");
 		}
 //		Map<String, String> data = new HashMap<>();
-		Map<String,String> cbo = cbos.get(0);
+		Map<String, String> cbo = cbos.get(0);
 //		WebUtil.copyValueToMapFromCbos(cbo, data);
 		List<Map<String, String>> dataList = new ArrayList<>();
 		dataList.add(cbo);
 		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");
 //		}
@@ -2431,7 +2737,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);
@@ -2464,51 +2770,63 @@
 		}
 		List<String> oidList = VciBaseUtil.str2List(conditionMap.get("oid"));
 		Map<String, String> oidMap = new HashMap<>();
+		QueryWrapper<CodeWupin> wrapper = new QueryWrapper();
 		if (conditionMap.get("oid").contains(",")) {
-			oidMap.put("oid", QueryOptionConstant.IN +"("+ VciBaseUtil.toInSql(oidList.toArray(new String[0])) + ")");
+//			oidMap.put("oid", QueryOptionConstant.IN +"("+ VciBaseUtil.toInSql(oidList.toArray(new String[0])) + ")");
+			wrapper.in("oid", oidList);
 		} else {
-			oidMap.put("oid", conditionMap.get("oid"));
+//			oidMap.put("oid", conditionMap.get("oid"));
+			wrapper.in("oid", conditionMap.get("oid"));
 		}
 		if (CollectionUtils.isEmpty(oidMap)) {
 			throw new VciBaseException("涓氬姟鏁版嵁涓婚敭涓嶈兘涓虹┖");
 		}
 //		List<ClientBusinessObject> cbos = boService.queryCBO(btmType, oidMap);
-//		if (CollectionUtils.isEmpty(cbos)) {
-//			throw new VciBaseException("鏈壘鍒颁笟鍔℃暟鎹�");
-//		}
-//		ClientBusinessObject cbo = cbos.get(0);
-//		String templateOid = cbo.getAttributeValue("CODETEMPLATEOID");
+		List<CodeWupin> cbos = baseMapper.selectList(wrapper);
+		if (CollectionUtils.isEmpty(cbos)) {
+			throw new VciBaseException("鏈壘鍒颁笟鍔℃暟鎹�");
+		}
+		CodeWupin cbo = cbos.get(0);
+		String templateOid = cbo.getCodetemplateoid();
 //		Map<String, String> templateOidMap = new HashMap<>();
 //		templateOidMap.put("oid", templateOid);
+
+		QueryWrapper<CodeClassifyTemplate> codeClassifyTemplateWrapper = new QueryWrapper<>();
+		codeClassifyTemplateWrapper.eq("oid", templateOid);
+		List<CodeClassifyTemplate> templateDOList = templateService.list(codeClassifyTemplateWrapper);
+
 //		List<CodeClassifyTemplate> templateDOList = boService.queryObject(CodeClassifyTemplate.class, templateOidMap);
+		QueryWrapper<CodeClassifyTemplateAttr> codeClassifyTemplateAttrWrapper = new QueryWrapper<>();
+		codeClassifyTemplateAttrWrapper.eq("CLASSIFYTEMPLATEOID", templateOid);
 //		templateOidMap.clear();
 //		templateOidMap.put("CLASSIFYTEMPLATEOID",templateOid);
-//		List<CodeClassifyTemplateAttr> attrDOList = boService.queryObject(CodeClassifyTemplateAttr.class, templateOidMap);
-//		if (CollectionUtils.isEmpty(templateDOList)) {
-//			logger.error("鎵句笉鍒颁笟鍔℃暟鎹叧鑱旂殑妯℃澘锛屾ā鏉夸富閿細" + templateOid);
-//			throw new VciBaseException("鎵句笉鍒颁笟鍔℃暟鎹叧鑱旂殑妯℃澘");
-//		}
-//		CodeClassifyTemplateVO templateVO = templateService.codeClassifyTemplateDO2VO(templateDOList.get(0));
-//		templateVO.setAttributes(templateAttrService.codeClassifyTemplateAttrDO2VOs(attrDOList));
-//		try {
-//			if (oidList.size() > 1){
-//				DataGrid<Map<String,String>> allDataGrid = new DataGrid<>();
-//				List<Map<String,String>> allData = new ArrayList<>();
-//				oidList.forEach(oid -> {
-//					Map<String,String> condition = new HashMap<>();
-//					condition.put("oid",oid);
-//					DataGrid<Map<String, String>> dataGrid = queryGrid(btmType, templateVO, condition, pageHelper);
-//					allData.addAll(dataGrid.getData());
-//				});
-//				allDataGrid.setData(allData);
-//				return allDataGrid;
-//			}else {
-//				return queryGrid(btmType, templateVO, conditionMap, pageHelper);
-//			}
-//		} catch (Exception e) {
-//			System.out.println(e.getMessage());
+		List<CodeClassifyTemplateAttr> attrDOList = codeClassifyTemplateAttrService.list(codeClassifyTemplateAttrWrapper);
+//			boService.queryObject(CodeClassifyTemplateAttr.class, templateOidMap);
+		if (CollectionUtils.isEmpty(templateDOList)) {
+			logger.error("鎵句笉鍒颁笟鍔℃暟鎹叧鑱旂殑妯℃澘锛屾ā鏉夸富閿細" + templateOid);
+			throw new VciBaseException("鎵句笉鍒颁笟鍔℃暟鎹叧鑱旂殑妯℃澘");
+		}
+		CodeClassifyTemplateVO templateVO = templateService.codeClassifyTemplateDO2VO(templateDOList.get(0));
+		templateVO.setAttributes(codeClassifyTemplateAttrService.codeClassifyTemplateAttrDO2VOs(attrDOList));
+		try {
+			if (oidList.size() > 1) {
+				DataGrid<Map<String, String>> allDataGrid = new DataGrid<>();
+				List<Map<String, String>> allData = new ArrayList<>();
+				oidList.forEach(oid -> {
+					Map<String, String> condition = new HashMap<>();
+					condition.put("oid", oid);
+					DataGrid<Map<String, String>> dataGrid = queryGrid(btmType, templateVO, condition, pageHelper);
+					allData.addAll(dataGrid.getData());
+				});
+				allDataGrid.setData(allData);
+				return allDataGrid;
+			} else {
+				return queryGrid(btmType, templateVO, conditionMap, pageHelper);
+			}
+		} catch (Exception e) {
+			System.out.println(e.getMessage());
 			return null;
-//		}
+		}
 	}
 	/**
 	 * 浣跨敤鍒嗙被鐨勪富閿幏鍙栬〃鏍肩殑瀹氫箟
@@ -2522,20 +2840,20 @@
 		MdmUIInfoVO uiInfoVO = new MdmUIInfoVO();
 		CodeClassifyTemplateVO templateVO = getUsedTemplateByClassifyOid(codeClassifyOid);
 		uiInfoVO.setTemplateVO(templateVO);
-		UITableDefineVO uiTableDefineVO = wrapperTableDefineByTemplate(templateVO,true);
+		UITableDefineVO uiTableDefineVO = wrapperTableDefineByTemplate(templateVO, true);
 		List<String> phaseAttrIdList = listPhaseAttrByClassifyOid(codeClassifyOid, phase);
 		uiTableDefineVO.getCols().stream().forEach(list -> {
-			List<UITableFieldVO> visiableTableField=new ArrayList<>();
-			if(StringUtils.isNotBlank(phase)) {
+			List<UITableFieldVO> visiableTableField = new ArrayList<>();
+			if (StringUtils.isNotBlank(phase)) {
 				visiableTableField = list.stream().filter(col ->
 					phaseAttrIdList.stream().anyMatch(s -> StringUtils.equalsIgnoreCase(col.getField(), s) ||
 						(StringUtils.equalsIgnoreCase(col.getFieldType(), "combox") && StringUtils.equalsIgnoreCase(col.getSortField(), s))
 						|| (StringUtils.equalsIgnoreCase(col.getFieldType(), "refer") && StringUtils.equalsIgnoreCase(col.getQueryField(), s))
 					)).collect(Collectors.toList());
-			}else{
-				visiableTableField=  list.stream().filter(col ->
+			} else {
+				visiableTableField = list.stream().filter(col ->
 					templateVO.getAttributes().stream().anyMatch(s ->
-						(!s.getReadOnlyFlag().equalsIgnoreCase("true")&& StringUtils.equalsIgnoreCase(col.getField(), s.getId())) ||
+						(!s.getReadOnlyFlag().equalsIgnoreCase("true") && StringUtils.equalsIgnoreCase(col.getField(), s.getId())) ||
 							(StringUtils.equalsIgnoreCase(col.getFieldType(), "combox") && StringUtils.equalsIgnoreCase(col.getSortField(), s.getId()))
 							|| (StringUtils.equalsIgnoreCase(col.getFieldType(), "refer") && StringUtils.equalsIgnoreCase(col.getQueryField(), s.getId()))
 					)).collect(Collectors.toList());
@@ -2547,9 +2865,9 @@
 					setReferConfig2EditConfig(vo);
 				} else if ("combox".equalsIgnoreCase(vo.getFieldType())) {
 					setComboxConfig2EditConfig(vo);
-				} else if (StringUtils.isNotBlank(vo.getDateFormate())){
+				} else if (StringUtils.isNotBlank(vo.getDateFormate())) {
 					vo.setEdit("date");
-				}else {
+				} else {
 					vo.setEdit(vo.getFieldType());
 				}
 			});
@@ -2629,14 +2947,14 @@
 	 * @param vo 琛ㄦ牸瀛楁鏄剧ず瀵硅薄
 	 */
 	private void setReferConfig2EditConfig(UITableFieldVO vo) {
-		if (!CollectionUtils.isEmpty(vo.getReferConfig().getWhere())){
+		if (!CollectionUtils.isEmpty(vo.getReferConfig().getWhere())) {
 			vo.getReferConfig().getWhere().keySet().forEach(key -> {
 				vo.getReferConfig().getWhere().put(key, "'" + vo.getReferConfig().getWhere().get(key) + "'");
 			});
 		}
-		if (StringUtils.isNotBlank(vo.getReferConfig().getParentValue())){
+		if (StringUtils.isNotBlank(vo.getReferConfig().getParentValue())) {
 			String parentValue = vo.getReferConfig().getParentValue();
-			parentValue ="\\" +  parentValue.replaceAll("'","{vci-quote}").replaceAll("=","{vci-equals}");
+			parentValue = "\\" + parentValue.replaceAll("'", "{vci-quote}").replaceAll("=", "{vci-equals}");
 			vo.getReferConfig().setParentValue(parentValue);
 		}
 		String referConfig = vo.getReferConfig().toString()
@@ -2660,16 +2978,16 @@
 	 */
 	private void setComboxConfig2EditConfig(UITableFieldVO vo) {
 		vo.setEditConfig("{editable:true,comboxKey:'" + vo.getComboxKey() + "'");
-		if (!CollectionUtils.isEmpty(vo.getData())){
-			vo.setEditConfig(vo.getEditConfig()+", comboxConfig:");
+		if (!CollectionUtils.isEmpty(vo.getData())) {
+			vo.setEditConfig(vo.getEditConfig() + ", comboxConfig:");
 			for (int i = 0; i < vo.getData().size(); i++) {
 				KeyValue data = vo.getData().get(i);
-				if (i == vo.getData().size() -1){
-					vo.setEditConfig(vo.getEditConfig() + "{attributes:"+data.getAttributes()+",key:'"+data.getKey()+"',value:'"+data.getValue()+"'}]}");
-				}else if (i == 0){
-					vo.setEditConfig(vo.getEditConfig() + "{data:[{attributes:"+data.getAttributes()+",key:'"+data.getKey()+"',value:'"+data.getValue()+"'},");
-				}else{
-					vo.setEditConfig(vo.getEditConfig() + "{attributes:"+data.getAttributes()+",key:'"+data.getKey()+"',value:'"+data.getValue()+"'},");
+				if (i == vo.getData().size() - 1) {
+					vo.setEditConfig(vo.getEditConfig() + "{attributes:" + data.getAttributes() + ",key:'" + data.getKey() + "',value:'" + data.getValue() + "'}]}");
+				} else if (i == 0) {
+					vo.setEditConfig(vo.getEditConfig() + "{data:[{attributes:" + data.getAttributes() + ",key:'" + data.getKey() + "',value:'" + data.getValue() + "'},");
+				} else {
+					vo.setEditConfig(vo.getEditConfig() + "{attributes:" + data.getAttributes() + ",key:'" + data.getKey() + "',value:'" + data.getValue() + "'},");
 				}
 			}
 			vo.setEditConfig(vo.getEditConfig() + ",valueField:'" + vo.getQueryField() + "'");
@@ -2687,7 +3005,7 @@
 	@Override
 	public MdmUIInfoVO getFormDefineByClassifyIdPath(String idPath) {
 		CodeClassifyVO classifyVO = classifyService.getObjectByIdPath(idPath);
-		if(classifyVO !=null){
+		if (classifyVO != null) {
 			return getFormDefineByClassifyOid(classifyVO.getOid());
 		}
 		return null;
@@ -2732,7 +3050,7 @@
 		MdmUIInfoVO uiInfoVO = new MdmUIInfoVO();
 		uiInfoVO.setTemplateVO(templateVO);
 		//鎴戜滑闇�瑕佸皢妯℃澘杞崲涓鸿〃鏍肩浉鍏崇殑鏄剧ず淇℃伅
-		uiInfoVO.setTableDefineVO(wrapperTableDefineByTemplate(uiInfoVO.getTemplateVO(),false));
+		uiInfoVO.setTableDefineVO(wrapperTableDefineByTemplate(uiInfoVO.getTemplateVO(), false));
 		//闇�瑕佸幓鐪嬫墿灞曠殑鎸夐挳,鍙湁鍒楄〃閲岄潰鏈韩鎵嶆坊鍔犺繘鍘伙紝宸ュ叿鏍忎笂鐨勫崟鐙幏鍙�
 		List<CodeClassifyTemplateButtonVO> buttonVOS = templateButtonService.listButtonByTemplateOid(templateVO.getOid(), true);
 		if (!CollectionUtils.isEmpty(buttonVOS)) {
@@ -2752,7 +3070,7 @@
 					kv.setValue(buttonVO.getClassifyButtonOidName());
 					kv.setAttributes(VciBaseUtil.objectToMap(buttonVO));
 					buttons.add(kv);
-					optionJsMap.put(buttonVO.getId(), buttonVO.getButtonVO().getExecutejs());
+					optionJsMap.put(buttonVO.getId(), buttonVO.getButtonVO().getExecuteJs());
 				});
 				optionFieldVO.setOptionJsMap(optionJsMap);
 				uiInfoVO.getTableDefineVO().getCols().get(0).add(optionFieldVO);
@@ -2771,8 +3089,8 @@
 	@Override
 	public MdmUIInfoVO getUIInfoByClassifyIdPath(String codeClassifyIdPath, String functionId) {
 		CodeClassifyVO classifyVO = classifyService.getObjectByIdPath(codeClassifyIdPath);
-		if(classifyVO !=null){
-			return getUIInfoByClassifyOid(classifyVO.getOid(),functionId);
+		if (classifyVO != null) {
+			return getUIInfoByClassifyOid(classifyVO.getOid(), functionId);
 		}
 		return null;
 	}
@@ -2787,30 +3105,33 @@
 	@Override
 	public MdmUIInfoVO getUIInfoByClassifyOid(String codeClassifyOid, String functionId) {
 		VciBaseUtil.alertNotNull(codeClassifyOid, "涓婚搴撳垎绫讳富閿�");
+
 		MdmUIInfoVO uiInfoVO = getTableDefineByTemplateVO(getUsedTemplateByClassifyOid(codeClassifyOid));
 		uiInfoVO.setLeaf(classifyService.countChildrenByClassifyOid(codeClassifyOid) == 0);
 		if (StringUtils.isNotBlank(functionId) && !"~".equalsIgnoreCase(functionId)) {
-			//鍔熻兘鎸夐挳鏈嶅姟杩樻湭瀹炵幇锛岀瓑瀹炵幇浜嗭紝鍦ㄨ繘琛岃皟鐢�
-			//List<SmOperationVO> operationVOS = operationService.listButtonByFunctionId(functionId);
+			List<Menu> buttonVOS = iSysClient.getMenuButtonByType(uiInfoVO.getTemplateVO().getBtmTypeId()).getData();
+//			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;
 	}
@@ -2849,4 +3170,367 @@
 		}
 		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("浼犲叆涓氬姟绫诲瀷鏈煡璇㈠埌鐩稿簲琛ㄥ崟锛岃妫�鏌ワ紒");
+		}
+		//灏哹ean杞负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);
+	}
+
+	/**
+	 * 浼犲叆涓氬姟绫诲瀷浠ュ強鐩竜id闆嗗悎鏌ヨ鏁版嵁杩涜杩斿洖
+	 *
+	 * @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("浼犲叆涓氬姟绫诲瀷鏈煡璇㈠埌鐩稿簲琛ㄥ崟锛岃妫�鏌ワ紒");
+		}
+		//灏哹ean杞负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("鏇存柊鎴愬姛锛�");
+	}
+
+	/**
+	 * 鑾峰彇鍙傜収鐨勪俊鎭�
+	 *
+	 * @param referConfigVO 鍙傜収鐨勯厤缃�
+	 * @return 鍒楄〃鏁版嵁
+	 */
+	@Override
+	public Page<BtmTypeVO> referDataGrid(UIFormReferVO referConfigVO, BaseQueryObject baseQueryObject) {
+		// checkReferConfig(referConfigVO);
+		// 浣跨敤涓氬姟绫诲瀷鏌ヨ
+		R<BtmTypeVO> allAttributeByBtmId = btmTypeClient.getAllAttributeByBtmId(referConfigVO.getReferType());
+		BtmTypeVO btmTypeVO = allAttributeByBtmId.getData();
+		/**
+		 * 鍔犱笂鏌ヨ鏈�鏂扮増娆�
+		 */
+		baseQueryObject.getConditionMap().put("lastr", "1");
+		baseQueryObject.getConditionMap().put("lastv", "1");
+		if (VciBaseUtil.containsKeyUnCaseForMap(baseQueryObject.getConditionMap(), VciQueryWrapperForDO.LC_STATUS_FIELD) &&
+			BtmTypeLcStatusConstant.FRAME_WORK_LIFE_CYCLE_NAME.equalsIgnoreCase(btmTypeVO.getLifeCycleId())) {
+			baseQueryObject.getConditionMap().put(VciQueryWrapperForDO.LC_STATUS_FIELD, FrameworkDataLCStatus.ENABLED.getValue());
+		}
+		if (VciBaseUtil.containsKeyUnCaseForMap(baseQueryObject.getConditionMap(), VciQueryWrapperForDO.LC_STATUS_FIELD) &&
+			BtmTypeLcStatusConstant.RELEASE_LIFE_CYCLE.equalsIgnoreCase(btmTypeVO.getLifeCycleId())) {
+			baseQueryObject.getConditionMap().put(VciQueryWrapperForDO.LC_STATUS_FIELD, CodeDefaultLC.RELEASED.getValue());
+		}
+		baseQueryObject.getConditionMap().put("domain", AppConstant.APPLICATION_NAME_CODE);
+		R<Page<BtmTypeVO>> refPage = btmTypeClient.getRefPage(baseQueryObject);
+		if(refPage.getCode() != 200){
+			throw new ServiceException("涓氬姟绫诲瀷feign鎺ュ彛璋冪敤閿欒");
+		}
+		return refPage.getData();
+	}
+
+	/**
+	 * 鑾峰彇鏍戝舰鐨勫弬鐓�
+	 *
+	 * @param referConfigVO 鍙傜収鐨勯厤缃�
+	 * @return 鏍戝舰鐨勬暟鎹�
+	 */
+	@Override
+	public List<Tree> referTree(UIFormReferVO referConfigVO, TreeQueryObject queryObject) {
+		if (queryObject.getConditionMap() == null) {
+			queryObject.setConditionMap(new HashMap<>());
+		}
+
+		if (queryObject.getParentOid()==null){
+			LambdaQueryWrapper<CodeClassify> lqw = new LambdaQueryWrapper<>();
+			String parentValue = referConfigVO.getParentValue().substring(3);
+			lqw.inSql(CodeClassify::getOid,parentValue);
+			List<String> codeClassifies = classifyService.select1(lqw);
+			String oid = codeClassifies.get(0);
+			queryObject.setParentOid(oid);
+		}
+		String oidFieldName = StringUtils.isNotBlank(referConfigVO.getParentUsedField()) ? referConfigVO.getParentUsedField() : referConfigVO.getValueField();
+		if (queryObject.isQueryAllLevel()) {
+			String parentOidSql = "";
+			if (StringUtils.isNotBlank(referConfigVO.getParentValue())) {
+				String temp = referConfigVO.getParentValue();
+				if (temp.startsWith(QueryOptionConstant.IN)) {
+					temp = temp.substring((QueryOptionConstant.IN).length()).trim();
+					parentOidSql = " in " + ((temp.startsWith("(") && temp.endsWith(")")) ? temp : "(" + temp + ")");
+				} else if (temp.startsWith(QueryOptionConstant.NOTIN)) {
+					parentOidSql = " not in " + ((temp.startsWith("(") && temp.endsWith(")")) ? temp : "(" + temp + ")");
+				} else if (temp.startsWith(QueryOptionConstant.NOTEQUAL)) {
+					temp = temp.substring((QueryOptionConstant.NOTEQUAL).length()).trim();
+					parentOidSql = QueryOptionConstant.NOTEQUAL + " " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'");
+				} else if (temp.startsWith(QueryOptionConstant.MORETHAN)) {
+					temp = temp.substring((QueryOptionConstant.MORETHAN).length()).trim();
+					parentOidSql = QueryOptionConstant.MORETHAN + " " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'");
+				} else if (temp.startsWith(QueryOptionConstant.MORE)) {
+					temp = temp.substring((QueryOptionConstant.MORE).length()).trim();
+					parentOidSql = QueryOptionConstant.MORE + " " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'");
+				} else if (temp.startsWith(QueryOptionConstant.LESSTHAN)) {
+					temp = temp.substring((QueryOptionConstant.LESSTHAN).length()).trim();
+					parentOidSql = QueryOptionConstant.LESSTHAN + " " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'");
+				} else if (temp.startsWith(QueryOptionConstant.LESS)) {
+					temp = temp.substring((QueryOptionConstant.LESS).length()).trim();
+					parentOidSql = QueryOptionConstant.LESS + " " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'");
+				} else if (temp.startsWith(QueryOptionConstant.ISNOTNULL)) {
+					parentOidSql = " is not null";
+				} else if (temp.startsWith(QueryOptionConstant.ISNULL)) {
+					parentOidSql = " is  null";
+				} else if (temp.contains("*")) {
+					parentOidSql = " like " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'").replace("*", "%");
+				} else {
+					parentOidSql = " = " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'");
+				}
+
+			}
+			//鏌ヨ鍏ㄩ儴鐨勪俊鎭�
+			queryObject.getConditionMap().put("oid", QueryOptionConstant.IN + "(select oid from " +
+					getTableName(referConfigVO.getReferType())+
+				" START WITH " + referConfigVO.getParentFieldName() + " " +
+				parentOidSql +
+				" CONNECT BY PRIOR " + oidFieldName + " = " + referConfigVO.getParentFieldName() + ")");
+		} else {
+			if (StringUtils.isNotBlank(referConfigVO.getParentFieldName()) && StringUtils.isNotBlank(queryObject.getParentOid())) {
+				queryObject.getConditionMap().put(referConfigVO.getParentFieldName(), queryObject.getParentOid());
+			}
+		}
+		LambdaQueryWrapper<CodeClassify> lqw = new LambdaQueryWrapper<>();
+		String sql = queryObject.getConditionMap().get("oid").substring(3);
+		lqw.inSql(CodeClassify::getOid,sql);
+		List<CodeClassify> codeClassifies = classifyService.selectByWrapper(lqw);
+		TreeWrapperOptions treeWrapperOptions = new TreeWrapperOptions(referConfigVO.getParentFieldName());
+		treeWrapperOptions.setOidFieldName(oidFieldName);
+		treeWrapperOptions.setTextFieldName(referConfigVO.getTextField());
+		treeWrapperOptions.setMultipleSelect(referConfigVO.isMuti());
+		treeWrapperOptions.setParentOid(queryObject.getParentOid());
+		return revisionModelUtil.doList2Trees(codeClassifies, treeWrapperOptions, null);
+	}
+
+
+	@Override
+	public boolean checkUnAttrUnEdit(String attrName) {
+		return  (VciQueryWrapperForDO.OID_FIELD.equalsIgnoreCase(attrName)
+				||"ts".equalsIgnoreCase(attrName)
+				|| "lastmodifier".equalsIgnoreCase(attrName)
+				|| "lastmodifytime".equalsIgnoreCase(attrName)
+				|| "createtime".equalsIgnoreCase(attrName)
+				|| "checkintime".equalsIgnoreCase(attrName)
+				||"checkouttime".equalsIgnoreCase(attrName));
+	}
+
+	private String getTableName(String refertype){
+		if ("codeclassify".equals(refertype)){
+			return "pl_code_classify";
+		}
+		if ("table".equals(refertype)){
+			return "pl_code_test_table";
+		}
+		if ("testBtmType".equals(refertype)){
+			return "PLBT_code_testBtmType";
+		}
+
+		return "pl_code_"+refertype.trim().toLowerCase();
+	}
+
+	public BaseModel reviseBusinessObject(BaseModel fromBo) {
+		BaseModel toBo = new BaseModel();
+//		Map<String,String> data = new HashMap<>();
+//		toBo.getData().put(data);
+		toBo.setOid(VciBaseUtil.getPk());
+		toBo.setRevisionOid(VciBaseUtil.getPk());
+		toBo.setNameOid(fromBo.getNameOid());
+		toBo.setBtmname(fromBo.getBtmname());
+		toBo.setLastR(String.valueOf(1));
+		toBo.setFirstR(String.valueOf(0));
+		toBo.setFirstV(String.valueOf(1));
+		toBo.setLastV(String.valueOf(1));
+		toBo.setCreator(String.valueOf(AuthUtil.getUser().getUserId()));
+		toBo.setCreateTime(new Date());
+		toBo.setLastModifier(String.valueOf(AuthUtil.getUser().getUserId()));
+		toBo.setLastModifyTime(new Date());
+		toBo.setRevisionRule(fromBo.getRevisionRule());
+		toBo.setVersionRule(fromBo.getVersionRule());
+//		RevisionValueObject rvObj = this.getNextRevision(fromBo.getBtmName(), fromBo.getNameoid(), item.revRuleName, item.revInput, revisionVal);
+		R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(fromBo.getBtmname()));
+		Map<String, Object> nextRevision = commonsMapper.getNextRevision(listR.getData().get(0).getTableName(), fromBo.getNameOid());
+		toBo.setRevisionSeq(Integer.parseInt(nextRevision.get("REVISIONSEQ").toString()));
+		toBo.setRevisionValue(nextRevision.get("REVISIONVAL").toString());
+//		VersionValueObject versionObj = this.getVersionValue(item.verRuleName);
+		toBo.setVersionSeq(Integer.valueOf(nextRevision.get("VERSIONSEQ").toString()));
+		toBo.setVersionValue(nextRevision.get("VERSIONVAL").toString());
+		toBo.setLctid(fromBo.getLctid());
+		toBo.setLcStatus("Editing");
+		toBo.setId(fromBo.getId());
+		toBo.setName(fromBo.getName());
+		toBo.setDescription(fromBo.getDescription());
+		toBo.setOwner(String.valueOf(AuthUtil.getUser().getUserId()));
+//		toBo.setCheckinBy(String.valueOf(AuthUtil.getUser().getUserId()));
+		toBo.setCopyFromVersion(fromBo.getOid());
+		toBo.getData().putAll(fromBo.getData());
+		toBo.getData().put("CHECKINBY",String.valueOf(AuthUtil.getUser().getUserId()));
+//		this.initRevisionTypeAttributeValue(fromBo, toBo);
+		return toBo;
+
+	}
 }

--
Gitblit v1.9.3