From dd4cd96c69061da3ff80cbfb87237b16cda8abc3 Mon Sep 17 00:00:00 2001 From: doum <doum> Date: 星期五, 26 九月 2025 18:48:06 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/wuhuyancao' into wuhuyancao --- server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java | 312 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 311 insertions(+), 1 deletions(-) diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java index b2edb5a..7336cb7 100644 --- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java +++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CompanyServiceImpl.java @@ -5,9 +5,15 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dingtalk.api.response.OapiV2DepartmentGetResponse; +import com.dingtalk.api.response.OapiV2DepartmentListsubResponse; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.config.DataSyncConfig; import com.doumee.core.constants.ResponseStatus; +import com.doumee.core.dingTalk.DingTalk; +import com.doumee.core.erp.ErpConstants; +import com.doumee.core.erp.model.openapi.request.erp.OrgListRequest; +import com.doumee.core.erp.model.openapi.response.erp.ErpOrgListResponse; import com.doumee.core.exception.BusinessException; import com.doumee.core.haikang.model.HKConstants; import com.doumee.core.haikang.model.param.BaseResponse; @@ -33,6 +39,7 @@ import com.doumee.dao.system.model.SystemUser; import com.doumee.service.business.CompanyService; import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.taobao.api.ApiException; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; @@ -40,6 +47,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import shade.com.alibaba.fastjson2.JSONArray; +import shade.com.alibaba.fastjson2.JSONObject; import java.util.*; import java.util.stream.Collectors; @@ -63,6 +72,9 @@ @Autowired private CompanyJoinMapper companyJoinMapper; + + @Autowired + private DingTalk dingTalk; @Override @Transactional(rollbackFor = {BusinessException.class,Exception.class}) @@ -765,7 +777,305 @@ for (Company updCompany:companyPool) { companyMapper.updateById(updCompany); } - } + + + // org_dept_create 閮ㄩ棬鏂板缓 {"timeStamp":"1758783935796","eventId":"0c779adba04143958a3960e8e36bbce5","deptId":[1040735458]} + // org_dept_modify 閮ㄩ棬淇敼 {"timeStamp":"1758785791639","eventId":"6c2d8c7a61a7419e8928fda3effb3bf4","deptId":[1040735458]} + // org_dept_remove 閮ㄩ棬鍒犻櫎 {"timeStamp":"1758785817760","eventId":"47e289f334e041719ed354052da474de","deptId":[1040735458]} + + @Override + public void ddPushCompanyInfo(String eventType, JSONObject eventData) throws ApiException { + JSONArray jsonArray = eventData.getJSONArray("deptId"); + if(jsonArray.isEmpty()){ + return; + } + if(eventType.equals("org_dept_remove")){ + //鍒犻櫎瀵瑰簲閮ㄩ棬淇℃伅 + List<Long> deptIdList = new ArrayList<>(); + for (int i = 0; i < jsonArray.size(); i++) { + Long deptId = jsonArray.getLong(i); + deptIdList.add(deptId); + } + if(CollectionUtils.isNotEmpty(deptIdList)){ + syncDelCompany(deptIdList); + } + }else if(eventType.equals("org_dept_create")||eventType.equals("org_dept_modify")){ + for (int i = 0; i < jsonArray.size(); i++) { + Company company = companyMapper.selectOne(new QueryWrapper<Company>().lambda() + .eq(Company::getIsdeleted,Constants.ZERO) + .eq(Company::getErpId,jsonArray.getLong(i)) + ); + OapiV2DepartmentGetResponse.DeptGetResponse deptGetResponse = dingTalk.syncDepartmentInfo(jsonArray.getLong(i)); + if(Objects.isNull(company)){ + getAddCompanyModel(deptGetResponse,company); + }else{ + getUpdateCompanyModel(deptGetResponse,company); + } + } + } + } + + private void doHkDeleteOrg(List<Integer> delIds,List<String> delHkIds, Date date) { + if(delHkIds.size() == 0){ + return; + } + OrgDelRequest request = new OrgDelRequest(); + request.setIndexCodes( delHkIds.toArray(new String[]{})); + BaseResponse<List<OrgUpdateFailureResponse>> result = HKService.delBatchOrg(request); + if(result !=null && StringUtils.equals(result.getCode(),HKConstants.RESPONSE_SUCCEE)){ + List<String> fIds = new ArrayList<>(); + if(result.getData()!=null){ + for(OrgUpdateFailureResponse r : result.getData()){ + if(r.getCode().equals("0x00052102")){ + //涓嶅瓨鍦ㄧ殑涔熺畻鍒犻櫎鎴愬姛 + fIds.add(r.getOrgIndexCode());//鍒犻櫎澶辫触鐨勬暟鎹泦鍚� + } + } + } + //鏍囪鍒犻櫎鎴愬姛鐨勬暟鎹紙娴峰悍瀵规帴鐘舵�佷负宸插悓姝ワ紝锛屽悓姝ュけ璐ョ殑浠嶄负寰呭悓姝ワ紝绛変笅涓�娆$户缁鐞嗭紝鐭ラ亾鍏ㄩ儴鍒犻櫎瀹屾瘯锛� + companyMapper.update(null,new UpdateWrapper<Company>().lambda() + .set(Company::getHkStatus,Constants.ONE) + .set(Company::getHkDate,date) + .set(Company::getHkId,null ) + .in(Company::getId, delIds) + .notIn(fIds.size()>0,Company::getHkId, fIds)); + companyMapper.update(null,new UpdateWrapper<Company>().lambda() + .set(Company::getHkStatus,Constants.TWO) + .set(Company::getHkDate,date) + .in(Company::getId, delIds) + .in(fIds.size()>0,Company::getHkId, fIds)); + } + } + + @Override + public String syncDDCompany() throws ApiException { + List<OapiV2DepartmentGetResponse.DeptGetResponse> list = dingTalk.syncAllDDDepartmentList(); + if(list !=null && list.size()>0){ + List<Company> addList = new ArrayList<>(); + List<Company> updateList = new ArrayList<>(); + List<Long> delIds = new ArrayList<>();//淇敼涓轰娇鐢ㄩ拤閽塱d erpId + List<Company> allList = companyMapper.selectList(new QueryWrapper<Company>().lambda() + .eq(Company::getIsdeleted,Constants.ZERO).eq(Company::getType,Constants.ONE)); + dealCompanyChangeList(list,addList,updateList,delIds,allList); + if(delIds.size()>0){ + syncDelCompany(delIds); + } + return "鍚屾鏁版嵁锛氭柊澧炪��"+addList.size()+"銆戞潯锛屾洿鏂般��"+updateList.size()+"銆戞潯锛屽垹闄ゃ��"+delIds.size()+"銆戞潯"; + }else{ + throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "鍚屾閽夐拤鏁版嵁涓虹┖锛�"); + } + } + + private void dealCompanyChangeList(List<OapiV2DepartmentGetResponse.DeptGetResponse> list, List<Company> addList, List<Company> updateList, List<Long> delIds, List<Company> allList) { + Date date = new Date(); + for(OapiV2DepartmentGetResponse.DeptGetResponse respone : list){ + //鏍规嵁erpid鏌ヨ浼佷笟淇℃伅锛屽垽鏂槸鏂板杩樻槸鏇存柊 + Company company = findCompanyByERPId(allList,respone.getDeptId().toString()); + if(company == null){ + //濡傛灉鏄柊澧� + //灏佽鏂板缁勭粐瀵硅薄鏁版嵁 + addList.add(getAddCompanyModel(respone,new Company())); + }else{ + updateList.add(getUpdateCompanyModel(respone,company)); + } + } + if(allList!=null && allList.size()>0){ + for(Company c : allList){ + if(!isCompanyDeleted(c,list)){ + delIds.add(Long.valueOf(c.getErpId())); + } + } + } + } + + + /** + * 鏁寸悊閽夐拤鍚屾 鏂板缁勭粐瀵硅薄 + * @param deptGetResponse + * @return + */ + private Company getAddCompanyModel(OapiV2DepartmentGetResponse.DeptGetResponse deptGetResponse,Company company) { + return syncDDAddCompanyModel(deptGetResponse,company); + } + + /** + * 鏁寸悊閽夐拤鍚屾 鏂板 闇�瑕佷慨鏀圭殑缁勭粐瀵硅薄 + * @param deptGetResponse + * @param company + * @return + */ + private Company getUpdateCompanyModel(OapiV2DepartmentGetResponse.DeptGetResponse deptGetResponse, Company company) { + return syncDDEditCompanyModel(deptGetResponse,company); + } + + + /** + * 鏍规嵁ERPID 鍒ゆ柇鏁版嵁鏄惁宸插湪闆嗗悎閲屽瓨鍦� + * @param allList + * @param id + * @return + */ + private Company findCompanyByERPId(List<Company> allList, String id) { + if(allList!=null){ + for(Company com :allList){ + if(StringUtils.equals(com.getErpId(),id)){ + return com; + } + } + } + return null; + } + + private boolean isCompanyDeleted(Company c, List<OapiV2DepartmentGetResponse.DeptGetResponse> list) { + for(OapiV2DepartmentGetResponse.DeptGetResponse m : list){ + if(StringUtils.equals(c.getErpId(),m.getDeptId().toString())){ + return true; + } + } + return false; + } + + + /** + * 鏁寸悊 閽夐拤鍚屾鐨� 缁勭粐淇℃伅 + * @param deptGetResponse + * @param company + * @return + */ + public Company syncDDAddCompanyModel(OapiV2DepartmentGetResponse.DeptGetResponse deptGetResponse,Company company){ + company = new Company(); + company.setCreateDate(new Date()); + company.setIsdeleted(Constants.ZERO); + company.setStatus(Constants.ZERO); + + company.setName(deptGetResponse.getName()); + company.setErpId(deptGetResponse.getDeptId().toString()); + company.setErpParentId(deptGetResponse.getParentId().toString()); + company.setSortnum(deptGetResponse.getOrder().intValue());//榛樿鏈�涓婇潰 + + company.setType(Constants.ONE); + String rootOrgId = systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.HK_ROOTORG_CODE).getCode(); + company.setCompanyPath(company.getId()+"/");//鍚嶇О璺緞 + company.setCompanyNamePath(company.getName());//鍚嶇О璺緞 + company.setHkParentId(rootOrgId); + String idPath = ""; + if(StringUtils.isNotBlank(company.getErpParentId()) && !StringUtils.equals(company.getErpParentId(),Constants.ONE+"")){ + Company parent = companyMapper.selectOne(new QueryWrapper<Company>().lambda().eq(Company::getErpId,company.getErpParentId()) + .eq(Company::getIsdeleted,Constants.ZERO).last(" limit 1 ")); + if(parent == null || Constants.equalsInteger(parent.getIsdeleted(),Constants.ONE)){ + throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "瀵逛笉璧凤紝鐖剁骇缁勭粐淇℃伅涓嶅瓨鍦▇"); + } +// if(StringUtils.isBlank(parent.getHkId())){ +// throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "瀵逛笉璧凤紝鐖剁骇缁勭粐淇℃伅灏氭湭鍚屾涓嬪彂鎴愬姛~"); +// } + if(Objects.nonNull(parent.getType())&&!Constants.equalsInteger(parent.getType(),-1)){ + if(!Constants.equalsInteger(company.getType(),parent.getType())){ + throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝缁勭粐淇℃伅閿欒"); + } + }else if(Objects.isNull(parent.getType())){ + throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝缁勭粐淇℃伅閿欒"); + } + idPath = parent.getCompanyPath(); + company.setHkParentId(parent.getHkId()); + company.setCompanyPath(parent.getCompanyPath()+company.getId()+"/"); + company.setCompanyNamePath(parent.getCompanyNamePath()+"/"+company.getName()); + } + company.setHkCompanyPath(company.getCompanyNamePath()); + company.setCreateDate(new Date()); + company.setIsdeleted(Constants.ZERO); + company.setHkStatus(Constants.ZERO); + company.setStatus(Constants.ZERO); + company.setHkDate(company.getCreateDate()); + company.setEditDate(company.getCreateDate()); + company.setEditor(company.getCreator()); + company.setPinyin(Constants.getChinesePingyin(company.getName())); + companyMapper.insert(company); + + company.setHkId(UUID.randomUUID().toString().replace("-","")); + //涓嬪彂娴峰悍瀹夐槻骞冲彴 + Boolean issueStatus = addHkOrg(company); + Company com = new Company(); + com.setId(company.getId()); + com.setHkId(issueStatus?company.getHkId():null); + com.setHkStatus(issueStatus?Constants.ONE:Constants.TWO); + com.setCompanyPath(idPath+company.getId()+"/"); + companyMapper.updateById(com); + return company; + } + + + public Company syncDDEditCompanyModel(OapiV2DepartmentGetResponse.DeptGetResponse deptGetResponse,Company company){ + company.setErpParentId(deptGetResponse.getParentId().toString()); + String idPath = ""; + if(StringUtils.isNotBlank(company.getErpParentId()) && !StringUtils.equals(company.getErpParentId(),Constants.ONE+"")){ + Company parent = companyMapper.selectOne(new QueryWrapper<Company>().lambda().eq(Company::getErpId,company.getErpParentId()) + .eq(Company::getIsdeleted,Constants.ZERO).last("limit 1 ")); + if(parent == null || Constants.equalsInteger(parent.getIsdeleted(),Constants.ONE)){ + throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "瀵逛笉璧凤紝鐖剁骇缁勭粐淇℃伅涓嶅瓨鍦▇"); + } + if(Objects.nonNull(parent.getType())&&!Constants.equalsInteger(parent.getType(),-1)){ + if(!Constants.equalsInteger(company.getType(),parent.getType())){ + throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝缁勭粐淇℃伅閿欒"); + } + }else if(Objects.isNull(parent.getType())){ + throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝缁勭粐淇℃伅閿欒"); + } + idPath = parent.getCompanyPath(); + company.setHkParentId(parent.getHkId()); + company.setCompanyPath(parent.getCompanyPath()+company.getId()+"/"); + company.setCompanyNamePath(parent.getCompanyNamePath()+"/"+company.getName()); + } + + company.setName(deptGetResponse.getName()); + company.setErpId(deptGetResponse.getDeptId().toString()); + company.setErpParentId(deptGetResponse.getParentId().toString()); + company.setSortnum(deptGetResponse.getOrder().intValue());//榛樿鏈�涓婇潰 + company.setEditDate(new Date()); + company.setHkCompanyPath(company.getCompanyNamePath()); + company.setHkStatus(Constants.ZERO); + company.setStatus(Constants.ZERO); + company.setSortnum(deptGetResponse.getOrder().intValue()); + company.setHkDate(company.getCreateDate()); + company.setEditDate(company.getCreateDate()); + company.setEditor(company.getCreator()); + company.setPinyin(Constants.getChinesePingyin(company.getName())); + companyMapper.updateById(company); + //涓嬪彂娴峰悍瀹夐槻骞冲彴 + Boolean issueStatus = editHkOrg(company); + Company com = new Company(); + com.setId(company.getId()); + com.setHkId(issueStatus?company.getHkId():null); + com.setHkStatus(issueStatus?Constants.ONE:Constants.TWO); + com.setCompanyPath(idPath+company.getId()+"/"); + companyMapper.updateById(com); + return company; + } + + + + public void syncDelCompany(List<Long> deptIdList){ + List<Company> companyList = companyMapper.selectList(new QueryWrapper<Company>() + .lambda() + .eq(Company::getIsdeleted,Constants.ZERO) + .in(Company::getErpId,deptIdList) + ); + if(CollectionUtils.isNotEmpty(companyList)){ + List<Integer> delIds = companyList.stream().map(i->i.getId()).collect(Collectors.toList()); + List<String> delHKIds = companyList.stream().filter(i->StringUtils.isNotBlank(i.getHkId())).map(i->i.getHkId()).collect(Collectors.toList()); + + //鏍囪涓氬姟鍒犻櫎 + companyMapper.update(new UpdateWrapper<Company>().lambda() + .set(Company::getIsdeleted,Constants.ONE) + .set(Company::getEditDate,new Date()) + .in(Company::getId,delIds) + ); + //娴峰悍鍒犻櫎鐨勬暟鎹紝杩涜鍒犻櫎 + doHkDeleteOrg(delIds,delHKIds,new Date()); + } + } + + + } -- Gitblit v1.9.3