diff --git a/mdp-lcode/src/main/java/com/mdp/lcode/ctrl/FormDataController.java b/mdp-lcode/src/main/java/com/mdp/lcode/ctrl/FormDataController.java index ac86f79..8430fb0 100644 --- a/mdp-lcode/src/main/java/com/mdp/lcode/ctrl/FormDataController.java +++ b/mdp-lcode/src/main/java/com/mdp/lcode/ctrl/FormDataController.java @@ -3,15 +3,21 @@ package com.mdp.lcode.ctrl; import java.util.*; import java.util.stream.Collectors; +import com.alibaba.fastjson.JSON; +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import com.mdp.Util; +import com.mdp.core.SpringContextUtils; import com.mdp.core.utils.BaseUtils; import com.mdp.core.utils.ObjectTools; -import com.mdp.lcode.entity.FormDefVo; -import com.mdp.lcode.entity.FormField; -import com.mdp.lcode.entity.FormQx; +import com.mdp.lcode.entity.*; +import com.mdp.lcode.service.FormDefService; import com.mdp.lcode.service.FormFieldService; +import com.mdp.meta.client.entity.ExtInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -32,7 +38,6 @@ import com.mdp.swagger.ApiEntityParams; import springfox.documentation.annotations.ApiIgnore; import com.mdp.lcode.service.FormDataService; -import com.mdp.lcode.entity.FormData; @RestController @RequestMapping(value="/**/lcode/formData") @@ -48,6 +53,9 @@ public class FormDataController { @Autowired private FormFieldService formFieldService; + + private DynamicRoutingDataSource dataSourceService; + @ApiOperation( value = "表单数据表-查询列表",notes=" ") @ApiEntityParams(FormData.class) @ApiResponses({ @@ -122,9 +130,23 @@ public class FormDataController { } } - qw.eq("branch_id",user.getBranchId()); IPage page=QueryTools.initPage(params); - List> datas = formDataService.selectListMapByWhere(page,qw,params); + List> datas=new ArrayList<>(); + FormDef formDef=formDefVo.getFormDef(); + if("2".equals(formDefVo.getFormDef().getDataType()) ||"3".equals(formDefVo.getFormDef().getDataType())){ + if(dataSourceService==null){ + dataSourceService= SpringContextUtils.getBean(DynamicRoutingDataSource.class); + } + if("2".equals(formDefVo.getFormDef().getDataType())){ + JdbcTemplate template=new JdbcTemplate(); + template.setDataSource(dataSourceService.getDataSource(formDefVo.getFormDef().getTableOwner())); + datas=template.queryForList("select * from "+formDef.getTableName()); + } + }else{ + qw.eq("branch_id",user.getBranchId()); + datas = formDataService.selectListMapByWhere(page,qw,params); + } + return Result.ok("query-ok","查询成功").setData(datas).setTotal(page.getTotal()); }catch (BizException e) { return Result.error(e); @@ -139,11 +161,14 @@ public class FormDataController { @ApiResponse(code = 200,response=FormData.class,message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'},data:数据对象}") }) @RequestMapping(value="/add",method=RequestMethod.POST) - public Result addFormData(@RequestBody FormData formData) { + public Result addFormData(@RequestBody Map params) { + FormData formData=BaseUtils.fromMap(params,FormData.class); if(StringUtils.isEmpty(formData.getFstate())) { formData.setFstate("0"); } - + if(ObjectTools.isEmpty(formData.getFormId())){ + return Result.error("formId-required","表单编号不能为空"); + } FormDefVo formDefVo=formFieldService.getFormFieldFromCache(formData.getFormId()); if(formDefVo==null){ throw new BizException("formDef-0","表单不存在"); @@ -159,8 +184,74 @@ public class FormDataController { formData.setDeptName(user.getDeptName()); formData.setCtime(new Date()); formData.setLtime(new Date()); + FormDef formDef=formDefVo.getFormDef(); + if("2".equals(formDef.getDataType())||"3".equals(formDef.getDataType())){ + if("3".equals(formDef.getDataType())){//独立建表 + if(dataSourceService==null){ + dataSourceService= SpringContextUtils.getBean(DynamicRoutingDataSource.class); + } + JdbcTemplate template=new JdbcTemplate(); + template.setDataSource(dataSourceService.getDataSource(formDefVo.getFormDef().getTableOwner())); + StringBuffer sb=new StringBuffer(); + List varList=new ArrayList<>(); + List fields=FormDefService.calcDbFields(formFields); + sb.append("insert "); + sb.append(formDef.getTableName()); + sb.append("("); + for (int i = 0; i < fields.size(); i++) { + FormField field=fields.get(i); + sb.append(field.getId()); + if(i< fields.size()-1){ + sb.append(","); + } + } + sb.append(")value("); + for (int i = 0; i < fields.size(); i++) { + FormField field=fields.get(i); + sb.append("?"); + if(i< fields.size()-1){ + sb.append(","); + } + varList.add(params.get(field.getIdCamel())); + } + sb.append(")"); + template.update(sb.toString(),varList.toArray()); + }else{//寄存某个字段 + if(dataSourceService==null){ + dataSourceService= SpringContextUtils.getBean(DynamicRoutingDataSource.class); + } + JdbcTemplate template=new JdbcTemplate(); + template.setDataSource(dataSourceService.getDataSource(formDefVo.getFormDef().getTableOwner())); + StringBuffer sb=new StringBuffer(); + List fields= FormDefService.calcDbFields(formDefVo.getFormFields()); + sb.append("update "); + sb.append(formDef.getTableName()); + sb.append(" set "+ObjectTools.camelToUnderline(formDef.getDataField())).append(" = ? "); + sb.append(" where 1=1"); + List vars=new ArrayList<>(); + if(ObjectTools.isEmpty(formDef.getPks())){ + return Result.error("pks-not-setting","没有设置主键,无法插入数据"); + } + for (String k : formDef.getPks().split(",")) { + sb.append(" and "+ObjectTools.camelToUnderline(k)+"=?"); + vars.add(params.get(params.get(ObjectTools.camelName(k)))); + } + if(vars.size()==0){ + return Result.error("pks-not-setting","没有设置主键,无法更新数据"); + } + List extInfos=new ArrayList<>(); + for (FormField field : fields) { + ExtInfo extInfo=new ExtInfo(); + extInfo.setValue((String) params.get(field.getIdCamel())); + extInfo.setId(field.getIdCamel()); + extInfo.setName(field.getTitle()); + extInfos.add(extInfo); + } - + template.update(sb.toString(),JSON.toJSONString(extInfos),vars.toArray()); + } + return Result.ok(); + } /** * 必输项检查 @@ -199,7 +290,8 @@ public class FormDataController { @ApiResponse(code = 200,response=FormData.class, message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'},data:数据对象}") }) @RequestMapping(value="/edit",method=RequestMethod.POST) - public Result editFormData(@RequestBody FormData formData) { + public Result editFormData(@RequestBody Map params) { + FormData formData=BaseUtils.fromMap(params,FormData.class); if(ObjectTools.isEmpty(formData.getId())){ return Result.error("id-0","主键不能为空"); } @@ -227,13 +319,80 @@ public class FormDataController { /** * 必输项检查 */ - Map formDataMap=BaseUtils.toMap(formData); for (FormField field : formFields) { - Object pkValue= formDataMap.get(field.getIdCamel()); + Object pkValue= params.get(field.getIdCamel()); if("1".equals(field.getReq()) && ObjectTools.isEmpty(pkValue)){ return Result.error("field-required","%s不能为空",field.getTitle()); } } + FormDef formDef=formDefVo.getFormDef(); + if("2".equals(formDef.getDataType())||"3".equals(formDef.getDataType())){ + if("3".equals(formDef.getDataType())){//独立建表 + if(dataSourceService==null){ + dataSourceService= SpringContextUtils.getBean(DynamicRoutingDataSource.class); + } + JdbcTemplate template=new JdbcTemplate(); + template.setDataSource(dataSourceService.getDataSource(formDefVo.getFormDef().getTableOwner())); + StringBuffer sb=new StringBuffer(); + List varList=new ArrayList<>(); + if(ObjectTools.isEmpty(formDef.getPks())){ + return Result.error("pks-not-setting","没有设置主键,无法插入数据"); + } + List fields=FormDefService.calcDbFields(formFields); + sb.append("update "); + sb.append(formDef.getTableName()); + sb.append(" set "); + for (int i = 0; i < fields.size(); i++) { + FormField field=fields.get(i); + sb.append(field.getId()+"= ?"); + if(i fields= FormDefService.calcDbFields(formDefVo.getFormFields()); + sb.append("update "); + sb.append(formDef.getTableName()); + sb.append(" set "+ObjectTools.camelToUnderline(formDef.getDataField())).append(" = ? "); + sb.append(" where 1=1"); + List vars=new ArrayList<>(); + if(ObjectTools.isEmpty(formDef.getPks())){ + return Result.error("pks-not-setting","没有设置主键,无法插入数据"); + } + for (String k : formDef.getPks().split(",")) { + sb.append(" and "+ObjectTools.camelToUnderline(k)+"=?"); + vars.add(params.get(params.get(ObjectTools.camelName(k)))); + } + if(vars.size()==0){ + return Result.error("pks-not-setting","没有设置主键,无法更新数据"); + } + List extInfos=new ArrayList<>(); + for (FormField field : fields) { + ExtInfo extInfo=new ExtInfo(); + extInfo.setValue((String) params.get(field.getIdCamel())); + extInfo.setId(field.getIdCamel()); + extInfo.setName(field.getTitle()); + extInfos.add(extInfo); + } + + template.update(sb.toString(),JSON.toJSONString(extInfos),vars.toArray()); + } + return Result.ok(); + } String bizKey= formDataService.createBizKey(formDefVo,formData); formData.setBizKey(ObjectTools.isNotEmpty(bizKey)?bizKey:formDataDb.getId()); diff --git a/mdp-lcode/src/main/java/com/mdp/lcode/entity/FormDef.java b/mdp-lcode/src/main/java/com/mdp/lcode/entity/FormDef.java index e3fc1b9..abbca1b 100644 --- a/mdp-lcode/src/main/java/com/mdp/lcode/entity/FormDef.java +++ b/mdp-lcode/src/main/java/com/mdp/lcode/entity/FormDef.java @@ -102,6 +102,10 @@ public class FormDef implements java.io.Serializable { @ApiModelProperty(notes="函数列表",allowEmptyValue=true,example="",allowableValues="") String funcs; + + @ApiModelProperty(notes="建表方式",allowEmptyValue=true,example="",allowableValues="") + String ctType; + /** *主键 **/ diff --git a/mdp-lcode/src/main/java/com/mdp/lcode/service/DbTableService.java b/mdp-lcode/src/main/java/com/mdp/lcode/service/DbTableService.java new file mode 100644 index 0000000..de593e9 --- /dev/null +++ b/mdp-lcode/src/main/java/com/mdp/lcode/service/DbTableService.java @@ -0,0 +1,128 @@ +package com.mdp.lcode.service; + + +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.mdp.core.SpringContextUtils; +import com.mdp.core.entity.Result; +import com.mdp.core.query.QueryTools; +import com.mdp.core.utils.ObjectTools; +import com.mdp.dev.dao.CodeGenDao; +import com.mdp.dev.entity.FieldInfo; +import com.mdp.lcode.entity.FormData; +import com.mdp.lcode.entity.FormDef; +import com.mdp.lcode.entity.FormField; +import com.mdp.meta.client.entity.ItemVo; +import com.mdp.meta.client.entity.ExtInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +import javax.sql.DataSource; +import java.util.List; +import java.util.Map; + +@Service +public class DbTableService { + + @Autowired + CodeGenDao codeGenDao; + + DynamicRoutingDataSource dataSourceService; + + void createTable(FormDef formDef, List formFields){ + if("3".equals(formDef.getCtType())){ + return; + } + if(dataSourceService==null){ + dataSourceService= SpringContextUtils.getBean(DynamicRoutingDataSource.class); + } + DataSource dataSource=dataSourceService.getDataSource(formDef.getTableOwner()); + JdbcTemplate jdbcTemplate=new JdbcTemplate(); + jdbcTemplate.setDataSource(dataSource); + StringBuffer sqlBuff=new StringBuffer(); + if(formDef.getTableName().indexOf(formDef.getBranchId())<0){ + formDef.setTableName(formDef.getBranchId()+"_"+formDef.getTableName()); + } + //如果没有则创建 + if("2".equals(formDef.getCtType())){ + List cols=codeGenDao.getColumnsInfo(formDef.getTableOwner(),formDef.getTableName()); + if(cols!=null && cols.size()>0){ + return; + } + } + String tableName=formDef.getTableName().replaceAll("-","").replaceAll("@","").replaceAll("$",""); + formDef.setTableName(tableName); + //先删除后创建 + if("1".equals(formDef.getCtType())){ + sqlBuff.append(" DROP TABLE IF EXISTS "+formDef.getTableName()); + jdbcTemplate.update(sqlBuff.toString()); + } + sqlBuff=new StringBuffer(); + sqlBuff.append(" create table ").append(formDef.getTableName()).append(" ("); + for (FormField f : formFields) { + Map extInfoMap= ItemVo.parseExtInfosMap(f.getExtInfos()); + sqlBuff.append(" "+f.getId()).append(" "+getDBTypeByFieldType(f,extInfoMap)).append(" COMMENT '"+f.getRemark()+"',"); + } + String sql=sqlBuff.toString(); + if(sql.endsWith(",")){ + sql=sql.substring(0,sql.length()-1); + } + sql=sql+") COMMENT = '"+formDef.getFormName()+"'"; + jdbcTemplate.update(sql); + } + + private String getDBTypeByFieldType(FormField f, Map extInfoMap) { + + if(ObjectTools.isEmpty(f.getTyp())){ + if("user".equals(f.getExtType())){ + return "VARCHAR("+f.getLen()+")"; + }else if("dept".equals(f.getExtType())){ + return "VARCHAR("+f.getLen()+")"; + }else if("image".equals(f.getExtType())){ + return "VARCHAR("+f.getLen()+")"; + }else if("json".equals(f.getExtType())){ + return "VARCHAR("+f.getLen()+")"; + }else if("att".equals(f.getExtType())){ + return "VARCHAR("+f.getLen()+")"; + }else if("link".equals(f.getExtType())){ + return "VARCHAR("+f.getLen()+")"; + }else if("tag".equals(f.getExtType())){ + return "VARCHAR("+f.getLen()+")"; + }else if("cate".equals(f.getExtType())){ + return "VARCHAR("+f.getLen()+")"; + }else if("html".equals(f.getExtType())){ + return "VARCHAR("+f.getLen()+")"; + }else if("text".equals(f.getTyp())){ + return "VARCHAR("+f.getLen()+")"; + } else if("datetime".equals(f.getTyp())){ + return " datetime "; + }else if("date".equals(f.getTyp())){ + return " date "; + }else if("month".equals(f.getTyp())){ + return "VARCHAR("+f.getLen()+")"; + }else if("year".equals(f.getTyp())){ + return "VARCHAR("+f.getLen()+")"; + }else if("number".equals(f.getTyp())){ + ExtInfo scale=extInfoMap.get("scale"); + if(scale==null && f.getLen()<=8){ + return "int"; + }else{ + return "decimal("+f.getLen()+","+scale.getValue()+")"; + } + }else { + return "VARCHAR("+f.getLen()+")"; + } + }else{ + return "VARCHAR("+f.getLen()+")"; + } + + } + + public Result list(FormDef formDef,List fields,Map params) { + QueryWrapper qw=new QueryWrapper(); + return Result.ok(); + } +} diff --git a/mdp-lcode/src/main/java/com/mdp/lcode/service/FormDefService.java b/mdp-lcode/src/main/java/com/mdp/lcode/service/FormDefService.java index 1caf7f1..04f07fb 100644 --- a/mdp-lcode/src/main/java/com/mdp/lcode/service/FormDefService.java +++ b/mdp-lcode/src/main/java/com/mdp/lcode/service/FormDefService.java @@ -14,6 +14,7 @@ import org.slf4j.LoggerFactory; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -31,6 +32,10 @@ import org.springframework.transaction.annotation.Transactional; ***/ @Service public class FormDefService extends BaseService { + + @Autowired + DbTableService dbTableService; + static Logger logger =LoggerFactory.getLogger(FormDefService.class); /** @@ -82,6 +87,11 @@ public class FormDefService extends BaseService { super.update(uw); } + + + public static List calcDbFields(List fieldList){ + return fieldList.stream().filter(k->!"row".equals(k.getExtType()) && !"tabs".equals(k.getExtType()) && !"card".equals(k.getExtType())).collect(Collectors.toList()); + } @Transactional public void addFormDefAndFields(FormDefVo formDefVo) { User user= LoginUtils.getCurrentUserInfo(); @@ -97,6 +107,8 @@ public class FormDefService extends BaseService { List formFields=formDefVo.getFormFields(); + + for (FormField formField : formFields) { formField.setFormId(formDef.getId()); if(ObjectTools.isEmpty(formField.getId())){ @@ -104,6 +116,10 @@ public class FormDefService extends BaseService { } } + + if("3".equals(formDef.getDataType())){ + dbTableService.createTable(formDef,formFields); + } super.save(formDef); this.ffs.saveBatch(formFields); formFieldCacheService.putFormFields(formId, formDefVo); @@ -132,6 +148,9 @@ public class FormDefService extends BaseService { this.updateById(formDef,true); this.ffs.deleteByFormId(formDef.getId()); this.ffs.saveBatch(formFields); + if("3".equals(formDef.getDataType())){ + dbTableService.createTable(formDef,formFields); + } formFieldCacheService.putFormFields(formDef.getId(), null); }