diff --git a/Zero.Extension.Commerce.ERP.DB/src/main/resources/plugins/zero-extension-commerce-erp/web/ambient/customer/corporation/UI.json b/Zero.Extension.Commerce.ERP.DB/src/main/resources/plugins/zero-extension-commerce-erp/web/ambient/customer/corporation/UI.json index 8332c271ecd203849ca0870e4884f0cf4281ce15..483287779de8df5e58a60b64438345a11cdbbd2d 100644 --- a/Zero.Extension.Commerce.ERP.DB/src/main/resources/plugins/zero-extension-commerce-erp/web/ambient/customer/corporation/UI.json +++ b/Zero.Extension.Commerce.ERP.DB/src/main/resources/plugins/zero-extension-commerce-erp/web/ambient/customer/corporation/UI.json @@ -1,350 +1,349 @@ -{ - "_module": { - "$options": { - "formUp": { - "ui": [ - [ - { - "metadata": "active,启用,,,aiCheckbox", - "optionConfig": { - "valuePropName": "checked" - } - }, - { - "metadata": "runUp,是否挂账,,,aiCheckbox", - "optionConfig": { - "valuePropName": "checked" - } - } - ] - ] - }, - "form": { - "ui": [ - [ - "title=签单人信息" - ], - [ - "contactName,签单人姓名,,,,placeholder=请输入真实姓名", - { - "metadata": "contactPhone,签单人电话,,,,placeholder=请输入手机号", - "optionConfig.rules": [ - { - "max": 11, - "pattern": "0?(13|14|15|18|17)[0-9]{9}", - "message": "格式错误,请正确输入手机号!" - } - ] - }, - { - "metadata": "contactEmail,签单人邮箱,,,,placeholder=格式:xxx@xxx.xx", - "optionConfig.rules": [ - { - "pattern": "\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}", - "message": "格式错误,请正确输入邮件地址!" - } - ] - } - ], - [ - "contactOnline,在线联系方式,,,,placeholder=QQ、微博等在线联系方式" - ] - ] - } - } - }, - "_grid": { - "query": { - "projection": [], - "pager": "1,10", - "sorter": "updatedAt=DESC", - "criteria": { - "sigma": "PROP:app.sigma" - } - }, - "options": { - "search.cond": [ - "name,c", - "code,c" - ], - "search.enabled": true, - "search.confirm.clear": "该操作会清空所有的查询条件,确认清空?", - "search.op.redo": "清除条件", - "search.op.advanced": "高级搜索", - "search.op.view": "查询条件", - "search.placeholder": "名称/编号", - "search.advanced": true, - "search.advanced.width": "40%", - "search.advanced.title": "搜索基础客户", - "search.advanced.notice": { - "message": "注意!", - "description": [ - "高级搜索条件优先级会大于普通搜索,一旦触发,普通搜索条件会被重置。", - "高级搜索表单中的搜索条件会被保存,再次打开时会重置到上次的搜索状态。" - ] - }, - "search.criteria.window": "当前查询条件,保存,关闭,false,900,true,btnCriteria", - "search.criteria.view": { - "selected": "当前视图:", - "confirm": "您正在更改当前视图的查询条件,一旦更改后查询数据会有变化,确认?" - }, - "tabs.list": "基础客户列表", - "tabs.add": "添加基础客户", - "tabs.edit": "编辑基础客户", - "identifier": "res.customer", - "dynamic.op": false, - "dynamic.column": false, - "dynamic.switch": false, - "op.open.add": "添加", - "op.open.filter": "清除筛选", - "op.batch.delete": "批量删除", - "op.batch.edit": "批量更新", - "op.extra.column": "修改显示列", - "op.extra.export": "导出", - "op.extra.import": "导入", - "op.extra.view": "视图管理", - "op.row.edit": true, - "op.row.delete": true, - "op.submit.add": "添加", - "op.submit.save": "保存", - "op.submit.delete": "删除", - "op.submit.reset": "重置", - "window.batch.editor": "选择批量更新的字段,更新,关闭,false,720,true,btnBatchEdit", - "window.extra.column": "请选择您要显示的列,leftTop,720,true", - "window.extra.export": "选择导出字段,导出,关闭,false,720,true,btnExport", - "window.extra.import": "请上传导入文件,导入,关闭,false,720,true,btnImport", - "window.extra.view": "视图管理,right,480,true,btnView", - "id.submit.add": "$opAdd", - "id.submit.save": "$opSave", - "id.submit.reset": "$opReset", - "id.submit.delete": "$opDelete", - "ajax.position": [ - "ROUTE:type" - ], - "ajax.search.uri": "/api/customer/search", - "ajax.get.uri": "/api/customer/:key", - "ajax.delete.uri": "/api/customer/:key", - "ajax.batch.delete.uri": "/api/batch/customer/delete", - "ajax.batch.update.uri": "/api/batch/customer/update", - "ajax.column.full": "/api/columns/customer/full", - "ajax.column.my": "/api/columns/customer/my", - "ajax.column.save": "/api/columns/customer/my", - "ajax.file.export": "/api/customer/export", - "ajax.file.import": "/api/customer/import", - "confirm.delete": "确认删除当前基础客户记录?", - "confirm.batch.delete": "您确认要删除所有选中的基础客户记录?", - "confirm.clean.filter": "该操作将清空所有的查询条件,确认?", - "message.batch.delete": "您所选择的记录已经全部删除成功!" - }, - "component": { - "batch.editor": { - "fieldColumn": { - "title": "选择属性", - "items": [ - "contactName", - "contactPhone", - "address", - "companyId", - "active" - ] - }, - "valueColumn": { - "title": "设置值", - "render": { - "active": "RADIO", - "companyId": "DATUM" - } - } - } - }, - "table": { - "total": { - "report": "(总共:page页,:total条数据)", - "selected": "勾选了:count条" - }, - "row": { - "onDoubleClick": "fnEdit" - }, - "columns": [ - { - "title": "操作", - "dataIndex": "key", - "fixed": "left", - "$render": "EXECUTOR", - "$option": [ - { - "text": "编辑", - "executor": "fnEdit" - }, - "divider", - { - "text": "删除", - "executor": "fnDelete", - "confirm": "确认删除选择的基础客户记录?" - } - ] - }, - { - "title": "基础客户名称", - "dataIndex": "name", - "sorter": true, - "$filter.type": "SEARCH", - "$filter.config": { - "placeholder": "输入基础客户名称", - "button": { - "search": "搜索", - "reset": "重置" - } - } - }, - { - "title": "基础客户编号", - "dataIndex": "code", - "sorter": true, - "$filter.type": "SEARCH", - "$filter.config": { - "placeholder": "输入基础客户编号", - "button": { - "search": "搜索", - "reset": "重置" - } - } - }, - { - "title": "基础客户显示标题", - "dataIndex": "title", - "sorter": true, - "$filter.type": "SEARCH", - "$filter.config": { - "placeholder": "输入基础客户显示标题", - "button": { - "search": "搜索", - "reset": "重置" - } - } - }, - { - "title": "税号", - "dataIndex": "taxCode", - "sorter": true - }, - { - "title": "开票抬头", - "dataIndex": "taxTitle", - "sorter": true - }, - { - "title": "企业信箱", - "dataIndex": "email", - "sorter": true, - "$filter.type": "SEARCH", - "$filter.config": { - "placeholder": "输入企业信箱", - "button": { - "search": "搜索", - "reset": "重置" - } - } - }, - { - "title": "传真号", - "dataIndex": "fax", - "sorter": true - }, - { - "title": "基础客户主页", - "dataIndex": "homepage", - "sorter": true - }, - { - "title": "基础客户座机", - "dataIndex": "phone", - "sorter": true - }, - { - "title": "基础客户地址", - "dataIndex": "address", - "sorter": true - }, - { - "title": "联系人名称", - "dataIndex": "contactName", - "sorter": true, - "$filter.type": "SEARCH", - "$filter.config": { - "placeholder": "输入联系人名称", - "button": { - "search": "搜索", - "reset": "重置" - } - } - }, - { - "title": "联系人电话", - "dataIndex": "contactPhone", - "sorter": true, - "$filter.type": "SEARCH", - "$filter.config": { - "placeholder": "输入联系人电话", - "button": { - "search": "搜索", - "reset": "重置" - } - } - }, - { - "title": "在线联系方式", - "dataIndex": "contactOnline", - "sorter": true, - "$filter.type": "SEARCH", - "$filter.config": { - "placeholder": "输入在线联系方式", - "button": { - "search": "搜索", - "reset": "重置" - } - } - }, - { - "title": "是否启用", - "dataIndex": "active", - "sorter": true, - "$render": "LOGICAL", - "$mapping": { - "true": "启用", - "false": "禁用" - }, - "$filter.config.dataType": "BOOLEAN", - "$filter.config.items": [ - "true,启用", - "false,禁用" - ], - "$filter.config.button": { - "yes": "确认", - "reset": "重置" - }, - "$filter.config.width": { - "radio": 110, - "button": 55 - } - }, - { - "title": "更新人", - "dataIndex": "updatedBy", - "$render": "USER", - "$config": { - "uri": "/api/user/:key", - "field": "realname" - }, - "$empty": "(系统)" - }, - { - "title": "更新时间", - "dataIndex": "updatedAt", - "$render": "DATE", - "$format": "YYYY-MM-DD" - } - ] - } - } +{ + "_module": { + "$options": { + "formUp": { + "ui": [ + [ + { + "metadata": "active,启用,,,aiCheckbox", + "optionConfig": { + "valuePropName": "checked" + } + }, + { + "metadata": "runUp,是否挂账,,,aiCheckbox", + "optionConfig": { + "valuePropName": "checked" + } + } + ] + ] + }, + "form": { + "ui": [ + [ + "title=签单人信息" + ], + [ + "contactName,签单人姓名,,,,placeholder=请输入真实姓名", + { + "metadata": "contactPhone,签单人电话,,,,placeholder=请输入手机号", + "optionConfig.rules": [ + { + "max": 11, + "pattern": "0?(13|14|15|18|17)[0-9]{9}", + "message": "格式错误,请正确输入手机号!" + } + ] + }, + { + "metadata": "contactEmail,签单人邮箱,,,,placeholder=格式:xxx@xxx.xx", + "optionConfig.rules": [ + { + "pattern": "\\w[-\\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\\.)+[A-Za-z]{2,14}", + "message": "格式错误,请正确输入邮件地址!" + } + ] + } + ], + [ + "contactOnline,在线联系方式,,,,placeholder=QQ、微博等在线联系方式" + ] + ] + } + } + }, + "_grid": { + "query": { + "projection": [], + "pager": "1,10", + "sorter": "updatedAt=DESC", + "criteria": { + "sigma": "PROP:app.sigma" + } + }, + "options": { + "search.cond": [ + "name,c", + "code,c" + ], + "search.enabled": true, + "search.confirm.clear": "该操作会清空所有的查询条件,确认清空?", + "search.op.redo": "清除条件", + "search.op.advanced": "高级搜索", + "search.op.view": "查询条件", + "search.placeholder": "名称/编号", + "search.advanced": true, + "search.advanced.width": "40%", + "search.advanced.title": "搜索基础客户", + "search.advanced.notice": { + "message": "注意!", + "description": [ + "高级搜索条件优先级会大于普通搜索,一旦触发,普通搜索条件会被重置。", + "高级搜索表单中的搜索条件会被保存,再次打开时会重置到上次的搜索状态。" + ] + }, + "search.criteria.window": "当前查询条件,保存,关闭,false,900,true,btnCriteria", + "search.criteria.view": { + "selected": "当前视图:", + "confirm": "您正在更改当前视图的查询条件,一旦更改后查询数据会有变化,确认?" + }, + "tabs.list": "基础客户列表", + "tabs.add": "添加基础客户", + "tabs.edit": "编辑基础客户", + "identifier": "res.customer", + "dynamic.op": false, + "dynamic.column": false, + "dynamic.switch": false, + "op.open.add": "添加", + "op.open.filter": "清除筛选", + "op.batch.edit": "批量更新", + "op.extra.column": "修改显示列", + "op.extra.export": "导出", + "op.extra.import": "导入", + "op.extra.view": "视图管理", + "op.row.edit": true, + "op.row.delete": true, + "op.submit.add": "添加", + "op.submit.save": "保存", + "op.submit.delete": "删除", + "op.submit.reset": "重置", + "window.batch.editor": "选择批量更新的字段,更新,关闭,false,720,true,btnBatchEdit", + "window.extra.column": "请选择您要显示的列,leftTop,720,true", + "window.extra.export": "选择导出字段,导出,关闭,false,720,true,btnExport", + "window.extra.import": "请上传导入文件,导入,关闭,false,720,true,btnImport", + "window.extra.view": "视图管理,right,480,true,btnView", + "id.submit.add": "$opAdd", + "id.submit.save": "$opSave", + "id.submit.reset": "$opReset", + "id.submit.delete": "$opDelete", + "ajax.position": [ + "ROUTE:type" + ], + "ajax.search.uri": "/api/customer/search", + "ajax.get.uri": "/api/customer/:key", + "ajax.delete.uri": "/api/customer/:key", + "ajax.batch.delete.uri": "/api/batch/customer/delete", + "ajax.batch.update.uri": "/api/batch/customer/update", + "ajax.column.full": "/api/columns/customer/full", + "ajax.column.my": "/api/columns/customer/my", + "ajax.column.save": "/api/columns/customer/my", + "ajax.file.export": "/api/customer/export", + "ajax.file.import": "/api/customer/import", + "confirm.delete": "确认删除当前基础客户记录?", + "confirm.batch.delete": "您确认要删除所有选中的基础客户记录?", + "confirm.clean.filter": "该操作将清空所有的查询条件,确认?", + "message.batch.delete": "您所选择的记录已经全部删除成功!" + }, + "component": { + "batch.editor": { + "fieldColumn": { + "title": "选择属性", + "items": [ + "contactName", + "contactPhone", + "address", + "companyId", + "active" + ] + }, + "valueColumn": { + "title": "设置值", + "render": { + "active": "RADIO", + "companyId": "DATUM" + } + } + } + }, + "table": { + "total": { + "report": "(总共:page页,:total条数据)", + "selected": "勾选了:count条" + }, + "row": { + "onDoubleClick": "fnEdit" + }, + "columns": [ + { + "title": "操作", + "dataIndex": "key", + "fixed": "left", + "$render": "EXECUTOR", + "$option": [ + { + "text": "编辑", + "executor": "fnEdit" + }, + "divider", + { + "text": "删除", + "executor": "fnDelete", + "confirm": "确认删除选择的基础客户记录?" + } + ] + }, + { + "title": "基础客户名称", + "dataIndex": "name", + "sorter": true, + "$filter.type": "SEARCH", + "$filter.config": { + "placeholder": "输入基础客户名称", + "button": { + "search": "搜索", + "reset": "重置" + } + } + }, + { + "title": "基础客户编号", + "dataIndex": "code", + "sorter": true, + "$filter.type": "SEARCH", + "$filter.config": { + "placeholder": "输入基础客户编号", + "button": { + "search": "搜索", + "reset": "重置" + } + } + }, + { + "title": "基础客户显示标题", + "dataIndex": "title", + "sorter": true, + "$filter.type": "SEARCH", + "$filter.config": { + "placeholder": "输入基础客户显示标题", + "button": { + "search": "搜索", + "reset": "重置" + } + } + }, + { + "title": "税号", + "dataIndex": "taxCode", + "sorter": true + }, + { + "title": "开票抬头", + "dataIndex": "taxTitle", + "sorter": true + }, + { + "title": "企业信箱", + "dataIndex": "email", + "sorter": true, + "$filter.type": "SEARCH", + "$filter.config": { + "placeholder": "输入企业信箱", + "button": { + "search": "搜索", + "reset": "重置" + } + } + }, + { + "title": "传真号", + "dataIndex": "fax", + "sorter": true + }, + { + "title": "基础客户主页", + "dataIndex": "homepage", + "sorter": true + }, + { + "title": "基础客户座机", + "dataIndex": "phone", + "sorter": true + }, + { + "title": "基础客户地址", + "dataIndex": "address", + "sorter": true + }, + { + "title": "联系人名称", + "dataIndex": "contactName", + "sorter": true, + "$filter.type": "SEARCH", + "$filter.config": { + "placeholder": "输入联系人名称", + "button": { + "search": "搜索", + "reset": "重置" + } + } + }, + { + "title": "联系人电话", + "dataIndex": "contactPhone", + "sorter": true, + "$filter.type": "SEARCH", + "$filter.config": { + "placeholder": "输入联系人电话", + "button": { + "search": "搜索", + "reset": "重置" + } + } + }, + { + "title": "在线联系方式", + "dataIndex": "contactOnline", + "sorter": true, + "$filter.type": "SEARCH", + "$filter.config": { + "placeholder": "输入在线联系方式", + "button": { + "search": "搜索", + "reset": "重置" + } + } + }, + { + "title": "是否启用", + "dataIndex": "active", + "sorter": true, + "$render": "LOGICAL", + "$mapping": { + "true": "启用", + "false": "禁用" + }, + "$filter.config.dataType": "BOOLEAN", + "$filter.config.items": [ + "true,启用", + "false,禁用" + ], + "$filter.config.button": { + "yes": "确认", + "reset": "重置" + }, + "$filter.config.width": { + "radio": 110, + "button": 55 + } + }, + { + "title": "更新人", + "dataIndex": "updatedBy", + "$render": "USER", + "$config": { + "uri": "/api/user/:key", + "field": "realname" + }, + "$empty": "(系统)" + }, + { + "title": "更新时间", + "dataIndex": "updatedAt", + "$render": "DATE", + "$format": "YYYY-MM-DD" + } + ] + } + } } \ No newline at end of file diff --git a/Zero.Extension.Commerce.Finance.DB/script/code/zero-jooq.bat b/Zero.Extension.Commerce.Finance.DB/script/code/zero-jooq.bat new file mode 100644 index 0000000000000000000000000000000000000000..0bd65cc14d8605a0494c45309c98f4e66628edc4 --- /dev/null +++ b/Zero.Extension.Commerce.Finance.DB/script/code/zero-jooq.bat @@ -0,0 +1,4 @@ +@echo off +java -Djooq.codegen.jdbc.username=%Z_DBR_USERNAME% -Djooq.codegen.jdbc.password=%Z_DBR_PASS% ^ + -classpath "jooq-3.18.5.jar;jooq-meta-3.18.5.jar;jooq-codegen-3.18.5.jar;mysql-connector-j-8.0.33.jar;reactive-streams-1.0.4.jar;vertx-jooq-generate-6.5.5.jar;vertx-jooq-shared-6.5.5.jar;vertx-jooq-classic-6.5.5.jar;jakarta.xml.bind-api-4.0.0.jar;r2dbc-spi-1.0.0.RELEASE.jar;vertx-core-4.4.4.jar" ^ + org.jooq.codegen.GenerationTool .\config\zero-jooq.xml \ No newline at end of file diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/api/income/MutliActor.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/api/income/MutliActor.java index dc462d3e64d5caff857270d450634c816ce783a6..a115d96f0ccd7ef8661dcb8e771d05ced359f0d7 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/api/income/MutliActor.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/api/income/MutliActor.java @@ -1,40 +1,40 @@ -package io.zerows.extension.commerce.finance.agent.api.income; - -import io.zerows.extension.commerce.finance.domain.tables.pojos.FBillItem; -import io.zerows.extension.commerce.finance.agent.service.income.BillStub; -import io.vertx.core.Future; -import io.vertx.core.json.JsonObject; -import io.zerows.extension.commerce.finance.eon.Addr; -import io.zerows.extension.commerce.finance.uca.enter.Maker; -import io.vertx.up.annotations.Address; -import io.vertx.up.annotations.Me; -import io.vertx.up.annotations.Queue; -import io.vertx.up.eon.KName; -import io.vertx.up.unity.Ux; -import io.vertx.up.util.Ut; -import jakarta.inject.Inject; - -import java.util.List; - -/** - * @author lang : 2024-01-11 - */ -@Queue -public class MutliActor { - - @Inject - private transient BillStub billStub; - - /** 参考:{@link MultiAgent#inMulti} 接口注释 */ - @Me - @Address(Addr.Bill.IN_MULTI) - public Future inMulti(final JsonObject data) { - final List items = Ux.fromJson(Ut.valueJArray(data, KName.ITEMS), FBillItem.class); - return Maker.ofB().buildFastAsync(data) - /* 账单:1,账单明细:N */ - .compose(bill -> this.billStub.multiAsync( - bill, // 账单对象 - items // 账单明细列表 - )); - } -} +package io.zerows.extension.commerce.finance.agent.api.income; + +import io.zerows.extension.commerce.finance.domain.tables.pojos.FBillItem; +import io.zerows.extension.commerce.finance.agent.service.income.BillStub; +import io.vertx.core.Future; +import io.vertx.core.json.JsonObject; +import io.zerows.extension.commerce.finance.eon.Addr; +import io.zerows.extension.commerce.finance.uca.enter.Maker; +import io.vertx.up.annotations.Address; +import io.vertx.up.annotations.Me; +import io.vertx.up.annotations.Queue; +import io.vertx.up.eon.KName; +import io.vertx.up.unity.Ux; +import io.vertx.up.util.Ut; +import jakarta.inject.Inject; + +import java.util.List; + +/** + * @author lang : 2024-01-11 + */ +@Queue +public class MutliActor { + + @Inject + private transient BillStub billStub; + + /** 参考:{@link MultiAgent#inMulti} 接口注释 */ + @Me + @Address(Addr.Bill.IN_MULTI) + public Future inMulti(final JsonObject data) { + final List items = Ux.fromJson(Ut.valueJArray(data, KName.ITEMS), FBillItem.class); + return Maker.ofB().buildFastAsync(data) + /* 账单:1,账单明细:N */ + .compose(bill -> this.billStub.multiAsync( + bill, // 账单对象 + items // 账单明细列表 + )); + } +} diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/api/income/SingleActor.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/api/income/SingleActor.java index b975e2e9eb8f8b44327454d7ef1f7c6d82bc9732..231624d6a0d6e4a046e663d5534185ab5a17a7ff 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/api/income/SingleActor.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/api/income/SingleActor.java @@ -1,54 +1,54 @@ -package io.zerows.extension.commerce.finance.agent.api.income; - -import io.zerows.extension.commerce.finance.domain.tables.pojos.FBillItem; -import io.zerows.extension.commerce.finance.domain.tables.pojos.FPreAuthorize; -import io.zerows.extension.commerce.finance.agent.service.income.BillStub; -import io.vertx.core.Future; -import io.vertx.core.json.JsonObject; -import io.zerows.extension.commerce.finance.eon.Addr; -import io.zerows.extension.commerce.finance.util.Fm; -import io.zerows.extension.commerce.finance.uca.enter.Maker; -import io.vertx.up.annotations.Address; -import io.vertx.up.annotations.Me; -import io.vertx.up.annotations.Queue; -import io.vertx.up.unity.Ux; -import jakarta.inject.Inject; - -/** - * @author lang : 2024-01-11 - */ -@Queue -public class SingleActor { - - @Inject - private transient BillStub billStub; - - /** 参考:{@link SingleAgent#inPre} 接口注释 */ - @Me - @Address(Addr.Bill.IN_PRE) - public Future inPre(final JsonObject data) { - final FBillItem item = Ux.fromJson(data, FBillItem.class); - final FPreAuthorize authorize = Fm.toAuthorize(data); - return Maker.ofB().buildFastAsync(data) // 账单序号生成 - /* 账单:1,账单明细:1,预授权:1 or ? ( preAuthorize 节点)*/ - .compose(bill -> this.billStub.singleAsync( - bill, // 账单对象 - item, // 账单明细对象 - authorize // 预授权对象 - )); - } - - - /** 参考:{@link SingleAgent#inCommon} 接口注释 **/ - @Me - @Address(Addr.Bill.IN_COMMON) - public Future inCommon(final JsonObject data) { - final FBillItem item = Ux.fromJson(data, FBillItem.class); - return Maker.ofB().buildFastAsync(data) // 账单序号生成 - /* 账单:1,账单明细:1 */ - .compose(bill -> this.billStub.singleAsync( - bill, // 账单对象 - item // 账单明细对象 - )); - } -} +package io.zerows.extension.commerce.finance.agent.api.income; + +import io.zerows.extension.commerce.finance.domain.tables.pojos.FBillItem; +import io.zerows.extension.commerce.finance.domain.tables.pojos.FPreAuthorize; +import io.zerows.extension.commerce.finance.agent.service.income.BillStub; +import io.vertx.core.Future; +import io.vertx.core.json.JsonObject; +import io.zerows.extension.commerce.finance.eon.Addr; +import io.zerows.extension.commerce.finance.util.Fm; +import io.zerows.extension.commerce.finance.uca.enter.Maker; +import io.vertx.up.annotations.Address; +import io.vertx.up.annotations.Me; +import io.vertx.up.annotations.Queue; +import io.vertx.up.unity.Ux; +import jakarta.inject.Inject; + +/** + * @author lang : 2024-01-11 + */ +@Queue +public class SingleActor { + + @Inject + private transient BillStub billStub; + + /** 参考:{@link SingleAgent#inPre} 接口注释 */ + @Me + @Address(Addr.Bill.IN_PRE) + public Future inPre(final JsonObject data) { + final FBillItem item = Ux.fromJson(data, FBillItem.class); + final FPreAuthorize authorize = Fm.toAuthorize(data); + return Maker.ofB().buildFastAsync(data) // 账单序号生成 + /* 账单:1,账单明细:1,预授权:1 or ? ( preAuthorize 节点)*/ + .compose(bill -> this.billStub.singleAsync( + bill, // 账单对象 + item, // 账单明细对象 + authorize // 预授权对象 + )); + } + + + /** 参考:{@link SingleAgent#inCommon} 接口注释 **/ + @Me + @Address(Addr.Bill.IN_COMMON) + public Future inCommon(final JsonObject data) { + final FBillItem item = Ux.fromJson(data, FBillItem.class); + return Maker.ofB().buildFastAsync(data) // 账单序号生成 + /* 账单:1,账单明细:1 */ + .compose(bill -> this.billStub.singleAsync( + bill, // 账单对象 + item // 账单明细对象 + )); + } +} diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/service/end/SettleRService.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/service/end/SettleRService.java index 6aefe80a68413d89fa3d790c15375d33ebbee095..ae78680f78ce020faf7c2df56682999bee98c7ce 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/service/end/SettleRService.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/service/end/SettleRService.java @@ -1,232 +1,236 @@ -package io.zerows.extension.commerce.finance.agent.service.end; - -import io.zerows.extension.commerce.finance.domain.tables.daos.FDebtDao; -import io.zerows.extension.commerce.finance.domain.tables.daos.FSettlementDao; -import io.zerows.extension.commerce.finance.domain.tables.daos.FSettlementItemDao; -import io.zerows.extension.commerce.finance.domain.tables.pojos.FDebt; -import io.zerows.extension.commerce.finance.domain.tables.pojos.FSettlement; -import io.zerows.extension.commerce.finance.domain.tables.pojos.FSettlementItem; -import io.vertx.core.Future; -import io.vertx.core.json.JsonArray; -import io.vertx.core.json.JsonObject; -import io.zerows.extension.commerce.finance.eon.em.EmDebt; -import io.zerows.extension.commerce.finance.eon.em.EmTran; -import io.zerows.extension.commerce.finance.util.Fm; -import io.vertx.up.eon.KName; -import io.vertx.up.unity.Ux; -import io.vertx.up.util.Ut; -import jakarta.inject.Inject; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.stream.Collectors; - -/** - * @author Lang - */ -public class SettleRService implements SettleRStub { - - @Inject - private transient TransStub transStub; - - /** - * 此处注意响应的格式,响应格式在原始基础上会有所变化 - *

-     *     1. 原来的单结算单的模式改成了多结算单模式,那么此处有可能会出现多张订单同时结算的情况
-     *        结算限制:结算本身不限制,只是给出相关提示,同订单的选择提示。
-     *     2. 响应数据格式如:
-     *        {
-     *            "settlements": [],
-     *            "items": [],
-     *            "debts": [],
-     *            "transactions": []
-     *        }
-     *        前端去针对数据结构做运算,此处的结构是为了方便前端处理,后端不做任何运算,此处是在
-     *        选择之后提取 settlements 结算信息时出来的内容,放前端运算更靠谱,和结算相关的信息
-     *        有两个维度
-     *        - debts:相关应收信息
-     *        - transactions:交易数据,交易数据中会包含直接结算部分,如果交易数据直接和结算挂钩
-     *        证明这些交易数据本身是关联结算的,而且是直接结算模式。
-     * 
- * - * @param keys 传入的结算单主键集合 - * - * @return JsonObject - */ - @Override - public Future fetchSettlement(final JsonArray keys) { - final JsonObject response = new JsonObject(); - return Ux.Jooq.on(FSettlementDao.class).fetchInAsync(KName.KEY, keys) - .compose(this::statusSettlement) - .compose(settlementA -> { - /* settlements */ - response.put(KName.Finance.SETTLEMENTS, settlementA); - return this.fetchInternalItems(keys); - }) - .compose(items -> { - /* items */ - response.put(KName.ITEMS, Ux.toJson(items)); - final JsonArray debtIds = Ut.toJArray(Ut.valueSetString(items, FSettlementItem::getDebtId)); - return Ux.Jooq.on(FDebtDao.class).fetchInAsync(KName.KEY, debtIds); - }) - .compose(debts -> { - /* debts */ - response.put(KName.Finance.DEBTS, Ux.toJson(debts)); - return this.transStub.fetchAsync(Ut.toSet(keys), Set.of(EmTran.Type.SETTLEMENT)); - }) - .compose(tranData -> Ux.future(Fm.toTransaction(response, tranData))); - } - - /** - * 根据交易ID读取结算单列表,结算单列表中会包含 items 属性用来存储结算单相关的结算明细信息 - *

-     *     type = SETTLEMENT
-     * 
- * - * @param transId 交易ID - * - * @return 结算单列表 - */ - @Override - public Future fetchByTran(final String transId) { - final JsonObject cond = Ux.whereAnd(); - return null; - } - - @Override - public Future statusSettlement(final JsonArray settlements) { - final JsonArray keys = Ut.valueJArray(settlements, KName.KEY); - return this.fetchStatus(keys).compose(statusMap -> { - /* - * statusMap 中的数据结构如: - * - settlementId = JsonArray - * 其中 JsonArray 中的状态值会有多个,如果为空,则表示没有处理过 - * 那么状态中的数据应该是 PENDING(单元素) - */ - Ut.itJArray(settlements).forEach(settleJ -> { - final String key = settleJ.getString(KName.KEY); - final JsonArray status = statusMap.getOrDefault(key, new JsonArray()); - settleJ.put(KName.LINKED, status); - }); - return Ux.future(settlements); - }); - } - - @Override - public Future statusSettlement(final List settlements) { - final JsonArray settlementA = Ux.toJson(settlements); - // 旧版:final JsonArray keys = Ut.toJArray(Ut.elementSet(settlements, FSettlement::getKey)); - return this.statusSettlement(settlementA); - } - - /** - * 完整的状态计算,此处计算结算单状态 - *

-     *     1. 根据结算单中数据提取状态相关信息,先读取结算明细,然后根据结算明细进行分析。
-     *        Settlement      Debt
-     *                \        /
-     *                 \      /
-     *              Settlement Item
-     *     2. 结算管理中的状态信息说明
-     *        - finished = false            PENDING        -> 未完成
-     *        - finished = true
-     *          - debtId = null             SETTLEMENT     -> 结算完成
-     *          - debtId != null            应收或退款
-     *            - debt金额 > 0             DEBT           -> 应收
-     *            - debt金额 < 0             REFUND         -> 应退
-     *     3. 结算单是否完成的计算
-     *        - 结算明细 finishedId 有值      debtId = null   -> 直接结算完成
-     *                                      debtId !- null  -> 应收/应退处理(应收单中继续处理)
-     *        - 结算明细 finishedId = null   此时 debtId 不可以有值,有值证明处理过
-     *        - 所有结算明细 finishedId 有值,则结算单完成,否则结算单依旧挂起
-     *     4. 有了结算明细的状态计算之后,上层计算已经没有任何作用了,直接在结算明细中考虑相关问题
-     *        关于结算明细中的关联属性说明
-     *        - settlementId:当前明细所属结算单的关联ID
-     *        - debtId:当前明细所属应收/应退单的关联ID
-     *        - relatedId:当前结算明细对应的 1:1 的账单明细关联ID
-     *        - finishedId:当前结算明细关联的完成ID(完成ID可以是交易ID,存在交易ID证明已被处理过)
-     *        新版移除了 finished 和 finishedAt 的信息,因为结算明细中的 finished 可直接通过 finishedId 判断,
-     *        而结算明细中的 finishedAt 则可以直接使用挂靠的 finishedId 对应单据的 updatedAt 来计算。
-     * 
- * - * @param keys 传入的结算单主键集合 - * - * @return 返回“结算单”对应的状态信息 - */ - public Future> fetchStatus(final JsonArray keys) { - final JsonArray settlementIds = Ut.toJArray(keys); - final ConcurrentMap statusMap = new ConcurrentHashMap<>(); - return this.fetchInternalItems(settlementIds).compose(items -> { - final ConcurrentMap> mapSettle = Ut.elementGroup(items, FSettlementItem::getSettlementId); - - /* - * 追加结算单基本状态 - * - PENDING:未开始结算 - * - DONE:已完成结算 - * - PART:部分完成结算 - */ - Ut.itJString(keys).forEach(settlementId -> { - final List groupItems = mapSettle.getOrDefault(settlementId, new ArrayList<>()); - if (!groupItems.isEmpty()) { - final JsonArray statusQ = new JsonArray(); - // 计算 PENDING / DONE / PART - final int size = groupItems.size(); - final Set finishedSet = groupItems - .stream().map(FSettlementItem::getFinishedId) - .filter(Ut::isNotNull).collect(Collectors.toSet()); - if (size == finishedSet.size()) { - // DONE - statusQ.add(EmDebt.Linked.DONE.name()); - } else if (finishedSet.isEmpty()) { - // PENDING - statusQ.add(EmDebt.Linked.PENDING.name()); - } else { - // PART - statusQ.add(EmDebt.Linked.PART.name()); - } - statusMap.put(settlementId, statusQ); - } - }); - - /* - * 计算结算明细中的 debtId 来判断结算单中会包含额外的状态 - * - DEBT:有应收 - * - REFUND:有应退 - */ - final Set debtIds = items.stream() - .map(FSettlementItem::getDebtId) - .filter(Ut::isNotNil) - .collect(Collectors.toSet()); - return Ux.Jooq.on(FDebtDao.class).fetchInAsync(KName.KEY, debtIds).compose(debts -> { - final ConcurrentMap> mapItem = Ut.elementGroup(items, FSettlementItem::getDebtId); - debts.forEach(debt -> { - final String debtId = debt.getKey(); - final List itemList = mapItem.getOrDefault(debtId, new ArrayList<>()); - itemList.forEach(item -> { - final JsonArray statusQ = statusMap.getOrDefault(item.getSettlementId(), new JsonArray()); - if (Ut.isNotNil(statusQ)) { - if (EmDebt.Type.DEBT.name().equals(debt.getType())) { - // DEBT - statusQ.add(EmDebt.Linked.DEBT.name()); - } else { - // REFUND - statusQ.add(EmDebt.Linked.REFUND.name()); - } - } - statusMap.put(item.getSettlementId(), statusQ); - }); - }); - return Ux.future(statusMap); - }); - }); - } - - // ---------------- Private ----------------- - - private Future> fetchInternalItems(final JsonArray settlementIds) { - return Ux.Jooq.on(FSettlementItemDao.class).fetchInAsync(KName.Finance.SETTLEMENT_ID, settlementIds); - } -} +package io.zerows.extension.commerce.finance.agent.service.end; + +import io.zerows.extension.commerce.finance.domain.tables.daos.FDebtDao; +import io.zerows.extension.commerce.finance.domain.tables.daos.FSettlementDao; +import io.zerows.extension.commerce.finance.domain.tables.daos.FSettlementItemDao; +import io.zerows.extension.commerce.finance.domain.tables.pojos.FDebt; +import io.zerows.extension.commerce.finance.domain.tables.pojos.FSettlement; +import io.zerows.extension.commerce.finance.domain.tables.pojos.FSettlementItem; +import io.vertx.core.Future; +import io.vertx.core.json.JsonArray; +import io.vertx.core.json.JsonObject; +import io.zerows.extension.commerce.finance.eon.em.EmDebt; +import io.zerows.extension.commerce.finance.eon.em.EmTran; +import io.zerows.extension.commerce.finance.util.Fm; +import io.vertx.up.eon.KName; +import io.vertx.up.unity.Ux; +import io.vertx.up.util.Ut; +import jakarta.inject.Inject; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.stream.Collectors; + +/** + * @author Lang + */ +public class SettleRService implements SettleRStub { + + @Inject + private transient TransStub transStub; + + /** + * 此处注意响应的格式,响应格式在原始基础上会有所变化 + *

+     *     1. 原来的单结算单的模式改成了多结算单模式,那么此处有可能会出现多张订单同时结算的情况
+     *        结算限制:结算本身不限制,只是给出相关提示,同订单的选择提示。
+     *     2. 响应数据格式如:
+     *        {
+     *            "settlements": [],
+     *            "items": [],
+     *            "debts": [],
+     *            "transactions": []
+     *        }
+     *        前端去针对数据结构做运算,此处的结构是为了方便前端处理,后端不做任何运算,此处是在
+     *        选择之后提取 settlements 结算信息时出来的内容,放前端运算更靠谱,和结算相关的信息
+     *        有两个维度
+     *        - debts:相关应收信息
+     *        - transactions:交易数据,交易数据中会包含直接结算部分,如果交易数据直接和结算挂钩
+     *        证明这些交易数据本身是关联结算的,而且是直接结算模式。
+     * 
+ * + * @param keys 传入的结算单主键集合 + * + * @return JsonObject + */ + @Override + public Future fetchSettlement(final JsonArray keys) { + final JsonObject response = new JsonObject(); + return Ux.Jooq.on(FSettlementDao.class).fetchInAsync(KName.KEY, keys) + .compose(this::statusSettlement) + .compose(settlementA -> { + /* settlements */ + response.put(KName.Finance.SETTLEMENTS, settlementA); + return this.fetchInternalItems(keys); + }) + .compose(items -> { + /* items */ + response.put(KName.ITEMS, Ux.toJson(items)); + final JsonArray debtIds = Ut.toJArray(Ut.valueSetString(items, FSettlementItem::getDebtId)); + return Ux.Jooq.on(FDebtDao.class).fetchInAsync(KName.KEY, debtIds); + }) + .compose(debts -> { + /* debts */ + response.put(KName.Finance.DEBTS, Ux.toJson(debts)); + return this.transStub.fetchAsync(Ut.toSet(keys), Set.of(EmTran.Type.SETTLEMENT)); + }) + .compose(tranData -> Ux.future(Fm.toTransaction(response, tranData))); + } + + /** + * 根据交易ID读取结算单列表,结算单列表中会包含 items 属性用来存储结算单相关的结算明细信息 + *

+     *     type = SETTLEMENT
+     * 
+ * + * @param transId 交易ID + * + * @return 结算单列表 + */ + @Override + public Future fetchByTran(final String transId) { + final JsonObject cond = Ux.whereAnd(); + return null; + } + + @Override + public Future statusSettlement(final JsonArray settlements) { + final JsonArray keys = Ut.valueJArray(settlements, KName.KEY); + return this.fetchStatus(keys).compose(statusMap -> { + /* + * statusMap 中的数据结构如: + * - settlementId = JsonArray + * 其中 JsonArray 中的状态值会有多个,如果为空,则表示没有处理过 + * 那么状态中的数据应该是 PENDING(单元素) + */ + Ut.itJArray(settlements).forEach(settleJ -> { + final String key = settleJ.getString(KName.KEY); + final JsonArray status = statusMap.getOrDefault(key, new JsonArray()); + settleJ.put(KName.LINKED, status); + }); + return Ux.future(settlements); + }); + } + + @Override + public Future statusSettlement(final List settlements) { + final JsonArray settlementA = Ux.toJson(settlements); + // 旧版:final JsonArray keys = Ut.toJArray(Ut.elementSet(settlements, FSettlement::getKey)); + return this.statusSettlement(settlementA); + } + + /** + * 完整的状态计算,此处计算结算单状态 + *

+     *     1. 根据结算单中数据提取状态相关信息,先读取结算明细,然后根据结算明细进行分析。
+     *        Settlement      Debt
+     *                \        /
+     *                 \      /
+     *              Settlement Item
+     *     2. 结算管理中的状态信息说明
+     *        - finished = false            PENDING        -> 未完成
+     *        - finished = true
+     *          - debtId = null             SETTLEMENT     -> 结算完成
+     *          - debtId != null            应收或退款
+     *            - debt金额 > 0             DEBT           -> 应收
+     *            - debt金额 < 0             REFUND         -> 应退
+     *     3. 结算单是否完成的计算
+     *        - 结算明细 finishedId 有值      debtId = null   -> 直接结算完成
+     *                                      debtId !- null  -> 应收/应退处理(应收单中继续处理)
+     *        - 结算明细 finishedId = null   此时 debtId 不可以有值,有值证明处理过
+     *        - 所有结算明细 finishedId 有值,则结算单完成,否则结算单依旧挂起
+     *     4. 有了结算明细的状态计算之后,上层计算已经没有任何作用了,直接在结算明细中考虑相关问题
+     *        关于结算明细中的关联属性说明
+     *        - settlementId:当前明细所属结算单的关联ID
+     *        - debtId:当前明细所属应收/应退单的关联ID
+     *        - relatedId:当前结算明细对应的 1:1 的账单明细关联ID
+     *        - finishedId:当前结算明细关联的完成ID(完成ID可以是交易ID,存在交易ID证明已被处理过)
+     *        新版移除了 finished 和 finishedAt 的信息,因为结算明细中的 finished 可直接通过 finishedId 判断,
+     *        而结算明细中的 finishedAt 则可以直接使用挂靠的 finishedId 对应单据的 updatedAt 来计算。
+     * 
+ * + * @param keys 传入的结算单主键集合 + * + * @return 返回“结算单”对应的状态信息 + */ + public Future> fetchStatus(final JsonArray keys) { + final JsonArray settlementIds = Ut.toJArray(keys); + final ConcurrentMap statusMap = new ConcurrentHashMap<>(); + return this.fetchInternalItems(settlementIds).compose(items -> { + final ConcurrentMap> mapSettle = Ut.elementGroup(items, FSettlementItem::getSettlementId); + + /* + * 追加结算单基本状态 + * - PENDING:未开始结算 + * - DONE:已完成结算 + * - PART:部分完成结算 + */ + Ut.itJString(keys).forEach(settlementId -> { + final List groupItems = mapSettle.getOrDefault(settlementId, new ArrayList<>()); + if (!groupItems.isEmpty()) { + final JsonArray statusQ = new JsonArray(); + // 计算 PENDING / DONE / PART + final int size = groupItems.size(); + final ArrayList finishedSet = new ArrayList<>(); + for (FSettlementItem groupItem : groupItems) { + String finishedId = groupItem.getFinishedId(); + if (Ut.isNotNull(finishedId)) { + finishedSet.add(finishedId); + } + } + if (size == finishedSet.size()) { + // DONE + statusQ.add(EmDebt.Linked.DONE.name()); + } else if (finishedSet.isEmpty()) { + // PENDING + statusQ.add(EmDebt.Linked.PENDING.name()); + } else { + // PART + statusQ.add(EmDebt.Linked.PART.name()); + } + statusMap.put(settlementId, statusQ); + } + }); + + /* + * 计算结算明细中的 debtId 来判断结算单中会包含额外的状态 + * - DEBT:有应收 + * - REFUND:有应退 + */ + final Set debtIds = items.stream() + .map(FSettlementItem::getDebtId) + .filter(Ut::isNotNil) + .collect(Collectors.toSet()); + return Ux.Jooq.on(FDebtDao.class).fetchInAsync(KName.KEY, debtIds).compose(debts -> { + final ConcurrentMap> mapItem = Ut.elementGroup(items, FSettlementItem::getDebtId); + debts.forEach(debt -> { + final String debtId = debt.getKey(); + final List itemList = mapItem.getOrDefault(debtId, new ArrayList<>()); + itemList.forEach(item -> { + final JsonArray statusQ = statusMap.getOrDefault(item.getSettlementId(), new JsonArray()); + if (Ut.isNotNil(statusQ)) { + if (EmDebt.Type.DEBT.name().equals(debt.getType())) { + // DEBT + statusQ.add(EmDebt.Linked.DEBT.name()); + } else { + // REFUND + statusQ.add(EmDebt.Linked.REFUND.name()); + } + } + statusMap.put(item.getSettlementId(), statusQ); + }); + }); + return Ux.future(statusMap); + }); + }); + } + + // ---------------- Private ----------------- + + private Future> fetchInternalItems(final JsonArray settlementIds) { + return Ux.Jooq.on(FSettlementItemDao.class).fetchInAsync(KName.Finance.SETTLEMENT_ID, settlementIds); + } +} diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/service/end/SettleWService.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/service/end/SettleWService.java index c6164f1e5cbd64cac355bcf40ce549e349912771..cebd9c6180793a1338055f4a055c93c5a982169c 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/service/end/SettleWService.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/service/end/SettleWService.java @@ -130,6 +130,7 @@ public class SettleWService implements SettleWStub { **/ final Set ignoreSet = new HashSet<>(); items.stream() + .filter(item->item.getDebtId()==null) .filter(item -> !itemsKeys.contains(item.getKey())) .forEach(item -> ignoreSet.add(item.getSettlementId())); final Set settlementSet = Ut.toSet(settlementIds); diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/service/end/TransService.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/service/end/TransService.java index e7b5b7ed832061ffa6019e6b855a7320df86f762..987d2d0eb531cc80ec0e2beccb88680ae5e64a8f 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/service/end/TransService.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/agent/service/end/TransService.java @@ -1,210 +1,212 @@ -package io.zerows.extension.commerce.finance.agent.service.end; - -import io.horizon.atom.program.KRef; -import io.vertx.core.Future; -import io.vertx.core.json.JsonArray; -import io.vertx.core.json.JsonObject; -import io.vertx.up.eon.KName; -import io.vertx.up.fn.Fn; -import io.vertx.up.unity.Ux; -import io.vertx.up.util.Ut; -import io.zerows.extension.commerce.finance.atom.TranData; -import io.zerows.extension.commerce.finance.domain.tables.daos.*; -import io.zerows.extension.commerce.finance.domain.tables.pojos.*; -import io.zerows.extension.commerce.finance.eon.FmConstant; -import io.zerows.extension.commerce.finance.eon.em.EmTran; -import io.zerows.extension.commerce.finance.uca.replica.IkWay; -import io.zerows.extension.commerce.finance.uca.trans.Trade; - -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.stream.Collectors; - -/** - * @author lang : 2024-01-24 - */ -public class TransService implements TransStub { - @Override - public Future createBySettlement(final JsonObject data, final FSettlement settlement) { - final JsonObject params = new JsonObject(); - { - params.put(KName.COMMENT, settlement.getComment()); - params.put(KName.TYPE, EmTran.Type.SETTLEMENT.name()); - params.put(KName.KEYS, new JsonArray().add(settlement.getKey())); - } - // 1. 构造 FTrans - return Trade.step06T().flatter(data, List.of(settlement)) - // 2. 构造 FTransOf - .compose(trans -> this.createTransItem(trans, data, params)); - } - - @Override - public Future createBySettlement(final JsonObject data, final List settlements) { - final JsonObject params = new JsonObject(); - { - params.put(KName.COMMENT, Ut.valueString(data, KName.COMMENT)); - params.put(KName.TYPE, EmTran.Type.SETTLEMENT.name()); - final JsonArray keys = Ut.toJArray(Ut.valueSetString(settlements, FSettlement::getKey)); - params.put(KName.KEYS, keys); - } - // 1. 构造 FTrans - return Trade.step06T().flatter(data, settlements) - // 2. 构造 FTransOf - .compose(trans -> this.createTransItem(trans, data, params)); - } - - @Override - public Future createByDebt(final JsonObject data, final List debts) { - final JsonObject params = new JsonObject(); - { - // 这种模式下前端已经传入了 type 信息 - params.put(KName.COMMENT, Ut.valueString(data, KName.COMMENT)); - params.put(KName.TYPE, Ut.valueString(data, KName.TYPE)); - final JsonArray keys = Ut.toJArray(Ut.valueSetString(debts, FDebt::getKey)); - params.put(KName.KEYS, keys); - } - // 1. 构造 FTrans - return Trade.step07T().flatter(data, debts) - // 2. 构造 FTransOf - .compose(trans -> this.createTransItem(trans, data, params)); - } - - private Future createTransItem( - final FTrans trans, final JsonObject data, final JsonObject params) { - return Trade.step06TO().scatter(params, trans) - .compose(nil -> { - final JsonArray paymentJ = Ut.valueJArray(data, FmConstant.ID.PAYMENT); - final List payments = Ux.fromJson(paymentJ, FTransItem.class); - - IkWay.ofT2TI().transfer(trans, payments); - // 防重复创建:Duplicate entry 'Cash' for key 'name_UNIQUE' - payments.forEach(payment -> payment.setKey(null)); - - return Ux.Jooq.on(FTransItemDao.class).insertAsync(payments); - }) - .compose(nil -> Ux.future(trans)); - } - - /** - * 批量查询(只能查询单独类型的数据),查询的最终数据结构如下 - *

-     *     [
-     *         {
-     *             "....": "....",
-     *             "items": [],
-     *             "of": []
-     *         }
-     *     ]
-     * 
- * - * @param keys 关联主键集合 - * @param typeSet 关联类型 - * - * @return 关联数据集合 - */ - @Override - public Future> fetchAsync(final Set keys, - final Set typeSet) { - final Set transId = new HashSet<>(); - final KRef itemRef = new KRef(); - final ConcurrentMap> tranMap = new ConcurrentHashMap<>(); - // WHERE OBJECT_TYPE = ? AND OBJECT_ID = ? - final JsonObject condition = Ux.whereAnd(); - condition.put("objectType,i", Ut.toJArray(typeSet.stream() - .map(EmTran.Type::name).collect(Collectors.toSet()) - )); - condition.put("objectId,i", Ut.toJArray(keys)); - // WHERE OBJECT_TYPE = ? AND OBJECT_ID = ? - return Ux.Jooq.on(FTransOfDao.class).fetchAsync(condition) - .compose(transOf -> { - tranMap.putAll(Ut.elementGroup(transOf, FTransOf::getTransId)); - /* - * 此处 TransOf 的目的是提取 transIds,最终的数据结构是 JsonArray 的结构,每一个元素都是一个 - * Trans 对象,然后在对象之下紧跟 items 来表示 transId 对应的所有 items 数据。 - */ - transId.addAll(Ut.valueSetString(transOf, FTransOf::getTransId)); - // 跳过选择,直接查询 FTransItem - final JsonObject condTrans = Ux.whereAnd(); - condTrans.put("transactionId,i", Ut.toJArray(transId)); - return Ux.Jooq.on(FTransItemDao.class).fetchAsync(condTrans); - }) - .compose(itemRef::future) - .compose(items -> Ux.Jooq.on(FTransDao.class).fetchInAsync(KName.KEY, Ut.toJArray(transId))) - .compose(transList -> { - final List items = itemRef.get(); - final ConcurrentMap> grouped = Ut.elementGroup(items, FTransItem::getTransactionId); - final List response = new ArrayList<>(); - transList.forEach(tran -> { - final TranData object = TranData.instance().transaction(tran); - final List itemData = grouped.getOrDefault(tran.getKey(), new ArrayList<>()); - final List ofData = tranMap.getOrDefault(tran.getKey(), new ArrayList<>()); - response.add(object.items(itemData).of(ofData)); - }); - return Ux.future(response); - }); - } - - @Override - public Future fetchAsync(final String key) { - // 单条交易记录 - final JsonObject response = new JsonObject(); - return Ux.Jooq.on(FTransDao.class).fetchByIdAsync(key) - .compose(trans -> { - response.mergeIn(Ux.toJson(trans)); - return this.fetchRelated(key); - }) - .compose(relatedMap -> { - relatedMap.forEach(response::put); // debts, settlements - return Ux.Jooq.on(FSettlementItemDao.class) - .fetchAsync("finishedId", key); - }) - .compose(items -> { - response.put(KName.ITEMS, Ux.toJson(items)); // items - return Ux.Jooq.on(FTransItemDao.class) - .fetchAsync("transactionId", key); - }) - .compose(payment -> { - response.put(FmConstant.ID.PAYMENT, Ux.toJson(payment)); // payment - return Ux.future(response); - }); - } - - /* - * 抓取 debts, settlements - */ - private Future> fetchRelated(final String key) { - return Ux.Jooq.on(FTransOfDao.class).fetchAsync("transId", key).compose(transOfs -> { - final ConcurrentMap> futureMap = new ConcurrentHashMap<>(); - final Set keySettle = new HashSet<>(); - final Set keyDebt = new HashSet<>(); - transOfs.stream() - // 防止 null 过滤 - .filter(Objects::nonNull) - .filter(transOf -> Ut.isNotNil(transOf.getObjectType())) - .filter(transOf -> Ut.isNotNil(transOf.getObjectId())) - .forEach(transOf -> { - final String type = transOf.getObjectType(); - if (EmTran.Type.SETTLEMENT.name().equals(type)) { - keySettle.add(transOf.getObjectId()); - } else { - // DEBT / REFUND - keyDebt.add(transOf.getObjectId()); - } - }); - - - /* - * debts = JsonArray - * settlements = JsonArray - */ - futureMap.put(KName.Finance.SETTLEMENTS, Ux.Jooq.on(FSettlementDao.class) - .fetchJInAsync(KName.KEY, Ut.toJArray(keySettle)) - ); - futureMap.put(KName.Finance.DEBTS, Ux.Jooq.on(FDebtDao.class) - .fetchJInAsync(KName.KEY, Ut.toJArray(keyDebt)) - ); - return Fn.combineM(futureMap); - }); - } -} +package io.zerows.extension.commerce.finance.agent.service.end; + +import io.horizon.atom.program.KRef; +import io.vertx.core.Future; +import io.vertx.core.json.JsonArray; +import io.vertx.core.json.JsonObject; +import io.vertx.up.eon.KName; +import io.vertx.up.fn.Fn; +import io.vertx.up.unity.Ux; +import io.vertx.up.util.Ut; +import io.zerows.extension.commerce.finance.atom.TranData; +import io.zerows.extension.commerce.finance.domain.tables.daos.*; +import io.zerows.extension.commerce.finance.domain.tables.pojos.*; +import io.zerows.extension.commerce.finance.eon.FmConstant; +import io.zerows.extension.commerce.finance.eon.em.EmTran; +import io.zerows.extension.commerce.finance.uca.replica.IkWay; +import io.zerows.extension.commerce.finance.uca.trans.Trade; +import io.zerows.extension.commerce.finance.util.Fm; + +import java.time.LocalDateTime; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.stream.Collectors; + +/** + * @author lang : 2024-01-24 + */ +public class TransService implements TransStub { + @Override + public Future createBySettlement(final JsonObject data, final FSettlement settlement) { + final JsonObject params = new JsonObject(); + { + params.put(KName.COMMENT, settlement.getComment()); + params.put(KName.TYPE, EmTran.Type.SETTLEMENT.name()); + params.put(KName.KEYS, new JsonArray().add(settlement.getKey())); + } + // 1. 构造 FTrans + return Trade.step06T().flatter(data, List.of(settlement)) + // 2. 构造 FTransOf + .compose(trans -> this.createTransItem(trans, data, params)); + } + + @Override + public Future createBySettlement(final JsonObject data, final List settlements) { + final JsonObject params = new JsonObject(); + { + params.put(KName.COMMENT, Ut.valueString(data, KName.COMMENT)); + params.put(KName.TYPE, EmTran.Type.SETTLEMENT.name()); + final JsonArray keys = Ut.toJArray(Ut.valueSetString(settlements, FSettlement::getKey)); + params.put(KName.KEYS, keys); + } + // 1. 构造 FTrans + return Trade.step06T().flatter(data, settlements) + // 2. 构造 FTransOf + .compose(trans -> this.createTransItem(trans, data, params)); + } + + @Override + public Future createByDebt(final JsonObject data, final List debts) { + final JsonObject params = new JsonObject(); + { + // 这种模式下前端已经传入了 type 信息 + params.put(KName.COMMENT, Ut.valueString(data, KName.COMMENT)); + params.put(KName.TYPE, Ut.valueString(data, KName.TYPE)); + final JsonArray keys = Ut.toJArray(Ut.valueSetString(debts, FDebt::getKey)); + params.put(KName.KEYS, keys); + } + // 1. 构造 FTrans + return Trade.step07T().flatter(data, debts) + // 2. 构造 FTransOf + .compose(trans -> this.createTransItem(trans, data, params)); + } + + private Future createTransItem( + final FTrans trans, final JsonObject data, final JsonObject params) { + return Trade.step06TO().scatter(params, trans) + .compose(nil -> { + final JsonArray paymentJ = Ut.valueJArray(data, FmConstant.ID.PAYMENT); + final List payments = Ux.fromJson(paymentJ, FTransItem.class); + + IkWay.ofT2TI().transfer(trans, payments); + // 防重复创建:Duplicate entry 'Cash' for key 'name_UNIQUE' + payments.forEach(payment -> payment.setKey(null)); + + return Ux.Jooq.on(FTransItemDao.class).insertAsync(payments); + }) + .compose(nil -> Ux.future(trans)); + } + + /** + * 批量查询(只能查询单独类型的数据),查询的最终数据结构如下 + *

+     *     [
+     *         {
+     *             "....": "....",
+     *             "items": [],
+     *             "of": []
+     *         }
+     *     ]
+     * 
+ * + * @param keys 关联主键集合 + * @param typeSet 关联类型 + * + * @return 关联数据集合 + */ + @Override + public Future> fetchAsync(final Set keys, + final Set typeSet) { + final Set transId = new HashSet<>(); + final KRef itemRef = new KRef(); + final ConcurrentMap> tranMap = new ConcurrentHashMap<>(); + // WHERE OBJECT_TYPE = ? AND OBJECT_ID = ? + final JsonObject condition = Ux.whereAnd(); + condition.put("objectType,i", Ut.toJArray(typeSet.stream() + .map(EmTran.Type::name).collect(Collectors.toSet()) + )); + condition.put("objectId,i", Ut.toJArray(keys)); + // WHERE OBJECT_TYPE = ? AND OBJECT_ID = ? + return Ux.Jooq.on(FTransOfDao.class).fetchAsync(condition) + .compose(transOf -> { + tranMap.putAll(Ut.elementGroup(transOf, FTransOf::getTransId)); + /* + * 此处 TransOf 的目的是提取 transIds,最终的数据结构是 JsonArray 的结构,每一个元素都是一个 + * Trans 对象,然后在对象之下紧跟 items 来表示 transId 对应的所有 items 数据。 + */ + transId.addAll(Ut.valueSetString(transOf, FTransOf::getTransId)); + // 跳过选择,直接查询 FTransItem + final JsonObject condTrans = Ux.whereAnd(); + condTrans.put("transactionId,i", Ut.toJArray(transId)); + return Ux.Jooq.on(FTransItemDao.class).fetchAsync(condTrans); + }) + .compose(itemRef::future) + .compose(items -> Ux.Jooq.on(FTransDao.class).fetchInAsync(KName.KEY, Ut.toJArray(transId))) + .compose(transList -> { + final List items = itemRef.get(); + final ConcurrentMap> grouped = Ut.elementGroup(items, FTransItem::getTransactionId); + final List response = new ArrayList<>(); + transList.forEach(tran -> { + final TranData object = TranData.instance().transaction(tran); + final List itemData = grouped.getOrDefault(tran.getKey(), new ArrayList<>()); + final List ofData = tranMap.getOrDefault(tran.getKey(), new ArrayList<>()); + response.add(object.items(itemData).of(ofData)); + }); + return Ux.future(response); + }); + } + + @Override + public Future fetchAsync(final String key) { + // 单条交易记录 + final JsonObject response = new JsonObject(); + return Ux.Jooq.on(FTransDao.class).fetchByIdAsync(key) + .compose(trans -> { + response.mergeIn(Ux.toJson(trans)); + return this.fetchRelated(key); + }) + .compose(relatedMap -> { + relatedMap.forEach(response::put); // debts, settlements + return Ux.Jooq.on(FSettlementItemDao.class) + .fetchAsync("finishedId", key); + }) + .compose(items -> { + response.put(KName.ITEMS, Ux.toJson(items)); // items + return Ux.Jooq.on(FTransItemDao.class) + .fetchAsync("transactionId", key); + }) + .compose(payment -> { + response.put(FmConstant.ID.PAYMENT, Ux.toJson(payment)); // payment + return Ux.future(response); + }); + } + + /* + * 抓取 debts, settlements + */ + private Future> fetchRelated(final String key) { + return Ux.Jooq.on(FTransOfDao.class).fetchAsync("transId", key).compose(transOfs -> { + final ConcurrentMap> futureMap = new ConcurrentHashMap<>(); + final Set keySettle = new HashSet<>(); + final Set keyDebt = new HashSet<>(); + transOfs.stream() + // 防止 null 过滤 + .filter(Objects::nonNull) + .filter(transOf -> Ut.isNotNil(transOf.getObjectType())) + .filter(transOf -> Ut.isNotNil(transOf.getObjectId())) + .forEach(transOf -> { + final String type = transOf.getObjectType(); + if (EmTran.Type.SETTLEMENT.name().equals(type)) { + keySettle.add(transOf.getObjectId()); + } else { + // DEBT / REFUND + keyDebt.add(transOf.getObjectId()); + } + }); + + + /* + * debts = JsonArray + * settlements = JsonArray + */ + futureMap.put(KName.Finance.SETTLEMENTS, Ux.Jooq.on(FSettlementDao.class) + .fetchJInAsync(KName.KEY, Ut.toJArray(keySettle)) + ); + futureMap.put(KName.Finance.DEBTS, Ux.Jooq.on(FDebtDao.class) + .fetchJInAsync(KName.KEY, Ut.toJArray(keyDebt)) + ); + return Fn.combineM(futureMap); + }); + } +} diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/FBillItem.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/FBillItem.java index 00282f90c550ad73036ddeb2eec3e53d7aabf656..92353fb51a48eb4ef81d45f8b28d6e5aff38db2b 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/FBillItem.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/FBillItem.java @@ -144,6 +144,21 @@ public class FBillItem extends TableImpl { */ public final TableField OP_AT = createField(DSL.name("OP_AT"), SQLDataType.LOCALDATETIME(0), this, "「opAt」- 操作时间"); + /** + * The column ZDB.F_BILL_ITEM.START_AT. 「startAt」- 开始时间 + */ + public final TableField START_AT = createField(DSL.name("START_AT"), SQLDataType.LOCALDATETIME(0), this, "「startAt」- 开始时间"); + + /** + * The column ZDB.F_BILL_ITEM.END_AT. 「endAt」- 结束时间 + */ + public final TableField END_AT = createField(DSL.name("END_AT"), SQLDataType.LOCALDATETIME(0), this, "「endAt」- 结束时间"); + + /** + * The column ZDB.F_BILL_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + public final TableField GROUP_BY = createField(DSL.name("GROUP_BY"), SQLDataType.VARCHAR(64), this, "「groupBy」- 分组"); + /** * The column ZDB.F_BILL_ITEM.RELATED_ID. 「relatedId」- * 关联ID(保留,原系统存在) diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/FSettlementItem.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/FSettlementItem.java index e63479c6bc977015542b394b1ffc31e0a992e5d3..4aa72003e094ca071221ed505565642b3102051f 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/FSettlementItem.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/FSettlementItem.java @@ -13,18 +13,13 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Arrays; import java.util.List; -import java.util.function.Function; import org.jooq.Field; import org.jooq.ForeignKey; -import org.jooq.Function22; import org.jooq.Index; import org.jooq.Name; import org.jooq.Record; -import org.jooq.Records; -import org.jooq.Row22; import org.jooq.Schema; -import org.jooq.SelectField; import org.jooq.Table; import org.jooq.TableField; import org.jooq.TableOptions; @@ -97,6 +92,21 @@ public class FSettlementItem extends TableImpl { */ public final TableField COMMENT = createField(DSL.name("COMMENT"), SQLDataType.CLOB, this, "「comment」 - 明细备注"); + /** + * The column ZDB.F_SETTLEMENT_ITEM.START_AT. 「startAt」- 开始时间 + */ + public final TableField START_AT = createField(DSL.name("START_AT"), SQLDataType.LOCALDATETIME(0), this, "「startAt」- 开始时间"); + + /** + * The column ZDB.F_SETTLEMENT_ITEM.END_AT. 「endAt」- 结束时间 + */ + public final TableField END_AT = createField(DSL.name("END_AT"), SQLDataType.LOCALDATETIME(0), this, "「endAt」- 结束时间"); + + /** + * The column ZDB.F_SETTLEMENT_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + public final TableField GROUP_BY = createField(DSL.name("GROUP_BY"), SQLDataType.VARCHAR(64), this, "「groupBy」- 分组"); + /** * The column ZDB.F_SETTLEMENT_ITEM.MANUAL_NO. 「manualNo」 - * 手工单号(线下单号专用) @@ -268,28 +278,4 @@ public class FSettlementItem extends TableImpl { public FSettlementItem rename(Table name) { return new FSettlementItem(name.getQualifiedName(), null); } - - // ------------------------------------------------------------------------- - // Row22 type methods - // ------------------------------------------------------------------------- - - @Override - public Row22 fieldsRow() { - return (Row22) super.fieldsRow(); - } - - /** - * Convenience mapping calling {@link SelectField#convertFrom(Function)}. - */ - public SelectField mapping(Function22 from) { - return convertFrom(Records.mapping(from)); - } - - /** - * Convenience mapping calling {@link SelectField#convertFrom(Class, - * Function)}. - */ - public SelectField mapping(Class toType, Function22 from) { - return convertFrom(toType, Records.mapping(from)); - } } diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/FTransItem.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/FTransItem.java index e49d679f36b0294a38723664b1c85ec11b114117..972d7dc7bcfdc8bfb63536d7546a43cd17c33ac2 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/FTransItem.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/FTransItem.java @@ -17,12 +17,12 @@ import java.util.function.Function; import org.jooq.Field; import org.jooq.ForeignKey; -import org.jooq.Function18; +import org.jooq.Function21; import org.jooq.Index; import org.jooq.Name; import org.jooq.Record; import org.jooq.Records; -import org.jooq.Row18; +import org.jooq.Row21; import org.jooq.Schema; import org.jooq.SelectField; import org.jooq.Table; @@ -107,6 +107,21 @@ public class FTransItem extends TableImpl { */ public final TableField PAY_ID = createField(DSL.name("PAY_ID"), SQLDataType.VARCHAR(255), this, "「payId」付款账号"); + /** + * The column ZDB.F_TRANS_ITEM.START_AT. 「startAt」- 开始时间 + */ + public final TableField START_AT = createField(DSL.name("START_AT"), SQLDataType.LOCALDATETIME(0), this, "「startAt」- 开始时间"); + + /** + * The column ZDB.F_TRANS_ITEM.END_AT. 「endAt」- 结束时间 + */ + public final TableField END_AT = createField(DSL.name("END_AT"), SQLDataType.LOCALDATETIME(0), this, "「endAt」- 结束时间"); + + /** + * The column ZDB.F_TRANS_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + public final TableField GROUP_BY = createField(DSL.name("GROUP_BY"), SQLDataType.VARCHAR(64), this, "「groupBy」- 分组"); + /** * The column ZDB.F_TRANS_ITEM.SIGMA. 「sigma」- 统一标识 */ @@ -240,18 +255,18 @@ public class FTransItem extends TableImpl { } // ------------------------------------------------------------------------- - // Row18 type methods + // Row21 type methods // ------------------------------------------------------------------------- @Override - public Row18 fieldsRow() { - return (Row18) super.fieldsRow(); + public Row21 fieldsRow() { + return (Row21) super.fieldsRow(); } /** * Convenience mapping calling {@link SelectField#convertFrom(Function)}. */ - public SelectField mapping(Function18 from) { + public SelectField mapping(Function21 from) { return convertFrom(Records.mapping(from)); } @@ -259,7 +274,7 @@ public class FTransItem extends TableImpl { * Convenience mapping calling {@link SelectField#convertFrom(Class, * Function)}. */ - public SelectField mapping(Class toType, Function18 from) { + public SelectField mapping(Class toType, Function21 from) { return convertFrom(toType, Records.mapping(from)); } } diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/daos/FBillItemDao.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/daos/FBillItemDao.java index 8a23045b1d089800050b704ee4f2ae184f25b153..f3b65854b4ab875fd694be37467e6d3107454da4 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/daos/FBillItemDao.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/daos/FBillItemDao.java @@ -294,6 +294,51 @@ public class FBillItemDao extends AbstractVertxDAOSTART_AT IN (values) asynchronously + */ + public Future> findManyByStartAt(Collection values) { + return findManyByCondition(FBillItem.F_BILL_ITEM.START_AT.in(values)); + } + + /** + * Find records that have START_AT IN (values) asynchronously + * limited by the given limit + */ + public Future> findManyByStartAt(Collection values, int limit) { + return findManyByCondition(FBillItem.F_BILL_ITEM.START_AT.in(values),limit); + } + + /** + * Find records that have END_AT IN (values) asynchronously + */ + public Future> findManyByEndAt(Collection values) { + return findManyByCondition(FBillItem.F_BILL_ITEM.END_AT.in(values)); + } + + /** + * Find records that have END_AT IN (values) asynchronously + * limited by the given limit + */ + public Future> findManyByEndAt(Collection values, int limit) { + return findManyByCondition(FBillItem.F_BILL_ITEM.END_AT.in(values),limit); + } + + /** + * Find records that have GROUP_BY IN (values) asynchronously + */ + public Future> findManyByGroupBy(Collection values) { + return findManyByCondition(FBillItem.F_BILL_ITEM.GROUP_BY.in(values)); + } + + /** + * Find records that have GROUP_BY IN (values) asynchronously + * limited by the given limit + */ + public Future> findManyByGroupBy(Collection values, int limit) { + return findManyByCondition(FBillItem.F_BILL_ITEM.GROUP_BY.in(values),limit); + } + /** * Find records that have RELATED_ID IN (values) asynchronously */ diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/daos/FSettlementItemDao.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/daos/FSettlementItemDao.java index 83213e163331b52f3a9bb03827475b647cca8dfb..1b18306bfd39a01e9fa51a060b17a23670fc83ed 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/daos/FSettlementItemDao.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/daos/FSettlementItemDao.java @@ -143,6 +143,51 @@ public class FSettlementItemDao extends AbstractVertxDAOSTART_AT IN (values) asynchronously + */ + public Future> findManyByStartAt(Collection values) { + return findManyByCondition(FSettlementItem.F_SETTLEMENT_ITEM.START_AT.in(values)); + } + + /** + * Find records that have START_AT IN (values) asynchronously + * limited by the given limit + */ + public Future> findManyByStartAt(Collection values, int limit) { + return findManyByCondition(FSettlementItem.F_SETTLEMENT_ITEM.START_AT.in(values),limit); + } + + /** + * Find records that have END_AT IN (values) asynchronously + */ + public Future> findManyByEndAt(Collection values) { + return findManyByCondition(FSettlementItem.F_SETTLEMENT_ITEM.END_AT.in(values)); + } + + /** + * Find records that have END_AT IN (values) asynchronously + * limited by the given limit + */ + public Future> findManyByEndAt(Collection values, int limit) { + return findManyByCondition(FSettlementItem.F_SETTLEMENT_ITEM.END_AT.in(values),limit); + } + + /** + * Find records that have GROUP_BY IN (values) asynchronously + */ + public Future> findManyByGroupBy(Collection values) { + return findManyByCondition(FSettlementItem.F_SETTLEMENT_ITEM.GROUP_BY.in(values)); + } + + /** + * Find records that have GROUP_BY IN (values) asynchronously + * limited by the given limit + */ + public Future> findManyByGroupBy(Collection values, int limit) { + return findManyByCondition(FSettlementItem.F_SETTLEMENT_ITEM.GROUP_BY.in(values),limit); + } + /** * Find records that have MANUAL_NO IN (values) asynchronously */ diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/daos/FTransItemDao.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/daos/FTransItemDao.java index cba57bfb0c5a65fc50a3fa84b8add6381d78e0ca..e64b2b9f681743180de0bd6c28b76b8ea5a3043b 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/daos/FTransItemDao.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/daos/FTransItemDao.java @@ -174,6 +174,51 @@ public class FTransItemDao extends AbstractVertxDAOSTART_AT IN (values) asynchronously + */ + public Future> findManyByStartAt(Collection values) { + return findManyByCondition(FTransItem.F_TRANS_ITEM.START_AT.in(values)); + } + + /** + * Find records that have START_AT IN (values) asynchronously + * limited by the given limit + */ + public Future> findManyByStartAt(Collection values, int limit) { + return findManyByCondition(FTransItem.F_TRANS_ITEM.START_AT.in(values),limit); + } + + /** + * Find records that have END_AT IN (values) asynchronously + */ + public Future> findManyByEndAt(Collection values) { + return findManyByCondition(FTransItem.F_TRANS_ITEM.END_AT.in(values)); + } + + /** + * Find records that have END_AT IN (values) asynchronously + * limited by the given limit + */ + public Future> findManyByEndAt(Collection values, int limit) { + return findManyByCondition(FTransItem.F_TRANS_ITEM.END_AT.in(values),limit); + } + + /** + * Find records that have GROUP_BY IN (values) asynchronously + */ + public Future> findManyByGroupBy(Collection values) { + return findManyByCondition(FTransItem.F_TRANS_ITEM.GROUP_BY.in(values)); + } + + /** + * Find records that have GROUP_BY IN (values) asynchronously + * limited by the given limit + */ + public Future> findManyByGroupBy(Collection values, int limit) { + return findManyByCondition(FTransItem.F_TRANS_ITEM.GROUP_BY.in(values),limit); + } + /** * Find records that have SIGMA IN (values) asynchronously */ diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/interfaces/IFBillItem.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/interfaces/IFBillItem.java index 8f5f41c932a13a03c8f23afa7e30ae6a3aea753b..b86b45280e4f4f71a6055c28eac2e047106d3fd4 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/interfaces/IFBillItem.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/interfaces/IFBillItem.java @@ -206,6 +206,36 @@ public interface IFBillItem extends VertxPojo, Serializable { */ public LocalDateTime getOpAt(); + /** + * Setter for ZDB.F_BILL_ITEM.START_AT. 「startAt」- 开始时间 + */ + public IFBillItem setStartAt(LocalDateTime value); + + /** + * Getter for ZDB.F_BILL_ITEM.START_AT. 「startAt」- 开始时间 + */ + public LocalDateTime getStartAt(); + + /** + * Setter for ZDB.F_BILL_ITEM.END_AT. 「endAt」- 结束时间 + */ + public IFBillItem setEndAt(LocalDateTime value); + + /** + * Getter for ZDB.F_BILL_ITEM.END_AT. 「endAt」- 结束时间 + */ + public LocalDateTime getEndAt(); + + /** + * Setter for ZDB.F_BILL_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + public IFBillItem setGroupBy(String value); + + /** + * Getter for ZDB.F_BILL_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + public String getGroupBy(); + /** * Setter for ZDB.F_BILL_ITEM.RELATED_ID. 「relatedId」- * 关联ID(保留,原系统存在) @@ -378,6 +408,9 @@ public interface IFBillItem extends VertxPojo, Serializable { setOrThrow(this::setOpNumber,json::getString,"OP_NUMBER","java.lang.String"); setOrThrow(this::setOpShift,json::getString,"OP_SHIFT","java.lang.String"); setOrThrow(this::setOpAt,key -> {String s = json.getString(key); return s==null?null:java.time.LocalDateTime.parse(s);},"OP_AT","java.time.LocalDateTime"); + setOrThrow(this::setStartAt,key -> {String s = json.getString(key); return s==null?null:java.time.LocalDateTime.parse(s);},"START_AT","java.time.LocalDateTime"); + setOrThrow(this::setEndAt,key -> {String s = json.getString(key); return s==null?null:java.time.LocalDateTime.parse(s);},"END_AT","java.time.LocalDateTime"); + setOrThrow(this::setGroupBy,json::getString,"GROUP_BY","java.lang.String"); setOrThrow(this::setRelatedId,json::getString,"RELATED_ID","java.lang.String"); setOrThrow(this::setSettlementId,json::getString,"SETTLEMENT_ID","java.lang.String"); setOrThrow(this::setBillId,json::getString,"BILL_ID","java.lang.String"); @@ -416,6 +449,9 @@ public interface IFBillItem extends VertxPojo, Serializable { json.put("OP_NUMBER",getOpNumber()); json.put("OP_SHIFT",getOpShift()); json.put("OP_AT",getOpAt()==null?null:getOpAt().toString()); + json.put("START_AT",getStartAt()==null?null:getStartAt().toString()); + json.put("END_AT",getEndAt()==null?null:getEndAt().toString()); + json.put("GROUP_BY",getGroupBy()); json.put("RELATED_ID",getRelatedId()); json.put("SETTLEMENT_ID",getSettlementId()); json.put("BILL_ID",getBillId()); diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/interfaces/IFSettlementItem.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/interfaces/IFSettlementItem.java index d682eb0b318b17fecaa1b900774a2f39ce2e1a9b..28af4e2fa359fd5e57afdd8563258307eb18468a 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/interfaces/IFSettlementItem.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/interfaces/IFSettlementItem.java @@ -102,6 +102,36 @@ public interface IFSettlementItem extends VertxPojo, Serializable { */ public String getComment(); + /** + * Setter for ZDB.F_SETTLEMENT_ITEM.START_AT. 「startAt」- 开始时间 + */ + public IFSettlementItem setStartAt(LocalDateTime value); + + /** + * Getter for ZDB.F_SETTLEMENT_ITEM.START_AT. 「startAt」- 开始时间 + */ + public LocalDateTime getStartAt(); + + /** + * Setter for ZDB.F_SETTLEMENT_ITEM.END_AT. 「endAt」- 结束时间 + */ + public IFSettlementItem setEndAt(LocalDateTime value); + + /** + * Getter for ZDB.F_SETTLEMENT_ITEM.END_AT. 「endAt」- 结束时间 + */ + public LocalDateTime getEndAt(); + + /** + * Setter for ZDB.F_SETTLEMENT_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + public IFSettlementItem setGroupBy(String value); + + /** + * Getter for ZDB.F_SETTLEMENT_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + public String getGroupBy(); + /** * Setter for ZDB.F_SETTLEMENT_ITEM.MANUAL_NO. 「manualNo」 - * 手工单号(线下单号专用) @@ -288,6 +318,9 @@ public interface IFSettlementItem extends VertxPojo, Serializable { setOrThrow(this::setType,json::getString,"TYPE","java.lang.String"); setOrThrow(this::setAmount,key -> {String s = json.getString(key); return s==null?null:new java.math.BigDecimal(s);},"AMOUNT","java.math.BigDecimal"); setOrThrow(this::setComment,json::getString,"COMMENT","java.lang.String"); + setOrThrow(this::setStartAt,key -> {String s = json.getString(key); return s==null?null:java.time.LocalDateTime.parse(s);},"START_AT","java.time.LocalDateTime"); + setOrThrow(this::setEndAt,key -> {String s = json.getString(key); return s==null?null:java.time.LocalDateTime.parse(s);},"END_AT","java.time.LocalDateTime"); + setOrThrow(this::setGroupBy,json::getString,"GROUP_BY","java.lang.String"); setOrThrow(this::setManualNo,json::getString,"MANUAL_NO","java.lang.String"); setOrThrow(this::setPayTermId,json::getString,"PAY_TERM_ID","java.lang.String"); setOrThrow(this::setRelatedId,json::getString,"RELATED_ID","java.lang.String"); @@ -317,6 +350,9 @@ public interface IFSettlementItem extends VertxPojo, Serializable { json.put("TYPE",getType()); json.put("AMOUNT",getAmount()==null?null:getAmount().toString()); json.put("COMMENT",getComment()); + json.put("START_AT",getStartAt()==null?null:getStartAt().toString()); + json.put("END_AT",getEndAt()==null?null:getEndAt().toString()); + json.put("GROUP_BY",getGroupBy()); json.put("MANUAL_NO",getManualNo()); json.put("PAY_TERM_ID",getPayTermId()); json.put("RELATED_ID",getRelatedId()); diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/interfaces/IFTransItem.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/interfaces/IFTransItem.java index fab4ee6f2e05bc58433570106fd69fe25e2ca72c..22f44a557d9d5d422da9a3a7d200a7bb093194cc 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/interfaces/IFTransItem.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/interfaces/IFTransItem.java @@ -122,6 +122,36 @@ public interface IFTransItem extends VertxPojo, Serializable { */ public String getPayId(); + /** + * Setter for ZDB.F_TRANS_ITEM.START_AT. 「startAt」- 开始时间 + */ + public IFTransItem setStartAt(LocalDateTime value); + + /** + * Getter for ZDB.F_TRANS_ITEM.START_AT. 「startAt」- 开始时间 + */ + public LocalDateTime getStartAt(); + + /** + * Setter for ZDB.F_TRANS_ITEM.END_AT. 「endAt」- 结束时间 + */ + public IFTransItem setEndAt(LocalDateTime value); + + /** + * Getter for ZDB.F_TRANS_ITEM.END_AT. 「endAt」- 结束时间 + */ + public LocalDateTime getEndAt(); + + /** + * Setter for ZDB.F_TRANS_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + public IFTransItem setGroupBy(String value); + + /** + * Getter for ZDB.F_TRANS_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + public String getGroupBy(); + /** * Setter for ZDB.F_TRANS_ITEM.SIGMA. 「sigma」- 统一标识 */ @@ -230,6 +260,9 @@ public interface IFTransItem extends VertxPojo, Serializable { setOrThrow(this::setPayMobile,json::getString,"PAY_MOBILE","java.lang.String"); setOrThrow(this::setPayMethod,json::getString,"PAY_METHOD","java.lang.String"); setOrThrow(this::setPayId,json::getString,"PAY_ID","java.lang.String"); + setOrThrow(this::setStartAt,key -> {String s = json.getString(key); return s==null?null:java.time.LocalDateTime.parse(s);},"START_AT","java.time.LocalDateTime"); + setOrThrow(this::setEndAt,key -> {String s = json.getString(key); return s==null?null:java.time.LocalDateTime.parse(s);},"END_AT","java.time.LocalDateTime"); + setOrThrow(this::setGroupBy,json::getString,"GROUP_BY","java.lang.String"); setOrThrow(this::setSigma,json::getString,"SIGMA","java.lang.String"); setOrThrow(this::setLanguage,json::getString,"LANGUAGE","java.lang.String"); setOrThrow(this::setActive,json::getBoolean,"ACTIVE","java.lang.Boolean"); @@ -255,6 +288,9 @@ public interface IFTransItem extends VertxPojo, Serializable { json.put("PAY_MOBILE",getPayMobile()); json.put("PAY_METHOD",getPayMethod()); json.put("PAY_ID",getPayId()); + json.put("START_AT",getStartAt()==null?null:getStartAt().toString()); + json.put("END_AT",getEndAt()==null?null:getEndAt().toString()); + json.put("GROUP_BY",getGroupBy()); json.put("SIGMA",getSigma()); json.put("LANGUAGE",getLanguage()); json.put("ACTIVE",getActive()); diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/pojos/FBillItem.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/pojos/FBillItem.java index 7b8050b603528c6778fc13320448a14d2898fbef..1af59c3c801d45ddb2f3d1eec594d651178a4f07 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/pojos/FBillItem.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/pojos/FBillItem.java @@ -38,6 +38,9 @@ public class FBillItem implements VertxPojo, IFBillItem { private String opNumber; private String opShift; private LocalDateTime opAt; + private LocalDateTime startAt; + private LocalDateTime endAt; + private String groupBy; private String relatedId; private String settlementId; private String billId; @@ -73,6 +76,9 @@ public class FBillItem implements VertxPojo, IFBillItem { this.opNumber = value.getOpNumber(); this.opShift = value.getOpShift(); this.opAt = value.getOpAt(); + this.startAt = value.getStartAt(); + this.endAt = value.getEndAt(); + this.groupBy = value.getGroupBy(); this.relatedId = value.getRelatedId(); this.settlementId = value.getSettlementId(); this.billId = value.getBillId(); @@ -107,6 +113,9 @@ public class FBillItem implements VertxPojo, IFBillItem { String opNumber, String opShift, LocalDateTime opAt, + LocalDateTime startAt, + LocalDateTime endAt, + String groupBy, String relatedId, String settlementId, String billId, @@ -139,6 +148,9 @@ public class FBillItem implements VertxPojo, IFBillItem { this.opNumber = opNumber; this.opShift = opShift; this.opAt = opAt; + this.startAt = startAt; + this.endAt = endAt; + this.groupBy = groupBy; this.relatedId = relatedId; this.settlementId = settlementId; this.billId = billId; @@ -473,6 +485,57 @@ public class FBillItem implements VertxPojo, IFBillItem { return this; } + /** + * Getter for ZDB.F_BILL_ITEM.START_AT. 「startAt」- 开始时间 + */ + @Override + public LocalDateTime getStartAt() { + return this.startAt; + } + + /** + * Setter for ZDB.F_BILL_ITEM.START_AT. 「startAt」- 开始时间 + */ + @Override + public FBillItem setStartAt(LocalDateTime startAt) { + this.startAt = startAt; + return this; + } + + /** + * Getter for ZDB.F_BILL_ITEM.END_AT. 「endAt」- 结束时间 + */ + @Override + public LocalDateTime getEndAt() { + return this.endAt; + } + + /** + * Setter for ZDB.F_BILL_ITEM.END_AT. 「endAt」- 结束时间 + */ + @Override + public FBillItem setEndAt(LocalDateTime endAt) { + this.endAt = endAt; + return this; + } + + /** + * Getter for ZDB.F_BILL_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + @Override + public String getGroupBy() { + return this.groupBy; + } + + /** + * Setter for ZDB.F_BILL_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + @Override + public FBillItem setGroupBy(String groupBy) { + this.groupBy = groupBy; + return this; + } + /** * Getter for ZDB.F_BILL_ITEM.RELATED_ID. 「relatedId」- * 关联ID(保留,原系统存在) @@ -817,6 +880,24 @@ public class FBillItem implements VertxPojo, IFBillItem { } else if (!this.opAt.equals(other.opAt)) return false; + if (this.startAt == null) { + if (other.startAt != null) + return false; + } + else if (!this.startAt.equals(other.startAt)) + return false; + if (this.endAt == null) { + if (other.endAt != null) + return false; + } + else if (!this.endAt.equals(other.endAt)) + return false; + if (this.groupBy == null) { + if (other.groupBy != null) + return false; + } + else if (!this.groupBy.equals(other.groupBy)) + return false; if (this.relatedId == null) { if (other.relatedId != null) return false; @@ -920,6 +1001,9 @@ public class FBillItem implements VertxPojo, IFBillItem { result = prime * result + ((this.opNumber == null) ? 0 : this.opNumber.hashCode()); result = prime * result + ((this.opShift == null) ? 0 : this.opShift.hashCode()); result = prime * result + ((this.opAt == null) ? 0 : this.opAt.hashCode()); + result = prime * result + ((this.startAt == null) ? 0 : this.startAt.hashCode()); + result = prime * result + ((this.endAt == null) ? 0 : this.endAt.hashCode()); + result = prime * result + ((this.groupBy == null) ? 0 : this.groupBy.hashCode()); result = prime * result + ((this.relatedId == null) ? 0 : this.relatedId.hashCode()); result = prime * result + ((this.settlementId == null) ? 0 : this.settlementId.hashCode()); result = prime * result + ((this.billId == null) ? 0 : this.billId.hashCode()); @@ -958,6 +1042,9 @@ public class FBillItem implements VertxPojo, IFBillItem { sb.append(", ").append(opNumber); sb.append(", ").append(opShift); sb.append(", ").append(opAt); + sb.append(", ").append(startAt); + sb.append(", ").append(endAt); + sb.append(", ").append(groupBy); sb.append(", ").append(relatedId); sb.append(", ").append(settlementId); sb.append(", ").append(billId); @@ -1000,6 +1087,9 @@ public class FBillItem implements VertxPojo, IFBillItem { setOpNumber(from.getOpNumber()); setOpShift(from.getOpShift()); setOpAt(from.getOpAt()); + setStartAt(from.getStartAt()); + setEndAt(from.getEndAt()); + setGroupBy(from.getGroupBy()); setRelatedId(from.getRelatedId()); setSettlementId(from.getSettlementId()); setBillId(from.getBillId()); diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/pojos/FSettlementItem.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/pojos/FSettlementItem.java index b9754888ff63518cb1afd0912b0ad2eb0a869b18..930b96b33fafebd914f8d1a4112a9276a5acc693 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/pojos/FSettlementItem.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/pojos/FSettlementItem.java @@ -28,6 +28,9 @@ public class FSettlementItem implements VertxPojo, IFSettlementItem { private String type; private BigDecimal amount; private String comment; + private LocalDateTime startAt; + private LocalDateTime endAt; + private String groupBy; private String manualNo; private String payTermId; private String relatedId; @@ -54,6 +57,9 @@ public class FSettlementItem implements VertxPojo, IFSettlementItem { this.type = value.getType(); this.amount = value.getAmount(); this.comment = value.getComment(); + this.startAt = value.getStartAt(); + this.endAt = value.getEndAt(); + this.groupBy = value.getGroupBy(); this.manualNo = value.getManualNo(); this.payTermId = value.getPayTermId(); this.relatedId = value.getRelatedId(); @@ -79,6 +85,9 @@ public class FSettlementItem implements VertxPojo, IFSettlementItem { String type, BigDecimal amount, String comment, + LocalDateTime startAt, + LocalDateTime endAt, + String groupBy, String manualNo, String payTermId, String relatedId, @@ -102,6 +111,9 @@ public class FSettlementItem implements VertxPojo, IFSettlementItem { this.type = type; this.amount = amount; this.comment = comment; + this.startAt = startAt; + this.endAt = endAt; + this.groupBy = groupBy; this.manualNo = manualNo; this.payTermId = payTermId; this.relatedId = relatedId; @@ -263,6 +275,57 @@ public class FSettlementItem implements VertxPojo, IFSettlementItem { return this; } + /** + * Getter for ZDB.F_SETTLEMENT_ITEM.START_AT. 「startAt」- 开始时间 + */ + @Override + public LocalDateTime getStartAt() { + return this.startAt; + } + + /** + * Setter for ZDB.F_SETTLEMENT_ITEM.START_AT. 「startAt」- 开始时间 + */ + @Override + public FSettlementItem setStartAt(LocalDateTime startAt) { + this.startAt = startAt; + return this; + } + + /** + * Getter for ZDB.F_SETTLEMENT_ITEM.END_AT. 「endAt」- 结束时间 + */ + @Override + public LocalDateTime getEndAt() { + return this.endAt; + } + + /** + * Setter for ZDB.F_SETTLEMENT_ITEM.END_AT. 「endAt」- 结束时间 + */ + @Override + public FSettlementItem setEndAt(LocalDateTime endAt) { + this.endAt = endAt; + return this; + } + + /** + * Getter for ZDB.F_SETTLEMENT_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + @Override + public String getGroupBy() { + return this.groupBy; + } + + /** + * Setter for ZDB.F_SETTLEMENT_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + @Override + public FSettlementItem setGroupBy(String groupBy) { + this.groupBy = groupBy; + return this; + } + /** * Getter for ZDB.F_SETTLEMENT_ITEM.MANUAL_NO. 「manualNo」 - * 手工单号(线下单号专用) @@ -578,6 +641,24 @@ public class FSettlementItem implements VertxPojo, IFSettlementItem { } else if (!this.comment.equals(other.comment)) return false; + if (this.startAt == null) { + if (other.startAt != null) + return false; + } + else if (!this.startAt.equals(other.startAt)) + return false; + if (this.endAt == null) { + if (other.endAt != null) + return false; + } + else if (!this.endAt.equals(other.endAt)) + return false; + if (this.groupBy == null) { + if (other.groupBy != null) + return false; + } + else if (!this.groupBy.equals(other.groupBy)) + return false; if (this.manualNo == null) { if (other.manualNo != null) return false; @@ -677,6 +758,9 @@ public class FSettlementItem implements VertxPojo, IFSettlementItem { result = prime * result + ((this.type == null) ? 0 : this.type.hashCode()); result = prime * result + ((this.amount == null) ? 0 : this.amount.hashCode()); result = prime * result + ((this.comment == null) ? 0 : this.comment.hashCode()); + result = prime * result + ((this.startAt == null) ? 0 : this.startAt.hashCode()); + result = prime * result + ((this.endAt == null) ? 0 : this.endAt.hashCode()); + result = prime * result + ((this.groupBy == null) ? 0 : this.groupBy.hashCode()); result = prime * result + ((this.manualNo == null) ? 0 : this.manualNo.hashCode()); result = prime * result + ((this.payTermId == null) ? 0 : this.payTermId.hashCode()); result = prime * result + ((this.relatedId == null) ? 0 : this.relatedId.hashCode()); @@ -706,6 +790,9 @@ public class FSettlementItem implements VertxPojo, IFSettlementItem { sb.append(", ").append(type); sb.append(", ").append(amount); sb.append(", ").append(comment); + sb.append(", ").append(startAt); + sb.append(", ").append(endAt); + sb.append(", ").append(groupBy); sb.append(", ").append(manualNo); sb.append(", ").append(payTermId); sb.append(", ").append(relatedId); @@ -739,6 +826,9 @@ public class FSettlementItem implements VertxPojo, IFSettlementItem { setType(from.getType()); setAmount(from.getAmount()); setComment(from.getComment()); + setStartAt(from.getStartAt()); + setEndAt(from.getEndAt()); + setGroupBy(from.getGroupBy()); setManualNo(from.getManualNo()); setPayTermId(from.getPayTermId()); setRelatedId(from.getRelatedId()); diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/pojos/FTransItem.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/pojos/FTransItem.java index ef53ac91ff438651ea784e81fc701f7295283437..f4c1b960216810b345f6369c4e3b0df503588f51 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/pojos/FTransItem.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/pojos/FTransItem.java @@ -30,6 +30,9 @@ public class FTransItem implements VertxPojo, IFTransItem { private String payMobile; private String payMethod; private String payId; + private LocalDateTime startAt; + private LocalDateTime endAt; + private String groupBy; private String sigma; private String language; private Boolean active; @@ -52,6 +55,9 @@ public class FTransItem implements VertxPojo, IFTransItem { this.payMobile = value.getPayMobile(); this.payMethod = value.getPayMethod(); this.payId = value.getPayId(); + this.startAt = value.getStartAt(); + this.endAt = value.getEndAt(); + this.groupBy = value.getGroupBy(); this.sigma = value.getSigma(); this.language = value.getLanguage(); this.active = value.getActive(); @@ -73,6 +79,9 @@ public class FTransItem implements VertxPojo, IFTransItem { String payMobile, String payMethod, String payId, + LocalDateTime startAt, + LocalDateTime endAt, + String groupBy, String sigma, String language, Boolean active, @@ -92,6 +101,9 @@ public class FTransItem implements VertxPojo, IFTransItem { this.payMobile = payMobile; this.payMethod = payMethod; this.payId = payId; + this.startAt = startAt; + this.endAt = endAt; + this.groupBy = groupBy; this.sigma = sigma; this.language = language; this.active = active; @@ -281,6 +293,57 @@ public class FTransItem implements VertxPojo, IFTransItem { return this; } + /** + * Getter for ZDB.F_TRANS_ITEM.START_AT. 「startAt」- 开始时间 + */ + @Override + public LocalDateTime getStartAt() { + return this.startAt; + } + + /** + * Setter for ZDB.F_TRANS_ITEM.START_AT. 「startAt」- 开始时间 + */ + @Override + public FTransItem setStartAt(LocalDateTime startAt) { + this.startAt = startAt; + return this; + } + + /** + * Getter for ZDB.F_TRANS_ITEM.END_AT. 「endAt」- 结束时间 + */ + @Override + public LocalDateTime getEndAt() { + return this.endAt; + } + + /** + * Setter for ZDB.F_TRANS_ITEM.END_AT. 「endAt」- 结束时间 + */ + @Override + public FTransItem setEndAt(LocalDateTime endAt) { + this.endAt = endAt; + return this; + } + + /** + * Getter for ZDB.F_TRANS_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + @Override + public String getGroupBy() { + return this.groupBy; + } + + /** + * Setter for ZDB.F_TRANS_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + @Override + public FTransItem setGroupBy(String groupBy) { + this.groupBy = groupBy; + return this; + } + /** * Getter for ZDB.F_TRANS_ITEM.SIGMA. 「sigma」- 统一标识 */ @@ -486,6 +549,24 @@ public class FTransItem implements VertxPojo, IFTransItem { } else if (!this.payId.equals(other.payId)) return false; + if (this.startAt == null) { + if (other.startAt != null) + return false; + } + else if (!this.startAt.equals(other.startAt)) + return false; + if (this.endAt == null) { + if (other.endAt != null) + return false; + } + else if (!this.endAt.equals(other.endAt)) + return false; + if (this.groupBy == null) { + if (other.groupBy != null) + return false; + } + else if (!this.groupBy.equals(other.groupBy)) + return false; if (this.sigma == null) { if (other.sigma != null) return false; @@ -551,6 +632,9 @@ public class FTransItem implements VertxPojo, IFTransItem { result = prime * result + ((this.payMobile == null) ? 0 : this.payMobile.hashCode()); result = prime * result + ((this.payMethod == null) ? 0 : this.payMethod.hashCode()); result = prime * result + ((this.payId == null) ? 0 : this.payId.hashCode()); + result = prime * result + ((this.startAt == null) ? 0 : this.startAt.hashCode()); + result = prime * result + ((this.endAt == null) ? 0 : this.endAt.hashCode()); + result = prime * result + ((this.groupBy == null) ? 0 : this.groupBy.hashCode()); result = prime * result + ((this.sigma == null) ? 0 : this.sigma.hashCode()); result = prime * result + ((this.language == null) ? 0 : this.language.hashCode()); result = prime * result + ((this.active == null) ? 0 : this.active.hashCode()); @@ -576,6 +660,9 @@ public class FTransItem implements VertxPojo, IFTransItem { sb.append(", ").append(payMobile); sb.append(", ").append(payMethod); sb.append(", ").append(payId); + sb.append(", ").append(startAt); + sb.append(", ").append(endAt); + sb.append(", ").append(groupBy); sb.append(", ").append(sigma); sb.append(", ").append(language); sb.append(", ").append(active); @@ -605,6 +692,9 @@ public class FTransItem implements VertxPojo, IFTransItem { setPayMobile(from.getPayMobile()); setPayMethod(from.getPayMethod()); setPayId(from.getPayId()); + setStartAt(from.getStartAt()); + setEndAt(from.getEndAt()); + setGroupBy(from.getGroupBy()); setSigma(from.getSigma()); setLanguage(from.getLanguage()); setActive(from.getActive()); diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/records/FBillItemRecord.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/records/FBillItemRecord.java index 7c7d4e9a0176015436e73827020c4bfe02a30151..b67fc6f1f05d854a711983e3391c27326626993b 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/records/FBillItemRecord.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/records/FBillItemRecord.java @@ -338,13 +338,64 @@ public class FBillItemRecord extends UpdatableRecordImpl implem return (LocalDateTime) get(17); } + /** + * Setter for ZDB.F_BILL_ITEM.START_AT. 「startAt」- 开始时间 + */ + @Override + public FBillItemRecord setStartAt(LocalDateTime value) { + set(18, value); + return this; + } + + /** + * Getter for ZDB.F_BILL_ITEM.START_AT. 「startAt」- 开始时间 + */ + @Override + public LocalDateTime getStartAt() { + return (LocalDateTime) get(18); + } + + /** + * Setter for ZDB.F_BILL_ITEM.END_AT. 「endAt」- 结束时间 + */ + @Override + public FBillItemRecord setEndAt(LocalDateTime value) { + set(19, value); + return this; + } + + /** + * Getter for ZDB.F_BILL_ITEM.END_AT. 「endAt」- 结束时间 + */ + @Override + public LocalDateTime getEndAt() { + return (LocalDateTime) get(19); + } + + /** + * Setter for ZDB.F_BILL_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + @Override + public FBillItemRecord setGroupBy(String value) { + set(20, value); + return this; + } + + /** + * Getter for ZDB.F_BILL_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + @Override + public String getGroupBy() { + return (String) get(20); + } + /** * Setter for ZDB.F_BILL_ITEM.RELATED_ID. 「relatedId」- * 关联ID(保留,原系统存在) */ @Override public FBillItemRecord setRelatedId(String value) { - set(18, value); + set(21, value); return this; } @@ -354,7 +405,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public String getRelatedId() { - return (String) get(18); + return (String) get(21); } /** @@ -363,7 +414,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public FBillItemRecord setSettlementId(String value) { - set(19, value); + set(22, value); return this; } @@ -373,7 +424,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public String getSettlementId() { - return (String) get(19); + return (String) get(22); } /** @@ -381,7 +432,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public FBillItemRecord setBillId(String value) { - set(20, value); + set(23, value); return this; } @@ -390,7 +441,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public String getBillId() { - return (String) get(20); + return (String) get(23); } /** @@ -399,7 +450,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public FBillItemRecord setSubjectId(String value) { - set(21, value); + set(24, value); return this; } @@ -409,7 +460,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public String getSubjectId() { - return (String) get(21); + return (String) get(24); } /** @@ -417,7 +468,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public FBillItemRecord setPayTermId(String value) { - set(22, value); + set(25, value); return this; } @@ -426,7 +477,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public String getPayTermId() { - return (String) get(22); + return (String) get(25); } /** @@ -434,7 +485,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public FBillItemRecord setSigma(String value) { - set(23, value); + set(26, value); return this; } @@ -443,7 +494,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public String getSigma() { - return (String) get(23); + return (String) get(26); } /** @@ -451,7 +502,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public FBillItemRecord setLanguage(String value) { - set(24, value); + set(27, value); return this; } @@ -460,7 +511,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public String getLanguage() { - return (String) get(24); + return (String) get(27); } /** @@ -468,7 +519,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public FBillItemRecord setActive(Boolean value) { - set(25, value); + set(28, value); return this; } @@ -477,7 +528,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public Boolean getActive() { - return (Boolean) get(25); + return (Boolean) get(28); } /** @@ -485,7 +536,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public FBillItemRecord setMetadata(String value) { - set(26, value); + set(29, value); return this; } @@ -494,7 +545,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public String getMetadata() { - return (String) get(26); + return (String) get(29); } /** @@ -502,7 +553,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public FBillItemRecord setCreatedAt(LocalDateTime value) { - set(27, value); + set(30, value); return this; } @@ -511,7 +562,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public LocalDateTime getCreatedAt() { - return (LocalDateTime) get(27); + return (LocalDateTime) get(30); } /** @@ -519,7 +570,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public FBillItemRecord setCreatedBy(String value) { - set(28, value); + set(31, value); return this; } @@ -528,7 +579,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public String getCreatedBy() { - return (String) get(28); + return (String) get(31); } /** @@ -536,7 +587,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public FBillItemRecord setUpdatedAt(LocalDateTime value) { - set(29, value); + set(32, value); return this; } @@ -545,7 +596,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public LocalDateTime getUpdatedAt() { - return (LocalDateTime) get(29); + return (LocalDateTime) get(32); } /** @@ -553,7 +604,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public FBillItemRecord setUpdatedBy(String value) { - set(30, value); + set(33, value); return this; } @@ -562,7 +613,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem */ @Override public String getUpdatedBy() { - return (String) get(30); + return (String) get(33); } // ------------------------------------------------------------------------- @@ -598,6 +649,9 @@ public class FBillItemRecord extends UpdatableRecordImpl implem setOpNumber(from.getOpNumber()); setOpShift(from.getOpShift()); setOpAt(from.getOpAt()); + setStartAt(from.getStartAt()); + setEndAt(from.getEndAt()); + setGroupBy(from.getGroupBy()); setRelatedId(from.getRelatedId()); setSettlementId(from.getSettlementId()); setBillId(from.getBillId()); @@ -634,7 +688,7 @@ public class FBillItemRecord extends UpdatableRecordImpl implem /** * Create a detached, initialised FBillItemRecord */ - public FBillItemRecord(String key, String name, String code, String serial, Boolean income, String type, String status, BigDecimal amount, String comment, String manualNo, String unit, BigDecimal price, Integer quantity, BigDecimal amountTotal, String opBy, String opNumber, String opShift, LocalDateTime opAt, String relatedId, String settlementId, String billId, String subjectId, String payTermId, String sigma, String language, Boolean active, String metadata, LocalDateTime createdAt, String createdBy, LocalDateTime updatedAt, String updatedBy) { + public FBillItemRecord(String key, String name, String code, String serial, Boolean income, String type, String status, BigDecimal amount, String comment, String manualNo, String unit, BigDecimal price, Integer quantity, BigDecimal amountTotal, String opBy, String opNumber, String opShift, LocalDateTime opAt, LocalDateTime startAt, LocalDateTime endAt, String groupBy, String relatedId, String settlementId, String billId, String subjectId, String payTermId, String sigma, String language, Boolean active, String metadata, LocalDateTime createdAt, String createdBy, LocalDateTime updatedAt, String updatedBy) { super(FBillItem.F_BILL_ITEM); setKey(key); @@ -655,6 +709,9 @@ public class FBillItemRecord extends UpdatableRecordImpl implem setOpNumber(opNumber); setOpShift(opShift); setOpAt(opAt); + setStartAt(startAt); + setEndAt(endAt); + setGroupBy(groupBy); setRelatedId(relatedId); setSettlementId(settlementId); setBillId(billId); @@ -696,6 +753,9 @@ public class FBillItemRecord extends UpdatableRecordImpl implem setOpNumber(value.getOpNumber()); setOpShift(value.getOpShift()); setOpAt(value.getOpAt()); + setStartAt(value.getStartAt()); + setEndAt(value.getEndAt()); + setGroupBy(value.getGroupBy()); setRelatedId(value.getRelatedId()); setSettlementId(value.getSettlementId()); setBillId(value.getBillId()); diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/records/FSettlementItemRecord.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/records/FSettlementItemRecord.java index fde343b4dd5a84e3ef95711759b7300043347397..71ee8cf0a2d57f58a972c3bdb71441df02b8d3b0 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/records/FSettlementItemRecord.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/domain/tables/records/FSettlementItemRecord.java @@ -11,10 +11,7 @@ import io.zerows.extension.commerce.finance.domain.tables.interfaces.IFSettlemen import java.math.BigDecimal; import java.time.LocalDateTime; -import org.jooq.Field; import org.jooq.Record1; -import org.jooq.Record22; -import org.jooq.Row22; import org.jooq.impl.UpdatableRecordImpl; @@ -23,7 +20,7 @@ import static io.github.jklingsporn.vertx.jooq.shared.internal.VertxPojo.*; * This class is generated by jOOQ. */ @SuppressWarnings({ "all", "unchecked", "rawtypes" }) -public class FSettlementItemRecord extends UpdatableRecordImpl implements VertxPojo, Record22, IFSettlementItem { +public class FSettlementItemRecord extends UpdatableRecordImpl implements VertxPojo, IFSettlementItem { private static final long serialVersionUID = 1L; @@ -167,13 +164,64 @@ public class FSettlementItemRecord extends UpdatableRecordImplZDB.F_SETTLEMENT_ITEM.START_AT. 「startAt」- 开始时间 + */ + @Override + public FSettlementItemRecord setStartAt(LocalDateTime value) { + set(8, value); + return this; + } + + /** + * Getter for ZDB.F_SETTLEMENT_ITEM.START_AT. 「startAt」- 开始时间 + */ + @Override + public LocalDateTime getStartAt() { + return (LocalDateTime) get(8); + } + + /** + * Setter for ZDB.F_SETTLEMENT_ITEM.END_AT. 「endAt」- 结束时间 + */ + @Override + public FSettlementItemRecord setEndAt(LocalDateTime value) { + set(9, value); + return this; + } + + /** + * Getter for ZDB.F_SETTLEMENT_ITEM.END_AT. 「endAt」- 结束时间 + */ + @Override + public LocalDateTime getEndAt() { + return (LocalDateTime) get(9); + } + + /** + * Setter for ZDB.F_SETTLEMENT_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + @Override + public FSettlementItemRecord setGroupBy(String value) { + set(10, value); + return this; + } + + /** + * Getter for ZDB.F_SETTLEMENT_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + @Override + public String getGroupBy() { + return (String) get(10); + } + /** * Setter for ZDB.F_SETTLEMENT_ITEM.MANUAL_NO. 「manualNo」 - * 手工单号(线下单号专用) */ @Override public FSettlementItemRecord setManualNo(String value) { - set(8, value); + set(11, value); return this; } @@ -183,7 +231,7 @@ public class FSettlementItemRecord extends UpdatableRecordImpl fieldsRow() { - return (Row22) super.fieldsRow(); - } - - @Override - public Row22 valuesRow() { - return (Row22) super.valuesRow(); - } - - @Override - public Field field1() { - return FSettlementItem.F_SETTLEMENT_ITEM.KEY; - } - - @Override - public Field field2() { - return FSettlementItem.F_SETTLEMENT_ITEM.NAME; - } - - @Override - public Field field3() { - return FSettlementItem.F_SETTLEMENT_ITEM.CODE; - } - - @Override - public Field field4() { - return FSettlementItem.F_SETTLEMENT_ITEM.SERIAL; - } - - @Override - public Field field5() { - return FSettlementItem.F_SETTLEMENT_ITEM.INCOME; - } - - @Override - public Field field6() { - return FSettlementItem.F_SETTLEMENT_ITEM.TYPE; - } - - @Override - public Field field7() { - return FSettlementItem.F_SETTLEMENT_ITEM.AMOUNT; - } - - @Override - public Field field8() { - return FSettlementItem.F_SETTLEMENT_ITEM.COMMENT; - } - - @Override - public Field field9() { - return FSettlementItem.F_SETTLEMENT_ITEM.MANUAL_NO; - } - - @Override - public Field field10() { - return FSettlementItem.F_SETTLEMENT_ITEM.PAY_TERM_ID; - } - - @Override - public Field field11() { - return FSettlementItem.F_SETTLEMENT_ITEM.RELATED_ID; - } - - @Override - public Field field12() { - return FSettlementItem.F_SETTLEMENT_ITEM.SETTLEMENT_ID; - } - - @Override - public Field field13() { - return FSettlementItem.F_SETTLEMENT_ITEM.DEBT_ID; - } - - @Override - public Field field14() { - return FSettlementItem.F_SETTLEMENT_ITEM.FINISHED_ID; - } - - @Override - public Field field15() { - return FSettlementItem.F_SETTLEMENT_ITEM.SIGMA; - } - - @Override - public Field field16() { - return FSettlementItem.F_SETTLEMENT_ITEM.LANGUAGE; - } - - @Override - public Field field17() { - return FSettlementItem.F_SETTLEMENT_ITEM.ACTIVE; - } - - @Override - public Field field18() { - return FSettlementItem.F_SETTLEMENT_ITEM.METADATA; - } - - @Override - public Field field19() { - return FSettlementItem.F_SETTLEMENT_ITEM.CREATED_AT; - } - - @Override - public Field field20() { - return FSettlementItem.F_SETTLEMENT_ITEM.CREATED_BY; - } - - @Override - public Field field21() { - return FSettlementItem.F_SETTLEMENT_ITEM.UPDATED_AT; - } - - @Override - public Field field22() { - return FSettlementItem.F_SETTLEMENT_ITEM.UPDATED_BY; - } - - @Override - public String component1() { - return getKey(); - } - - @Override - public String component2() { - return getName(); - } - - @Override - public String component3() { - return getCode(); - } - - @Override - public String component4() { - return getSerial(); - } - - @Override - public Boolean component5() { - return getIncome(); - } - - @Override - public String component6() { - return getType(); - } - - @Override - public BigDecimal component7() { - return getAmount(); - } - - @Override - public String component8() { - return getComment(); - } - - @Override - public String component9() { - return getManualNo(); - } - - @Override - public String component10() { - return getPayTermId(); - } - - @Override - public String component11() { - return getRelatedId(); - } - - @Override - public String component12() { - return getSettlementId(); - } - - @Override - public String component13() { - return getDebtId(); - } - - @Override - public String component14() { - return getFinishedId(); - } - - @Override - public String component15() { - return getSigma(); - } - - @Override - public String component16() { - return getLanguage(); - } - - @Override - public Boolean component17() { - return getActive(); - } - - @Override - public String component18() { - return getMetadata(); - } - - @Override - public LocalDateTime component19() { - return getCreatedAt(); - } - - @Override - public String component20() { - return getCreatedBy(); - } - - @Override - public LocalDateTime component21() { - return getUpdatedAt(); - } - - @Override - public String component22() { - return getUpdatedBy(); - } - - @Override - public String value1() { - return getKey(); - } - - @Override - public String value2() { - return getName(); - } - - @Override - public String value3() { - return getCode(); - } - - @Override - public String value4() { - return getSerial(); - } - - @Override - public Boolean value5() { - return getIncome(); - } - - @Override - public String value6() { - return getType(); - } - - @Override - public BigDecimal value7() { - return getAmount(); - } - - @Override - public String value8() { - return getComment(); - } - - @Override - public String value9() { - return getManualNo(); - } - - @Override - public String value10() { - return getPayTermId(); - } - - @Override - public String value11() { - return getRelatedId(); - } - - @Override - public String value12() { - return getSettlementId(); - } - - @Override - public String value13() { - return getDebtId(); - } - - @Override - public String value14() { - return getFinishedId(); - } - - @Override - public String value15() { - return getSigma(); - } - - @Override - public String value16() { - return getLanguage(); - } - - @Override - public Boolean value17() { - return getActive(); - } - - @Override - public String value18() { - return getMetadata(); - } - - @Override - public LocalDateTime value19() { - return getCreatedAt(); - } - - @Override - public String value20() { - return getCreatedBy(); - } - - @Override - public LocalDateTime value21() { - return getUpdatedAt(); - } - - @Override - public String value22() { - return getUpdatedBy(); - } - - @Override - public FSettlementItemRecord value1(String value) { - setKey(value); - return this; - } - - @Override - public FSettlementItemRecord value2(String value) { - setName(value); - return this; - } - - @Override - public FSettlementItemRecord value3(String value) { - setCode(value); - return this; - } - - @Override - public FSettlementItemRecord value4(String value) { - setSerial(value); - return this; - } - - @Override - public FSettlementItemRecord value5(Boolean value) { - setIncome(value); - return this; - } - - @Override - public FSettlementItemRecord value6(String value) { - setType(value); - return this; - } - - @Override - public FSettlementItemRecord value7(BigDecimal value) { - setAmount(value); - return this; - } - - @Override - public FSettlementItemRecord value8(String value) { - setComment(value); - return this; - } - - @Override - public FSettlementItemRecord value9(String value) { - setManualNo(value); - return this; - } - - @Override - public FSettlementItemRecord value10(String value) { - setPayTermId(value); - return this; - } - - @Override - public FSettlementItemRecord value11(String value) { - setRelatedId(value); - return this; - } - - @Override - public FSettlementItemRecord value12(String value) { - setSettlementId(value); - return this; - } - - @Override - public FSettlementItemRecord value13(String value) { - setDebtId(value); - return this; - } - - @Override - public FSettlementItemRecord value14(String value) { - setFinishedId(value); - return this; - } - - @Override - public FSettlementItemRecord value15(String value) { - setSigma(value); - return this; - } - - @Override - public FSettlementItemRecord value16(String value) { - setLanguage(value); - return this; - } - - @Override - public FSettlementItemRecord value17(Boolean value) { - setActive(value); - return this; - } - - @Override - public FSettlementItemRecord value18(String value) { - setMetadata(value); - return this; - } - - @Override - public FSettlementItemRecord value19(LocalDateTime value) { - setCreatedAt(value); - return this; - } - - @Override - public FSettlementItemRecord value20(String value) { - setCreatedBy(value); - return this; - } - - @Override - public FSettlementItemRecord value21(LocalDateTime value) { - setUpdatedAt(value); - return this; - } - - @Override - public FSettlementItemRecord value22(String value) { - setUpdatedBy(value); - return this; - } - - @Override - public FSettlementItemRecord values(String value1, String value2, String value3, String value4, Boolean value5, String value6, BigDecimal value7, String value8, String value9, String value10, String value11, String value12, String value13, String value14, String value15, String value16, Boolean value17, String value18, LocalDateTime value19, String value20, LocalDateTime value21, String value22) { - value1(value1); - value2(value2); - value3(value3); - value4(value4); - value5(value5); - value6(value6); - value7(value7); - value8(value8); - value9(value9); - value10(value10); - value11(value11); - value12(value12); - value13(value13); - value14(value14); - value15(value15); - value16(value16); - value17(value17); - value18(value18); - value19(value19); - value20(value20); - value21(value21); - value22(value22); - return this; - } - // ------------------------------------------------------------------------- // FROM and INTO // ------------------------------------------------------------------------- @@ -951,6 +496,9 @@ public class FSettlementItemRecord extends UpdatableRecordImpl implements VertxPojo, Record18, IFTransItem { +public class FTransItemRecord extends UpdatableRecordImpl implements VertxPojo, Record21, IFTransItem { private static final long serialVersionUID = 1L; @@ -201,12 +201,63 @@ public class FTransItemRecord extends UpdatableRecordImpl impl return (String) get(9); } + /** + * Setter for ZDB.F_TRANS_ITEM.START_AT. 「startAt」- 开始时间 + */ + @Override + public FTransItemRecord setStartAt(LocalDateTime value) { + set(10, value); + return this; + } + + /** + * Getter for ZDB.F_TRANS_ITEM.START_AT. 「startAt」- 开始时间 + */ + @Override + public LocalDateTime getStartAt() { + return (LocalDateTime) get(10); + } + + /** + * Setter for ZDB.F_TRANS_ITEM.END_AT. 「endAt」- 结束时间 + */ + @Override + public FTransItemRecord setEndAt(LocalDateTime value) { + set(11, value); + return this; + } + + /** + * Getter for ZDB.F_TRANS_ITEM.END_AT. 「endAt」- 结束时间 + */ + @Override + public LocalDateTime getEndAt() { + return (LocalDateTime) get(11); + } + + /** + * Setter for ZDB.F_TRANS_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + @Override + public FTransItemRecord setGroupBy(String value) { + set(12, value); + return this; + } + + /** + * Getter for ZDB.F_TRANS_ITEM.GROUP_BY. 「groupBy」- 分组 + */ + @Override + public String getGroupBy() { + return (String) get(12); + } + /** * Setter for ZDB.F_TRANS_ITEM.SIGMA. 「sigma」- 统一标识 */ @Override public FTransItemRecord setSigma(String value) { - set(10, value); + set(13, value); return this; } @@ -215,7 +266,7 @@ public class FTransItemRecord extends UpdatableRecordImpl impl */ @Override public String getSigma() { - return (String) get(10); + return (String) get(13); } /** @@ -223,7 +274,7 @@ public class FTransItemRecord extends UpdatableRecordImpl impl */ @Override public FTransItemRecord setLanguage(String value) { - set(11, value); + set(14, value); return this; } @@ -232,7 +283,7 @@ public class FTransItemRecord extends UpdatableRecordImpl impl */ @Override public String getLanguage() { - return (String) get(11); + return (String) get(14); } /** @@ -240,7 +291,7 @@ public class FTransItemRecord extends UpdatableRecordImpl impl */ @Override public FTransItemRecord setActive(Boolean value) { - set(12, value); + set(15, value); return this; } @@ -249,7 +300,7 @@ public class FTransItemRecord extends UpdatableRecordImpl impl */ @Override public Boolean getActive() { - return (Boolean) get(12); + return (Boolean) get(15); } /** @@ -257,7 +308,7 @@ public class FTransItemRecord extends UpdatableRecordImpl impl */ @Override public FTransItemRecord setMetadata(String value) { - set(13, value); + set(16, value); return this; } @@ -266,7 +317,7 @@ public class FTransItemRecord extends UpdatableRecordImpl impl */ @Override public String getMetadata() { - return (String) get(13); + return (String) get(16); } /** @@ -274,7 +325,7 @@ public class FTransItemRecord extends UpdatableRecordImpl impl */ @Override public FTransItemRecord setCreatedAt(LocalDateTime value) { - set(14, value); + set(17, value); return this; } @@ -283,7 +334,7 @@ public class FTransItemRecord extends UpdatableRecordImpl impl */ @Override public LocalDateTime getCreatedAt() { - return (LocalDateTime) get(14); + return (LocalDateTime) get(17); } /** @@ -291,7 +342,7 @@ public class FTransItemRecord extends UpdatableRecordImpl impl */ @Override public FTransItemRecord setCreatedBy(String value) { - set(15, value); + set(18, value); return this; } @@ -300,7 +351,7 @@ public class FTransItemRecord extends UpdatableRecordImpl impl */ @Override public String getCreatedBy() { - return (String) get(15); + return (String) get(18); } /** @@ -308,7 +359,7 @@ public class FTransItemRecord extends UpdatableRecordImpl impl */ @Override public FTransItemRecord setUpdatedAt(LocalDateTime value) { - set(16, value); + set(19, value); return this; } @@ -317,7 +368,7 @@ public class FTransItemRecord extends UpdatableRecordImpl impl */ @Override public LocalDateTime getUpdatedAt() { - return (LocalDateTime) get(16); + return (LocalDateTime) get(19); } /** @@ -325,7 +376,7 @@ public class FTransItemRecord extends UpdatableRecordImpl impl */ @Override public FTransItemRecord setUpdatedBy(String value) { - set(17, value); + set(20, value); return this; } @@ -334,7 +385,7 @@ public class FTransItemRecord extends UpdatableRecordImpl impl */ @Override public String getUpdatedBy() { - return (String) get(17); + return (String) get(20); } // ------------------------------------------------------------------------- @@ -347,17 +398,17 @@ public class FTransItemRecord extends UpdatableRecordImpl impl } // ------------------------------------------------------------------------- - // Record18 type implementation + // Record21 type implementation // ------------------------------------------------------------------------- @Override - public Row18 fieldsRow() { - return (Row18) super.fieldsRow(); + public Row21 fieldsRow() { + return (Row21) super.fieldsRow(); } @Override - public Row18 valuesRow() { - return (Row18) super.valuesRow(); + public Row21 valuesRow() { + return (Row21) super.valuesRow(); } @Override @@ -411,42 +462,57 @@ public class FTransItemRecord extends UpdatableRecordImpl impl } @Override - public Field field11() { + public Field field11() { + return FTransItem.F_TRANS_ITEM.START_AT; + } + + @Override + public Field field12() { + return FTransItem.F_TRANS_ITEM.END_AT; + } + + @Override + public Field field13() { + return FTransItem.F_TRANS_ITEM.GROUP_BY; + } + + @Override + public Field field14() { return FTransItem.F_TRANS_ITEM.SIGMA; } @Override - public Field field12() { + public Field field15() { return FTransItem.F_TRANS_ITEM.LANGUAGE; } @Override - public Field field13() { + public Field field16() { return FTransItem.F_TRANS_ITEM.ACTIVE; } @Override - public Field field14() { + public Field field17() { return FTransItem.F_TRANS_ITEM.METADATA; } @Override - public Field field15() { + public Field field18() { return FTransItem.F_TRANS_ITEM.CREATED_AT; } @Override - public Field field16() { + public Field field19() { return FTransItem.F_TRANS_ITEM.CREATED_BY; } @Override - public Field field17() { + public Field field20() { return FTransItem.F_TRANS_ITEM.UPDATED_AT; } @Override - public Field field18() { + public Field field21() { return FTransItem.F_TRANS_ITEM.UPDATED_BY; } @@ -501,42 +567,57 @@ public class FTransItemRecord extends UpdatableRecordImpl impl } @Override - public String component11() { + public LocalDateTime component11() { + return getStartAt(); + } + + @Override + public LocalDateTime component12() { + return getEndAt(); + } + + @Override + public String component13() { + return getGroupBy(); + } + + @Override + public String component14() { return getSigma(); } @Override - public String component12() { + public String component15() { return getLanguage(); } @Override - public Boolean component13() { + public Boolean component16() { return getActive(); } @Override - public String component14() { + public String component17() { return getMetadata(); } @Override - public LocalDateTime component15() { + public LocalDateTime component18() { return getCreatedAt(); } @Override - public String component16() { + public String component19() { return getCreatedBy(); } @Override - public LocalDateTime component17() { + public LocalDateTime component20() { return getUpdatedAt(); } @Override - public String component18() { + public String component21() { return getUpdatedBy(); } @@ -591,42 +672,57 @@ public class FTransItemRecord extends UpdatableRecordImpl impl } @Override - public String value11() { + public LocalDateTime value11() { + return getStartAt(); + } + + @Override + public LocalDateTime value12() { + return getEndAt(); + } + + @Override + public String value13() { + return getGroupBy(); + } + + @Override + public String value14() { return getSigma(); } @Override - public String value12() { + public String value15() { return getLanguage(); } @Override - public Boolean value13() { + public Boolean value16() { return getActive(); } @Override - public String value14() { + public String value17() { return getMetadata(); } @Override - public LocalDateTime value15() { + public LocalDateTime value18() { return getCreatedAt(); } @Override - public String value16() { + public String value19() { return getCreatedBy(); } @Override - public LocalDateTime value17() { + public LocalDateTime value20() { return getUpdatedAt(); } @Override - public String value18() { + public String value21() { return getUpdatedBy(); } @@ -691,55 +787,73 @@ public class FTransItemRecord extends UpdatableRecordImpl impl } @Override - public FTransItemRecord value11(String value) { + public FTransItemRecord value11(LocalDateTime value) { + setStartAt(value); + return this; + } + + @Override + public FTransItemRecord value12(LocalDateTime value) { + setEndAt(value); + return this; + } + + @Override + public FTransItemRecord value13(String value) { + setGroupBy(value); + return this; + } + + @Override + public FTransItemRecord value14(String value) { setSigma(value); return this; } @Override - public FTransItemRecord value12(String value) { + public FTransItemRecord value15(String value) { setLanguage(value); return this; } @Override - public FTransItemRecord value13(Boolean value) { + public FTransItemRecord value16(Boolean value) { setActive(value); return this; } @Override - public FTransItemRecord value14(String value) { + public FTransItemRecord value17(String value) { setMetadata(value); return this; } @Override - public FTransItemRecord value15(LocalDateTime value) { + public FTransItemRecord value18(LocalDateTime value) { setCreatedAt(value); return this; } @Override - public FTransItemRecord value16(String value) { + public FTransItemRecord value19(String value) { setCreatedBy(value); return this; } @Override - public FTransItemRecord value17(LocalDateTime value) { + public FTransItemRecord value20(LocalDateTime value) { setUpdatedAt(value); return this; } @Override - public FTransItemRecord value18(String value) { + public FTransItemRecord value21(String value) { setUpdatedBy(value); return this; } @Override - public FTransItemRecord values(String value1, String value2, String value3, String value4, BigDecimal value5, String value6, String value7, String value8, String value9, String value10, String value11, String value12, Boolean value13, String value14, LocalDateTime value15, String value16, LocalDateTime value17, String value18) { + public FTransItemRecord values(String value1, String value2, String value3, String value4, BigDecimal value5, String value6, String value7, String value8, String value9, String value10, LocalDateTime value11, LocalDateTime value12, String value13, String value14, String value15, Boolean value16, String value17, LocalDateTime value18, String value19, LocalDateTime value20, String value21) { value1(value1); value2(value2); value3(value3); @@ -758,6 +872,9 @@ public class FTransItemRecord extends UpdatableRecordImpl impl value16(value16); value17(value17); value18(value18); + value19(value19); + value20(value20); + value21(value21); return this; } @@ -777,6 +894,9 @@ public class FTransItemRecord extends UpdatableRecordImpl impl setPayMobile(from.getPayMobile()); setPayMethod(from.getPayMethod()); setPayId(from.getPayId()); + setStartAt(from.getStartAt()); + setEndAt(from.getEndAt()); + setGroupBy(from.getGroupBy()); setSigma(from.getSigma()); setLanguage(from.getLanguage()); setActive(from.getActive()); @@ -808,7 +928,7 @@ public class FTransItemRecord extends UpdatableRecordImpl impl /** * Create a detached, initialised FTransItemRecord */ - public FTransItemRecord(String key, String name, String code, String serial, BigDecimal amount, String transactionId, String payName, String payMobile, String payMethod, String payId, String sigma, String language, Boolean active, String metadata, LocalDateTime createdAt, String createdBy, LocalDateTime updatedAt, String updatedBy) { + public FTransItemRecord(String key, String name, String code, String serial, BigDecimal amount, String transactionId, String payName, String payMobile, String payMethod, String payId, LocalDateTime startAt, LocalDateTime endAt, String groupBy, String sigma, String language, Boolean active, String metadata, LocalDateTime createdAt, String createdBy, LocalDateTime updatedAt, String updatedBy) { super(FTransItem.F_TRANS_ITEM); setKey(key); @@ -821,6 +941,9 @@ public class FTransItemRecord extends UpdatableRecordImpl impl setPayMobile(payMobile); setPayMethod(payMethod); setPayId(payId); + setStartAt(startAt); + setEndAt(endAt); + setGroupBy(groupBy); setSigma(sigma); setLanguage(language); setActive(active); @@ -849,6 +972,9 @@ public class FTransItemRecord extends UpdatableRecordImpl impl setPayMobile(value.getPayMobile()); setPayMethod(value.getPayMethod()); setPayId(value.getPayId()); + setStartAt(value.getStartAt()); + setEndAt(value.getEndAt()); + setGroupBy(value.getGroupBy()); setSigma(value.getSigma()); setLanguage(value.getLanguage()); setActive(value.getActive()); diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/enter/UpdaterBillItem.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/enter/UpdaterBillItem.java index cf359447883265cc180fb8d7c0d422ed0e189030..fc7af5b1ca7a87819dab2ea1af5aaa7cce7055f2 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/enter/UpdaterBillItem.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/enter/UpdaterBillItem.java @@ -1,38 +1,38 @@ -package io.zerows.extension.commerce.finance.uca.enter; - -import io.zerows.extension.commerce.finance.domain.tables.daos.FBillItemDao; -import io.zerows.extension.commerce.finance.domain.tables.pojos.FBillItem; -import io.vertx.core.Future; -import io.vertx.core.json.JsonObject; -import io.vertx.up.unity.Ux; - -/** - * 对象查询器,根据传入数据信息读取对象信息 - * - * @author lang : 2024-01-18 - */ -class UpdaterBillItem implements Maker { - /** - * 「更新账单子项」 - * 此方法为处理账单子项的更新专用方法,将新的数据写入到账单子项中 - *

-     *     1. 根据 key 查询账单子项
-     *     2. 此处确认可以查询,然后将 data 写入到账单子项数据中
-     * 
- * - * @param key 账单子项的主键 - * @param data 更新的数据 - * - * @return {@link FBillItem} - */ - @Override - public Future buildAsync(final JsonObject data, final String key) { - return Ux.Jooq.on(FBillItemDao.class).fetchJByIdAsync(key) - // 将传入的 data 数据更新到原始数据中构造新的对象 - .compose(queried -> { - final JsonObject normalized = queried.copy().mergeIn(data); - final FBillItem item = Ux.fromJson(normalized, FBillItem.class); - return Ux.future(item); - }); - } -} +package io.zerows.extension.commerce.finance.uca.enter; + +import io.zerows.extension.commerce.finance.domain.tables.daos.FBillItemDao; +import io.zerows.extension.commerce.finance.domain.tables.pojos.FBillItem; +import io.vertx.core.Future; +import io.vertx.core.json.JsonObject; +import io.vertx.up.unity.Ux; + +/** + * 对象查询器,根据传入数据信息读取对象信息 + * + * @author lang : 2024-01-18 + */ +class UpdaterBillItem implements Maker { + /** + * 「更新账单子项」 + * 此方法为处理账单子项的更新专用方法,将新的数据写入到账单子项中 + *

+     *     1. 根据 key 查询账单子项
+     *     2. 此处确认可以查询,然后将 data 写入到账单子项数据中
+     * 
+ * + * @param key 账单子项的主键 + * @param data 更新的数据 + * + * @return {@link FBillItem} + */ + @Override + public Future buildAsync(final JsonObject data, final String key) { + return Ux.Jooq.on(FBillItemDao.class).fetchJByIdAsync(key) + // 将传入的 data 数据更新到原始数据中构造新的对象 + .compose(queried -> { + final JsonObject normalized = queried.copy().mergeIn(data); + final FBillItem item = Ux.fromJson(normalized, FBillItem.class); + return Ux.future(item); + }); + } +} diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/replica/BillItemSplit.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/replica/BillItemSplit.java index e3aaa75938978969dfda4c9853b417e98d222634..3f5a19758c313400066f3a63fa7f69b3e90654b8 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/replica/BillItemSplit.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/replica/BillItemSplit.java @@ -1,66 +1,67 @@ -package io.zerows.extension.commerce.finance.uca.replica; - -import io.zerows.extension.commerce.finance.domain.tables.pojos.FBillItem; -import io.zerows.extension.commerce.finance.eon.FmConstant; -import io.zerows.extension.runtime.skeleton.refine.Ke; - -import java.util.List; -import java.util.Objects; - -/** - * 拆账专用,一个核心方法 - *

- *     1. {@link FBillItem} -> {@link List}
- * 
- * - * @author lang : 2024-01-18 - */ -class BillItemSplit implements IkWay { - /** - * 「拆账」拆账操作,将一个账单拆分成多个账单,基础规则如: - *

-     *     拆之前:
-     *     1. status = InValid
-     *     2. active = false
-     *
-     *     拆之后
-     *     1. 拆之前的编号为:CODE-XX,那么拆之后为:
-     *        - CODE-XXA
-     *        - CODE-XXB
-     *        ......
-     *     2. status = Pending
-     *     3. 拆之后的账单需清空 key 主键值(新建时自动生成)
-     *     4. active = true
-     *     5. relatedId = 原始项(关联)
-     * 
- * 目前的版本是一分为二,即拆分成两个账单,本身逻辑是可以支持一个分为多个的,取决于 - * 您目前的序号系统,目前支持:{@link FmConstant#SEQ} 中的基础定义 - * A - G 的编号。 - * - * @param item from = 拆之前账单项 - * @param items to = 拆之后账单项 - */ - @Override - public void transfer(final FBillItem item, final List items) { - Objects.requireNonNull(item); - if (Objects.isNull(items) || items.isEmpty()) { - return; - } - final int size = items.size(); - item.setActive(Boolean.FALSE); // Old Disabled - item.setStatus(FmConstant.Status.INVALID); - for (int idx = 0; idx < size; idx++) { - final FBillItem split = items.get(idx); - split.setKey(null); - split.setBillId(item.getBillId()); - split.setSerial(item.getSerial() + FmConstant.SEQ[idx]); - split.setCode(item.getCode() + FmConstant.SEQ[idx]); - split.setStatus(FmConstant.Status.PENDING); - split.setRelatedId(item.getKey()); - split.setIncome(item.getIncome()); - // active, sigma - Ke.umCreated(split, item); - split.setActive(Boolean.TRUE); // New Enabled - } - } -} +package io.zerows.extension.commerce.finance.uca.replica; + +import io.zerows.extension.commerce.finance.domain.tables.pojos.FBillItem; +import io.zerows.extension.commerce.finance.eon.FmConstant; +import io.zerows.extension.runtime.skeleton.refine.Ke; + +import java.util.List; +import java.util.Objects; + +/** + * 拆账专用,一个核心方法 + *

+ *     1. {@link FBillItem} -> {@link List}
+ * 
+ * + * @author lang : 2024-01-18 + */ +class BillItemSplit implements IkWay { + /** + * 「拆账」拆账操作,将一个账单拆分成多个账单,基础规则如: + *

+     *     拆之前:
+     *     1. status = InValid
+     *     2. active = false
+     *
+     *     拆之后
+     *     1. 拆之前的编号为:CODE-XX,那么拆之后为:
+     *        - CODE-XXA
+     *        - CODE-XXB
+     *        ......
+     *     2. status = Pending
+     *     3. 拆之后的账单需清空 key 主键值(新建时自动生成)
+     *     4. active = true
+     *     5. relatedId = 原始项(关联)
+     * 
+ * 目前的版本是一分为二,即拆分成两个账单,本身逻辑是可以支持一个分为多个的,取决于 + * 您目前的序号系统,目前支持:{@link FmConstant#SEQ} 中的基础定义 + * A - G 的编号。 + * + * @param item from = 拆之前账单项 + * @param items to = 拆之后账单项 + */ + @Override + public void transfer(final FBillItem item, final List items) { + Objects.requireNonNull(item); + if (Objects.isNull(items) || items.isEmpty()) { + return; + } + final int size = items.size(); + item.setActive(Boolean.FALSE); // Old Disabled + item.setStatus(FmConstant.Status.INVALID); + for (int idx = 0; idx < size; idx++) { + final FBillItem split = items.get(idx); + split.setKey(null); + split.setStartAt(item.getStartAt()); + split.setBillId(item.getBillId()); + split.setSerial(item.getSerial() + FmConstant.SEQ[idx]); + split.setCode(item.getCode() + FmConstant.SEQ[idx]); + split.setStatus(FmConstant.Status.PENDING); + split.setRelatedId(item.getKey()); + split.setIncome(item.getIncome()); + // active, sigma + Ke.umCreated(split, item); + split.setActive(Boolean.TRUE); // New Enabled + } + } +} diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/replica/Trans2TransItem.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/replica/Trans2TransItem.java index 2e4ad8bb79b7bd501cff0fff6ee875ae4290afc1..96f366d7329a4fc7b8c8f87044f9e8afa5c6f241 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/replica/Trans2TransItem.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/replica/Trans2TransItem.java @@ -1,38 +1,39 @@ -package io.zerows.extension.commerce.finance.uca.replica; - -import io.zerows.extension.commerce.finance.domain.tables.pojos.FTrans; -import io.zerows.extension.commerce.finance.domain.tables.pojos.FTransItem; -import io.zerows.extension.runtime.skeleton.refine.Ke; -import io.vertx.up.util.Ut; - -import java.util.List; -import java.util.Objects; - -/** - * @author lang : 2024-01-18 - */ -class Trans2TransItem implements IkWay { - /** - * 「付款」付款单 - *

-     *     1. 一张付款单会包含多个付款项
-     *     2. 结算单和付款单依靠付款项结合
-     *     3. 设置 transactionId 关联信息
-     * 
- * - * @param transaction from = 付款单 - * @param items to = 付款项 - */ - @Override - public void transfer(final FTrans transaction, final List items) { - for (int idx = 0; idx < items.size(); idx++) { - final FTransItem item = items.get(idx); - item.setTransactionId(transaction.getKey()); - if (Objects.isNull(item.getCode()) || Objects.isNull(item.getSerial())) { - item.setSerial(transaction.getSerial() + "-" + Ut.fromAdjust(idx + 1, 2)); - item.setCode(transaction.getCode() + "-" + Ut.fromAdjust(idx + 1, 2)); - } - Ke.umCreated(item, transaction); - } - } +package io.zerows.extension.commerce.finance.uca.replica; + +import io.zerows.extension.commerce.finance.domain.tables.pojos.FTrans; +import io.zerows.extension.commerce.finance.domain.tables.pojos.FTransItem; +import io.zerows.extension.runtime.skeleton.refine.Ke; +import io.vertx.up.util.Ut; + +import java.util.List; +import java.util.Objects; + +/** + * @author lang : 2024-01-18 + */ +class Trans2TransItem implements IkWay { + /** + * 「付款」付款单 + *

+     *     1. 一张付款单会包含多个付款项
+     *     2. 结算单和付款单依靠付款项结合
+     *     3. 设置 transactionId 关联信息
+     * 
+ * + * @param transaction from = 付款单 + * @param items to = 付款项 + */ + @Override + public void transfer(final FTrans transaction, final List items) { + for (int idx = 0; idx < items.size(); idx++) { + final FTransItem item = items.get(idx); + item.setTransactionId(transaction.getKey()); + if (Objects.isNull(item.getCode()) || Objects.isNull(item.getSerial())) { + item.setSerial(transaction.getSerial() + "-" + Ut.fromAdjust(idx + 1, 2)); + item.setCode(transaction.getCode() + "-" + Ut.fromAdjust(idx + 1, 2)); + item.setStartAt(transaction.getStartAt()); + } + Ke.umCreated(item, transaction); + } + } } \ No newline at end of file diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step01Settlement.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step01Settlement.java index 4be21f0618af736945a92cb9f964abcd92e04d07..4dd61c106add2141570772f8aa3a42946df6453b 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step01Settlement.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step01Settlement.java @@ -1,95 +1,95 @@ -package io.zerows.extension.commerce.finance.uca.trans; - -import io.vertx.core.Future; -import io.vertx.core.json.JsonArray; -import io.vertx.core.json.JsonObject; -import io.vertx.up.eon.KName; -import io.vertx.up.unity.Ux; -import io.vertx.up.util.Ut; -import io.zerows.extension.commerce.finance.domain.tables.daos.FSettlementDao; -import io.zerows.extension.commerce.finance.domain.tables.pojos.FSettlement; -import io.zerows.extension.commerce.finance.eon.em.EmPay; -import io.zerows.extension.commerce.finance.uca.enter.Maker; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * 步骤一:结算单处理流程(原始流程),完整步骤: - *

- *     1. 生成单号
- *     2. 根据是否延迟设定延迟相关信息
- *     3. 批量插入结算单
- * 
- * - * @author lang : 2024-01-19 - */ -class Step01Settlement implements Trade { - // type -> FSettlement - @Override - public Future flatter(final JsonObject data, final EmPay.Type type) { - /* - * 结算单创建时会生成单号,编号规则存储在模型的赔账 `numbers` 中,且支持多字段配置 - * Zero Extension 模块会直接根据 `X_NUMBER` 中的定义来生成相关编号,执行完成后 - * 会赋值给此处的 FSettlement 对象。 - */ - return Maker.ofST().buildFastAsync(data) - - - /* - * 根据传入的执行类型来判断当前的结算单是否完成,如果是延迟结算,则不完成 - * 如果是非延迟结算就是完成,注意直接转应收也算是结算完成,而开启了应收处理 - * 流程 - */ - .compose(generated -> { - this.executeFinished(generated, type); - return Ux.future(generated); - }) - - - /* - * 将构造好的 FSettlement 对象直接插入到数据库中,并且以 - * FSettlement 的方式返回上层 - */ - .compose(Ux.Jooq.on(FSettlementDao.class)::insertAsync); - } - - // type -> List - @Override - public Future> scatter(final JsonArray data, final EmPay.Type assist) { - /* - * 批量结算单模式,先提取 number 的定义,直接从 data 中的 "indent" 中提取唯一 - * 的序号定义,然后执行批量生成结算单,最终返回生成的结算单列表 - */ - final String indent = Ut.valueString(data, KName.INDENT); - return Maker.ofST().buildAsync(data, indent) - .compose(generatedList -> { - generatedList.forEach(generated -> this.executeFinished(generated, assist)); - return Ux.future(generatedList); - }) - .compose(Ux.Jooq.on(FSettlementDao.class)::insertAsync); - } - - // ---------------- 私有方法 ----------------- - - /** - * 不论批量还是单量,都要根据 {@link EmPay.Type} 来判断是否完成结算单 - *

-     *     1. {@link EmPay.Type#AT} 为即时结算,所以这种情况是完成的
-     *     3. {@link EmPay.Type#DEBT} 为转应收,所以这种情况是完成的
-     *     2. {@link EmPay.Type#DELAY} 为延迟结算,所以这种情况是未完成的
-     * 
- * - * @param settlement 结算单 - * @param type 结算类型 - */ - private void executeFinished(final FSettlement settlement, final EmPay.Type type) { - if (EmPay.Type.DELAY == type) { - settlement.setFinished(Boolean.FALSE); - } else { - // AT, DEBT 都是已完成的结算单 - settlement.setFinished(Boolean.TRUE); - settlement.setFinishedAt(LocalDateTime.now()); - } - } -} +package io.zerows.extension.commerce.finance.uca.trans; + +import io.vertx.core.Future; +import io.vertx.core.json.JsonArray; +import io.vertx.core.json.JsonObject; +import io.vertx.up.eon.KName; +import io.vertx.up.unity.Ux; +import io.vertx.up.util.Ut; +import io.zerows.extension.commerce.finance.domain.tables.daos.FSettlementDao; +import io.zerows.extension.commerce.finance.domain.tables.pojos.FSettlement; +import io.zerows.extension.commerce.finance.eon.em.EmPay; +import io.zerows.extension.commerce.finance.uca.enter.Maker; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 步骤一:结算单处理流程(原始流程),完整步骤: + *

+ *     1. 生成单号
+ *     2. 根据是否延迟设定延迟相关信息
+ *     3. 批量插入结算单
+ * 
+ * + * @author lang : 2024-01-19 + */ +class Step01Settlement implements Trade { + // type -> FSettlement + @Override + public Future flatter(final JsonObject data, final EmPay.Type type) { + /* + * 结算单创建时会生成单号,编号规则存储在模型的赔账 `numbers` 中,且支持多字段配置 + * Zero Extension 模块会直接根据 `X_NUMBER` 中的定义来生成相关编号,执行完成后 + * 会赋值给此处的 FSettlement 对象。 + */ + return Maker.ofST().buildFastAsync(data) + + + /* + * 根据传入的执行类型来判断当前的结算单是否完成,如果是延迟结算,则不完成 + * 如果是非延迟结算就是完成,注意直接转应收也算是结算完成,而开启了应收处理 + * 流程 + */ + .compose(generated -> { + this.executeFinished(generated, type); + return Ux.future(generated); + }) + + + /* + * 将构造好的 FSettlement 对象直接插入到数据库中,并且以 + * FSettlement 的方式返回上层 + */ + .compose(Ux.Jooq.on(FSettlementDao.class)::insertAsync); + } + + // type -> List + @Override + public Future> scatter(final JsonArray data, final EmPay.Type assist) { + /* + * 批量结算单模式,先提取 number 的定义,直接从 data 中的 "indent" 中提取唯一 + * 的序号定义,然后执行批量生成结算单,最终返回生成的结算单列表 + */ + final String indent = Ut.valueString(data, KName.INDENT); + return Maker.ofST().buildAsync(data, indent) + .compose(generatedList -> { + generatedList.forEach(generated -> this.executeFinished(generated, assist)); + return Ux.future(generatedList); + }) + .compose(Ux.Jooq.on(FSettlementDao.class)::insertAsync); + } + + // ---------------- 私有方法 ----------------- + + /** + * 不论批量还是单量,都要根据 {@link EmPay.Type} 来判断是否完成结算单 + *

+     *     1. {@link EmPay.Type#AT} 为即时结算,所以这种情况是完成的
+     *     3. {@link EmPay.Type#DEBT} 为转应收,所以这种情况是完成的
+     *     2. {@link EmPay.Type#DELAY} 为延迟结算,所以这种情况是未完成的
+     * 
+ * + * @param settlement 结算单 + * @param type 结算类型 + */ + private void executeFinished(final FSettlement settlement, final EmPay.Type type) { + if (EmPay.Type.DELAY == type) { + settlement.setFinished(Boolean.FALSE); + } else { + // AT, DEBT 都是已完成的结算单 + settlement.setFinished(Boolean.TRUE); + settlement.setFinishedAt(LocalDateTime.now()); + } + } +} diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step04SettlementItem.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step04SettlementItem.java index cd12ec04d4cb7da0a7765cc7f85f51ca96a46376..4dbd7c679dd30e2d58956f22766bbea69c133cf1 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step04SettlementItem.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step04SettlementItem.java @@ -1,53 +1,53 @@ -package io.zerows.extension.commerce.finance.uca.trans; - -import io.vertx.core.Future; -import io.vertx.core.json.JsonArray; -import io.vertx.up.eon.KName; -import io.vertx.up.fn.Fn; -import io.vertx.up.unity.Ux; -import io.vertx.up.util.Ut; -import io.zerows.extension.commerce.finance.domain.tables.daos.FSettlementItemDao; -import io.zerows.extension.commerce.finance.domain.tables.pojos.FSettlement; -import io.zerows.extension.commerce.finance.domain.tables.pojos.FSettlementItem; -import io.zerows.extension.commerce.finance.uca.enter.Maker; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ConcurrentMap; - -/** - * 步骤四:根据数据生成最终的 {@link FSettlementItem} 的列表 - * - * @author lang : 2024-01-22 - */ -class Step04SettlementItem implements Trade { - @Override - public Future> scatter(final JsonArray data, final FSettlement inserted) { - /* - * STI 构造来处理账单明细信息 - * 直接用账单明细 FBillItem 中的数据来构造 FSettlementItem,并且将 FSettlementItem 插入到数据库中 - * 保存起来。 - */ - return Maker.upSTI().buildAsync(data, inserted) - .compose(Ux.Jooq.on(FSettlementItemDao.class)::insertAsync); - } - - @Override - public Future> flatter(final JsonArray data, final List settlements) { - final List>> futures = new ArrayList<>(); - final ConcurrentMap grouped = Ut.elementGroup(data, KName.Finance.SETTLEMENT_ID); - final ConcurrentMap settlementMap = Ut.elementMap(settlements, FSettlement::getKey); - grouped.forEach((settlementId, items) -> { - if (Ut.isNotNil(settlementId) && Ut.isNotNil(items)) { - final FSettlement settlement = settlementMap.get(settlementId); - futures.add(Maker.upSTI().buildAsync(items, settlement)); - } - }); - return Fn.combineT(futures) - .compose(result -> { - final List inserted = new ArrayList<>(); - result.forEach(inserted::addAll); - return Ux.future(inserted); - }).compose(Ux.Jooq.on(FSettlementItemDao.class)::insertAsync); - } -} +package io.zerows.extension.commerce.finance.uca.trans; + +import io.vertx.core.Future; +import io.vertx.core.json.JsonArray; +import io.vertx.up.eon.KName; +import io.vertx.up.fn.Fn; +import io.vertx.up.unity.Ux; +import io.vertx.up.util.Ut; +import io.zerows.extension.commerce.finance.domain.tables.daos.FSettlementItemDao; +import io.zerows.extension.commerce.finance.domain.tables.pojos.FSettlement; +import io.zerows.extension.commerce.finance.domain.tables.pojos.FSettlementItem; +import io.zerows.extension.commerce.finance.uca.enter.Maker; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ConcurrentMap; + +/** + * 步骤四:根据数据生成最终的 {@link FSettlementItem} 的列表 + * + * @author lang : 2024-01-22 + */ +class Step04SettlementItem implements Trade { + @Override + public Future> scatter(final JsonArray data, final FSettlement inserted) { + /* + * STI 构造来处理账单明细信息 + * 直接用账单明细 FBillItem 中的数据来构造 FSettlementItem,并且将 FSettlementItem 插入到数据库中 + * 保存起来。 + */ + return Maker.upSTI().buildAsync(data, inserted) + .compose(Ux.Jooq.on(FSettlementItemDao.class)::insertAsync); + } + + @Override + public Future> flatter(final JsonArray data, final List settlements) { + final List>> futures = new ArrayList<>(); + final ConcurrentMap grouped = Ut.elementGroup(data, KName.Finance.SETTLEMENT_ID); + final ConcurrentMap settlementMap = Ut.elementMap(settlements, FSettlement::getKey); + grouped.forEach((settlementId, items) -> { + if (Ut.isNotNil(settlementId) && Ut.isNotNil(items)) { + final FSettlement settlement = settlementMap.get(settlementId); + futures.add(Maker.upSTI().buildAsync(items, settlement)); + } + }); + return Fn.combineT(futures) + .compose(result -> { + final List inserted = new ArrayList<>(); + result.forEach(inserted::addAll); + return Ux.future(inserted); + }).compose(Ux.Jooq.on(FSettlementItemDao.class)::insertAsync); + } +} diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step05Debt.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step05Debt.java index 337593d3fb6269da2f66864948083e003f5e716f..089872201b65b4b392743938cc554983827baf54 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step05Debt.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step05Debt.java @@ -1,106 +1,110 @@ -package io.zerows.extension.commerce.finance.uca.trans; - -import io.horizon.atom.program.KRef; -import io.horizon.eon.VValue; -import io.vertx.core.Future; -import io.vertx.core.json.JsonObject; -import io.vertx.up.eon.KName; -import io.vertx.up.unity.Ux; -import io.vertx.up.util.Ut; -import io.zerows.extension.commerce.finance.domain.tables.daos.FDebtDao; -import io.zerows.extension.commerce.finance.domain.tables.daos.FSettlementItemDao; -import io.zerows.extension.commerce.finance.domain.tables.pojos.FDebt; -import io.zerows.extension.commerce.finance.domain.tables.pojos.FSettlement; -import io.zerows.extension.commerce.finance.domain.tables.pojos.FSettlementItem; -import io.zerows.extension.commerce.finance.eon.FmConstant; -import io.zerows.extension.commerce.finance.uca.enter.Maker; - -import java.util.List; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; - -/** - * 特殊接口,直接使用 {@link FSettlement} 的集合创建 应收/应退 的单据,此处设置的点: - *

- *     根据 {@link FSettlement} 提取集合,并根据此集合构造单个 应收/应退 的单据,应收处理
- *     过程中有可能会跨越多个结算单来执行,所以此处的数据结构是:{@link List} 类型,每个元素
- *     类型是 {@link FSettlement}
- *     应收和退款是后台生成,所以此处必须有一个常来来处理序号定义相关信息,这个常量就是:
- *     {@link FmConstant.NUM#DEBT} 和 {@link FmConstant.NUM#REFUND}
- * 
- * 特殊请求格式 - *

- *     {
- *         "...": "...",
- *         "selected": [
- *
- *         ]
- *     }
- *     "selected" 在此处表示在选择模式下提取  {@link FSettlementItem} 集合的主键值,这种模式下执行
- *     1. 先根据 {@link FSettlement} 提取所有合法的结算明细
- *     2. 再根据提取的所有结算明细执行 selected 过滤得到最终的结算明细
- * 
- * - * @author lang : 2024-01-22 - */ -class Step05Debt implements Trade, FDebt> { - @Override - public Future flatter(final JsonObject data, final List settlements) { - /* - * 先构造应收 / 退款单据 - * 新版这种类型的单据的单号会有变化,原始 - * - R{结算单号} - 退款单号 - * - D{结算单号} - 应收单号 - * - * 新版直接根据 X_NUMBER 中的定义,因为此处新版已经去掉了原始的单号生成逻辑,而且改成了可以跨 - * 结算单处理的模式,所以此处无法再直接和单个结算单绑定到一起,序号生成会有很大的变化。 - * - NUM.DEBT - 应收单号 - * - NUM.REFUND - 退款单号 - * 应收和退款取决于金额之和的最终结果,如果是正数则是应收,如果是负数则是退款。 - */ - final Set keySelected = Ut.toSet(Ut.valueJArray(data, "selected")); - - final KRef ref = new KRef(); - - return this.executeItems(settlements, keySelected) - .compose(ref::future) - .compose(items -> Maker.ofD().buildAsync(data, items)) - .compose(entity -> { - entity.setKey(null); - return Ux.Jooq.on(FDebtDao.class).insertAsync(entity); - }) - .compose(inserted -> { - // 更新 items - final List items = ref.get(); - items.forEach(item -> item.setDebtId(inserted.getKey())); - return Ux.Jooq.on(FSettlementItemDao.class).updateAsync(items) - .compose(nil -> Ux.future(inserted)); - }); - } - - private Future> executeItems( - final List settlements, final Set keySelected) { - if (settlements.isEmpty()) { - return Ux.futureL(); - } - final Set ids = settlements.stream() - .map(FSettlement::getKey) - .collect(Collectors.toSet()); - - final String sigma = settlements.get(VValue.IDX).getSigma(); - // 读取所有的结算单明细 - final JsonObject condition = Ux.whereAnd(); - condition.put(KName.SIGMA, sigma); - condition.put(KName.Finance.SETTLEMENT_ID + ",i", Ut.toJArray(ids)); - return Ux.Jooq.on(FSettlementItemDao.class).fetchAndAsync(condition).compose(items -> { - // 如果没有选择模式,则直接返回所有的结算单明细,否则返回选择的结算单明细 - if (Objects.isNull(keySelected) || keySelected.isEmpty()) { - return Ux.future(items); - } - return Ux.future(items.stream() - .filter(item -> keySelected.contains(item.getKey())) - .collect(Collectors.toList())); - }); - } -} +package io.zerows.extension.commerce.finance.uca.trans; + +import io.horizon.atom.program.KRef; +import io.horizon.eon.VValue; +import io.vertx.core.Future; +import io.vertx.core.json.JsonObject; +import io.vertx.up.eon.KName; +import io.vertx.up.unity.Ux; +import io.vertx.up.util.Ut; +import io.zerows.extension.commerce.finance.domain.tables.daos.FDebtDao; +import io.zerows.extension.commerce.finance.domain.tables.daos.FSettlementItemDao; +import io.zerows.extension.commerce.finance.domain.tables.pojos.FDebt; +import io.zerows.extension.commerce.finance.domain.tables.pojos.FSettlement; +import io.zerows.extension.commerce.finance.domain.tables.pojos.FSettlementItem; +import io.zerows.extension.commerce.finance.eon.FmConstant; +import io.zerows.extension.commerce.finance.uca.enter.Maker; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 特殊接口,直接使用 {@link FSettlement} 的集合创建 应收/应退 的单据,此处设置的点: + *

+ *     根据 {@link FSettlement} 提取集合,并根据此集合构造单个 应收/应退 的单据,应收处理
+ *     过程中有可能会跨越多个结算单来执行,所以此处的数据结构是:{@link List} 类型,每个元素
+ *     类型是 {@link FSettlement}
+ *     应收和退款是后台生成,所以此处必须有一个常来来处理序号定义相关信息,这个常量就是:
+ *     {@link FmConstant.NUM#DEBT} 和 {@link FmConstant.NUM#REFUND}
+ * 
+ * 特殊请求格式 + *

+ *     {
+ *         "...": "...",
+ *         "selected": [
+ *
+ *         ]
+ *     }
+ *     "selected" 在此处表示在选择模式下提取  {@link FSettlementItem} 集合的主键值,这种模式下执行
+ *     1. 先根据 {@link FSettlement} 提取所有合法的结算明细
+ *     2. 再根据提取的所有结算明细执行 selected 过滤得到最终的结算明细
+ * 
+ * + * @author lang : 2024-01-22 + */ +class Step05Debt implements Trade, FDebt> { + @Override + public Future flatter(final JsonObject data, final List settlements) { + /* + * 先构造应收 / 退款单据 + * 新版这种类型的单据的单号会有变化,原始 + * - R{结算单号} - 退款单号 + * - D{结算单号} - 应收单号 + * + * 新版直接根据 X_NUMBER 中的定义,因为此处新版已经去掉了原始的单号生成逻辑,而且改成了可以跨 + * 结算单处理的模式,所以此处无法再直接和单个结算单绑定到一起,序号生成会有很大的变化。 + * - NUM.DEBT - 应收单号 + * - NUM.REFUND - 退款单号 + * 应收和退款取决于金额之和的最终结果,如果是正数则是应收,如果是负数则是退款。 + */ + final Set keySelected = Ut.toSet(Ut.valueJArray(data, "selected")); + + final KRef ref = new KRef(); + + return this.executeItems(settlements, keySelected) + .compose(ref::future) + .compose(items -> Maker.ofD().buildAsync(data, items)) + .compose(entity -> { + String string = data.getString("amount"); + entity.setAmount(new BigDecimal(string)); + entity.setAmountBalance(new BigDecimal(string)); + entity.setKey(null); + return Ux.Jooq.on(FDebtDao.class).insertAsync(entity); + }) + .compose(inserted -> { + // 更新 items + final List items = ref.get(); + items.forEach(item -> item.setDebtId(inserted.getKey())); + return Ux.Jooq.on(FSettlementItemDao.class).updateAsync(items) + .compose(nil -> Ux.future(inserted)); + }); + } + + private Future> executeItems( + final List settlements, final Set keySelected) { + if (settlements.isEmpty()) { + return Ux.futureL(); + } + final Set ids = settlements.stream() + .map(FSettlement::getKey) + .collect(Collectors.toSet()); + + final String sigma = settlements.get(VValue.IDX).getSigma(); + // 读取所有的结算单明细 + final JsonObject condition = Ux.whereAnd(); + condition.put(KName.SIGMA, sigma); + condition.put(KName.Finance.SETTLEMENT_ID + ",i", Ut.toJArray(ids)); + return Ux.Jooq.on(FSettlementItemDao.class).fetchAndAsync(condition).compose(items -> { + // 如果没有选择模式,则直接返回所有的结算单明细,否则返回选择的结算单明细 + if (Objects.isNull(keySelected) || keySelected.isEmpty()) { + return Ux.future(items); + } + return Ux.future(items.stream() + .filter(item -> keySelected.contains(item.getKey())) + .collect(Collectors.toList())); + }); + } +} diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step06TransSettle.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step06TransSettle.java index 3e438214bfb3bc805ceede125b261985ec938e5d..2f8410c6dec10860c1a6019780bcaacfe670a110 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step06TransSettle.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step06TransSettle.java @@ -1,45 +1,45 @@ -package io.zerows.extension.commerce.finance.uca.trans; - -import io.vertx.core.Future; -import io.vertx.core.json.JsonObject; -import io.vertx.up.unity.Ux; -import io.vertx.up.util.Ut; -import io.zerows.extension.commerce.finance.domain.tables.daos.FTransDao; -import io.zerows.extension.commerce.finance.domain.tables.pojos.FSettlement; -import io.zerows.extension.commerce.finance.domain.tables.pojos.FTrans; -import io.zerows.extension.commerce.finance.eon.em.EmTran; -import io.zerows.extension.commerce.finance.uca.enter.Maker; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.UUID; - -/** - * @author lang : 2024-01-24 - */ -class Step06TransSettle implements Trade, FTrans> { - - @Override - public Future flatter(final JsonObject data, final List settlements) { - // 构造 FTrans - return Maker.ofT().buildFastAsync(data) - .compose(trans -> { - /* - * 金额计算 - */ - final List nameList = new ArrayList<>(); - for (final FSettlement settlement : settlements) { - if (Objects.nonNull(settlement.getAmount())) { - nameList.add(settlement.getCode()); - } - } - trans.setType(EmTran.Type.SETTLEMENT.name()); - trans.setName("ST:" + Ut.fromJoin(nameList)); - trans.setKey(UUID.randomUUID().toString()); - // 此处构造完成 - return Ux.future(trans); - }) - .compose(Ux.Jooq.on(FTransDao.class)::insertAsync); - } -} +package io.zerows.extension.commerce.finance.uca.trans; + +import io.vertx.core.Future; +import io.vertx.core.json.JsonObject; +import io.vertx.up.unity.Ux; +import io.vertx.up.util.Ut; +import io.zerows.extension.commerce.finance.domain.tables.daos.FTransDao; +import io.zerows.extension.commerce.finance.domain.tables.pojos.FSettlement; +import io.zerows.extension.commerce.finance.domain.tables.pojos.FTrans; +import io.zerows.extension.commerce.finance.eon.em.EmTran; +import io.zerows.extension.commerce.finance.uca.enter.Maker; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.UUID; + +/** + * @author lang : 2024-01-24 + */ +class Step06TransSettle implements Trade, FTrans> { + + @Override + public Future flatter(final JsonObject data, final List settlements) { + // 构造 FTrans + return Maker.ofT().buildFastAsync(data) + .compose(trans -> { + /* + * 金额计算 + */ + final List nameList = new ArrayList<>(); + for (final FSettlement settlement : settlements) { + if (Objects.nonNull(settlement.getAmount())) { + nameList.add(settlement.getCode()); + } + } + trans.setType(EmTran.Type.SETTLEMENT.name()); + trans.setName("ST:" + Ut.fromJoin(nameList)); + trans.setKey(UUID.randomUUID().toString()); + // 此处构造完成 + return Ux.future(trans); + }) + .compose(Ux.Jooq.on(FTransDao.class)::insertAsync); + } +} diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step07TransDebt.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step07TransDebt.java index 62cdf01f2dfc3cd16f0eafb4f5a6d1b52d4dda3a..01626c3bfac7fa3fa188de2d2f8ff350312e32df 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step07TransDebt.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/uca/trans/Step07TransDebt.java @@ -1,39 +1,41 @@ -package io.zerows.extension.commerce.finance.uca.trans; - -import io.vertx.core.Future; -import io.vertx.core.json.JsonObject; -import io.vertx.up.unity.Ux; -import io.vertx.up.util.Ut; -import io.zerows.extension.commerce.finance.domain.tables.daos.FTransDao; -import io.zerows.extension.commerce.finance.domain.tables.pojos.FDebt; -import io.zerows.extension.commerce.finance.domain.tables.pojos.FTrans; -import io.zerows.extension.commerce.finance.uca.enter.Maker; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author lang : 2024-03-12 - */ -class Step07TransDebt implements Trade, FTrans> { - - @Override - public Future flatter(final JsonObject data, final List debts) { - // 构造 FTrans - return Maker.ofT().buildFastAsync(data) - .compose(trans -> { - // 名称 - final List nameList = new ArrayList<>(); - for (final FDebt debt : debts) { - if (null != debt.getAmount()) { - nameList.add(debt.getCode()); - } - } - trans.setKey(null); - trans.setName("DR: " + Ut.fromJoin(nameList)); - // 此处构造完成 - return Ux.future(trans); - }) - .compose(Ux.Jooq.on(FTransDao.class)::insertAsync); - } -} +package io.zerows.extension.commerce.finance.uca.trans; + +import io.vertx.core.Future; +import io.vertx.core.json.JsonObject; +import io.vertx.up.unity.Ux; +import io.vertx.up.util.Ut; +import io.zerows.extension.commerce.finance.domain.tables.daos.FTransDao; +import io.zerows.extension.commerce.finance.domain.tables.pojos.FDebt; +import io.zerows.extension.commerce.finance.domain.tables.pojos.FTrans; +import io.zerows.extension.commerce.finance.uca.enter.Maker; +import io.zerows.extension.commerce.finance.util.Fm; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +/** + * @author lang : 2024-03-12 + */ +class Step07TransDebt implements Trade, FTrans> { + + @Override + public Future flatter(final JsonObject data, final List debts) { + // 构造 FTrans + return Maker.ofT().buildFastAsync(data) + .compose(trans -> { + // 名称 + final List nameList = new ArrayList<>(); + for (final FDebt debt : debts) { + if (null != debt.getAmount()) { + nameList.add(debt.getCode()); + } + } + trans.setKey(null); + trans.setName("DR: " + Ut.fromJoin(nameList)); + // 此处构造完成 + return Ux.future(trans); + }) + .compose(Ux.Jooq.on(FTransDao.class)::insertAsync); + } +} diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/util/Fm.java b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/util/Fm.java index acb58da420b2189755a05b61c9eec00b9ac0dd58..a65728c1cc8452c5cbb80bf3c20035430a5a7614 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/util/Fm.java +++ b/Zero.Extension.Commerce.Finance.DB/src/main/java/io/zerows/extension/commerce/finance/util/Fm.java @@ -1,61 +1,61 @@ -package io.zerows.extension.commerce.finance.util; - -import io.horizon.uca.log.Log; -import io.horizon.uca.log.LogModule; -import io.vertx.core.json.JsonObject; -import io.zerows.core.domain.atom.specification.KNaming; -import io.zerows.extension.commerce.finance.atom.TranData; -import io.zerows.extension.commerce.finance.domain.tables.pojos.FBook; -import io.zerows.extension.commerce.finance.domain.tables.pojos.FPreAuthorize; -import io.zerows.extension.commerce.finance.eon.FmConstant; - -import java.math.BigDecimal; -import java.util.List; - -/** - * @author Lang - */ -public final class Fm { - private Fm() { - } - - /** - * 直接从 data 中提取 preAuthorize 节点来构造预授权对象 - * {@link FPreAuthorize} - */ - public static FPreAuthorize toAuthorize(final JsonObject data) { - return FmCombine.toAuthorize(data); - } - - public static JsonObject toTransaction(final JsonObject response, final List tranData) { - return FmCombine.toTransaction(response, tranData); - } - - public static BigDecimal calcAmount(final BigDecimal start, final BigDecimal adjust, - final boolean income, final String status) { - return FmAmount.calcAmount(start, adjust, income, status); - } - - public static BigDecimal calcAmount(final BigDecimal start, final BigDecimal adjust, - final boolean income) { - return FmAmount.calcAmount(start, adjust, income, FmConstant.Status.VALID); - } - - public static JsonObject qrBook(final KNaming spec) { - return FmBook.qrBook(spec); - } - - public static FBook umBook(final KNaming spec) { - return FmBook.umBook(spec); - } - - public static List umBook(final KNaming spec, final List books) { - return FmBook.umBook(spec, books); - } - - public interface LOG { - String MODULE = "χρηματοδότηση"; - - LogModule Book = Log.modulat(MODULE).extension("Book"); - } -} +package io.zerows.extension.commerce.finance.util; + +import io.horizon.uca.log.Log; +import io.horizon.uca.log.LogModule; +import io.vertx.core.json.JsonObject; +import io.zerows.core.domain.atom.specification.KNaming; +import io.zerows.extension.commerce.finance.atom.TranData; +import io.zerows.extension.commerce.finance.domain.tables.pojos.FBook; +import io.zerows.extension.commerce.finance.domain.tables.pojos.FPreAuthorize; +import io.zerows.extension.commerce.finance.eon.FmConstant; + +import java.math.BigDecimal; +import java.util.List; + +/** + * @author Lang + */ +public final class Fm { + private Fm() { + } + + /** + * 直接从 data 中提取 preAuthorize 节点来构造预授权对象 + * {@link FPreAuthorize} + */ + public static FPreAuthorize toAuthorize(final JsonObject data) { + return FmCombine.toAuthorize(data); + } + + public static JsonObject toTransaction(final JsonObject response, final List tranData) { + return FmCombine.toTransaction(response, tranData); + } + + public static BigDecimal calcAmount(final BigDecimal start, final BigDecimal adjust, + final boolean income, final String status) { + return FmAmount.calcAmount(start, adjust, income, status); + } + + public static BigDecimal calcAmount(final BigDecimal start, final BigDecimal adjust, + final boolean income) { + return FmAmount.calcAmount(start, adjust, income, FmConstant.Status.VALID); + } + + public static JsonObject qrBook(final KNaming spec) { + return FmBook.qrBook(spec); + } + + public static FBook umBook(final KNaming spec) { + return FmBook.umBook(spec); + } + + public static List umBook(final KNaming spec, final List books) { + return FmBook.umBook(spec, books); + } + + public interface LOG { + String MODULE = "χρηματοδότηση"; + + LogModule Book = Log.modulat(MODULE).extension("Book"); + } +} diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/resources/plugins/zero-extension-commerce-finance/database/MYSQL/F_BILL_ITEM.sql b/Zero.Extension.Commerce.Finance.DB/src/main/resources/plugins/zero-extension-commerce-finance/database/MYSQL/F_BILL_ITEM.sql index 3449cd0410474ce9fe6e32d2955f44e8959376ed..9d1fe0fee6e55549fc5d114bf1662c98b66d9ef5 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/resources/plugins/zero-extension-commerce-finance/database/MYSQL/F_BILL_ITEM.sql +++ b/Zero.Extension.Commerce.Finance.DB/src/main/resources/plugins/zero-extension-commerce-finance/database/MYSQL/F_BILL_ITEM.sql @@ -1,62 +1,66 @@ --- liquibase formatted sql - --- changeset Lang:f-income-item-1 -DROP TABLE IF EXISTS `F_BILL_ITEM`; -CREATE TABLE `F_BILL_ITEM` -( - `KEY` VARCHAR(36) COMMENT '「key」- 账单明细主键', - `NAME` VARCHAR(255) NOT NULL COMMENT '「name」 - 明细名称', - `CODE` VARCHAR(255) NOT NULL COMMENT '「code」 - 明细系统代码', - `SERIAL` VARCHAR(255) NOT NULL COMMENT '「serial」 - 明细编号', - `INCOME` BIT COMMENT '「income」- true = 消费类,false = 付款类', - - -- 维度信息 - `TYPE` VARCHAR(36) NOT NULL COMMENT '「type」- 明细类型', - `STATUS` VARCHAR(36) NOT NULL COMMENT '「status」- 明细状态', - - -- 基本信息 - `AMOUNT` DECIMAL(18, 2) DEFAULT NULL COMMENT '「amount」——价税合计,实际付款结果,有可能父项', - `COMMENT` LONGTEXT COMMENT '「comment」 - 明细备注', - `MANUAL_NO` VARCHAR(255) COMMENT '「manualNo」 - 手工单号(线下单号专用)', - -- 商品信息 - `UNIT` VARCHAR(36) DEFAULT NULL COMMENT '「unit」- 计量单位', - `PRICE` DECIMAL(18, 2) NOT NULL COMMENT '「price」- 商品单价', - `QUANTITY` INT NOT NULL COMMENT '「quantity」- 商品数量', - `AMOUNT_TOTAL` DECIMAL(18, 2) NOT NULL COMMENT '「amountTotal」——总价,理论计算结果', - - -- 人员部分 - `OP_BY` VARCHAR(36) COMMENT '「opBy」- 操作人员,关联员工ID', - `OP_NUMBER` VARCHAR(36) COMMENT '「opNumber」- 操作人员工号', - `OP_SHIFT` VARCHAR(128) COMMENT '「opShift」- 操作班次(对接排班系统)', - `OP_AT` DATETIME COMMENT '「opAt」- 操作时间', - - -- 关联信息 - `RELATED_ID` VARCHAR(36) COMMENT '「relatedId」- 关联ID(保留,原系统存在)', - `SETTLEMENT_ID` VARCHAR(36) COMMENT '「settlementId」- 结算单ID,该字段有值标识已经结算', - `BILL_ID` VARCHAR(36) NOT NULL COMMENT '「billId」- 所属账单ID', - `SUBJECT_ID` VARCHAR(36) COMMENT '「subjectId」- 会计科目ID,依赖账单项选择结果', - `PAY_TERM_ID` VARCHAR(36) NOT NULL COMMENT '「payTermId」- 账单项ID', - - -- 特殊字段 - `SIGMA` VARCHAR(32) COMMENT '「sigma」- 统一标识', - `LANGUAGE` VARCHAR(10) COMMENT '「language」- 使用的语言', - `ACTIVE` BIT COMMENT '「active」- 是否启用', - `METADATA` TEXT COMMENT '「metadata」- 附加配置数据', - - -- Auditor字段 - `CREATED_AT` DATETIME COMMENT '「createdAt」- 创建时间', - `CREATED_BY` VARCHAR(36) COMMENT '「createdBy」- 创建人', - `UPDATED_AT` DATETIME COMMENT '「updatedAt」- 更新时间', - `UPDATED_BY` VARCHAR(36) COMMENT '「updatedBy」- 更新人', - PRIMARY KEY (`KEY`) -); --- changeset Lang:f-income-item-2 -ALTER TABLE F_BILL_ITEM - ADD UNIQUE (`CODE`, `BILL_ID`, `SIGMA`); -ALTER TABLE F_BILL_ITEM - ADD UNIQUE (`SERIAL`, `BILL_ID`, `SIGMA`); --- INDEX -ALTER TABLE F_BILL_ITEM - ADD INDEX IDX_F_BILL_ITEM_BILL_ID (`BILL_ID`); -ALTER TABLE F_BILL_ITEM +-- liquibase formatted sql + +-- changeset Lang:f-income-item-1 +DROP TABLE IF EXISTS `F_BILL_ITEM`; +CREATE TABLE `F_BILL_ITEM` +( + `KEY` VARCHAR(36) COMMENT '「key」- 账单明细主键', + `NAME` VARCHAR(255) NOT NULL COMMENT '「name」 - 明细名称', + `CODE` VARCHAR(255) NOT NULL COMMENT '「code」 - 明细系统代码', + `SERIAL` VARCHAR(255) NOT NULL COMMENT '「serial」 - 明细编号', + `INCOME` BIT COMMENT '「income」- true = 消费类,false = 付款类', + + -- 维度信息 + `TYPE` VARCHAR(36) NOT NULL COMMENT '「type」- 明细类型', + `STATUS` VARCHAR(36) NOT NULL COMMENT '「status」- 明细状态', + + `START_AT` DATETIME COMMENT '「startAt」- 开始时间', + `END_AT` DATETIME COMMENT '「endAt」- 结束时间', + `GROUP_BY` VARCHAR(64) COMMENT '「groupBy」- 分组', + + -- 基本信息 + `AMOUNT` DECIMAL(18, 2) DEFAULT NULL COMMENT '「amount」——价税合计,实际付款结果,有可能父项', + `COMMENT` LONGTEXT COMMENT '「comment」 - 明细备注', + `MANUAL_NO` VARCHAR(255) COMMENT '「manualNo」 - 手工单号(线下单号专用)', + -- 商品信息 + `UNIT` VARCHAR(36) DEFAULT NULL COMMENT '「unit」- 计量单位', + `PRICE` DECIMAL(18, 2) NOT NULL COMMENT '「price」- 商品单价', + `QUANTITY` INT NOT NULL COMMENT '「quantity」- 商品数量', + `AMOUNT_TOTAL` DECIMAL(18, 2) NOT NULL COMMENT '「amountTotal」——总价,理论计算结果', + + -- 人员部分 + `OP_BY` VARCHAR(36) COMMENT '「opBy」- 操作人员,关联员工ID', + `OP_NUMBER` VARCHAR(36) COMMENT '「opNumber」- 操作人员工号', + `OP_SHIFT` VARCHAR(128) COMMENT '「opShift」- 操作班次(对接排班系统)', + `OP_AT` DATETIME COMMENT '「opAt」- 操作时间', + + -- 关联信息 + `RELATED_ID` VARCHAR(36) COMMENT '「relatedId」- 关联ID(保留,原系统存在)', + `SETTLEMENT_ID` VARCHAR(36) COMMENT '「settlementId」- 结算单ID,该字段有值标识已经结算', + `BILL_ID` VARCHAR(36) NOT NULL COMMENT '「billId」- 所属账单ID', + `SUBJECT_ID` VARCHAR(36) COMMENT '「subjectId」- 会计科目ID,依赖账单项选择结果', + `PAY_TERM_ID` VARCHAR(36) NOT NULL COMMENT '「payTermId」- 账单项ID', + + -- 特殊字段 + `SIGMA` VARCHAR(32) COMMENT '「sigma」- 统一标识', + `LANGUAGE` VARCHAR(10) COMMENT '「language」- 使用的语言', + `ACTIVE` BIT COMMENT '「active」- 是否启用', + `METADATA` TEXT COMMENT '「metadata」- 附加配置数据', + + -- Auditor字段 + `CREATED_AT` DATETIME COMMENT '「createdAt」- 创建时间', + `CREATED_BY` VARCHAR(36) COMMENT '「createdBy」- 创建人', + `UPDATED_AT` DATETIME COMMENT '「updatedAt」- 更新时间', + `UPDATED_BY` VARCHAR(36) COMMENT '「updatedBy」- 更新人', + PRIMARY KEY (`KEY`) +); +-- changeset Lang:f-income-item-2 +ALTER TABLE F_BILL_ITEM + ADD UNIQUE (`CODE`, `BILL_ID`, `SIGMA`); +ALTER TABLE F_BILL_ITEM + ADD UNIQUE (`SERIAL`, `BILL_ID`, `SIGMA`); +-- INDEX +ALTER TABLE F_BILL_ITEM + ADD INDEX IDX_F_BILL_ITEM_BILL_ID (`BILL_ID`); +ALTER TABLE F_BILL_ITEM ADD INDEX IDX_F_BILL_ITEM_SETTLEMENT_ID (`SETTLEMENT_ID`); \ No newline at end of file diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/resources/plugins/zero-extension-commerce-finance/database/MYSQL/F_SETTLEMENT_ITEM.sql b/Zero.Extension.Commerce.Finance.DB/src/main/resources/plugins/zero-extension-commerce-finance/database/MYSQL/F_SETTLEMENT_ITEM.sql index d9c5e091b4bd520dceb4e8a20d7a17725682a60b..bb7fb8087ad6c54a1dc55487513592fbbf9c046b 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/resources/plugins/zero-extension-commerce-finance/database/MYSQL/F_SETTLEMENT_ITEM.sql +++ b/Zero.Extension.Commerce.Finance.DB/src/main/resources/plugins/zero-extension-commerce-finance/database/MYSQL/F_SETTLEMENT_ITEM.sql @@ -1,49 +1,53 @@ --- liquibase formatted sql - --- changeset Lang:f-settlement-item-1 -DROP TABLE IF EXISTS `F_SETTLEMENT_ITEM`; -CREATE TABLE `F_SETTLEMENT_ITEM` -( - `KEY` VARCHAR(36) COMMENT '「key」- 结算单明细主键', - `NAME` VARCHAR(255) NOT NULL COMMENT '「name」 - 明细名称', - `CODE` VARCHAR(255) NOT NULL COMMENT '「code」 - 明细系统代码', - `SERIAL` VARCHAR(255) NOT NULL COMMENT '「serial」 - 明细编号', - `INCOME` BIT COMMENT '「income」- true = 消费类,false = 付款类', - - -- 明细数据 - `TYPE` VARCHAR(36) NOT NULL COMMENT '「type」- 明细类型', - `AMOUNT` DECIMAL(18, 2) NOT NULL COMMENT '「amount」——价税合计,实际结算金额', - `COMMENT` LONGTEXT COMMENT '「comment」 - 明细备注', - `MANUAL_NO` VARCHAR(255) COMMENT '「manualNo」 - 手工单号(线下单号专用)', - `PAY_TERM_ID` VARCHAR(36) NOT NULL COMMENT '「payTermId」- 账单项ID', - - -- 结算基础信息 - `RELATED_ID` VARCHAR(36) COMMENT '「relatedId」- 关联BillItem ID(保留,原系统存在)', - `SETTLEMENT_ID` VARCHAR(36) COMMENT '「settlementId」- 结算单ID,该字段有值标识已经结算', - `DEBT_ID` VARCHAR(36) COMMENT '「debtId」- 应收账单ID', - `FINISHED_ID` VARCHAR(36) COMMENT '「finishedId」- 关联交易ID', - - -- 特殊字段 - `SIGMA` VARCHAR(32) COMMENT '「sigma」- 统一标识', - `LANGUAGE` VARCHAR(10) COMMENT '「language」- 使用的语言', - `ACTIVE` BIT COMMENT '「active」- 是否启用', - `METADATA` TEXT COMMENT '「metadata」- 附加配置数据', - - -- Auditor字段 - `CREATED_AT` DATETIME COMMENT '「createdAt」- 创建时间', - `CREATED_BY` VARCHAR(36) COMMENT '「createdBy」- 创建人', - `UPDATED_AT` DATETIME COMMENT '「updatedAt」- 更新时间', - `UPDATED_BY` VARCHAR(36) COMMENT '「updatedBy」- 更新人', - PRIMARY KEY (`KEY`) -); --- changeset Lang:f-settlement-item-2 -ALTER TABLE F_SETTLEMENT_ITEM - ADD UNIQUE (`CODE`, `SETTLEMENT_ID`, `SIGMA`); -ALTER TABLE F_SETTLEMENT_ITEM - ADD UNIQUE (`SERIAL`, `SETTLEMENT_ID`, `SIGMA`); - --- INDEX -ALTER TABLE F_SETTLEMENT_ITEM - ADD INDEX IDX_F_SETTLEMENT_ITEM_DEBT_ID (`DEBT_ID`); -ALTER TABLE F_SETTLEMENT_ITEM +-- liquibase formatted sql + +-- changeset Lang:f-settlement-item-1 +DROP TABLE IF EXISTS `F_SETTLEMENT_ITEM`; +CREATE TABLE `F_SETTLEMENT_ITEM` +( + `KEY` VARCHAR(36) COMMENT '「key」- 结算单明细主键', + `NAME` VARCHAR(255) NOT NULL COMMENT '「name」 - 明细名称', + `CODE` VARCHAR(255) NOT NULL COMMENT '「code」 - 明细系统代码', + `SERIAL` VARCHAR(255) NOT NULL COMMENT '「serial」 - 明细编号', + `INCOME` BIT COMMENT '「income」- true = 消费类,false = 付款类', + + -- 明细数据 + `TYPE` VARCHAR(36) NOT NULL COMMENT '「type」- 明细类型', + `AMOUNT` DECIMAL(18, 2) NOT NULL COMMENT '「amount」——价税合计,实际结算金额', + `COMMENT` LONGTEXT COMMENT '「comment」 - 明细备注', + `MANUAL_NO` VARCHAR(255) COMMENT '「manualNo」 - 手工单号(线下单号专用)', + `PAY_TERM_ID` VARCHAR(36) NOT NULL COMMENT '「payTermId」- 账单项ID', + + `START_AT` DATETIME COMMENT '「startAt」- 开始时间', + `END_AT` DATETIME COMMENT '「endAt」- 结束时间', + `GROUP_BY` VARCHAR(64) COMMENT '「groupBy」- 分组', + + -- 结算基础信息 + `RELATED_ID` VARCHAR(36) COMMENT '「relatedId」- 关联BillItem ID(保留,原系统存在)', + `SETTLEMENT_ID` VARCHAR(36) COMMENT '「settlementId」- 结算单ID,该字段有值标识已经结算', + `DEBT_ID` VARCHAR(36) COMMENT '「debtId」- 应收账单ID', + `FINISHED_ID` VARCHAR(36) COMMENT '「finishedId」- 关联交易ID', + + -- 特殊字段 + `SIGMA` VARCHAR(32) COMMENT '「sigma」- 统一标识', + `LANGUAGE` VARCHAR(10) COMMENT '「language」- 使用的语言', + `ACTIVE` BIT COMMENT '「active」- 是否启用', + `METADATA` TEXT COMMENT '「metadata」- 附加配置数据', + + -- Auditor字段 + `CREATED_AT` DATETIME COMMENT '「createdAt」- 创建时间', + `CREATED_BY` VARCHAR(36) COMMENT '「createdBy」- 创建人', + `UPDATED_AT` DATETIME COMMENT '「updatedAt」- 更新时间', + `UPDATED_BY` VARCHAR(36) COMMENT '「updatedBy」- 更新人', + PRIMARY KEY (`KEY`) +); +-- changeset Lang:f-settlement-item-2 +ALTER TABLE F_SETTLEMENT_ITEM + ADD UNIQUE (`CODE`, `SETTLEMENT_ID`, `SIGMA`); +ALTER TABLE F_SETTLEMENT_ITEM + ADD UNIQUE (`SERIAL`, `SETTLEMENT_ID`, `SIGMA`); + +-- INDEX +ALTER TABLE F_SETTLEMENT_ITEM + ADD INDEX IDX_F_SETTLEMENT_ITEM_DEBT_ID (`DEBT_ID`); +ALTER TABLE F_SETTLEMENT_ITEM ADD INDEX IDX_F_SETTLEMENT_ITEM_SETTLEMENT_ID (`SETTLEMENT_ID`); \ No newline at end of file diff --git a/Zero.Extension.Commerce.Finance.DB/src/main/resources/plugins/zero-extension-commerce-finance/database/MYSQL/F_TRANS_ITEM.sql b/Zero.Extension.Commerce.Finance.DB/src/main/resources/plugins/zero-extension-commerce-finance/database/MYSQL/F_TRANS_ITEM.sql index 7901284437a3d5e816cae992e7eb7a96c88310d6..a618a40214da9af472d4e2fbbc0d9a483a761812 100644 --- a/Zero.Extension.Commerce.Finance.DB/src/main/resources/plugins/zero-extension-commerce-finance/database/MYSQL/F_TRANS_ITEM.sql +++ b/Zero.Extension.Commerce.Finance.DB/src/main/resources/plugins/zero-extension-commerce-finance/database/MYSQL/F_TRANS_ITEM.sql @@ -1,42 +1,46 @@ --- liquibase formatted sql - --- changeset Lang:f-trans-item-1 -DROP TABLE IF EXISTS `F_TRANS_ITEM`; -CREATE TABLE `F_TRANS_ITEM` -( - `KEY` VARCHAR(36) COMMENT '「key」- 收款明细账单主键ID', - `NAME` VARCHAR(255) COMMENT '「name」 - 收款明细单标题', - `CODE` VARCHAR(255) NOT NULL COMMENT '「code」 - 收款明细单编号', - `SERIAL` VARCHAR(36) NOT NULL COMMENT '「serial」 - 收款明细单据号', - - -- 基本信息 - `AMOUNT` DECIMAL(18, 2) NOT NULL COMMENT '「amount」——价税合计,所有明细对应的实际结算金额', - - `TRANSACTION_ID` VARCHAR(36) DEFAULT NULL COMMENT '「transactionId」交易ID', - - `PAY_NAME` VARCHAR(128) DEFAULT NULL COMMENT '「payName」打款人姓名', - `PAY_MOBILE` VARCHAR(128) DEFAULT NULL COMMENT '「payMobile」打款人电话', - `PAY_METHOD` VARCHAR(255) DEFAULT NULL COMMENT '「payMethod」付款方式', - `PAY_ID` VARCHAR(255) DEFAULT NULL COMMENT '「payId」付款账号', - - -- 特殊字段 - `SIGMA` VARCHAR(32) COMMENT '「sigma」- 统一标识', - `LANGUAGE` VARCHAR(10) COMMENT '「language」- 使用的语言', - `ACTIVE` BIT COMMENT '「active」- 是否启用', - `METADATA` TEXT COMMENT '「metadata」- 附加配置数据', - - -- Auditor字段 - `CREATED_AT` DATETIME COMMENT '「createdAt」- 创建时间', - `CREATED_BY` VARCHAR(36) COMMENT '「createdBy」- 创建人', - `UPDATED_AT` DATETIME COMMENT '「updatedAt」- 更新时间', - `UPDATED_BY` VARCHAR(36) COMMENT '「updatedBy」- 更新人', - PRIMARY KEY (`KEY`) -); --- changeset Lang:f-trans-item-2 -ALTER TABLE F_TRANS_ITEM - ADD UNIQUE (`CODE`, `SIGMA`); -ALTER TABLE F_TRANS_ITEM - ADD UNIQUE (`SERIAL`, `SIGMA`); - -ALTER TABLE F_TRANS_ITEM - ADD INDEX IDX_F_PAYMENT_ITEM_PAYMENT_ID (`TRANSACTION_ID`); +-- liquibase formatted sql + +-- changeset Lang:f-trans-item-1 +DROP TABLE IF EXISTS `F_TRANS_ITEM`; +CREATE TABLE `F_TRANS_ITEM` +( + `KEY` VARCHAR(36) COMMENT '「key」- 收款明细账单主键ID', + `NAME` VARCHAR(255) COMMENT '「name」 - 收款明细单标题', + `CODE` VARCHAR(255) NOT NULL COMMENT '「code」 - 收款明细单编号', + `SERIAL` VARCHAR(36) NOT NULL COMMENT '「serial」 - 收款明细单据号', + + -- 基本信息 + `AMOUNT` DECIMAL(18, 2) NOT NULL COMMENT '「amount」——价税合计,所有明细对应的实际结算金额', + + `TRANSACTION_ID` VARCHAR(36) DEFAULT NULL COMMENT '「transactionId」交易ID', + + `PAY_NAME` VARCHAR(128) DEFAULT NULL COMMENT '「payName」打款人姓名', + `PAY_MOBILE` VARCHAR(128) DEFAULT NULL COMMENT '「payMobile」打款人电话', + `PAY_METHOD` VARCHAR(255) DEFAULT NULL COMMENT '「payMethod」付款方式', + `PAY_ID` VARCHAR(255) DEFAULT NULL COMMENT '「payId」付款账号', + + `START_AT` DATETIME COMMENT '「startAt」- 开始时间', + `END_AT` DATETIME COMMENT '「endAt」- 结束时间', + `GROUP_BY` VARCHAR(64) COMMENT '「groupBy」- 分组', + + -- 特殊字段 + `SIGMA` VARCHAR(32) COMMENT '「sigma」- 统一标识', + `LANGUAGE` VARCHAR(10) COMMENT '「language」- 使用的语言', + `ACTIVE` BIT COMMENT '「active」- 是否启用', + `METADATA` TEXT COMMENT '「metadata」- 附加配置数据', + + -- Auditor字段 + `CREATED_AT` DATETIME COMMENT '「createdAt」- 创建时间', + `CREATED_BY` VARCHAR(36) COMMENT '「createdBy」- 创建人', + `UPDATED_AT` DATETIME COMMENT '「updatedAt」- 更新时间', + `UPDATED_BY` VARCHAR(36) COMMENT '「updatedBy」- 更新人', + PRIMARY KEY (`KEY`) +); +-- changeset Lang:f-trans-item-2 +ALTER TABLE F_TRANS_ITEM + ADD UNIQUE (`CODE`, `SIGMA`); +ALTER TABLE F_TRANS_ITEM + ADD UNIQUE (`SERIAL`, `SIGMA`); + +ALTER TABLE F_TRANS_ITEM + ADD INDEX IDX_F_PAYMENT_ITEM_PAYMENT_ID (`TRANSACTION_ID`); diff --git a/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/agent/api/RoleActor.java b/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/agent/api/RoleActor.java new file mode 100644 index 0000000000000000000000000000000000000000..c21ac1d1229d1b8266010cba9de07db30973f2c9 --- /dev/null +++ b/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/agent/api/RoleActor.java @@ -0,0 +1,24 @@ +package io.zerows.extension.commerce.rbac.agent.api; + +import io.vertx.core.Future; +import io.vertx.core.json.JsonObject; +import io.vertx.up.annotations.Address; +import io.vertx.up.annotations.EndPoint; +import io.vertx.up.eon.KName; +import io.zerows.core.domain.atom.commune.Vis; +import io.zerows.core.web.io.annotations.BodyParam; +import io.zerows.core.web.io.annotations.PointParam; +import io.zerows.extension.commerce.rbac.eon.Addr; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; + +@EndPoint +@Path("/api") +public interface RoleActor { + + @POST + @Path("/role") + @Address(Addr.Role.ROLE_SAVE) + Future roleSave(@BodyParam JsonObject region); +} diff --git a/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/agent/api/RoleAgent.java b/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/agent/api/RoleAgent.java new file mode 100644 index 0000000000000000000000000000000000000000..44a7d3fb01f806edb5a006955f581cf6b91a911b --- /dev/null +++ b/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/agent/api/RoleAgent.java @@ -0,0 +1,20 @@ +package io.zerows.extension.commerce.rbac.agent.api; + +import io.vertx.core.Future; +import io.vertx.core.json.JsonObject; +import io.vertx.up.annotations.Address; +import io.vertx.up.annotations.Queue; +import io.zerows.extension.commerce.rbac.agent.service.role.RoleStub; +import io.vertx.ext.auth.User; +import io.zerows.extension.commerce.rbac.eon.Addr; +import jakarta.inject.Inject; + +@Queue +public class RoleAgent { + @Inject + private transient RoleStub stub; + @Address(Addr.Role.ROLE_SAVE) + public Future saveRole(final JsonObject roleData, final User user) { + return stub.roleSave(roleData,user); + } +} diff --git a/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/agent/service/role/RoleService.java b/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/agent/service/role/RoleService.java new file mode 100644 index 0000000000000000000000000000000000000000..2471e965b62b8dc869e7eafc24084b923bac74e3 --- /dev/null +++ b/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/agent/service/role/RoleService.java @@ -0,0 +1,87 @@ + +package io.zerows.extension.commerce.rbac.agent.service.role; + +import io.vertx.core.Future; +import io.vertx.core.json.JsonArray; +import io.vertx.core.json.JsonObject; +import io.vertx.ext.auth.User; +import io.vertx.up.unity.Ux; +import io.vertx.up.util.Ut; +import io.zerows.core.metadata.atom.configuration.MDConfiguration; +import io.zerows.core.web.model.extension.HExtension; +import io.zerows.extension.commerce.rbac.domain.tables.daos.RRolePermDao; +import io.zerows.extension.commerce.rbac.domain.tables.daos.SPermissionDao; +import io.zerows.extension.commerce.rbac.domain.tables.daos.SRoleDao; +import io.zerows.extension.commerce.rbac.domain.tables.daos.SViewDao; +import io.zerows.extension.commerce.rbac.domain.tables.pojos.SPermission; +import io.zerows.extension.commerce.rbac.domain.tables.pojos.SRole; +import io.zerows.extension.commerce.rbac.domain.tables.pojos.SView; +import io.zerows.extension.commerce.rbac.eon.AuthKey; +import io.zerows.extension.commerce.rbac.eon.ScConstant; + +import java.time.LocalDateTime; +import java.util.UUID; + +public class RoleService implements RoleStub { + + @Override + public Future roleSave(final JsonObject data, final User user) { + // 1. 加载配置信息 + final MDConfiguration config = HExtension.getOrCreate(ScConstant.BUNDLE_SYMBOLIC_NAME); + final JsonObject configData = config.inConfiguration(); + final JsonObject initializeRole = configData.getJsonObject(AuthKey.INITIALIZE_ROLE); + final JsonObject initializePermissions = configData.getJsonObject(AuthKey.INITIALIZE_PERMISSIONS); + + // 2. 提取权限码 + final JsonArray permCodes = initializeRole.getJsonArray(AuthKey.PERMISSIONS); + final JsonObject queryCondition = new JsonObject().put(AuthKey.AUTH_CODE, permCodes); + + // 3. 转换数据模型 + final SRole sRole = Ut.fromJson(data, SRole.class); + + return Ux.Jooq.on(SRoleDao.class).insertAsync(sRole) + .compose(role -> savePermissions(role.getKey(), queryCondition)) + .compose(nil -> saveDefaultView(sRole, user,initializePermissions)) + .map(role -> (Ux.toJson(sRole))); + } + + /** + * 保存角色与权限的关联关系 + */ + private Future savePermissions(final String roleId, final JsonObject queryCondition) { + return Ux.Jooq.on(SPermissionDao.class).fetchAsync(queryCondition) + .compose(permissions -> { + final JsonArray relations = new JsonArray(); + for (SPermission permission : permissions) { + relations.add(new JsonObject() + .put(AuthKey.F_ROLE_ID, roleId) + .put(AuthKey.F_PERM_ID, permission.getKey())); + } + return Ux.Jooq.on(RRolePermDao.class).insertAsync(relations); + }).compose(niv->Ux.future()); + } + + /** + * 构造并保存默认视图 + */ + private Future saveDefaultView(final SRole role, final User user,final JsonObject initPermissions) { + final SView view = new SView(); + view.setKey(UUID.randomUUID().toString()); + view.setName(AuthKey.DEFAULT); + view.setOwner(role.getKey()); + view.setOwnerType(AuthKey.OWNER_TYPE_ROLE); + view.setResourceId(AuthKey.DEFAULT_RESOURCE_ID); + view.setProjection("{}"); + view.setCriteria("{}"); + view.setRows(initPermissions.toString()); + view.setPosition(AuthKey.DEFAULT); + view.setVisitant(false); + view.setSigma(role.getSigma()); + view.setLanguage(role.getLanguage()); + view.setActive(true); + view.setCreatedAt(LocalDateTime.now()); + view.setCreatedBy(Ux.keyUser(user)); + + return Ux.Jooq.on(SViewDao.class).insertAsync(view).mapEmpty(); + } +} \ No newline at end of file diff --git a/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/agent/service/role/RoleStub.java b/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/agent/service/role/RoleStub.java new file mode 100644 index 0000000000000000000000000000000000000000..6bbfe46a6f02a8bdcbdd05fa5bdf8bbe22b1a840 --- /dev/null +++ b/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/agent/service/role/RoleStub.java @@ -0,0 +1,10 @@ +package io.zerows.extension.commerce.rbac.agent.service.role; + +import io.vertx.core.Future; +import io.vertx.core.json.JsonObject; +import io.vertx.ext.auth.User; + +public interface RoleStub { + + Future roleSave(JsonObject data, User user); +} diff --git a/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/eon/Addr.java b/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/eon/Addr.java index d45ea9a27a9e390ec8e6e6037a4f4a741a3cd0e8..843534ffdc08fd9037c64f18e292c9f08a03e277 100644 --- a/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/eon/Addr.java +++ b/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/eon/Addr.java @@ -1,151 +1,153 @@ -package io.zerows.extension.commerce.rbac.eon; - -/** - * Address for Event Bus - */ -interface Prefix { - - String _EVENT = "Ἀτλαντὶς νῆσος://Ασφάλεια/"; -} - -public interface Addr { - - interface Rule { - - /* - * 「New Version」 - * 1. Fetch for KPermit of new structure - * 2. Save View based on Configuration - */ - String FETCH_REGION = Prefix._EVENT + "X-RULE/FETCH/REGION"; - String FETCH_REGION_VALUES = Prefix._EVENT + "X-RULE/FETCH/REGION-VALUES"; - - String FETCH_REGION_DEFINE = Prefix._EVENT + "X-RULE/FETCH/REGION-DEFINE"; - - String SAVE_REGION = Prefix._EVENT + "X-RULE/SAVING/SINGLE"; - } - - interface Auth { - - String LOGIN = Prefix._EVENT + "O-LOGIN"; - - - String LOGOUT = Prefix._EVENT + "O-LOGOUT"; - - String AUTHORIZE = Prefix._EVENT + "O-AUTHORIZE"; - - String TOKEN = Prefix._EVENT + "O-TOKEN"; - - String CAPTCHA_IMAGE = Prefix._EVENT + "X-CAPTCHA/IMAGE"; - - String CAPTCHA_IMAGE_VERIFY = Prefix._EVENT + "X-CAPTCHA/IMAGE/VERIFY"; - - interface Extension { - - String WECHAT_QR = Prefix._EVENT + "O-LOGIN-WECHAT-QR"; - - String WECHAT_LOGIN = Prefix._EVENT + "O-LOGIN-WECHAT"; - - String SMS_LOGIN = Prefix._EVENT + "O-LOGIN-SMS"; - - String SMS_LOGIN_PRE = Prefix._EVENT + "O-LOGIN-PRE"; - - String SMS_CAPTCHA = Prefix._EVENT + "O-LOGIN-SMS-CAPTCHA"; - } - } - - interface User { - String INFORMATION = Prefix._EVENT + "X-INFORMATION"; - - String PASSWORD = Prefix._EVENT + "X-PASSWORD"; - - String PROFILE = Prefix._EVENT + "X-PROFILE"; - - String SEARCH = Prefix._EVENT + "X-SEARCH"; - - /** - * modified by Hongwei at 2019/12/06 - * add get, create, update and delete methods for user domain. - */ - String GET = Prefix._EVENT + "X-USER/GET/ID"; - - String ADD = Prefix._EVENT + "X-USER/ADD"; - - String DELETE = Prefix._EVENT + "X-DELETE/USER/ID"; - - String UPDATE = Prefix._EVENT + "X-PUT/USER/ID"; - - String IMPORT = Prefix._EVENT + "X-IMPORT/USER"; - - /* - * New for user processing - */ - String QR_USER_SEARCH = Prefix._EVENT + "X-USER/QR/SEARCH"; - } - - interface Perm { - /* Search all permissions that are not related */ - String PERMISSION_UN_READY = Prefix._EVENT + "X-PERMISSION/UN-READY"; - - /* - * CRUD replaced - */ - String BY_ID = Prefix._EVENT + "X-PERMISSION/CRUD/READ"; - String ADD = Prefix._EVENT + "X-PERMISSION/CRUD/CREATE"; - String EDIT = Prefix._EVENT + "X-PERMISSION/CRUD/UPDATE"; - String DELETE = Prefix._EVENT + "X-PERMISSION/CRUD/DELETE"; - } - - interface Authority { - /* Api Seeking(Action Only) */ - String ACTION_SEEK = Prefix._EVENT + "X-ACTION/SEEK"; - - /* Api Pre-Ready */ - String ACTION_READY = Prefix._EVENT + "X-ACTION/READY"; - - /* Resource Search */ - String RESOURCE_SEARCH = Prefix._EVENT + "X-RESOURCE/SEARCH"; - - /* Perm Information */ - String PERMISSION_GROUP = Prefix._EVENT + "X-PERMISSION/GROUP"; - /* Perm Saving, Save permission definition */ - String PERMISSION_DEFINITION_SAVE = Prefix._EVENT + "X-PERMISSION/DEFINITION/SAVING"; - - /* Get all relation between role & permission */ - String PERMISSION_BY_ROLE = Prefix._EVENT + "X-PERMISSION/BY/ROLE"; - /* Save all relation between role & permission */ - String PERMISSION_SAVE = Prefix._EVENT + "X-PERMISSION/SAVING"; - - /* Resource get with action */ - String RESOURCE_GET_CASCADE = Prefix._EVENT + "X-RESOURCE/GET-CASCADE"; - /* Resource add with action */ - String RESOURCE_ADD_CASCADE = Prefix._EVENT + "X-RESOURCE/ADD-CASCADE"; - /* Resource update with action */ - String RESOURCE_UPDATE_CASCADE = Prefix._EVENT + "X-RESOURCE/UPDATE-CASCADE"; - /* Resource delete with action */ - String RESOURCE_DELETE_CASCADE = Prefix._EVENT + "X-RESOURCE/DELETE-CASCADE"; - } - - interface View { - /* - * View interface publish for `my view` instead of old `my` - */ - String VIEW_P_BY_USER = Prefix._EVENT + "X-VIEW-P/GET/BY-USER"; - String VIEW_P_ADD = Prefix._EVENT + "X-VIEW-P/ADD"; - String VIEW_P_DELETE = Prefix._EVENT + "X-VIEW-P/DELETE"; - String VIEW_P_UPDATE = Prefix._EVENT + "X-VIEW-P/UPDATE"; - String VIEW_P_BY_ID = Prefix._EVENT + "X-VIEW-P/GET/BY-ID"; - String VIEW_P_BATCH_DELETE = Prefix._EVENT + "X-VIEW-P/BATCH/DELETE"; - String VIEW_P_EXISTING = Prefix._EVENT + "X-VIEW-P/EXISTING"; - } - - interface Group { - String GROUP_SIGMA = Prefix._EVENT + "S-GROUP/SIGMA"; - } - - interface Role { - String ROLE_SIGMA = Prefix._EVENT + "S-ROLE/SIGMA"; - - String ROLE_PERM_UPDATE = Prefix._EVENT + "S-ROLE-PERM/PUT"; - } -} +package io.zerows.extension.commerce.rbac.eon; + +/** + * Address for Event Bus + */ +interface Prefix { + + String _EVENT = "Ἀτλαντὶς νῆσος://Ασφάλεια/"; +} + +public interface Addr { + + interface Rule { + + /* + * 「New Version」 + * 1. Fetch for KPermit of new structure + * 2. Save View based on Configuration + */ + String FETCH_REGION = Prefix._EVENT + "X-RULE/FETCH/REGION"; + String FETCH_REGION_VALUES = Prefix._EVENT + "X-RULE/FETCH/REGION-VALUES"; + + String FETCH_REGION_DEFINE = Prefix._EVENT + "X-RULE/FETCH/REGION-DEFINE"; + + String SAVE_REGION = Prefix._EVENT + "X-RULE/SAVING/SINGLE"; + } + + interface Auth { + + String LOGIN = Prefix._EVENT + "O-LOGIN"; + + + String LOGOUT = Prefix._EVENT + "O-LOGOUT"; + + String AUTHORIZE = Prefix._EVENT + "O-AUTHORIZE"; + + String TOKEN = Prefix._EVENT + "O-TOKEN"; + + String CAPTCHA_IMAGE = Prefix._EVENT + "X-CAPTCHA/IMAGE"; + + String CAPTCHA_IMAGE_VERIFY = Prefix._EVENT + "X-CAPTCHA/IMAGE/VERIFY"; + + interface Extension { + + String WECHAT_QR = Prefix._EVENT + "O-LOGIN-WECHAT-QR"; + + String WECHAT_LOGIN = Prefix._EVENT + "O-LOGIN-WECHAT"; + + String SMS_LOGIN = Prefix._EVENT + "O-LOGIN-SMS"; + + String SMS_LOGIN_PRE = Prefix._EVENT + "O-LOGIN-PRE"; + + String SMS_CAPTCHA = Prefix._EVENT + "O-LOGIN-SMS-CAPTCHA"; + } + } + + interface User { + String INFORMATION = Prefix._EVENT + "X-INFORMATION"; + + String PASSWORD = Prefix._EVENT + "X-PASSWORD"; + + String PROFILE = Prefix._EVENT + "X-PROFILE"; + + String SEARCH = Prefix._EVENT + "X-SEARCH"; + + /** + * modified by Hongwei at 2019/12/06 + * add get, create, update and delete methods for user domain. + */ + String GET = Prefix._EVENT + "X-USER/GET/ID"; + + String ADD = Prefix._EVENT + "X-USER/ADD"; + + String DELETE = Prefix._EVENT + "X-DELETE/USER/ID"; + + String UPDATE = Prefix._EVENT + "X-PUT/USER/ID"; + + String IMPORT = Prefix._EVENT + "X-IMPORT/USER"; + + /* + * New for user processing + */ + String QR_USER_SEARCH = Prefix._EVENT + "X-USER/QR/SEARCH"; + } + + interface Perm { + /* Search all permissions that are not related */ + String PERMISSION_UN_READY = Prefix._EVENT + "X-PERMISSION/UN-READY"; + + /* + * CRUD replaced + */ + String BY_ID = Prefix._EVENT + "X-PERMISSION/CRUD/READ"; + String ADD = Prefix._EVENT + "X-PERMISSION/CRUD/CREATE"; + String EDIT = Prefix._EVENT + "X-PERMISSION/CRUD/UPDATE"; + String DELETE = Prefix._EVENT + "X-PERMISSION/CRUD/DELETE"; + } + + interface Authority { + /* Api Seeking(Action Only) */ + String ACTION_SEEK = Prefix._EVENT + "X-ACTION/SEEK"; + + /* Api Pre-Ready */ + String ACTION_READY = Prefix._EVENT + "X-ACTION/READY"; + + /* Resource Search */ + String RESOURCE_SEARCH = Prefix._EVENT + "X-RESOURCE/SEARCH"; + + /* Perm Information */ + String PERMISSION_GROUP = Prefix._EVENT + "X-PERMISSION/GROUP"; + /* Perm Saving, Save permission definition */ + String PERMISSION_DEFINITION_SAVE = Prefix._EVENT + "X-PERMISSION/DEFINITION/SAVING"; + + /* Get all relation between role & permission */ + String PERMISSION_BY_ROLE = Prefix._EVENT + "X-PERMISSION/BY/ROLE"; + /* Save all relation between role & permission */ + String PERMISSION_SAVE = Prefix._EVENT + "X-PERMISSION/SAVING"; + + /* Resource get with action */ + String RESOURCE_GET_CASCADE = Prefix._EVENT + "X-RESOURCE/GET-CASCADE"; + /* Resource add with action */ + String RESOURCE_ADD_CASCADE = Prefix._EVENT + "X-RESOURCE/ADD-CASCADE"; + /* Resource update with action */ + String RESOURCE_UPDATE_CASCADE = Prefix._EVENT + "X-RESOURCE/UPDATE-CASCADE"; + /* Resource delete with action */ + String RESOURCE_DELETE_CASCADE = Prefix._EVENT + "X-RESOURCE/DELETE-CASCADE"; + } + + interface View { + /* + * View interface publish for `my view` instead of old `my` + */ + String VIEW_P_BY_USER = Prefix._EVENT + "X-VIEW-P/GET/BY-USER"; + String VIEW_P_ADD = Prefix._EVENT + "X-VIEW-P/ADD"; + String VIEW_P_DELETE = Prefix._EVENT + "X-VIEW-P/DELETE"; + String VIEW_P_UPDATE = Prefix._EVENT + "X-VIEW-P/UPDATE"; + String VIEW_P_BY_ID = Prefix._EVENT + "X-VIEW-P/GET/BY-ID"; + String VIEW_P_BATCH_DELETE = Prefix._EVENT + "X-VIEW-P/BATCH/DELETE"; + String VIEW_P_EXISTING = Prefix._EVENT + "X-VIEW-P/EXISTING"; + } + + interface Group { + String GROUP_SIGMA = Prefix._EVENT + "S-GROUP/SIGMA"; + } + + interface Role { + String ROLE_SIGMA = Prefix._EVENT + "S-ROLE/SIGMA"; + + String ROLE_PERM_UPDATE = Prefix._EVENT + "S-ROLE-PERM/PUT"; + + String ROLE_SAVE = Prefix._EVENT + "S-ROLE/SAVE"; + } +} diff --git a/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/eon/AuthKey.java b/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/eon/AuthKey.java index 8dc5c325e19e9b3265c48a8d3d0ee82d71f058de..f3230379530ff1f97a6df4ab30ec8707cc9ac94d 100644 --- a/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/eon/AuthKey.java +++ b/Zero.Extension.Commerce.RBAC.DB/src/main/java/io/zerows/extension/commerce/rbac/eon/AuthKey.java @@ -1,64 +1,72 @@ -package io.zerows.extension.commerce.rbac.eon; - -import io.vertx.up.eon.KName; - -public interface AuthKey { - /** - * Default state field - */ - String STATE = "state"; - String SCOPE = "scope"; - String AUTH_CODE = "code"; - - String USER_NAME = "username"; - String PASSWORD = "password"; - String PRIORITY = "priority"; - String CAPTCHA_IMAGE = "captcha"; - /** - * Request Parameters - */ - String CLIENT_ID = "client_id"; - String CLIENT_SECRET = "client_secret"; - String RESPONSE_TYPE = "response_type"; - - String ACCESS_TOKEN = KName.ACCESS_TOKEN; - String REFRESH_TOKEN = "refresh_token"; - String IAT = "iat"; - /** - * Pojo Field - */ - String F_USER_ID = "userId"; - String F_ROLE_ID = "roleId"; - String F_GROUP_ID = "groupId"; - String F_PARENT_ID = "parentId"; - - String F_CLIENT_ID = "clientId"; - String F_CLIENT_SECRET = "clientSecret"; - String F_GRANT_TYPE = "grantType"; - - /** - * Authorization Workflow - */ - String F_URI = "uri"; - String F_URI_REQUEST = "requestUri"; - String F_METHOD = "method"; - String F_METADATA = "metadata"; - String F_HEADERS = "headers"; - - /** - * Could not configure authorization pool - */ - String PROFILE_PERM = "PERM"; - String PROFILE_ROLE = "ROLE"; - - interface Acl { - /* - * Five constant for checking - */ - String BEFORE_PROJECTION = "BEFORE_PROJECTION"; - String BEFORE_CRITERIA = "BEFORE_CRITERIA"; - String AFTER_RECORD = "AFTER_RECORD"; - String AFTER_ROWS = "AFTER_ROWS"; - String AFTER_COLLECTION = "AFTER_COLLECTION"; - } -} +package io.zerows.extension.commerce.rbac.eon; + +import io.vertx.up.eon.KName; + +public interface AuthKey { + /** + * Default state field + */ + String INITIALIZE_ROLE = "initializeRole"; + String INITIALIZE_PERMISSIONS = "initializePermissions"; + String DEFAULT_RESOURCE_ID = "91a78ce8-30c7-4894-b235-730eb3e61255"; + String PERMISSIONS = "permissions"; + + String DEFAULT = "DEFAULT"; + String OWNER_TYPE_ROLE = "ROLE"; + String STATE = "state"; + String SCOPE = "scope"; + String AUTH_CODE = "code"; + + String USER_NAME = "username"; + String PASSWORD = "password"; + String PRIORITY = "priority"; + String CAPTCHA_IMAGE = "captcha"; + /** + * Request Parameters + */ + String CLIENT_ID = "client_id"; + String CLIENT_SECRET = "client_secret"; + String RESPONSE_TYPE = "response_type"; + + String ACCESS_TOKEN = KName.ACCESS_TOKEN; + String REFRESH_TOKEN = "refresh_token"; + String IAT = "iat"; + /** + * Pojo Field + */ + String F_USER_ID = "userId"; + String F_ROLE_ID = "roleId"; + String F_PERM_ID = "permId"; + String F_GROUP_ID = "groupId"; + String F_PARENT_ID = "parentId"; + + String F_CLIENT_ID = "clientId"; + String F_CLIENT_SECRET = "clientSecret"; + String F_GRANT_TYPE = "grantType"; + + /** + * Authorization Workflow + */ + String F_URI = "uri"; + String F_URI_REQUEST = "requestUri"; + String F_METHOD = "method"; + String F_METADATA = "metadata"; + String F_HEADERS = "headers"; + + /** + * Could not configure authorization pool + */ + String PROFILE_PERM = "PERM"; + String PROFILE_ROLE = "ROLE"; + + interface Acl { + /* + * Five constant for checking + */ + String BEFORE_PROJECTION = "BEFORE_PROJECTION"; + String BEFORE_CRITERIA = "BEFORE_CRITERIA"; + String AFTER_RECORD = "AFTER_RECORD"; + String AFTER_ROWS = "AFTER_ROWS"; + String AFTER_COLLECTION = "AFTER_COLLECTION"; + } +} diff --git a/Zero.Extension.MBSE.Modulat.DB/src/main/java/io/zerows/extension/mbse/modulat/agent/service/BagArgService.java b/Zero.Extension.MBSE.Modulat.DB/src/main/java/io/zerows/extension/mbse/modulat/agent/service/BagArgService.java index f98bfdbec3071f20892f88d7578f4b4232e7a36b..c9c51a52ce6db2ea0611f0d8e55e39c658b62269 100644 --- a/Zero.Extension.MBSE.Modulat.DB/src/main/java/io/zerows/extension/mbse/modulat/agent/service/BagArgService.java +++ b/Zero.Extension.MBSE.Modulat.DB/src/main/java/io/zerows/extension/mbse/modulat/agent/service/BagArgService.java @@ -1,127 +1,131 @@ -package io.zerows.extension.mbse.modulat.agent.service; - -import io.vertx.core.Future; -import io.vertx.core.json.JsonObject; -import io.vertx.up.eon.KName; -import io.vertx.up.fn.Fn; -import io.vertx.up.unity.Ux; -import io.vertx.up.util.Ut; -import io.zerows.core.feature.database.jooq.operation.UxJooq; -import io.zerows.extension.mbse.modulat.atom.PowerApp; -import io.zerows.extension.mbse.modulat.domain.tables.daos.BBagDao; -import io.zerows.extension.mbse.modulat.domain.tables.daos.BBlockDao; -import io.zerows.extension.mbse.modulat.domain.tables.pojos.BBag; -import io.zerows.extension.mbse.modulat.domain.tables.pojos.BBlock; -import io.zerows.extension.mbse.modulat.uca.configure.Combiner; - -import java.util.List; -import java.util.Objects; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -/** - * @author Lang - */ -@SuppressWarnings("all") -public class BagArgService implements BagArgStub { - private static final ConcurrentMap POOL_COMBINER = new ConcurrentHashMap<>(); - - @Override - public Future fetchBagConfig(final String bagAbbr) { - Objects.requireNonNull(bagAbbr); - final JsonObject condition = Ux.whereAnd("nameAbbr", bagAbbr); - final UxJooq jq = Ux.Jooq.on(BBagDao.class); - return jq.fetchOneAsync(condition).compose(bag -> { - /* Check if root by parentId */ - if (Objects.isNull(bag)) { - return Ux.futureJ(); - } - if (Objects.isNull(bag.getParentId())) { - /* Multi Bag Information */ - final JsonObject criteria = Ux.whereAnd(); - criteria.put(KName.PARENT_ID, bag.getKey()); - criteria.put(KName.ACTIVE, Boolean.TRUE); - return jq.fetchAsync(criteria).compose(query -> { - final ConcurrentMap map = Ut.elementMap(query, BBag::getNameAbbr); - final Combiner> combiner = Combiner.forBag(); - return combiner.configure(bag, map); - }); - } else { - /* Single Bag Information */ - final JsonObject response = Ut.toJObject(bag.getUiConfig()); - final Combiner combiner = Combiner.outBag(); - return combiner.configure(response, bag); - } - }); - } - - @Override - public Future fetchBag(final String bagAbbr) { - Objects.requireNonNull(bagAbbr); - final JsonObject condition = Ux.whereAnd("nameAbbr", bagAbbr); - return Ux.Jooq.on(BBagDao.class).fetchOneAsync(condition).compose(bag -> { - if (Objects.isNull(bag)) { - return Ux.futureJ(); - } - return this.seekBlocks(bag).compose(blocks -> { - final Combiner> combiner = Combiner.forBlock(); - return combiner.configure(bag, blocks); - }); - }); - } - - - @Override - public Future saveBag(final String bagId, final JsonObject data) { - Objects.requireNonNull(bagId); - return Ux.Jooq.on(BBagDao.class).fetchByIdAsync(bagId) - // Cache Processing - .compose(Fn.ofJObject(bag -> this.saveConfigure(bag, data))); - } - - @Override - public Future saveBagBy(String nameAbbr, JsonObject data) { - Objects.requireNonNull(nameAbbr); - return Ux.Jooq.on(BBagDao.class).fetchOneAsync("nameAbbr", nameAbbr) - // Cache Processing - .compose(Fn.ofJObject(bag -> this.saveConfigure(bag, data))); - } - - private Future saveConfigure(final BBag bag, final JsonObject data) { - // Cache flush - final BlockStub blockStub = Ut.singleton(BlockService.class); - return this.seekBlocks(bag) - // Parameters Store Code Logical - .compose(blocks -> blockStub.saveParameters(blocks, data)) - // Refresh Cache of appId - .compose(config -> PowerApp.getLatest(bag.getAppId()) - .compose(nil -> Ux.future(config))); - } - - @Override - public Future> seekBlocks(final BBag input) { - return Ux.future(input).compose(bag -> { - final JsonObject condition = Ux.whereAnd(); - if (Objects.isNull(bag.getParentId())) { - final JsonObject criteria = Ux.whereAnd(); - criteria.put(KName.PARENT_ID, bag.getKey()); - criteria.put(KName.ACTIVE, Boolean.TRUE); - return Ux.Jooq.on(BBagDao.class).fetchAsync(criteria).compose(bags -> { - final Set keys = Ut.elementSet(bags, BBag::getKey); - condition.put(KName.App.BAG_ID + ",i", Ut.toJArray(keys)); - return Ux.future(condition); - }); - } else { - condition.put(KName.App.BAG_ID, bag.getKey()); - return Ux.future(condition); - } - }).compose(condition -> { - if (Objects.isNull(condition)) { - return Ux.futureL(); - } else { - return Ux.Jooq.on(BBlockDao.class).fetchAsync(condition); - } - }); - } -} +package io.zerows.extension.mbse.modulat.agent.service; + +import io.vertx.core.Future; +import io.vertx.core.json.JsonObject; +import io.vertx.up.eon.KName; +import io.vertx.up.fn.Fn; +import io.vertx.up.unity.Ux; +import io.vertx.up.util.Ut; +import io.zerows.core.feature.database.jooq.operation.UxJooq; +import io.zerows.core.feature.web.cache.Rapid; +import io.zerows.extension.mbse.modulat.atom.PowerApp; +import io.zerows.extension.mbse.modulat.domain.tables.daos.BBagDao; +import io.zerows.extension.mbse.modulat.domain.tables.daos.BBlockDao; +import io.zerows.extension.mbse.modulat.domain.tables.pojos.BBag; +import io.zerows.extension.mbse.modulat.domain.tables.pojos.BBlock; +import io.zerows.extension.mbse.modulat.uca.configure.Combiner; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * @author Lang + */ +@SuppressWarnings("all") +public class BagArgService implements BagArgStub { + private static final ConcurrentMap POOL_COMBINER = new ConcurrentHashMap<>(); + private static final Rapid TIME_CACHE = Rapid.object("fmTimeCache"); + + + @Override + public Future fetchBagConfig(final String bagAbbr) { + Objects.requireNonNull(bagAbbr); + final JsonObject condition = Ux.whereAnd("nameAbbr", bagAbbr); + final UxJooq jq = Ux.Jooq.on(BBagDao.class); + return jq.fetchOneAsync(condition).compose(bag -> { + /* Check if root by parentId */ + if (Objects.isNull(bag)) { + return Ux.futureJ(); + } + if (Objects.isNull(bag.getParentId())) { + /* Multi Bag Information */ + final JsonObject criteria = Ux.whereAnd(); + criteria.put(KName.PARENT_ID, bag.getKey()); + criteria.put(KName.ACTIVE, Boolean.TRUE); + return jq.fetchAsync(criteria).compose(query -> { + final ConcurrentMap map = Ut.elementMap(query, BBag::getNameAbbr); + final Combiner> combiner = Combiner.forBag(); + return combiner.configure(bag, map); + }); + } else { + /* Single Bag Information */ + final JsonObject response = Ut.toJObject(bag.getUiConfig()); + final Combiner combiner = Combiner.outBag(); + return combiner.configure(response, bag); + } + }); + } + + @Override + public Future fetchBag(final String bagAbbr) { + Objects.requireNonNull(bagAbbr); + final JsonObject condition = Ux.whereAnd("nameAbbr", bagAbbr); + return Ux.Jooq.on(BBagDao.class).fetchOneAsync(condition).compose(bag -> { + if (Objects.isNull(bag)) { + return Ux.futureJ(); + } + return this.seekBlocks(bag).compose(blocks -> { + final Combiner> combiner = Combiner.forBlock(); + return combiner.configure(bag, blocks); + }); + }); + } + + + @Override + public Future saveBag(final String bagId, final JsonObject data) { + Objects.requireNonNull(bagId); + return Ux.Jooq.on(BBagDao.class).fetchByIdAsync(bagId) + // Cache Processing + .compose(Fn.ofJObject(bag -> this.saveConfigure(bag, data))); + } + + @Override + public Future saveBagBy(String nameAbbr, JsonObject data) { + Objects.requireNonNull(nameAbbr); + return Ux.Jooq.on(BBagDao.class).fetchOneAsync("nameAbbr", nameAbbr) + // Cache Processing + .compose(Fn.ofJObject(bag -> this.saveConfigure(bag, data))); + } + + private Future saveConfigure(final BBag bag, final JsonObject data) { + // Cache flush + final BlockStub blockStub = Ut.singleton(BlockService.class); + return this.seekBlocks(bag) + // Parameters Store Code Logical + .compose(blocks -> blockStub.saveParameters(blocks, data)) + // Refresh Cache of appId + .compose(config -> PowerApp.getLatest(bag.getAppId(),true) + .compose(nil -> Ux.future(config))); + } + + @Override + public Future> seekBlocks(final BBag input) { + return Ux.future(input).compose(bag -> { + final JsonObject condition = Ux.whereAnd(); + if (Objects.isNull(bag.getParentId())) { + final JsonObject criteria = Ux.whereAnd(); + criteria.put(KName.PARENT_ID, bag.getKey()); + criteria.put(KName.ACTIVE, Boolean.TRUE); + return Ux.Jooq.on(BBagDao.class).fetchAsync(criteria).compose(bags -> { + final Set keys = Ut.elementSet(bags, BBag::getKey); + condition.put(KName.App.BAG_ID + ",i", Ut.toJArray(keys)); + return Ux.future(condition); + }); + } else { + condition.put(KName.App.BAG_ID, bag.getKey()); + return Ux.future(condition); + } + }).compose(condition -> { + if (Objects.isNull(condition)) { + return Ux.futureL(); + } else { + return Ux.Jooq.on(BBlockDao.class).fetchAsync(condition); + } + }); + } +} diff --git a/Zero.Extension.MBSE.Modulat.DB/src/main/java/io/zerows/extension/mbse/modulat/atom/PowerApp.java b/Zero.Extension.MBSE.Modulat.DB/src/main/java/io/zerows/extension/mbse/modulat/atom/PowerApp.java index b6766fc6f27086f74d07adffd2a14c73b7699f13..05e5f94bc8193197393a76a94eef6e9fa3bd6a9b 100644 --- a/Zero.Extension.MBSE.Modulat.DB/src/main/java/io/zerows/extension/mbse/modulat/atom/PowerApp.java +++ b/Zero.Extension.MBSE.Modulat.DB/src/main/java/io/zerows/extension/mbse/modulat/atom/PowerApp.java @@ -1,71 +1,75 @@ -package io.zerows.extension.mbse.modulat.atom; - -import io.horizon.uca.cache.Cc; -import io.macrocosm.specification.app.HMod; -import io.vertx.core.Future; -import io.vertx.core.json.JsonObject; -import io.vertx.up.eon.KName; -import io.vertx.up.unity.Ux; -import io.vertx.up.util.Ut; -import io.zerows.extension.mbse.modulat.store.OCacheMod; -import io.zerows.extension.runtime.skeleton.osgi.spi.modeler.Modulat; - -import java.util.Objects; - -/** - * 新版去掉原来繁琐的流程,构造新流程处理 - *

- *     1. 根据 appId 从环境中提取 {@link OCacheMod} 的缓存信息
- *     2. 每个缓存信息中都会包含 mName = {@link HMod} 的基本信息
- * 
- * - * @author lang : 2024-07-08 - */ -public class PowerApp { - - private static final Cc> CC_APP = Cc.open(); - private final OCacheMod modReference; - - public PowerApp(final String appId) { - // 抓取应用关键的引用 - this.modReference = OCacheMod.of(appId); - } - - public static Future getOrCreate(final String appId) { - Objects.requireNonNull(appId); - return CC_APP.pick(() -> Ux.channel(Modulat.class, JsonObject::new, modulat -> modulat.extension(appId)).compose(storedJ -> { - final String configApp = Ut.valueString(storedJ, KName.KEY); - if (appId.equals(configApp)) { - // 抓取应用相关的 HMod 缓存 - final PowerApp app = new PowerApp(appId); - - - /* - * 移除 bags / key - */ - final JsonObject configAppJ = storedJ.copy(); - configAppJ.remove(KName.KEY); - configAppJ.remove(KName.App.BAGS); - Ut.itJObject(configAppJ, JsonObject.class) - .map(entry -> new PowerMod(entry.getKey(), entry.getValue())) - .forEach(app::add); - return Ux.future(app); - } - return Ux.future(null); - }), appId); - } - - public static Future getLatest(final String appId) { - CC_APP.remove(appId); - return getOrCreate(appId); - } - - public PowerApp add(final HMod mod) { - this.modReference.add(mod); - return this; - } - - public HMod block(final String name) { - return this.modReference.valueGet(name); - } -} +package io.zerows.extension.mbse.modulat.atom; + +import io.horizon.uca.cache.Cc; +import io.macrocosm.specification.app.HMod; +import io.vertx.core.Future; +import io.vertx.core.json.JsonObject; +import io.vertx.up.eon.KName; +import io.vertx.up.unity.Ux; +import io.vertx.up.util.Ut; +import io.zerows.core.feature.web.cache.Rapid; +import io.zerows.extension.mbse.modulat.store.OCacheMod; +import io.zerows.extension.runtime.skeleton.osgi.spi.modeler.Modulat; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.Objects; + +/** + * 新版去掉原来繁琐的流程,构造新流程处理 + *

+ *     1. 根据 appId 从环境中提取 {@link OCacheMod} 的缓存信息
+ *     2. 每个缓存信息中都会包含 mName = {@link HMod} 的基本信息
+ * 
+ * + * @author lang : 2024-07-08 + */ +public class PowerApp { + + private static final Cc> CC_APP = Cc.open(); + private final OCacheMod modReference; + + public PowerApp(final String appId) { + // 抓取应用关键的引用 + this.modReference = OCacheMod.of(appId); + } + + public static Future getOrCreate(final String appId,boolean open) { + Objects.requireNonNull(appId); + return CC_APP.pick(() -> Ux.channel(Modulat.class, JsonObject::new, modulat -> modulat.extension(appId,open)).compose(storedJ -> { + final String configApp = Ut.valueString(storedJ, KName.KEY); + if (appId.equals(configApp)) { + // 抓取应用相关的 HMod 缓存 + final PowerApp app = new PowerApp(appId); + + + /* + * 移除 bags / key + */ + final JsonObject configAppJ = storedJ.copy(); + configAppJ.remove(KName.KEY); + configAppJ.remove(KName.App.BAGS); + Ut.itJObject(configAppJ, JsonObject.class) + .map(entry -> new PowerMod(entry.getKey(), entry.getValue())) + .forEach(app::add); + return Ux.future(app); + } + return Ux.future(null); + }), appId); + } + + public static Future getLatest(final String appId,boolean open) { + CC_APP.remove(appId); + return getOrCreate(appId,open); + } + + public PowerApp add(final HMod mod) { + this.modReference.add(mod); + return this; + } + + public HMod block(final String name) { + return this.modReference.valueGet(name); + } +} diff --git a/Zero.Extension.MBSE.Modulat.DB/src/main/java/io/zerows/extension/mbse/modulat/uca/dock/ArkConfigure.java b/Zero.Extension.MBSE.Modulat.DB/src/main/java/io/zerows/extension/mbse/modulat/uca/dock/ArkConfigure.java index 9f0d1889c446d108c80147f305d2a763a55486c5..ae3214113a03347faa840f2ccffa98a40c93bc12 100644 --- a/Zero.Extension.MBSE.Modulat.DB/src/main/java/io/zerows/extension/mbse/modulat/uca/dock/ArkConfigure.java +++ b/Zero.Extension.MBSE.Modulat.DB/src/main/java/io/zerows/extension/mbse/modulat/uca/dock/ArkConfigure.java @@ -1,105 +1,103 @@ -package io.zerows.extension.mbse.modulat.uca.dock; - -import io.horizon.uca.cache.Cc; -import io.modello.eon.em.EmModel; -import io.vertx.core.Future; -import io.vertx.core.json.JsonArray; -import io.vertx.core.json.JsonObject; -import io.vertx.core.shareddata.ClusterSerializable; -import io.vertx.up.eon.KName; -import io.vertx.up.fn.Fn; -import io.vertx.up.unity.Ux; -import io.vertx.up.util.Ut; -import io.zerows.extension.mbse.modulat.domain.tables.daos.BBagDao; -import io.zerows.extension.mbse.modulat.domain.tables.pojos.BBag; - -import java.util.List; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -import static io.zerows.extension.mbse.modulat.util.Bk.LOG; - -class ArkConfigure extends AbstractArk { - - /* - * 该方法会提取应用存储专用的配置信息,该配置信息会被存储到 B_BLOCK 表中,开发中心可修订 - * 配置程序,如: - * { - * "store": "mXXX" - * } - * 格式,最终使用时用 - * mXXX = configuration - * 的 JSON 格式 - * - * 输入的格式 - */ - private static final Cc> ASYNC_BAG_ADMIN = Cc.openA(); - - @Override - public Future modularize(final String appId, - final boolean open, - final EmModel.By by) { - if (open) { - // open = true,跳过缓存 - return this.modularizeInternal(appId, true, by).compose(Ux::future); - } - // open = false,启用缓存 - return ASYNC_BAG_ADMIN.pick( - () -> this.modularizeInternal(appId, false, by), appId) - .compose(Ux::future); - } - - private Future modularizeInternal(final String appId, - final boolean open, - final EmModel.By by) { - final JsonObject condition = this.buildQr(appId, by); - /* - * 新路由中,BAG直接提取 EXTENSION 类型的模型即可 - * parentId __ NULL 在旧版本中是可行的,旧版本没有入口根包的概念 - * 新版本中多了入口根包概念,所以就不可以使用这个条件了,否则会导致BLOCK - * 为空。 - */ - condition.put(KName.PARENT_ID + ",n", null); - LOG.Spi.info(this.getClass(), "Modulat condition = {0}", condition.encode()); - return Ux.Jooq.on(BBagDao.class).fetchAsync(condition) - .compose(bags -> this.configureOut(bags, open)); - } - - private Future configureOut(final List bags, final boolean open) { - final ConcurrentMap> futures = new ConcurrentHashMap<>(); - // open = true 的时候要开放 - final ConcurrentMap> openMap = new ConcurrentHashMap<>(); - bags.forEach(bag -> { - final JsonObject uiConfig = Ut.toJObject(bag.getUiConfig()); - final String configKey = Ut.valueString(uiConfig, KName.STORE); - final JsonArray openField = Ut.valueJArray(uiConfig, "open"); - if (Ut.isNotNil(openField)) { - openMap.put(configKey, Ut.toSet(openField)); - } - if (Ut.isNotNil(configKey)) { - futures.put(configKey, this.configureBag(bag)); - } - }); - return Fn.combineM(futures).compose(dataMap -> { - if (!open) { - final JsonObject rapidJ = Ut.toJObject(dataMap); - return Ux.future(rapidJ); - } - - - // 带过滤的模式 - final JsonObject result = new JsonObject(); - dataMap.forEach((configKey, data) -> { - // 如果开放则必须使用开放配置来做参数 - if (openMap.containsKey(configKey)) { - // 过滤 - final Set fieldSet = openMap.get(configKey); - final JsonObject filtered = Ut.elementSubset(data, fieldSet); - result.put(configKey, filtered); - } - }); - return Ux.future(result); - }); - } -} +package io.zerows.extension.mbse.modulat.uca.dock; + +import io.horizon.uca.cache.Cc; +import io.modello.eon.em.EmModel; +import io.vertx.core.Future; +import io.vertx.core.json.JsonArray; +import io.vertx.core.json.JsonObject; +import io.vertx.core.shareddata.ClusterSerializable; +import io.vertx.up.eon.KName; +import io.vertx.up.fn.Fn; +import io.vertx.up.unity.Ux; +import io.vertx.up.util.Ut; +import io.zerows.extension.mbse.modulat.domain.tables.daos.BBagDao; +import io.zerows.extension.mbse.modulat.domain.tables.pojos.BBag; + +import java.util.List; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +import static io.zerows.extension.mbse.modulat.util.Bk.LOG; + +class ArkConfigure extends AbstractArk { + + /* + * 该方法会提取应用存储专用的配置信息,该配置信息会被存储到 B_BLOCK 表中,开发中心可修订 + * 配置程序,如: + * { + * "store": "mXXX" + * } + * 格式,最终使用时用 + * mXXX = configuration + * 的 JSON 格式 + * + * 输入的格式 + */ + private static final Cc> ASYNC_BAG_ADMIN = Cc.openA(); + + @Override + public Future modularize(final String appId, + final boolean open, + final EmModel.By by) { + if (open) { + // open = true,跳过缓存 + return this.modularizeInternal(appId, true, by).compose(Ux::future); + } + // open = false,启用缓存 + return ASYNC_BAG_ADMIN.pick( + () -> this.modularizeInternal(appId, false, by), appId) + .compose(Ux::future); + } + + private Future modularizeInternal(final String appId, + final boolean open, + final EmModel.By by) { + final JsonObject condition = this.buildQr(appId, by); + /* + * 新路由中,BAG直接提取 EXTENSION 类型的模型即可 + * parentId __ NULL 在旧版本中是可行的,旧版本没有入口根包的概念 + * 新版本中多了入口根包概念,所以就不可以使用这个条件了,否则会导致BLOCK + * 为空。 + */ + condition.put(KName.PARENT_ID + ",n", null); + LOG.Spi.info(this.getClass(), "Modulat condition = {0}", condition.encode()); + return Ux.Jooq.on(BBagDao.class).fetchAsync(condition) + .compose(bags -> this.configureOut(bags, open)); + } + + private Future configureOut(final List bags, final boolean open) { + final ConcurrentMap> futures = new ConcurrentHashMap<>(); + // open = true 的时候要开放 + final ConcurrentMap> openMap = new ConcurrentHashMap<>(); + bags.forEach(bag -> { + final JsonObject uiConfig = Ut.toJObject(bag.getUiConfig()); + final String configKey = Ut.valueString(uiConfig, KName.STORE); + final JsonArray openField = Ut.valueJArray(uiConfig, "open"); + if (Ut.isNotNil(openField)) { + openMap.put(configKey, Ut.toSet(openField)); + } + if (Ut.isNotNil(configKey)) { + futures.put(configKey, this.configureBag(bag)); + } + }); + return Fn.combineM(futures).compose(dataMap -> { + if (open) { + final JsonObject rapidJ = Ut.toJObject(dataMap); + return Ux.future(rapidJ); + } + // 带过滤的模式 + final JsonObject result = new JsonObject(); + dataMap.forEach((configKey, data) -> { + // 如果开放则必须使用开放配置来做参数 + if (openMap.containsKey(configKey)) { + // 过滤 + final Set fieldSet = openMap.get(configKey); + final JsonObject filtered = Ut.elementSubset(data, fieldSet); + result.put(configKey, filtered); + } + }); + return Ux.future(result); + }); + } +} diff --git a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/api/service/ReportService.java b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/api/service/ReportService.java index efbf0dd3bd09fa7a24fcea859c34ddab4d80fe23..c9b822187a2ef3ffb0035fe024aace5bee351960 100644 --- a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/api/service/ReportService.java +++ b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/api/service/ReportService.java @@ -1,180 +1,184 @@ -package io.zerows.extension.runtime.report.api.service; - -import io.horizon.atom.program.KRef; -import io.vertx.core.Future; -import io.vertx.core.json.JsonArray; -import io.vertx.core.json.JsonObject; -import io.vertx.up.eon.KName; -import io.vertx.up.fn.Fn; -import io.vertx.up.unity.Ux; -import io.vertx.up.util.Ut; -import io.zerows.extension.runtime.report.atom.RDimension; -import io.zerows.extension.runtime.report.atom.RGeneration; -import io.zerows.extension.runtime.report.domain.tables.daos.KpDataSetDao; -import io.zerows.extension.runtime.report.domain.tables.daos.KpDimensionDao; -import io.zerows.extension.runtime.report.domain.tables.daos.KpFeatureDao; -import io.zerows.extension.runtime.report.domain.tables.daos.KpReportDao; -import io.zerows.extension.runtime.report.domain.tables.pojos.KpDataSet; -import io.zerows.extension.runtime.report.domain.tables.pojos.KpDimension; -import io.zerows.extension.runtime.report.domain.tables.pojos.KpFeature; -import io.zerows.extension.runtime.report.domain.tables.pojos.KpReport; -import io.zerows.extension.runtime.report.eon.em.EmReport; -import io.zerows.extension.runtime.report.exception._400ReportDataSetException; -import io.zerows.extension.runtime.report.exception._404ReportMissingException; -import io.zerows.extension.runtime.report.uca.process.DimProc; -import io.zerows.extension.runtime.report.uca.pull.DataSet; -import jakarta.inject.Inject; - -import java.util.List; -import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -/** - * @author lang : 2024-10-08 - */ -public class ReportService implements ReportStub { - @Inject - private ReportInstanceStub instanceStub; - - @Override - public Future fetchReports(final String appId) { - final JsonObject qr = Ux.whereAnd(); - qr.put(KName.APP_ID, appId); - qr.put(KName.ACTIVE, Boolean.TRUE); - return Ux.Jooq.on(KpReportDao.class).fetchJAndAsync(qr); - } - - @Override - public Future buildInstance(final String reportId, final JsonObject params) { - return Ux.Jooq.on(KpReportDao.class).fetchByIdAsync(reportId) - .compose(report -> { - if (Objects.isNull(report)) { - // ERR-80701 - return Ut.Bnd.failOut(_404ReportMissingException.class, this.getClass(), reportId); - } - // 配置构造 - return this.buildGeneration(report, params); - }) - .compose(generation -> { - // 维度数据源 - final KpReport report = generation.reportMeta(); - return this.buildData(report, params) - // 实例生成 - .compose(data -> this.instanceStub.buildAsync(data, params, generation)); - }) - .compose(Ux::futureJ) - .compose(Fn.ofJObject( - "reportData", - "reportContent" - )); - } - - /** - * 读取主数据源 - * - * @param report 报表定义 - * @param params 参数 - * - * @return 数据源 - */ - @Override - public Future buildData(final KpReport report, final JsonObject params) { - final String reportId = report.getKey(); - final String dsId = report.getDataSetId(); - if (Ut.isNil(dsId)) { - // ERR-80702 - return Ut.Bnd.failOut(_400ReportDataSetException.class, this.getClass(), reportId); - } - return Ux.Jooq.on(KpDataSetDao.class).fetchByIdAsync(dsId).compose(dataSet -> { - if (Objects.isNull(dataSet)) { - // ERR-80702 - return Ut.Bnd.failOut(_400ReportDataSetException.class, this.getClass(), reportId); - } - - return DataSet.Tool.outputArray(params, dataSet); - }); - } - - - // -------------- 维度部分 --------------- - @Override - public Future buildGeneration(final KpReport report, final JsonObject params) { - final RGeneration refGen = new RGeneration(); - final KRef futureList = new KRef(); - // 主报表 - return Ux.future(report).compose(refGen::reportMeta) - // 维度处理 - .compose(processed -> this.reportOfDim(processed, params)).compose(refGen::dimension) - // 全特征提取 - .compose(dimensions -> this.featureOfAll(report)).compose(futureList::future) - // 属性特征 - .compose(nil -> this.featureOfDim(report, futureList.get()).compose(refGen::featureData)) - // 全局特征 - .compose(nil -> this.featureOfGlobal(futureList.get())).compose(refGen::featureGlobal) - // 返回结果 - .compose(nil -> Ux.future(refGen)); - } - - - private Future> featureOfGlobal(final List featureList) { - final ConcurrentMap featureGlobal = new ConcurrentHashMap<>(); - featureList.stream().filter(item -> { - final EmReport.FeatureType featureType = Ut.toEnum(item.getType(), EmReport.FeatureType.class, null); - if (Objects.isNull(featureType)) { - return false; - } - return EmReport.FeatureType.GLOBAL == featureType; - }).forEach(feature -> featureGlobal.put(feature.getName(), feature)); - return Ux.future(featureGlobal); - } - - /** - * 特征提取 - * - * @param report 报表定义 - * - * @return 返回列表 - */ - private Future> featureOfAll(final KpReport report) { - final JsonObject whereJ = Ux.whereAnd(); - whereJ.put("reportId", report.getKey()); - return Ux.Jooq.on(KpFeatureDao.class).fetchAsync(whereJ); - } - - private Future> featureOfDim(final KpReport report, final List featureList) { - final JsonObject reportConfig = Ut.toJObject(report.getReportConfig()); - final JsonArray featureA = Ut.valueJArray(reportConfig, "feature"); - final ConcurrentMap featureMap = Ut.elementMap(featureList, KpFeature::getName); - Ut.itJArray(featureA, String.class).forEach(featureName -> { - if (!featureMap.containsKey(featureName)) { - final KpFeature feature = featureMap.getOrDefault(featureName, null); - if (Objects.nonNull(feature)) { - featureList.add(feature); - } - } - }); - return Ux.future(featureList); - } - - - /** - * 维度处理 - * - * @param report 报表定义 - * @param params 参 - * - * @return 返回 Map - */ - private Future> reportOfDim(final KpReport report, final JsonObject params) { - final JsonObject whereJ = Ux.whereAnd(); - whereJ.put("reportId", report.getKey()); - return Ux.Jooq.on(KpDimensionDao.class).fetchAsync(whereJ).compose(dimensions -> { - final DimProc processor = DimProc.of(); - return processor.dimAsync(params, dimensions); - }).compose(dimensions -> { - final ConcurrentMap result = Ut.elementMap(dimensions, RDimension::key); - return Ux.future(result); - }); - } -} +package io.zerows.extension.runtime.report.api.service; + +import io.horizon.atom.program.KRef; +import io.vertx.core.Future; +import io.vertx.core.json.JsonArray; +import io.vertx.core.json.JsonObject; +import io.vertx.up.eon.KName; +import io.vertx.up.fn.Fn; +import io.vertx.up.unity.Ux; +import io.vertx.up.util.Ut; +import io.zerows.extension.runtime.report.atom.RDimension; +import io.zerows.extension.runtime.report.atom.RGeneration; +import io.zerows.extension.runtime.report.domain.tables.daos.KpDataSetDao; +import io.zerows.extension.runtime.report.domain.tables.daos.KpDimensionDao; +import io.zerows.extension.runtime.report.domain.tables.daos.KpFeatureDao; +import io.zerows.extension.runtime.report.domain.tables.daos.KpReportDao; +import io.zerows.extension.runtime.report.domain.tables.pojos.KpDataSet; +import io.zerows.extension.runtime.report.domain.tables.pojos.KpDimension; +import io.zerows.extension.runtime.report.domain.tables.pojos.KpFeature; +import io.zerows.extension.runtime.report.domain.tables.pojos.KpReport; +import io.zerows.extension.runtime.report.eon.em.EmReport; +import io.zerows.extension.runtime.report.exception._400ReportDataSetException; +import io.zerows.extension.runtime.report.exception._404ReportMissingException; +import io.zerows.extension.runtime.report.uca.process.DimProc; +import io.zerows.extension.runtime.report.uca.pull.DataSet; +import jakarta.inject.Inject; + +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +/** + * @author lang : 2024-10-08 + */ +public class ReportService implements ReportStub { + @Inject + private ReportInstanceStub instanceStub; + + public void setInstanceStub(ReportInstanceStub instanceStub) { + this.instanceStub = instanceStub; + } + + @Override + public Future fetchReports(final String appId) { + final JsonObject qr = Ux.whereAnd(); + qr.put(KName.APP_ID, appId); + qr.put(KName.ACTIVE, Boolean.TRUE); + return Ux.Jooq.on(KpReportDao.class).fetchJAndAsync(qr); + } + + @Override + public Future buildInstance(final String reportId, final JsonObject params) { + return Ux.Jooq.on(KpReportDao.class).fetchByIdAsync(reportId) + .compose(report -> { + if (Objects.isNull(report)) { + // ERR-80701 + return Ut.Bnd.failOut(_404ReportMissingException.class, this.getClass(), reportId); + } + // 配置构造 + return this.buildGeneration(report, params); + }) + .compose(generation -> { + // 维度数据源 + final KpReport report = generation.reportMeta(); + return this.buildData(report, params) + // 实例生成 + .compose(data -> this.instanceStub.buildAsync(data, params, generation)); + }) + .compose(Ux::futureJ) + .compose(Fn.ofJObject( + "reportData", + "reportContent" + )); + } + + /** + * 读取主数据源 + * + * @param report 报表定义 + * @param params 参数 + * + * @return 数据源 + */ + @Override + public Future buildData(final KpReport report, final JsonObject params) { + final String reportId = report.getKey(); + final String dsId = report.getDataSetId(); + if (Ut.isNil(dsId)) { + // ERR-80702 + return Ut.Bnd.failOut(_400ReportDataSetException.class, this.getClass(), reportId); + } + return Ux.Jooq.on(KpDataSetDao.class).fetchByIdAsync(dsId).compose(dataSet -> { + if (Objects.isNull(dataSet)) { + // ERR-80702 + return Ut.Bnd.failOut(_400ReportDataSetException.class, this.getClass(), reportId); + } + + return DataSet.Tool.outputArray(params, dataSet); + }); + } + + + // -------------- 维度部分 --------------- + @Override + public Future buildGeneration(final KpReport report, final JsonObject params) { + final RGeneration refGen = new RGeneration(); + final KRef futureList = new KRef(); + // 主报表 + return Ux.future(report).compose(refGen::reportMeta) + // 维度处理 + .compose(processed -> this.reportOfDim(processed, params)).compose(refGen::dimension) + // 全特征提取 + .compose(dimensions -> this.featureOfAll(report)).compose(futureList::future) + // 属性特征 + .compose(nil -> this.featureOfDim(report, futureList.get()).compose(refGen::featureData)) + // 全局特征 + .compose(nil -> this.featureOfGlobal(futureList.get())).compose(refGen::featureGlobal) + // 返回结果 + .compose(nil -> Ux.future(refGen)); + } + + + private Future> featureOfGlobal(final List featureList) { + final ConcurrentMap featureGlobal = new ConcurrentHashMap<>(); + featureList.stream().filter(item -> { + final EmReport.FeatureType featureType = Ut.toEnum(item.getType(), EmReport.FeatureType.class, null); + if (Objects.isNull(featureType)) { + return false; + } + return EmReport.FeatureType.GLOBAL == featureType; + }).forEach(feature -> featureGlobal.put(feature.getName(), feature)); + return Ux.future(featureGlobal); + } + + /** + * 特征提取 + * + * @param report 报表定义 + * + * @return 返回列表 + */ + private Future> featureOfAll(final KpReport report) { + final JsonObject whereJ = Ux.whereAnd(); + whereJ.put("reportId", report.getKey()); + return Ux.Jooq.on(KpFeatureDao.class).fetchAsync(whereJ); + } + + private Future> featureOfDim(final KpReport report, final List featureList) { + final JsonObject reportConfig = Ut.toJObject(report.getReportConfig()); + final JsonArray featureA = Ut.valueJArray(reportConfig, "feature"); + final ConcurrentMap featureMap = Ut.elementMap(featureList, KpFeature::getName); + Ut.itJArray(featureA, String.class).forEach(featureName -> { + if (!featureMap.containsKey(featureName)) { + final KpFeature feature = featureMap.getOrDefault(featureName, null); + if (Objects.nonNull(feature)) { + featureList.add(feature); + } + } + }); + return Ux.future(featureList); + } + + + /** + * 维度处理 + * + * @param report 报表定义 + * @param params 参 + * + * @return 返回 Map + */ + private Future> reportOfDim(final KpReport report, final JsonObject params) { + final JsonObject whereJ = Ux.whereAnd(); + whereJ.put("reportId", report.getKey()); + return Ux.Jooq.on(KpDimensionDao.class).fetchAsync(whereJ).compose(dimensions -> { + final DimProc processor = DimProc.of(); + return processor.dimAsync(params, dimensions); + }).compose(dimensions -> { + final ConcurrentMap result = Ut.elementMap(dimensions, RDimension::key); + return Ux.future(result); + }); + } +} diff --git a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/combiner/StepGeneratorTotal.java b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/combiner/StepGeneratorTotal.java index f7333c2330cf133a8693ee17e00a30acfc0b70fc..0f4bc1bf50bd94c87ae1c896bb0e6f15dece0b04 100644 --- a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/combiner/StepGeneratorTotal.java +++ b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/combiner/StepGeneratorTotal.java @@ -1,106 +1,106 @@ -package io.zerows.extension.runtime.report.uca.combiner; - -import io.vertx.core.Future; -import io.vertx.core.json.JsonArray; -import io.vertx.core.json.JsonObject; -import io.vertx.up.eon.KName; -import io.vertx.up.unity.Ux; -import io.vertx.up.util.Ut; -import io.zerows.extension.runtime.report.atom.RGeneration; -import io.zerows.extension.runtime.report.domain.tables.pojos.KpFeature; -import io.zerows.extension.runtime.report.domain.tables.pojos.KpReport; -import io.zerows.extension.runtime.report.domain.tables.pojos.KpReportInstance; -import io.zerows.extension.runtime.report.eon.RpConstant; -import io.zerows.extension.runtime.report.eon.em.EmReport; - -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.util.List; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; - -/** - * @author Yu : 2024-12-31 - */ -public class StepGeneratorTotal extends AbstractStepGenerator { - StepGeneratorTotal(final RGeneration generation) { - super(generation); - } - - @Override - public Future build(KpReportInstance instance, JsonObject request, JsonArray sourceData) { - final KpReport report = this.metadata().reportMeta(); - final RGeneration metadata = this.metadata(); - final List features = metadata.featureData(); - final JsonObject reportConfig = Ut.toJObject(report.getReportConfig()); - final JsonObject bottomTotal = Ut.valueJObject(reportConfig, RpConstant.ConfigField.TOTAL); - final JsonObject totalCount = Ut.valueJObject(reportConfig, RpConstant.ConfigField.TOTAL_COUNT); - final JsonObject reportContent = new JsonObject(instance.getReportContent()); - final JsonArray data = reportContent.getJsonArray(KName.DATA); - final JsonArray children = new JsonArray(); - data.forEach(item -> { - final JsonObject entries = Ux.toJson(item); - final JsonArray jsonArray = entries.getJsonArray(KName.CHILDREN); - jsonArray.forEach(children::add); - }); - final ConcurrentHashMap total = new ConcurrentHashMap<>(); - if(bottomTotal.fieldNames().size()!=0){ - bottomTotal.fieldNames().forEach(dimFeature -> { - // 提取 Feature - final KpFeature feature = Ut.elementFind(features, item -> item.getName().equals(dimFeature)); - final EmReport.FeatureType featureType = Ut.toEnum(feature.getType(), EmReport.FeatureType.class, EmReport.FeatureType.NONE); - if (EmReport.FeatureType.AGGR == featureType) { - children.forEach(item -> { - JsonObject entries = Ux.toJson(item); - String string = entries.getString(feature.getName()); - // 使用 BigDecimal.valueOf 保留两位小数 - BigDecimal value = (string == null || string.isEmpty()) ? BigDecimal.ZERO : BigDecimal.valueOf(Double.parseDouble(string)).setScale(2, RoundingMode.HALF_UP); - // 转换为字符串,确保两位小数 - String valueString = value.toString(); - // 使用 compute 方法累加值 - total.compute(feature.getName(), (key, current) -> { - if (current == null) { - return valueString; // 如果该键没有值,直接使用当前值 - } else { - // 将当前值和新值转换为 BigDecimal,进行累加 - BigDecimal currentValue = new BigDecimal(current); - BigDecimal newValue = new BigDecimal(valueString); - BigDecimal sum = currentValue.add(newValue).setScale(2, RoundingMode.HALF_UP); - return sum.toString(); // 返回累加后的值 - } - }); - }); - } - }); - } - - if (totalCount.fieldNames().size()!=0) { - totalCount.fieldNames().forEach(count -> { - final String formula = totalCount.getString(count); - Object result = Ut.fromExpressionT(formula, Ux.toJson(total)); - if(result==null){ - result= "0.00"; - } - final BigDecimal bigDecimal = new BigDecimal(result.toString()); - final BigDecimal truncatedValue = bigDecimal.setScale(2, RoundingMode.DOWN); - total.put(count, truncatedValue.toString()); - }); - } - if(total.keySet().size()>0){ - final JsonObject entries = Ux.toJson(total); - entries.put(KName.KEY, UUID.randomUUID().toString()); - bottomTotal.fieldNames().forEach(item -> { - boolean b = total.containsKey(item); - if (!b) { - entries.put(item, bottomTotal.getString(item)); - } - }); - JsonObject entries1 = Ux.cloneT(entries); - entries.put(KName.CHILDREN,new JsonArray().add(entries1)); - data.add(entries); - } - reportContent.put(KName.DATA, data); - instance.setReportContent(reportContent.toString()); - return Ux.future(instance); - } -} +package io.zerows.extension.runtime.report.uca.combiner; + +import io.vertx.core.Future; +import io.vertx.core.json.JsonArray; +import io.vertx.core.json.JsonObject; +import io.vertx.up.eon.KName; +import io.vertx.up.unity.Ux; +import io.vertx.up.util.Ut; +import io.zerows.extension.runtime.report.atom.RGeneration; +import io.zerows.extension.runtime.report.domain.tables.pojos.KpFeature; +import io.zerows.extension.runtime.report.domain.tables.pojos.KpReport; +import io.zerows.extension.runtime.report.domain.tables.pojos.KpReportInstance; +import io.zerows.extension.runtime.report.eon.RpConstant; +import io.zerows.extension.runtime.report.eon.em.EmReport; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author Yu : 2024-12-31 + */ +public class StepGeneratorTotal extends AbstractStepGenerator { + StepGeneratorTotal(final RGeneration generation) { + super(generation); + } + + @Override + public Future build(KpReportInstance instance, JsonObject request, JsonArray sourceData) { + final KpReport report = this.metadata().reportMeta(); + final RGeneration metadata = this.metadata(); + final List features = metadata.featureData(); + final JsonObject reportConfig = Ut.toJObject(report.getReportConfig()); + final JsonObject bottomTotal = Ut.valueJObject(reportConfig, RpConstant.ConfigField.TOTAL); + final JsonObject totalCount = Ut.valueJObject(reportConfig, RpConstant.ConfigField.TOTAL_COUNT); + final JsonObject reportContent = new JsonObject(instance.getReportContent()); + final JsonArray data = reportContent.getJsonArray(KName.DATA); + final JsonArray children = new JsonArray(); + data.forEach(item -> { + final JsonObject entries = Ux.toJson(item); + final JsonArray jsonArray = entries.getJsonArray(KName.CHILDREN); + jsonArray.forEach(children::add); + }); + final ConcurrentHashMap total = new ConcurrentHashMap<>(); + if(!bottomTotal.fieldNames().isEmpty()){ + bottomTotal.fieldNames().forEach(dimFeature -> { + // 提取 Feature + final KpFeature feature = Ut.elementFind(features, item -> item.getName().equals(dimFeature)); + final EmReport.FeatureType featureType = Ut.toEnum(feature.getType(), EmReport.FeatureType.class, EmReport.FeatureType.NONE); + if (EmReport.FeatureType.AGGR == featureType) { + children.forEach(item -> { + JsonObject entries = Ux.toJson(item); + String string = entries.getString(feature.getName()); + // 使用 BigDecimal.valueOf 保留两位小数 + BigDecimal value = (string == null || string.isEmpty()) ? BigDecimal.ZERO : BigDecimal.valueOf(Double.parseDouble(string)).setScale(2, RoundingMode.HALF_UP); + // 转换为字符串,确保两位小数 + String valueString = value.toString(); + // 使用 compute 方法累加值 + total.compute(feature.getName(), (key, current) -> { + if (current == null) { + return valueString; // 如果该键没有值,直接使用当前值 + } else { + // 将当前值和新值转换为 BigDecimal,进行累加 + BigDecimal currentValue = new BigDecimal(current); + BigDecimal newValue = new BigDecimal(valueString); + BigDecimal sum = currentValue.add(newValue).setScale(2, RoundingMode.HALF_UP); + return sum.toString(); // 返回累加后的值 + } + }); + }); + } + }); + } + + if (!totalCount.fieldNames().isEmpty()) { + totalCount.fieldNames().forEach(count -> { + final String formula = totalCount.getString(count); + Object result = Ut.fromExpressionT(formula, Ux.toJson(total)); + if(result==null){ + result= "0.00"; + } + final BigDecimal bigDecimal = new BigDecimal(result.toString()); + final BigDecimal truncatedValue = bigDecimal.setScale(2, RoundingMode.DOWN); + total.put(count, truncatedValue.toString()); + }); + } + if(!total.keySet().isEmpty()){ + final JsonObject entries = Ux.toJson(total); + entries.put(KName.KEY, UUID.randomUUID().toString()); + bottomTotal.fieldNames().forEach(item -> { + boolean b = total.containsKey(item); + if (!b) { + entries.put(item, bottomTotal.getString(item)); + } + }); + JsonObject entries1 = Ux.cloneT(entries); + entries.put(KName.CHILDREN,new JsonArray().add(entries1)); + data.add(entries); + } + reportContent.put(KName.DATA, data); + instance.setReportContent(reportContent.toString()); + return Ux.future(instance); + } +} diff --git a/Zero.Extension.Runtime.Report.DB/src/main/resources/plugins/zero-extension-runtime-report/security/RBAC_RESOURCE/report.query.all.xlsx b/Zero.Extension.Runtime.Report.DB/src/main/resources/plugins/zero-extension-runtime-report/security/RBAC_RESOURCE/report.query.all.xlsx index 75a7c7f50e531b8b15e36692385093e0cab8ff1e..a178cc5361ff6006282cdd42e8cfefcc1b7e6123 100644 Binary files a/Zero.Extension.Runtime.Report.DB/src/main/resources/plugins/zero-extension-runtime-report/security/RBAC_RESOURCE/report.query.all.xlsx and b/Zero.Extension.Runtime.Report.DB/src/main/resources/plugins/zero-extension-runtime-report/security/RBAC_RESOURCE/report.query.all.xlsx differ diff --git a/mvn-build.bat b/mvn-build.bat index a0d4db117d9edb9fd2c7e005f527271b2efc67fb..1220034a8664e0befd3014ca18092b7c36857569 100755 --- a/mvn-build.bat +++ b/mvn-build.bat @@ -1 +1 @@ -mvnd clean install -DskipTests=true -Dmaven.javadoc.skip=true -Dmaven.compile.fork=true -T 1C +mvn clean install -DskipTests=true -Dmaven.javadoc.skip=true -Dmaven.compile.fork=true -T 1C