package grand; import java.io.File; import java.sql.SQLException; import java.util.Date; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import foundation.action.ActionProvider; import foundation.capacity.ActorType; import foundation.code.CodeEngine; import foundation.dao.DataPackage; import foundation.dao.DataSource; import foundation.dao.Domain; import foundation.dao.Filter; import foundation.dao.PackageStringMap; import foundation.data.entity.Entity; import foundation.data.entity.EntitySet; import foundation.data.object.DataObject; import foundation.data.object.EntitySaver; import foundation.io.FileCenter; import foundation.io.FileField; import foundation.io.FileInjector; import foundation.io.FileMeta; import foundation.io.FileMetaList; import foundation.io.FileTypes; import foundation.io.object.FileRecord; import foundation.io.template.AuthorizeTemplate; import foundation.org.PositionCategory; import foundation.persist.NamedSQL; import foundation.persist.SQLRunner; import foundation.state.StateMachine; import foundation.token.IOnlineUser; import foundation.user.OnlineUser; import foundation.util.DateTimeUtil; import foundation.util.ID; import foundation.util.Util; public class OrgAccountHandler extends ActionProvider { private static Logger logger; private static String TermCode_Terminate = "terminate"; private static String TABLE_ACCOUNT = "md_org_account"; private static String TABLE_NCACCOUNT = "md_org_account_ncc"; private static String TABLE_CLOSEACCOUNT = "md_org_account_close"; static { logger = LogManager.getLogger(OrgAccountHandler.class); } @Override protected void publishMethod() { //1. 获取初始授信金额 addMethod("getAccountCreditInitialAmt"); //2. 生成协议附件 addMethod("createAgreementFile"); //3. 备案生效(协议来源) addMethod("activateAgreementRecord"); //3. 备案失效(协议来源) addMethod("stopAgreementRecord"); //4. 生成授权书 addMethod("createAuthorization"); //5. 终止授权书 addMethod("terminateAuthorization"); //6. 失效授权书 addMethod("disableAuthorization"); //7. 生成渠道关系 addMethod("refreshChannelStructure"); //8. 客商汇总 addMethod("customerCount"); //9. 新增岗位 addMethod("addPosition"); //10. 删除岗位 addMethod("deletePosition"); //11. 关闭账户 addMethod("closeAccount"); } public void createAgreementFile() throws Exception { DataPackage dataPackage = dataReader.getDataPackage(); if (dataPackage == null) { logger.error("create agreement file error: data not exists"); return; } dataPackage.loadOneDataFromDB(); //1. 获取模板列表 Entity master = dataPackage.getMasterEntity(); String templateId = master.getString("template_id"); DataObject dataObject = DataObject.getInstance("agm_template_file"); EntitySet templateSet = dataObject.getTableEntitySet(new Filter("sender_id", templateId)); if (templateSet == null || templateSet.isEmpty()) { logger.error("create agreement file error: template not exists"); dataWriter.reportOneError("createAgreementFile", "协议模板不存在,无法创建文件"); return; } //2. 数据注入 FileMetaList result = new FileMetaList(); IOnlineUser user = IOnlineUser.getInstance(); PackageStringMap dataMap = dataPackage.toStringMap(); dataMap.setNullResult("***"); for (Entity entity: templateSet) { File file = new File(entity.getString("file_path")); String targetName = entity.getString("file_name"); if (!file.exists()) { logger.error("create agreement file error, template not exists: {}", file.toString()); dataWriter.reportOneError("createAgreementFile", "协议模板不存在:" + targetName); continue; } File target = FileInjector.createOneFile(user, file, targetName, FileTypes.PDF, dataMap); targetName = target.getName(); FileMeta fileMeta = new FileMeta(targetName, target); fileMeta.setSize(file.length()); result.add(fileMeta); } //3. 回写到协议中 FileField fileField = new FileField("contract_attachment_id", null); FileCenter.saveFileToRepository(user, result, dataPackage, fileField); //4. 删除临时文件 // for (FileMeta fileMeta: result) { // File temp = fileMeta.getFile(); // temp.delete(); // } //5. 返回结果 dataWriter.addValue("file", result); } public void activateAgreementRecord() throws Exception { DataPackage dataPackage = dataReader.getDataPackage(); if (dataPackage == null) { logger.error("activate agreement record error: data not exists"); return; } Entity master = dataPackage.getMasterEntity(); String agreementNo = master.getString("agreement_no"); Date beginDate = master.getDate("date_from", null); Date endDate = master.getDate("date_to", null); NamedSQL namedSQL = NamedSQL.getInstance("activateAgreementRecord"); namedSQL.setParam("agreement_id", master.getId()); namedSQL.setParam("agreement_no", agreementNo); namedSQL.setParam("date_from", beginDate); namedSQL.setParam("date_to", endDate); namedSQL.setParam("state_code", StateMachine.State_Code_Open); namedSQL.setParam("state_name", StateMachine.State_Name_Open); //1. 生效备案(通用) namedSQL.setParam("tableName", "agm_record"); namedSQL.execute(); //2. 生效价格(产品) namedSQL.setParam("tableName", "agm_record_product"); namedSQL.execute(); //3. 生效价格(省份) namedSQL.setParam("tableName", "agm_record_province"); namedSQL.execute(); //4. 生效价格 namedSQL.setParam("tableName", "md_prod_price_detail"); namedSQL.execute(); } public void stopAgreementRecord() throws Exception { Domain domain = dataReader.getDomain(); NamedSQL namedSQL = NamedSQL.getInstance("stopAgreementRecord"); namedSQL.setParam("agreement_id", domain.getId()); namedSQL.setParam("state_code", StateMachine.State_Code_Close); namedSQL.setParam("state_name", StateMachine.State_Name_Close); //1. 中止备案(通用) namedSQL.setParam("tableName", "agm_record"); namedSQL.execute(); //2. 中止价格(产品) namedSQL.setParam("tableName", "agm_record_product"); namedSQL.execute(); //3. 中止价格(省份) namedSQL.setParam("tableName", "agm_record_provinces"); namedSQL.execute(); //4. 中止价格 namedSQL.setParam("tableName", "md_prod_price_detail"); namedSQL.execute(); } public void createAuthorization() throws Exception { DataPackage dataPackage = dataReader.getDataPackage(); if (dataPackage == null) { logger.error("create authorization file error: data not exists"); return; } dataPackage.loadOneDataFromDB(); IOnlineUser user = IOnlineUser.getInstance(); Entity masterEntity = dataPackage.getMasterEntity(); String applyId = masterEntity.getId(); //1. 获取模板列表, 创建授权书 String companyId = masterEntity.getString("company_id"); String buId = masterEntity.getString("bu_id"); String orgId = masterEntity.getString("org_id"); String categoryCode = masterEntity.getString("category_code"); String termCode = masterEntity.getString("term_code"); if (TermCode_Terminate.equalsIgnoreCase(termCode)) { logger.error("apply is terminate authorization, skip createAuthorization."); return; } //2. 获取开户客户 DataObject dataObject = DataObject.getInstance(TABLE_ACCOUNT); Filter accountFilter = new Filter(); accountFilter.add("bu_id", buId); accountFilter.add("company_id", companyId); accountFilter.add("org_id", orgId); String accountId = null; Entity accountEntity = dataObject.getTableEntity(accountFilter); if (accountEntity != null ) { accountId = accountEntity.getId(); } AuthorizeTemplate template = AuthorizeTemplate.getInstance(companyId, buId, categoryCode, termCode); if (template == null) { logger.error("authorize template file not exists, skep"); dataWriter.reportOneError("createAuthorization", "授权书模板不存在,过程终止"); task.terminate(); return; } //3. 获取授权申请下的所有授权书 dataObject = DataObject.getInstance("md_org_account_hospital"); Filter filter = new Filter("apply_id", applyId); EntitySet entitySet = dataObject.getTableEntitySet(filter); //4. 处理产品及生产产品描述 NamedSQL namedSQL = NamedSQL.getInstance("createAuthorizeProduces"); namedSQL.setParam("apply_id", applyId); String buName = masterEntity.getString("bu_name"); DataObject productObject = DataObject.getInstance("md_org_account_hospital_apply_product"); EntitySet productSet = productObject.getTableEntitySet(new Filter("parent_id", applyId)); String productRemark = createProductRemark(buName, productSet); for (Entity entity :entitySet) { String id = entity.getId(); //5.1 申请生效后,将产品拷贝到授权中 namedSQL.setParam("new_id", ID.newValue()).setParam("authorize_id", id); namedSQL.execute(); //5.2 申请生效后,明细授权生效 EntitySaver saver = dataObject.createEntitySaver(entity); saver.set("state_code", "Open"); saver.set("state_name", "已生效"); saver.set("is_active", "T"); saver.set("account_id", accountId); saver.set("org_id", masterEntity.getString("org_id")); saver.set("org_code", masterEntity.getString("org_code")); saver.set("org_name", masterEntity.getString("org_name")); saver.set("category_code", masterEntity.getString("category_code")); saver.set("category_name", masterEntity.getString("category_name")); saver.set("term_code", masterEntity.getString("term_code")); saver.set("term_name", masterEntity.getString("term_name")); saver.set("content", masterEntity.getString("content")); saver.set("company_id", masterEntity.getString("company_id")); saver.set("company_name", masterEntity.getString("company_name")); saver.set("bu_id", masterEntity.getString("bu_id")); saver.set("bu_name", masterEntity.getString("bu_name")); saver.set("account_id", masterEntity.getString("account_id")); saver.set("connected_org_id", masterEntity.getString("connected_org_id")); saver.set("connected_org_code", masterEntity.getString("connected_org_code")); saver.set("connected_org_name", masterEntity.getString("connected_org_name")); saver.set("date_from", masterEntity.getValue("date_from")); saver.set("date_to", masterEntity.getValue("date_to")); String dateTo = masterEntity.getString("date_to"); if (!Util.isEmpty(dateTo)) { String implantDeatline = DateTimeUtil.addMonths(dateTo, 1); saver.set("implant_deadline", Util.StringToDate(implantDeatline)); } saver.set("product_remark", productRemark); saver.update(); //5.3 生成授权书 DataPackage authorizePackage = DataPackage.getInstance("md_org_account_hospital"); authorizePackage.setMasterId(entity.getId()); authorizePackage.loadOneDataFromDB(); PackageStringMap dataMap = authorizePackage.toStringMap(); dataMap.addAlias("md_org_account_hospital", "authorize"); dataMap.addAlias("md_org_account_hospital_product", "products"); dataMap.setNullResult("***"); File target = FileInjector.createOneFile(user, template.getPath(), FileTypes.PDF, dataMap); FileMeta fileMeta = new FileMeta(target.getName(), target); fileMeta.setSize(target.length()); //5.4 回写到协议中 FileField fileField = new FileField("file_authorization", "file_name_authorization"); FileRecord fileRecord = FileCenter.saveFileToRepository(user, fileMeta, dataObject.getDataName(), id, fileField); saver = dataObject.createEntitySaver(id); saver.set("id", id); saver.set("file_authorization", fileRecord.getIndexId()); saver.set("file_name_authorization", fileRecord.getFileName()); saver.update(); } //6. 返回结果 int size = entitySet.size(); dataWriter.reportOneMessage("createAuthorization", ("共生成" + size + "授权书")); } public void terminateAuthorization() throws Exception { DataPackage dataPackage = dataReader.getDataPackage(); if (dataPackage == null) { logger.error("terminate authorization error: data not exists"); return; } OnlineUser user = OnlineUser.getInstance(); Entity masterEntity = dataPackage.getMasterEntity(); String applyId = dataPackage.getMasterId(); String companyId = masterEntity.getString("company_id"); String buId = masterEntity.getString("bu_id"); String categoryCode = masterEntity.getString("category_code"); String termCode = masterEntity.getString("term_code"); // 1. 判断是否为终止授权 if (!TermCode_Terminate.equalsIgnoreCase(termCode)) { logger.error("apply is not terminate authorization, skip terminateAuthorization."); return; } // 2. 计算植入截止日期 String suspendDate = masterEntity.getString("suspend_date"); if (Util.isEmpty(suspendDate)) { logger.error("terminate authorization error: suspend_date is not fill"); return; } String implantDeadline = DateTimeUtil.addMonths(suspendDate, 3); //3. 获取终止授权申请下的所有授权书 AuthorizeTemplate template = AuthorizeTemplate.getInstance(companyId, buId, categoryCode, termCode); if (template == null) { logger.error("authorize template file not exists, skep"); dataWriter.reportOneError("createAuthorization", "授权书模板不存在,过程终止"); task.terminate(); return; } DataObject dataObject = DataObject.getInstance("md_org_account_hospital"); Filter filter = new Filter("apply_id", applyId); EntitySet entitySet = dataObject.getTableEntitySet(filter); EntitySaver saver = dataObject.createEntitySaver(); for (Entity entity : entitySet){ //4. 更新原授权 String id = entity.getId(); String oldAuthorizationId = entity.getString("old_id"); saver = dataObject.createEntitySaver(oldAuthorizationId); saver.set("id", oldAuthorizationId); saver.set("state_code", "Closed"); saver.set("state_name", "已终止"); saver.set("suspend_date", suspendDate); saver.set("implant_deadline", implantDeadline); saver.update(); //3. 生成终止授权书 PackageStringMap dataMap = dataPackage.toStringMap(); dataMap.addAlias("md_org_account_hospital", "authorize"); dataMap.addAlias("md_org_account_hospital_product", "products"); dataMap.addReplace("_", "-"); dataMap.setNullResult("***"); File target = FileInjector.createOneFile(user, template.getTemplateName(), FileTypes.PDF, dataMap); FileMeta fileMeta = new FileMeta(target.getName(), target); fileMeta.setSize(target.length()); FileField fileField = new FileField("file_authorization", "file_name_authorization"); FileRecord fileRecord = FileCenter.saveFileToRepository(user, fileMeta, dataObject.getDataName(), id, fileField); //4. 回写授权 saver = dataObject.createEntitySaver(id); saver.set("id", id); saver.set("file_authorization", fileRecord.getIndexId()); saver.set("file_name_authorization", fileRecord.getFileName()); saver.set("suspend_date", suspendDate); saver.set("implant_deadline", implantDeadline); saver.update(); } //5. 返回结果 dataWriter.reportOneMessage("terminateAuthorization", "终止授权成功,植入上报截止时间为:" + implantDeadline); } private String createProductRemark(String buName, EntitySet productSet) { if (productSet.isEmpty()) { return buName; } Entity entity = productSet.getEntity(0); String result = entity.getString("product_name"); int size = productSet.size(); if (size > 1) { result = result + "(" + size + "个产品)"; } return result; } public synchronized void refreshChannelStructure() throws Exception { NamedSQL namedSQL; //1. 获取上次更新时间 namedSQL = NamedSQL.getInstance("getChannelStructureLastTime"); Date date = SQLRunner.getDate(namedSQL); if (date == null) { date = new Date(0); } //2. 增加新的渠道关系 int cnt_add = 0, cnt_delete = 0; namedSQL = NamedSQL.getInstance("createChannelStructure_dealerOnly"); namedSQL.setParam("updateTime", date); cnt_add = cnt_add + namedSQL.execute(); namedSQL = NamedSQL.getInstance("createChannelStructure_dealerDistributor"); namedSQL.setParam("updateTime", date); cnt_add = cnt_add + namedSQL.execute(); namedSQL = NamedSQL.getInstance("createChannelStructure_distributor"); namedSQL.setParam("updateTime", date); cnt_add = cnt_add + namedSQL.execute(); //3. 关闭取消的渠道关系 namedSQL = NamedSQL.getInstance("closeChannelStructure"); namedSQL.setParam("updateTime", date); cnt_delete = cnt_delete + namedSQL.execute(); //4. 写入日志 DataObject dataObject = DataObject.getInstance("md_channel_structure_log"); EntitySaver saver = dataObject.createEntitySaver(); saver.set("id", ID.newValue()); saver.set("run_time", new Date()); saver.set("cnt_add", cnt_add); saver.set("cnt_delete", cnt_delete); saver.insert(); } public void customerCount() throws Exception { OnlineUser user = OnlineUser.getInstance(); DataObject dataObject; Filter filter = new Filter(); int customerCount; //1. 直采客商 dataObject = DataObject.getInstance(TABLE_ACCOUNT); filter = dataObject.loadUserLineFilter(user); filter.add("state_code", "open"); filter.add("actor_code", "First"); customerCount = dataObject.getCount(filter); dataWriter.addValue("first", customerCount); //2. 平台商 filter.removeItemByName("actor_code"); filter.add("actor_code", "Platform"); customerCount = dataObject.getCount(filter); dataWriter.addValue("platform", customerCount); //3. 非直采 filter.removeItemByName("actor_code"); filter.add("actor_code", "Second"); customerCount = dataObject.getCount(filter); dataWriter.addValue("second", customerCount); //4. 配送商 dataObject = DataObject.getInstance("md_channel_structure"); filter = dataObject.loadUserLineFilter(user); filter.add("category_code", "Distributor"); NamedSQL namedSQL = NamedSQL.getInstance("getPositionDistributor"); namedSQL.setFilter(filter); Entity entity = namedSQL.getEntity(); customerCount = entity.getInt("customerCount"); dataWriter.addValue("distribute", customerCount); //5. 医院 dataObject = DataObject.getInstance("md_position_hospital"); filter = dataObject.loadUserLineFilter(user); customerCount = dataObject.getCount(filter); dataWriter.addValue("hospital", customerCount); } public void addPosition() throws Exception{ String dataName = dataReader.getString("dataname"); DataPackage dataPackage = dataReader.getDataPackage(); dataPackage.loadDataFromRequest(dataName); Entity positionEntity = dataPackage.getMasterEntity(DataSource.Request); String buId = positionEntity.getString("bu_id"); String companyId = positionEntity.getString("company_id"); PositionCategory category = PositionCategory.parse(positionEntity.getString("category_code")); String dynamic = null; DataObject dataObject = DataObject.getInstance("md_bu_org"); Filter filter = new Filter(); if(PositionCategory.Sales == category) { String[] segment = buId.split("-"); if(segment.length >= 1) { dynamic = segment[1]; } filter.add("bu_id", buId); filter.add("company_id", companyId); } else { dynamic = "BS-O"; } EntitySet buOrgRelation = dataObject.getTableEntitySet(filter); SQLRunner.beginTrans(); try { //1. 添加岗位 dataObject = DataObject.getInstance(dataName); String positionId = positionEntity.getId(), actorTargetId = null; if (Util.isEmpty(positionEntity.getId())) { positionId = ID.newValue(); actorTargetId = ID.newValue(); } //2. 生成编码 String code = CodeEngine.nextval("Code-Position", dynamic); positionEntity.setId(positionId); positionEntity.set("code", code); positionEntity.set("category_code", category); positionEntity.set("is_delete", "F"); dataObject.saveEntity(positionEntity); //3. 获取公司BU关系,为岗位配置角色 for (Entity entity: buOrgRelation) { String targetBuId = entity.getString("bu_id"); String targetCompanyId = entity.getString("company_id"); dataObject = DataObject.getInstance("sys_right_actor_target"); Filter targetFilter = new Filter("target_id", positionId) .add("bu_id",targetBuId) .add("company_id", targetCompanyId); Entity actorTargetExistsEntity = dataObject.getTableEntity(targetFilter); if(actorTargetExistsEntity != null ) { actorTargetId = actorTargetExistsEntity.getId(); } else { actorTargetId = ID.newValue(); } Entity actorTargetEntity = dataPackage.getItemEntity("sys_right_actor_target",DataSource.Request); actorTargetEntity.set("id", actorTargetId); actorTargetEntity.set("bu_id", targetBuId); actorTargetEntity.set("type_code", ActorType.Position); actorTargetEntity.set("company_id", targetCompanyId); actorTargetEntity.set("target_id", positionId); actorTargetEntity.set("remark", positionEntity.getString("remark")); dataObject.saveEntity(actorTargetEntity); } SQLRunner.commit(); } catch(Exception e) { e.printStackTrace(); try { SQLRunner.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } } public void deletePosition() throws Exception{ String dataName = dataReader.getString("dataname"); String id = dataReader.getString("id"); SQLRunner.beginTrans(); try { //1. 删除岗位 DataObject dataObject = DataObject.getInstance(dataName); EntitySaver saver = dataObject.createEntitySaver(id); saver.set("is_delete", "T"); saver.update(); //2. 删除岗位数据权限 dataObject = DataObject.getInstance("sys_right_actor_target"); dataObject.deleteEntity(new Filter("target_id", id)); SQLRunner.commit(); } catch(Exception e) { e.printStackTrace(); try { SQLRunner.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } } public void closeAccount() throws Exception{ DataObject closeDataObject = DataObject.getInstance(TABLE_CLOSEACCOUNT); DataObject accountDataObject = DataObject.getInstance(TABLE_ACCOUNT); DataObject ncOrgDataObject = DataObject.getInstance(TABLE_NCACCOUNT); DataObject actorTargetDataObject = DataObject.getInstance("sys_right_actor_target"); Filter filter = new Filter(); filter.add("state_code", "waitClose"); if (dataReader != null) { String id = dataReader.getString("id"); filter.add("id", id); } EntitySet entitySet = closeDataObject.getTableEntitySet(filter); for (Entity entity : entitySet) { Date terminationDate = entity.getDate("termination_date"); String terminationDateStr = Util.DataTimeToString(terminationDate, Util.NORMALFORMAT); if (Util.newDateStr().compareToIgnoreCase(terminationDateStr) < 0) { continue; } //1. 更新关户申请状态 entity.set("state_code", "Close"); entity.set("state_name", "已关户"); closeDataObject.updateEntity(entity); //2. 更新开户状态 String accountId = entity.getString("host_id"); Entity accountEntity = accountDataObject.getTableEntity(accountId); accountEntity.set("state_code", "Close"); accountEntity.set("state_name", "已关户"); accountDataObject.updateEntity(accountEntity); //3. 更新客商主数据状态 String ncOrgId = accountEntity.getString("org_ncc_id"); Entity ncAccountEntity = ncOrgDataObject.getTableEntity(ncOrgId); ncAccountEntity.set("state_code", "notExistsAccount"); ncAccountEntity.set("state_name", "DMS未开户"); ncOrgDataObject.updateEntity(ncAccountEntity); //4. 删除数据权限 actorTargetDataObject.deleteEntity(new Filter("target_id", accountId)); } } }