/*!
Copyright (c) REBUILD <https://getrebuild.com/> and/or its owners. All rights reserved.
rebuild is dual-licensed under commercial and open source licenses (GPLv3).
See LICENSE and COMMERCIAL in the project root for license information.
*/
package com.rebuild.core.service.general;
import cn.devezhao.bizz.privileges.Permission;
import cn.devezhao.bizz.privileges.impl.BizzPermission;
import cn.devezhao.persist4j.Entity;
import cn.devezhao.persist4j.Field;
import cn.devezhao.persist4j.Filter;
import cn.devezhao.persist4j.PersistManagerFactory;
import cn.devezhao.persist4j.Query;
import cn.devezhao.persist4j.Record;
import cn.devezhao.persist4j.engine.ID;
import com.rebuild.core.Application;
import com.rebuild.core.RebuildException;
import com.rebuild.core.UserContextHolder;
import com.rebuild.core.metadata.DeleteRecord;
import com.rebuild.core.metadata.EntityHelper;
import com.rebuild.core.metadata.MetadataHelper;
import com.rebuild.core.metadata.MetadataSorter;
import com.rebuild.core.metadata.easymeta.DisplayType;
import com.rebuild.core.metadata.easymeta.EasyField;
import com.rebuild.core.metadata.easymeta.EasyMetaFactory;
import com.rebuild.core.metadata.impl.EasyEntityConfigProps;
import com.rebuild.core.privileges.UserService;
import com.rebuild.core.privileges.bizz.InternalPermission;
import com.rebuild.core.privileges.bizz.User;
import com.rebuild.core.service.BaseService;
import com.rebuild.core.service.DataSpecificationException;
import com.rebuild.core.service.NoRecordFoundException;
import com.rebuild.core.service.approval.ApprovalHelper;
import com.rebuild.core.service.approval.ApprovalState;
import com.rebuild.core.service.general.recyclebin.RecycleStore;
import com.rebuild.core.service.general.series.SeriesGeneratorFactory;
import com.rebuild.core.service.notification.NotificationObserver;
import com.rebuild.core.service.query.QueryHelper;
import com.rebuild.core.service.trigger.ActionType;
import com.rebuild.core.service.trigger.RobotTriggerManager;
import com.rebuild.core.service.trigger.RobotTriggerManual;
import com.rebuild.core.service.trigger.RobotTriggerObserver;
import com.rebuild.core.service.trigger.TriggerAction;
import com.rebuild.core.service.trigger.TriggerWhen;
import com.rebuild.core.service.trigger.impl.AutoApproval;
import com.rebuild.core.support.i18n.Language;
import com.rebuild.core.support.task.TaskExecutors;
import com.rebuild.utils.CommonsUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
@Slf4j
@Service
public class GeneralEntityService extends ObservableService implements EntityService {
public static final String HAS_DETAILS = "$DETAILS$";
protected GeneralEntityService(PersistManagerFactory aPMFactory) {
super(aPMFactory);
addObserver(new NotificationObserver());
addObserver(new RobotTriggerObserver());
}
@Override
public int getEntityCode() {
return 0;
}
@Override
public Record createOrUpdate(Record record) {
@SuppressWarnings("unchecked")
final List<Record> details = (List<Record>) record.removeValue(HAS_DETAILS);
final int rcm = GeneralEntityServiceContextHolder.getRepeatedCheckModeOnce();
if (rcm == GeneralEntityServiceContextHolder.RCM_CHECK_MAIN
|| rcm == GeneralEntityServiceContextHolder.RCM_CHECK_ALL) {
List<Record> repeated = getAndCheckRepeated(record, 20);
if (!repeated.isEmpty()) {
throw new RepeatedRecordsException(repeated);
}
}
final boolean hasDetails = details != null && !details.isEmpty();
boolean lazyAutoApprovalForDetails = false;
boolean lazyAutoTransformForDetails = false;
if (hasDetails) {
TriggerAction[] hasAutoApprovalTriggers = getSpecTriggers(
record.getEntity(), ActionType.AUTOAPPROVAL, TriggerWhen.CREATE, TriggerWhen.UPDATE);
lazyAutoApprovalForDetails = hasAutoApprovalTriggers.length > 0;
if (!lazyAutoApprovalForDetails) {
TriggerAction[] hasOnApprovedTriggers = getSpecTriggers(
record.getEntity().getDetailEntity(), null, TriggerWhen.APPROVED);
lazyAutoApprovalForDetails = hasOnApprovedTriggers.length > 0;
}
if (lazyAutoApprovalForDetails) AutoApproval.setLazyAutoApproval();
TriggerAction[] hasAutoTransformTriggers = getSpecTriggers(
record.getEntity(), ActionType.AUTOTRANSFORM, TriggerWhen.CREATE, TriggerWhen.UPDATE);
lazyAutoTransformForDetails = hasAutoTransformTriggers.length > 0;
if (lazyAutoTransformForDetails) CommonsUtils.invokeMethod("com.rebuild.rbv.trigger.AutoTransform#setLazyAutoTransform");
}
Map<Integer, ID> detaileds = new TreeMap<>();
try {
record = record.getPrimary() == null ? create(record) : update(record);
if (!hasDetails) return record;
final String dtfField = MetadataHelper.getDetailToMainField(record.getEntity().getDetailEntity()).getName();
final ID mainid = record.getPrimary();
final boolean checkDetailsRepeated = rcm == GeneralEntityServiceContextHolder.RCM_CHECK_DETAILS
|| rcm == GeneralEntityServiceContextHolder.RCM_CHECK_ALL;
for (int i = 0; i < details.size(); i++) {
Record d = details.get(i);
if (d instanceof DeleteRecord) {
delete(d.getPrimary());
detaileds.put(i, d.getPrimary());
}
}
for (int i = 0; i < details.size(); i++) {
Record d = details.get(i);
if (d instanceof DeleteRecord) continue;
if (checkDetailsRepeated) {
d.setID(dtfField, mainid);
List<Record> repeated = getAndCheckRepeated(d, 20);
if (!repeated.isEmpty()) {
throw new RepeatedRecordsException(repeated);
}
}
if (d.getPrimary() == null) {
d.setID(dtfField, mainid);
create(d);
} else {
update(d);
}
detaileds.put(i, d.getPrimary());
}
record.setObjectValue(HAS_DETAILS, detaileds.values());
return record;
} finally {
if (lazyAutoApprovalForDetails) {
AutoApproval.executeLazyAutoApproval();
}
if (lazyAutoTransformForDetails) {
CommonsUtils.invokeMethod("com.rebuild.rbv.trigger.AutoTransform#executeLazyAutoTransform");
}
}
}
@Override
public Record create(Record record) {
appendDefaultValue(record);
checkModifications(record, BizzPermission.CREATE);
setSeriesValue(record);
return super.create(record);
}
@Override
public Record update(Record record) {
if (!checkModifications(record, BizzPermission.UPDATE)) {
return record;
}
record = super.update(record);
TriggerAction[] hasTriggers = getSpecTriggers(record.getEntity().getDetailEntity(),
ActionType.GROUPAGGREGATION, TriggerWhen.UPDATE);
if (hasTriggers.length > 0) {
RobotTrigg
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
REBUILD 通过创新的业务流程引擎帮助你快速搭建各类企业管理系统。REBUILD 侧重于业务需求实现,而非基础技术框架或项目启动模板,通过 REBUILD 可以真正实现零代码快速搭建!无需编程、无需编译代码,甚至无需了解任何技术。高度可配置化的企业管理系统!企业内部可免费使用!低代码/零代码快速搭建企业中台、CRM客户关系管理、WMS库存管理、TMS运输管理、SCM供应链管理,外贸管理,甚至是 ERP 企业资源计划
资源推荐
资源详情
资源评论
收起资源包目录
REBUILD 通过创新的业务流程引擎帮助你快速搭建各类企业管理系统 (1030个子文件)
CODEOWNERS 24B
COMMERCIAL 178B
nginx-rebuild.conf 698B
materialdesignicons.min-rb.css 677KB
rb-base.css 437KB
materialdesignicons.min.css 321KB
bootstrap.min.css 138KB
rb-page.css 89KB
material-design-iconic-font.min.css 69KB
animate.min.css 60KB
mprogress.min.css 24KB
view-page.css 18KB
select2.css 17KB
select2.min.css 15KB
approvals.css 12KB
feeds.css 12KB
bootstrap-datetimepicker.min.css 11KB
charts.css 11KB
simplemde.min.css 11KB
gridstack.css 10KB
triggers.css 9KB
bootstrap-slider.min.css 9KB
chart-design.css 8KB
introjs.min.css 8KB
form-design.css 6KB
project-tasks.css 6KB
task-view.css 5KB
dashboard.css 5KB
meta-edit.css 5KB
rebuild-tour.css 5KB
perfect-scrollbar.min.css 5KB
files.css 4KB
cropper.min.css 4KB
list-page.css 3KB
jquery-ui.min.css 2KB
classification.css 2KB
dataimports-test.csv 770B
materialdesignicons-webfont.eot 1.19MB
Material-Design-Iconic-Font.eot 41KB
spring.factories 99B
rb-loading.gif 7KB
role_1.gif 159B
role_2.gif 154B
role_0.gif 153B
role_3.gif 152B
role_4.gif 110B
s.gif 43B
.gitattributes 93B
.gitignore 466B
preview.html 520KB
field-edit.html 35KB
system-cfg.html 19KB
role-privileges.html 14KB
trigger-design.html 13KB
chart-design.html 13KB
user-settings.html 11KB
entity-advanced.html 9KB
data-imports-body.html 9KB
record-list.html 9KB
entity-edit.html 9KB
submail.html 9KB
detail-list.html 8KB
transform-design.html 8KB
login.html 8KB
project-editor.html 8KB
record-view.html 8KB
form-design.html 8KB
fields.html 7KB
entity-new.html 7KB
nav-left-admin.html 6KB
wxwork.html 6KB
home.html 6KB
messages.html 6KB
nav-settings.html 6KB
user-list.html 6KB
entity-overview.html 6KB
nav-top.html 6KB
entities.html 6KB
dingtalk.html 5KB
auto-fillin.html 5KB
project-tasks.html 5KB
forgot-passwd.html 5KB
docs.html 5KB
detail-view.html 5KB
home.html 5KB
user-view.html 5KB
dept-list.html 5KB
approval-list.html 4KB
server-status.html 4KB
storage-qiniu.html 4KB
attachment.html 4KB
report-templates.html 4KB
trigger-list.html 4KB
reference-search.html 4KB
install.html 4KB
entities-sheet.html 4KB
transform-list.html 4KB
team-view.html 4KB
field-new.html 3KB
search-icon.html 3KB
共 1030 条
- 1
- 2
- 3
- 4
- 5
- 6
- 11
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6732
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- vscode配置c/c 环境教程
- vscode配置c/c 环境教程
- 基于matlab实现电磁优化计算功能,进行线型规划优化电磁设计.rar
- 基于matlab实现带精英策略的非支配排序遗传算法matlab 源码.rar
- 基于matlab实现差分进化算法,最新的用于替代遗传算法,是以后的主要发展方法.rar
- VSCode配置c/c++环境教程.md
- 基于matlab实现标准合作型协同进化遗传算法matlab源程序
- 七下人教.zip
- 基于matlab实现本份代码能对图像进行gabor滤波处理,结合指纹方向图以及指纹沟壑频率特性,对指纹图像进行增强.rar
- 基于matlab实现RBM神经网络实现了手写数字体识别的GUI程序.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功