# htliu-ecsplus **Repository Path**: liuhongtaowxp1/htliu-ecsplus ## Basic Information - **Project Name**: htliu-ecsplus - **Description**: ecs平台的map操作数据太不好用,基于ECS平台的API,探讨一种面向对象的类似于ebean或mybatis-plus操作数据的方式 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-10-01 - **Last Updated**: 2022-11-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # htliu-ecsplus #### 介绍 基于ECS平台的API,实现一种面向对象的类似于ebean或mybatis-plus操作数据的方式,用类似ebean的注解和api去包装ECS平台的API和业务对象。 现已经支持entity和vo类与数据库交互。支持普通的CRUD操作,支持分页,支持各种引用,支持附件,支持批量。暂时不支持级联查询和修改。支持快速开发,写好VO类,ENTITY类 ,对应的controller类只需要继承ControllerAdapter类,controller类就拥有了create,insert,update,delete,issue,selectOne,page,batchSave,batchInsert的能力。对于简单的需求,后端做到零代码开发。 开发目标 ![输入图片说明](%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_16669434548858.png) 提供三类数据格式的相互转化 #### 使用说明 1.打开平台业务对象,建立实体类,实体类继承BaseModel类,实体类上放置注解@BusinessObject(apiName = "fapiao", tableName = "TP_BO_FPDEF001"),其中apiName对应平台的apiName,tableName 为业务对象的表名。字段为业务对象字段的驼峰写法,对应通用的字段已提取到BaseModel类,只需要声明业务字段,其中引用类型(单值,多值,附件,部门,人员,字典值等)的字段类型为string,例子: @BusinessObject(apiName = "fapiao", tableName = "TP_BO_FPDEF001") public class Invoice extends BaseModel { private String companyName; private BigDecimal amount; private Date purDate; private String purName; private String goodDetail; private String tiaoCode; private String unit; private BigDecimal num; public String getCompanyName() { return companyName; } public void setCompanyName(String companyName) { this.companyName = companyName; } public BigDecimal getAmount() { return amount; } public void setAmount(BigDecimal amount) { this.amount = amount; } public Date getPurDate() { return purDate; } public void setPurDate(Date purDate) { this.purDate = purDate; } public String getPurName() { return purName; } public void setPurName(String purName) { this.purName = purName; } public String getGoodDetail() { return goodDetail; } public void setGoodDetail(String goodDetail) { this.goodDetail = goodDetail; } public String getTiaoCode() { return tiaoCode; } public void setTiaoCode(String tiaoCode) { this.tiaoCode = tiaoCode; } public String getUnit() { return unit; } public void setUnit(String unit) { this.unit = unit; } public BigDecimal getNum() { return num; } public void setNum(BigDecimal num) { this.num = num; } } 2.建立VO类,VO类继承BaseVoModel类,实体类上放置注解@BusinessObject(apiName = "fapiao", tableName = "TP_BO_FPDEF001"),其中apiName对应平台的apiName,tableName 为业务对象的表名。字段为业务对象字段的驼峰写法,对应通用的字段已提取到BaseModel类,只需要声明业务字段,字段类型统一为CustomeFieldValueVo类,提供给前端展示,同时前端通过此VO回写数据给后台,例子: @BusinessObject(apiName = "fapiao", tableName = "TP_BO_FPDEF001") public class InvoiceVo extends BaseVoModel { private CustomeFieldValueVo companyName; private CustomeFieldValueVo amount; private CustomeFieldValueVo purDate; private CustomeFieldValueVo purName; private CustomeFieldValueVo goodDetail; private CustomeFieldValueVo tiaoCode; private CustomeFieldValueVo unit; private CustomeFieldValueVo num; public CustomeFieldValueVo getCompanyName() { return companyName; } public void setCompanyName(CustomeFieldValueVo companyName) { this.companyName = companyName; } public CustomeFieldValueVo getAmount() { return amount; } public void setAmount(CustomeFieldValueVo amount) { this.amount = amount; } public CustomeFieldValueVo getPurDate() { return purDate; } public void setPurDate(CustomeFieldValueVo purDate) { this.purDate = purDate; } public CustomeFieldValueVo getPurName() { return purName; } public void setPurName(CustomeFieldValueVo purName) { this.purName = purName; } public CustomeFieldValueVo getGoodDetail() { return goodDetail; } public void setGoodDetail(CustomeFieldValueVo goodDetail) { this.goodDetail = goodDetail; } public CustomeFieldValueVo getTiaoCode() { return tiaoCode; } public void setTiaoCode(CustomeFieldValueVo tiaoCode) { this.tiaoCode = tiaoCode; } public CustomeFieldValueVo getUnit() { return unit; } public void setUnit(CustomeFieldValueVo unit) { this.unit = unit; } public CustomeFieldValueVo getNum() { return num; } public void setNum(CustomeFieldValueVo num) { this.num = num; } } 3. 建立controller类,controller类可继承ControllerAdapter,继承ControllerAdapter后,就拥有create,insert,update,delete,issue,selectOne,page,batchSave,batchInsert的能力,对于简单的需求可满足。如果满足不了需求,可实现ControllerAdapter的回调方法去扩展,如果还满足不了需求,那就在controller里自己去写代码。例子: @RestController @RequestMapping("ecsplus") public class EcsplusDemoController extends ControllerAdapter { @Override protected void createBeforeCallback(Map initData) { super.createBeforeCallback(initData); } @Override protected void createAfterCallback(InvoiceVo baseVoModel) { Invoice invoice = baseVoModel.toEntity(Invoice.class); System.out.println(invoice); } @PostMapping("/select1") public List select1(@RequestBody SqlVo sql) { CommonModel commonModel = new CommonModel(Invoice.class); return commonModel.selectList(sql.getSql()); } //---------------------------------------------insert-------------------------- @PostMapping("/insert") public Invoice insert() { Invoice invoice = new Invoice(); invoice.setCompanyName("中商百货"); invoice.setAmount(new BigDecimal(1200)); invoice.setPurDate(new Date()); invoice.setPurName("张三"); invoice.setNum(new BigDecimal(10)); //保存到数据库 invoice.insert(); //发布 invoice.issue(); InvoiceDetail invoiceDetail = new InvoiceDetail(); invoiceDetail.setGoodName("背包"); invoiceDetail.setNum(new BigDecimal(1)); invoiceDetail.setPrice(new BigDecimal(500)); invoiceDetail.setMoney(new BigDecimal(500)); invoiceDetail.setFp(invoice.getObjectId()); invoiceDetail.setInvoice(invoice); InvoiceDetail invoiceDetail1 = new InvoiceDetail(); invoiceDetail1.setGoodName("衣服"); invoiceDetail1.setNum(new BigDecimal(1)); invoiceDetail1.setPrice(new BigDecimal(700)); invoiceDetail1.setMoney(new BigDecimal(700)); invoiceDetail1.setFp(invoice.getObjectId()); invoiceDetail1.setInvoice(invoice); invoiceDetail.insert(); invoiceDetail.issue(); invoiceDetail1.insert(); invoiceDetail1.issue(); invoice.setGoodDetail(invoiceDetail.getObjectId() + "," + invoiceDetail1.getObjectId()); invoice.update(); return invoice; } //---------------------------------------------batchinsert-------------------------- @PostMapping("/batchInsert") public List batchInsert() { List list = new ArrayList<>(); for (int i = 0; i < 30; i++) { Invoice invoice = new Invoice(); invoice.setCompanyName("中商百货"); invoice.setAmount(new BigDecimal(1200 + i)); invoice.setPurDate(new Date()); invoice.setPurName("张三"); invoice.setNum(new BigDecimal(i)); list.add(invoice); } CommonModel commonModel = new CommonModel(Invoice.class); commonModel.batchInsert(list); return list; } //---------------------------------------------batchSave-------------------------- @PostMapping("/batchSave") public List batchSave() { List list = new ArrayList<>(); for (int i = 0; i < 30; i++) { Invoice invoice = new Invoice(); invoice.setCompanyName("中商百货"); invoice.setAmount(new BigDecimal(1300 + i)); invoice.setPurDate(new Date()); invoice.setPurName("张三"); invoice.setNum(new BigDecimal(i)); invoice.create(); list.add(invoice); } LambdaModel lambdaModel = new LambdaModel<>(Invoice.class); list.add(lambdaModel.and().eq(Invoice::getObjectId, "11ed5102d1ad403d9d5f99d317629d72").selectOne()); CommonModel commonModel = new CommonModel(Invoice.class); commonModel.batchSave(list); return list; } @PostMapping("/select") public List select() { BOSetupInitVO boSetupInitVO; LambdaModel lambdaModel = new LambdaModel(Invoice.class); List list = lambdaModel.and().eq(Invoice::getPurName, "张三").le(Invoice::getAmount, 1500).selectList(); return list; } @PostMapping("/select4") public List select4() { LambdaModel lambdaModel = new LambdaModel(Invoice.class); List list = lambdaModel.and().eq(Invoice::getCreateDate, "2022-10-21 11:23:37").selectList(); return list; } @PostMapping("/select1") public List select1(@RequestBody SqlVo sql) { CommonModel commonModel = new CommonModel(Invoice.class); return commonModel.selectList(sql.getSql()); } @PostMapping("/select2") public Invoice select2() { CommonModel commonModel = new CommonModel(Invoice.class); Invoice invoice = commonModel.selectByObjectId("11ed50e85d51f397a340436762a01ed5"); //System.out.println(invoice.getGoodDetailRef().getDataId() + ":" + invoice.getGoodDetailRef().getRefValueApiName() + ":" + invoice.getGoodDetailRef().getValue()); return invoice; } @PostMapping("/select3") public InvoiceVo select3() { CustomeFieldValueVo customeFieldValueVo; FullDataModel commonModel = new FullDataModel(InvoiceVo.class); return commonModel.selectOne("11ed50e85d51f397a340436762a01ed5"); } @PostMapping("/delete") public int delete() { CommonModel commonModel = new CommonModel(Invoice.class); return commonModel.deleteByObjectId("11ed50e85d51f397a340436762a01ed5"); } } #### 软件架构 1.前端和后台交互架构 ![输入图片说明](%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_16662537513898.png) vo的基类是BaseVoModel, vo字段详情为 public class CustomerFieldValueVo { private String fieldTitle; private String dataType; private Object fieldValue; private String refApiName; private String refAppId; private String refSourceId; private String defaultValue; private int length; private boolean readOnly; private boolean required; private boolean hidden;} 后端返回VO 给前端例子:支持分页,提供两种模式:FullDataModel,PageModel @PostMapping("/select") public FapiaoVo select() { FullDataModel fullDataModel = new FullDataModel<>(FapiaoVo.class); List list = fullDataModel.selectList("name='发票3'"); return (FapiaoVo) list.get(0); } @PostMapping("/select1") public List select1() { FullDataModel fullDataModel = new FullDataModel<>(FapiaomingxiVo.class); List list = fullDataModel.selectList("fp='11ed4f72d862c1749377b51422578649'"); return list; } @PostMapping("/select2") public FapiaoVo select2() { FullDataModel fullDataModel1 = new FullDataModel<>(FapiaoVo.class); List list1 = fullDataModel1.selectList("name='发票3'"); FapiaoVo fapiaoVo = (FapiaoVo) list1.get(0); FullDataModel fullDataModel = new FullDataModel<>(FapiaomingxiVo.class); List list = fullDataModel.selectList("fp='"+ fapiaoVo.getObjectId().getFieldValue() + "'"); fapiaoVo.setFapiaomingxiVoList(list); return fapiaoVo; } @PostMapping("/select3") public Pagination select3() { PageModel pageModel = new PageModel(FapiaomingxiVo.class); return pageModel.selectList("price < 20", 2, 0, "price"); } @PostMapping("/select4") public FapiaoVo select4() { FullDataModel fullDataModel1 = new FullDataModel<>(FapiaoVo.class); return fullDataModel1.selectOne("11ed4f703bd661478583f96bd2ca9b81"); } @PostMapping("/create1") public FapiaoVo create1() { FullDataModel fullDataModel1 = new FullDataModel<>(FapiaoVo.class); return fullDataModel1.createOne(true); //return (FapiaoVo) fullDataModel1.selectOne("11ed4f703bd661478583f96bd2ca9b81"); } 后端取得前端返回VO的处理:支持批量保存 @PostMapping("/voupdate") public FapiaoVo update(@RequestBody FapiaoVo fapiaoVo) { fapiaoVo.update(); return fapiaoVo; } @PostMapping("/create") public FapiaoVo create() { FullDataModel fullDataModel = new FullDataModel<>(FapiaoVo.class); return (FapiaoVo) fullDataModel.createOne(false); } @PostMapping("/insertEcsSourcingTemplateVo") public EcsSourcingTemplateVo insertEcsSourcingTemplateVo(@RequestBody EcsSourcingTemplateVo ecsSourcingTemplateVo) { ecsSourcingTemplateVo.insert(); return ecsSourcingTemplateVo; } @PostMapping("/batchSave2") public List batchSave2() { FullDataModel fullDataModel = new FullDataModel<>(FapiaoVo.class); List list = new ArrayList<>(); FapiaoVo f1 = new FapiaoVo(); CustomerFieldValueVo customerFieldValueVo = new CustomerFieldValueVo(); customerFieldValueVo.setFieldValue("3333"); f1.setCode(customerFieldValueVo); CustomerFieldValueVo customerFieldValueVo2 = new CustomerFieldValueVo(); customerFieldValueVo2.setFieldValue("11ed50409a95544fb5714f69d6fd4fbd"); f1.setObjectId(customerFieldValueVo2); list.add(f1); FapiaoVo f2 = new FapiaoVo(); CustomerFieldValueVo customerFieldValueVo1 = new CustomerFieldValueVo(); customerFieldValueVo1.setFieldValue("44444"); f2.setCode(customerFieldValueVo1); list.add(f2); fullDataModel.batchSave(list); return null; } 2.后台逻辑处理架构 ![输入图片说明](%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_16662544251705.png) 实体的基类为BaseModel,提供两种模式:CommonModel,LambdaModel 使用例子: @PostMapping("/insert") public Fapiao insert() { Fapiao fapiao = new Fapiao(); fapiao.setName("发票3"); fapiao.setPurName("营业员1"); fapiao.setAmount(new BigDecimal(100)); fapiao.insert(); Fapiaomingxi fapiaomingxi = new Fapiaomingxi(); fapiaomingxi.setFp(fapiao.getObjectId()); fapiaomingxi.setGoodName("卫生纸1"); fapiaomingxi.setPrice(18); fapiaomingxi.insert(); Fapiaomingxi fapiaomingxi1 = new Fapiaomingxi(); fapiaomingxi1.setFp(fapiao.getObjectId()); fapiaomingxi1.setGoodName("苹果1"); fapiaomingxi1.setPrice(12); fapiaomingxi1.insert(); List list = new ArrayList<>(); list.add(fapiaomingxi); list.add(fapiaomingxi1); fapiao.setFapiaomingxiList(list); return fapiao; } @PostMapping("/select21") public Fapiao select21() { LambdaModel lambdaModel = new LambdaModel<>(Fapiao.class); Fapiao fapiao = lambdaModel.and().eq(Fapiao::getName, "发票3").selectOne(); return fapiao; } @PostMapping("/batchInsert1") public List batchInsert1() { List list = new ArrayList(); Fapiao fapiao1 = new Fapiao(); fapiao1.setName("3"); Fapiao fapiao2 = new Fapiao(); fapiao2.setName("4"); list.add(fapiao1); list.add(fapiao2); CommonModel commonModel = new CommonModel<>(Fapiao.class); commonModel.batchInsert(list); return list; } #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)