diff --git a/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/ActionDelete.java b/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/ActionDelete.java index 81e16ef679990cc2d2e0628d53921d9b84088f68..e67462d291934ca9abfa0040ec6166c3c0590581 100644 --- a/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/ActionDelete.java +++ b/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/ActionDelete.java @@ -33,20 +33,7 @@ import com.x.organization.assemble.control.ThisApplication; import com.x.organization.assemble.control.message.OrgBodyMessage; import com.x.organization.assemble.control.message.OrgMessage; import com.x.organization.assemble.control.message.OrgMessageFactory; -import com.x.organization.core.entity.Group; -import com.x.organization.core.entity.Group_; -import com.x.organization.core.entity.Identity; -import com.x.organization.core.entity.Identity_; -import com.x.organization.core.entity.Person; -import com.x.organization.core.entity.PersonAttribute; -import com.x.organization.core.entity.PersonAttribute_; -import com.x.organization.core.entity.Person_; -import com.x.organization.core.entity.Role; -import com.x.organization.core.entity.Role_; -import com.x.organization.core.entity.Unit; -import com.x.organization.core.entity.UnitDuty; -import com.x.organization.core.entity.UnitDuty_; -import com.x.organization.core.entity.Unit_; +import com.x.organization.core.entity.*; class ActionDelete extends BaseAction { private static Logger logger = LoggerFactory.getLogger(ActionDelete.class); @@ -80,6 +67,9 @@ class ActionDelete extends BaseAction { /** 删除个人属性 */ emc.beginTransaction(PersonAttribute.class); this.removePersonAttribute(business, person); + /** 删除个人自定义信息 */ + emc.beginTransaction(Custom.class); + this.removePersonCustom(business, person); /** 删除群组成员 */ emc.beginTransaction(Group.class); this.removeMemberOfGroup(business, person); @@ -102,12 +92,12 @@ class ActionDelete extends BaseAction { CacheManager.notify(Person.class); /** 通知x_collect_service_transmit同步数据到collect */ business.instrument().collect().person(); - + /**创建 组织变更org消息通信 */ //createMessageCommunicate(person, effectivePerson); OrgMessageFactory orgMessageFactory = new OrgMessageFactory(); orgMessageFactory.createMessageCommunicate("delete", "person", person, effectivePerson); - + Wo wo = new Wo(); wo.setId(person.getId()); result.setData(wo); @@ -193,6 +183,19 @@ class ActionDelete extends BaseAction { } } + private void removePersonCustom(Business business, Person person) throws Exception { + EntityManager em = business.entityManagerContainer().get(Custom.class); + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Custom.class); + Root root = cq.from(Custom.class); + Predicate p = cb.equal(root.get(Custom_.person), person.getId()); + p = cb.or(p, cb.equal(root.get(Custom_.person), person.getDistinguishedName())); + List os = em.createQuery(cq.select(root).where(p)).getResultList(); + for (Custom o : os) { + business.entityManagerContainer().remove(o, CheckRemoveType.all); + } + } + private void removeMemberOfGroup(Business business, Person person) throws Exception { EntityManager em = business.entityManagerContainer().get(Group.class); CriteriaBuilder cb = em.getCriteriaBuilder(); @@ -216,14 +219,14 @@ class ActionDelete extends BaseAction { o.getPersonList().remove(person.getId()); } } - + /**创建 组织变更org消息通信 */ private boolean createMessageCommunicate(Person person, EffectivePerson effectivePerson) { try{ Gson gson = new Gson(); String strPerson = gson.toJson(person); OrgMessage orgMessage = new OrgMessage(); - + orgMessage.setOperType("delete"); orgMessage.setOrgType("person"); orgMessage.setOperUerId(effectivePerson.getDistinguishedName()); @@ -231,26 +234,26 @@ class ActionDelete extends BaseAction { orgMessage.setReceiveSystem(""); orgMessage.setConsumed(false); orgMessage.setConsumedModule(""); - + OrgBodyMessage orgBodyMessage = new OrgBodyMessage(); orgBodyMessage.setOriginalData(strPerson); orgMessage.setBody( gson.toJson(orgBodyMessage)); - + Applications applications = new Applications(); String path ="org/create"; //String address = "http://127.0.0.1:20020/x_message_assemble_communicate/jaxrs/org/create"; //ActionResponse resp = CipherConnectionAction.post(false, address, body); - + ActionResponse resp = ThisApplication.context().applications() .postQuery(x_message_assemble_communicate.class, path, orgMessage); - + String mess = resp.getMessage(); String data = resp.getData().toString(); return true; }catch(Exception e) { logger.print(e.toString()); return false; - } + } } -} \ No newline at end of file +} diff --git a/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/ActionDeleteV2.java b/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/ActionDeleteV2.java new file mode 100644 index 0000000000000000000000000000000000000000..b89e01f7e7d4bac71eece51765a6e9295befa618 --- /dev/null +++ b/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/ActionDeleteV2.java @@ -0,0 +1,243 @@ +package com.x.organization.assemble.control.jaxrs.person; + +import com.google.gson.Gson; +import com.x.base.core.container.EntityManagerContainer; +import com.x.base.core.container.factory.EntityManagerContainerFactory; +import com.x.base.core.entity.JpaObject; +import com.x.base.core.entity.annotation.CheckRemoveType; +import com.x.base.core.project.Applications; +import com.x.base.core.project.cache.CacheManager; +import com.x.base.core.project.config.Config; +import com.x.base.core.project.connection.ActionResponse; +import com.x.base.core.project.exception.ExceptionAccessDenied; +import com.x.base.core.project.exception.ExceptionEntityNotExist; +import com.x.base.core.project.http.ActionResult; +import com.x.base.core.project.http.EffectivePerson; +import com.x.base.core.project.jaxrs.WoId; +import com.x.base.core.project.logger.Logger; +import com.x.base.core.project.logger.LoggerFactory; +import com.x.base.core.project.tools.ListTools; +import com.x.base.core.project.x_message_assemble_communicate; +import com.x.organization.assemble.control.Business; +import com.x.organization.assemble.control.ThisApplication; +import com.x.organization.assemble.control.message.OrgBodyMessage; +import com.x.organization.assemble.control.message.OrgMessage; +import com.x.organization.core.entity.*; + +import javax.persistence.EntityManager; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import java.util.List; +import java.util.stream.Collectors; + +class ActionDeleteV2 extends BaseAction { + private static Logger logger = LoggerFactory.getLogger(ActionDeleteV2.class); + ActionResult execute(EffectivePerson effectivePerson, String flag) throws Exception { + try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) { + ActionResult result = new ActionResult<>(); + if (Config.token().isInitialManager(flag)) { + throw new ExceptionDenyDeleteInitialManager(); + } else { + Business business = new Business(emc); + Person person = business.person().pick(flag); + if (null == person) { + throw new ExceptionEntityNotExist(flag, Person.class); + } + /** 从内存中取到人 */ + person = emc.find(person.getId(), Person.class); + if (!this.editable(business, effectivePerson, person)) { + throw new ExceptionAccessDenied(effectivePerson); + } + List identities = this.listIdentity(business, person); + /** 删除身份组织职务成员,提交后才可以删除身份 */ + emc.beginTransaction(UnitDuty.class); + this.removeMemberOfUnitDuty(business, identities); + emc.commit(); + /** 删除身份 */ + emc.beginTransaction(Identity.class); + for (Identity o : identities) { + emc.remove(o, CheckRemoveType.all); + } + emc.commit(); + /** 删除个人自定义信息 */ + emc.beginTransaction(Custom.class); + this.removePersonCustom(business, person); + /** 删除群组成员 */ + emc.beginTransaction(Group.class); + this.removeMemberOfGroup(business, person); + /** 删除角色成员 */ + emc.beginTransaction(Role.class); + this.removeMemberOfRole(business, person); + /** 删除组织的管理个人以及继承的管理个人 */ + emc.beginTransaction(Unit.class); + this.removeMemberOfUnitController(business, person); + /** 删除个人管理者成员 */ + this.removeMemberOfPersonController(business, person); + /** 删除汇报人员为将要删除的人 */ + this.removeMemberOfPersonSuperior(business, person); + emc.beginTransaction(Person.class); + /** 先进行一次提交,通过check */ + emc.commit(); + CacheManager.notify(Person.class); + + Wo wo = new Wo(); + wo.setId(person.getId()); + result.setData(wo); + } + return result; + } + } + + public static class Wo extends WoId { + + } + + private List listIdentity(Business business, Person person) throws Exception { + EntityManager em = business.entityManagerContainer().get(Identity.class); + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Identity.class); + Root root = cq.from(Identity.class); + Predicate p = cb.equal(root.get(Identity_.person), person.getId()); + List os = em.createQuery(cq.select(root).where(p)).getResultList(); + return os; + } + + private void removeMemberOfUnitDuty(Business business, List identities) throws Exception { + List ids = ListTools.extractProperty(identities, JpaObject.id_FIELDNAME, String.class, true, true); + EntityManager em = business.entityManagerContainer().get(UnitDuty.class); + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(UnitDuty.class); + Root root = cq.from(UnitDuty.class); + Predicate p = root.get(UnitDuty_.identityList).in(ids); + List os = em.createQuery(cq.select(root).where(p)).getResultList().stream().distinct().collect(Collectors.toList()); + for (UnitDuty o : os) { + o.getIdentityList().removeAll(ids); + } + } + + private void removeMemberOfUnitController(Business business, Person person) throws Exception { + EntityManager em = business.entityManagerContainer().get(Unit.class); + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Unit.class); + Root root = cq.from(Unit.class); + Predicate p = cb.isMember(person.getId(), root.get(Unit_.controllerList)); + //p = cb.or(cb.isMember(person.getId(), root.get(Unit_.inheritedControllerList))); + List os = em.createQuery(cq.select(root).where(p)).getResultList().stream().distinct().collect(Collectors.toList()); + for (Unit o : os) { + o.getControllerList().remove(person.getId()); + //o.getInheritedControllerList().remove(person.getId()); + } + } + + private void removeMemberOfPersonController(Business business, Person person) throws Exception { + EntityManager em = business.entityManagerContainer().get(Person.class); + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Person.class); + Root root = cq.from(Person.class); + Predicate p = cb.isMember(person.getId(), root.get(Person_.controllerList)); + List os = em.createQuery(cq.select(root).where(p)).getResultList().stream().distinct().collect(Collectors.toList()); + for (Person o : os) { + o.getControllerList().remove(person.getId()); + } + } + + private void removeMemberOfPersonSuperior(Business business, Person person) throws Exception { + EntityManager em = business.entityManagerContainer().get(Person.class); + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Person.class); + Root root = cq.from(Person.class); + Predicate p = cb.equal(root.get(Person_.superior), person.getId()); + List os = em.createQuery(cq.select(root).where(p)).getResultList(); + for (Person o : os) { + o.setSuperior(""); + } + } + + private void removePersonAttribute(Business business, Person person) throws Exception { + EntityManager em = business.entityManagerContainer().get(PersonAttribute.class); + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(PersonAttribute.class); + Root root = cq.from(PersonAttribute.class); + Predicate p = cb.equal(root.get(PersonAttribute_.person), person.getId()); + List os = em.createQuery(cq.select(root).where(p)).getResultList(); + for (PersonAttribute o : os) { + business.entityManagerContainer().remove(o, CheckRemoveType.all); + } + } + + private void removePersonCustom(Business business, Person person) throws Exception { + EntityManager em = business.entityManagerContainer().get(Custom.class); + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Custom.class); + Root root = cq.from(Custom.class); + Predicate p = cb.equal(root.get(Custom_.person), person.getId()); + p = cb.or(p, cb.equal(root.get(Custom_.person), person.getDistinguishedName())); + List os = em.createQuery(cq.select(root).where(p)).getResultList(); + for (Custom o : os) { + business.entityManagerContainer().remove(o, CheckRemoveType.all); + } + } + + private void removeMemberOfGroup(Business business, Person person) throws Exception { + EntityManager em = business.entityManagerContainer().get(Group.class); + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Group.class); + Root root = cq.from(Group.class); + Predicate p = cb.isMember(person.getId(), root.get(Group_.personList)); + List os = em.createQuery(cq.select(root).where(p)).getResultList(); + for (Group o : os) { + o.getPersonList().remove(person.getId()); + } + } + + private void removeMemberOfRole(Business business, Person person) throws Exception { + EntityManager em = business.entityManagerContainer().get(Role.class); + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Role.class); + Root root = cq.from(Role.class); + Predicate p = cb.isMember(person.getId(), root.get(Role_.personList)); + List os = em.createQuery(cq.select(root).where(p)).getResultList(); + for (Role o : os) { + o.getPersonList().remove(person.getId()); + } + } + + /**创建 组织变更org消息通信 */ + private boolean createMessageCommunicate(Person person, EffectivePerson effectivePerson) { + try{ + Gson gson = new Gson(); + String strPerson = gson.toJson(person); + OrgMessage orgMessage = new OrgMessage(); + + orgMessage.setOperType("delete"); + orgMessage.setOrgType("person"); + orgMessage.setOperUerId(effectivePerson.getDistinguishedName()); + orgMessage.setOperDataId(person.getId()); + orgMessage.setReceiveSystem(""); + orgMessage.setConsumed(false); + orgMessage.setConsumedModule(""); + + OrgBodyMessage orgBodyMessage = new OrgBodyMessage(); + orgBodyMessage.setOriginalData(strPerson); + orgMessage.setBody( gson.toJson(orgBodyMessage)); + + Applications applications = new Applications(); + String path ="org/create"; + //String address = "http://127.0.0.1:20020/x_message_assemble_communicate/jaxrs/org/create"; + //ActionResponse resp = CipherConnectionAction.post(false, address, body); + + ActionResponse resp = ThisApplication.context().applications() + .postQuery(x_message_assemble_communicate.class, path, orgMessage); + + String mess = resp.getMessage(); + String data = resp.getData().toString(); + return true; + }catch(Exception e) { + logger.print(e.toString()); + return false; + } + } + +} diff --git a/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/PersonAction.java b/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/PersonAction.java index 5d2ebc2a65fe4d01ccbe25291d3d05a500c1a7d5..8a50646fb8d52e8f3cf3e27b557c7356a74ed05d 100644 --- a/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/PersonAction.java +++ b/o2server/x_organization_assemble_control/src/main/java/com/x/organization/assemble/control/jaxrs/person/PersonAction.java @@ -108,6 +108,24 @@ public class PersonAction extends StandardJaxrsAction { asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result)); } + @JaxrsMethodDescribe(value = "删除个人关联信息(身份、角色等),但保留人员(企业离退休人员需要能登录平台但不能做业务处理).", action = ActionDeleteV2.class) + @DELETE + @Path("{flag}/v2") + @Produces(HttpMediaType.APPLICATION_JSON_UTF_8) + @Consumes(MediaType.APPLICATION_JSON) + public void deleteV2(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request, + @JaxrsParameterDescribe("人员标识") @PathParam("flag") String flag) { + ActionResult result = new ActionResult<>(); + EffectivePerson effectivePerson = this.effectivePerson(request); + try { + result = new ActionDeleteV2().execute(effectivePerson, flag); + } catch (Exception e) { + logger.error(e, effectivePerson, request, null); + result.error(e); + } + asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result)); + } + @JaxrsMethodDescribe(value = "列示个人,下一页.", action = ActionListNext.class) @GET @Path("list/{flag}/next/{count}") @@ -346,4 +364,4 @@ public class PersonAction extends StandardJaxrsAction { asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result)); } -} \ No newline at end of file +}