Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/service/ForeignTousseApplicationManagerImpl.java =================================================================== diff -u -r40564 -r40716 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/service/ForeignTousseApplicationManagerImpl.java (.../ForeignTousseApplicationManagerImpl.java) (revision 40564) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/service/ForeignTousseApplicationManagerImpl.java (.../ForeignTousseApplicationManagerImpl.java) (revision 40716) @@ -47,6 +47,7 @@ import com.forgon.disinfectsystem.barcode.service.BarcodeManager; import com.forgon.disinfectsystem.basedata.becleanitem.service.ClassifyBasketManager; import com.forgon.disinfectsystem.basedatamanager.goodsstock.service.GoodsStockManager; +import com.forgon.disinfectsystem.basedatamanager.orgunitpatientarearelation.service.OrgUnitPatientAreaRelationManager; import com.forgon.disinfectsystem.basedatamanager.supplier.service.SupplierManager; import com.forgon.disinfectsystem.basedatamanager.supplyroomconfig.service.SupplyRoomConfigManager; import com.forgon.disinfectsystem.basedatamanager.urgent.notification.service.UrgentNotificationManager; @@ -197,6 +198,12 @@ private UserManager userManager; + private OrgUnitPatientAreaRelationManager orgUnitPatientAreaRelationManager; + + public void setOrgUnitPatientAreaRelationManager(OrgUnitPatientAreaRelationManager orgUnitPatientAreaRelationManager) { + this.orgUnitPatientAreaRelationManager = orgUnitPatientAreaRelationManager; + } + public void setUserManager(UserManager userManager) { this.userManager = userManager; } @@ -3087,7 +3094,15 @@ @Override public void saveOrUpdate(ForeignTousseApplication origineFta, ForeignTousseApplication foreignTousseApplication, - String foreignTousseTreeData, String actionType, String timeoutHandType) { + String foreignTousseTreeData, String actionType, String timeoutHandType, boolean checkApplyDepartPatientAreaRelation) { + //提交外来器械申请单时,需要判断本次申请单中,申请科室和病区是否配置了关联关系,如果没有配置,则弹窗提醒用户;DGSETYY-122 + if(checkApplyDepartPatientAreaRelation){ + if(StringUtils.equals(actionType, ForeignTousseApplication.ACTION_TYPE_ADD) + || StringUtils.equals(actionType, ForeignTousseApplication.ACTION_TYPE_UPDATE) + || StringUtils.equals(actionType, ForeignTousseApplication.ACTION_TYPE_INTERFERE)){ + orgUnitPatientAreaRelationManager.checkApplyDepartPatientAreaRelation(foreignTousseApplication); + } + } this.saveOrUpdate(origineFta, foreignTousseApplication, foreignTousseTreeData, actionType); if(ForeignTousseApplication.ACTION_TYPE_ADD.equals(actionType)){ //根据foreiginTousseApplicationWarningTimeRange配置项判断是否保存不良事件 @@ -4374,7 +4389,7 @@ //保存翻包申请产生的外来器械包申请单 foreignTousseApplication.setSerialNumber(null); - this.saveOrUpdate(null, foreignTousseApplication, foreignTousseTreeDataArray.toString(), ForeignTousseApplication.ACTION_TYPE_ADD, timeoutHandType); + this.saveOrUpdate(null, foreignTousseApplication, foreignTousseTreeDataArray.toString(), ForeignTousseApplication.ACTION_TYPE_ADD, timeoutHandType, false); //翻包申请产生的外来器械包申请单关联进行翻包申请的申请单 foreignTousseApplication.setUsedAgainInvoicePlanId(usedAgainForeignTousseApplication.getId()); @@ -5091,7 +5106,7 @@ //申请单物品明细 String foreignTousseInfo = buildForeignTousseInfo(actionType, dto); String timeoutHandType = null; - this.saveOrUpdate(origineFta, foreignTousseApplication, foreignTousseInfo , actionType, timeoutHandType ); + this.saveOrUpdate(origineFta, foreignTousseApplication, foreignTousseInfo , actionType, timeoutHandType, false); } /** Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/orgunitpatientarearelation/service/OrgUnitPatientAreaRelationManager.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/orgunitpatientarearelation/service/OrgUnitPatientAreaRelationManager.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/orgunitpatientarearelation/service/OrgUnitPatientAreaRelationManager.java (revision 40716) @@ -0,0 +1,52 @@ +package com.forgon.disinfectsystem.basedatamanager.orgunitpatientarearelation.service; + +import com.forgon.directory.model.OrgUnitPatientAreaRelation; +import com.forgon.directory.vo.OrgUnitPatientAreaRelationVo; +import com.forgon.disinfectsystem.entity.foreigntousseapplication.ForeignTousseApplication; +import com.forgon.entity.PageEntity; +import com.forgon.tools.hibernate.BasePoManager; + +/** + * 申请科室关联病区设置的manager + * DGSETYY-122 + */ +public interface OrgUnitPatientAreaRelationManager extends BasePoManager { + + /** + * 保存或者修改“申请科室关联病区设置” + * @param orgUnitPatientAreaRelationVo “申请科室关联病区设置”vo + */ + public void saveOrgUnitPatientAreaRelation(OrgUnitPatientAreaRelationVo orgUnitPatientAreaRelationVo); + + /** + * 根据科室id批次删除“申请科室关联病区设置” + * @param orgUnitIds 科室id,例如:1;2;3 + */ + public void deleteOrgUnitPatientAreaRelationByOrgUnitId(String orgUnitIds); + + /** + * 分页加载科室及关联病区 + * @param page 分页参数 + */ + public void loadOrgUnitPatientAreaRelation(PageEntity page); + + /** + * 检查外来器械包申请单的申请科室和病区的值是否有关联 + * @param foreignTousseApplication 外来器械包申请单 + */ + public void checkApplyDepartPatientAreaRelation(ForeignTousseApplication foreignTousseApplication); + + /** + * 检查申请科室和病区的值是否有关联 + * @param applyDepartCode 科室编码 + * @param patientArea 病区 + */ + public void checkApplyDepartPatientAreaRelation(String applyDepartCode, String patientArea); + + /** + * 检查装配任务关联的外来器械包申请单的申请科室和病区的关联 + * @param packingTaskIds 装配任务id,例如:1;2;3 + */ + public void checkPackingTaskApplyOrgUnitPatientAreaRelation(String packingTaskIds); + +} Index: ssts-web/src/test/java/test/forgon/directory/service/OrgUnitPatientAreaRelationManagerTest.java =================================================================== diff -u --- ssts-web/src/test/java/test/forgon/directory/service/OrgUnitPatientAreaRelationManagerTest.java (revision 0) +++ ssts-web/src/test/java/test/forgon/directory/service/OrgUnitPatientAreaRelationManagerTest.java (revision 40716) @@ -0,0 +1,265 @@ +package test.forgon.directory.service; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.collections.CollectionUtils; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.testng.AssertJUnit; + +import com.forgon.directory.model.OrgUnit; +import com.forgon.directory.model.OrgUnitPatientAreaRelation; +import com.forgon.directory.service.OrgUnitManager; +import com.forgon.directory.vo.OrgUnitPatientAreaRelationVo; +import com.forgon.disinfectsystem.basedatamanager.orgunitpatientarearelation.service.OrgUnitPatientAreaRelationManager; +import com.forgon.disinfectsystem.basedatamanager.supplyroomconfig.service.SupplyRoomConfigManager; +import com.forgon.disinfectsystem.entity.foreigntousseapplication.ForeignTousseApplication; +import com.forgon.entity.PageEntity; +import com.forgon.systemsetting.model.HttpOption; +import com.forgon.systemsetting.service.HttpOptionManager; +import com.forgon.tools.string.StringTools; +import com.forgon.tools.util.ConfigUtils; + +import test.forgon.constant.Constants; +import test.forgon.disinfectsystem.AbstractCSSDTest; + +/** + * 申请科室关联病区设置测试 + */ +public class OrgUnitPatientAreaRelationManagerTest extends AbstractCSSDTest { + + @Autowired + private OrgUnitPatientAreaRelationManager orgUnitPatientAreaRelationManager; + + @Autowired + private OrgUnitManager orgUnitManager; + + @Autowired + private HttpOptionManager httpOptionManager; + + @Autowired + private SupplyRoomConfigManager supplyRoomConfigManager; + + /** + * 申请科室(测试内科) + */ + private OrgUnit applyDepartNeiKe; + + /** + * 申请科室(测试外科) + */ + private OrgUnit applyDepartWaiKe; + + /** + * 供应室 + */ + private OrgUnit cssdDepart; + + private List patientAreaHttpOptionList; + + @Before + public void initTestData(){ + //申请科室(测试内科) + applyDepartNeiKe = orgUnitManager.getByCode(Constants.ORG_UNIT_CODE_NEIKE); + //申请科室(测试外科) + applyDepartWaiKe = orgUnitManager.getByCode(Constants.ORG_UNIT_CODE_WAIKE); + //供应室 + cssdDepart = orgUnitManager.getByCode(Constants.ORG_UNIT_CODE_CSSD); + //先清除旧数据 + List dbOptionList = httpOptionManager.getHttpOptionListById(HttpOption.SYSTEMSETTING_PATIENT_AREA); + if(CollectionUtils.isNotEmpty(dbOptionList)){ + for (HttpOption httpOption : dbOptionList) { + httpOptionManager.delete(httpOption); + } + } + //测试的病区 + List optionList = new ArrayList(); + HttpOption httpOption1 = new HttpOption(); + httpOption1.setId(null); + httpOption1.setOptionListId(HttpOption.SYSTEMSETTING_PATIENT_AREA); + httpOption1.setOptionText("病区01"); + httpOption1.setOptionValue(null); + httpOption1.setSequence(1); + httpOption1.setStatus(1); + optionList.add(httpOption1); + HttpOption httpOption2 = new HttpOption(); + httpOption2.setId(null); + httpOption2.setOptionListId(HttpOption.SYSTEMSETTING_PATIENT_AREA); + httpOption2.setOptionText("病区02"); + httpOption2.setOptionValue(null); + httpOption2.setSequence(2); + httpOption2.setStatus(1); + optionList.add(httpOption2); + httpOptionManager.saveOrUpdateByListId(optionList, HttpOption.SYSTEMSETTING_PATIENT_AREA); + patientAreaHttpOptionList = httpOptionManager.getHttpOptionListById(HttpOption.SYSTEMSETTING_PATIENT_AREA); + } + + /** + * 测试保存修改科室关联病区设置 + */ + @Test + @SuppressWarnings("unchecked") + public void testSaveOrUpdateOrgUnitPatientAreaRelation(){ + AssertJUnit.assertNotNull(patientAreaHttpOptionList); + String patientAreaHttpOptionIds = ""; + List patientAreaHttpOptionIdList = new ArrayList(); + if(CollectionUtils.isNotEmpty(patientAreaHttpOptionList)){ + for (HttpOption httpOption : patientAreaHttpOptionList) { + patientAreaHttpOptionIdList.add(httpOption.getId()); + } + patientAreaHttpOptionIds = StringTools.join(patientAreaHttpOptionIdList, ";"); + } + + //测试内科关联病区 + OrgUnitPatientAreaRelationVo orgUnitPatientAreaRelationVo = new OrgUnitPatientAreaRelationVo(); + orgUnitPatientAreaRelationVo.setOrgUnitId(applyDepartNeiKe.getId()); + orgUnitPatientAreaRelationVo.setPatientAreaHttpOptionIds(patientAreaHttpOptionIds); + orgUnitPatientAreaRelationManager.saveOrgUnitPatientAreaRelation(orgUnitPatientAreaRelationVo); + + //测试外科关联病区 + orgUnitPatientAreaRelationVo = new OrgUnitPatientAreaRelationVo(); + orgUnitPatientAreaRelationVo.setOrgUnitId(applyDepartWaiKe.getId()); + orgUnitPatientAreaRelationVo.setPatientAreaHttpOptionIds(patientAreaHttpOptionIds); + orgUnitPatientAreaRelationManager.saveOrgUnitPatientAreaRelation(orgUnitPatientAreaRelationVo); + + //供应室不能设置关联病区,科室只能为【科室供应室设置】—【科室申领配置】中配置的所有未停用的科室 + try { + orgUnitPatientAreaRelationVo = new OrgUnitPatientAreaRelationVo(); + orgUnitPatientAreaRelationVo.setOrgUnitId(cssdDepart.getId()); + orgUnitPatientAreaRelationVo.setPatientAreaHttpOptionIds(patientAreaHttpOptionIds); + orgUnitPatientAreaRelationManager.saveOrgUnitPatientAreaRelation(orgUnitPatientAreaRelationVo); + } catch (Exception e) {} + + //列表查询到两行记录 + PageEntity page = new PageEntity(0, 20); + orgUnitPatientAreaRelationManager.loadOrgUnitPatientAreaRelation(page); + List orgUnitPatientAreaRelationVoList = page.getList(); + AssertJUnit.assertNotNull(orgUnitPatientAreaRelationVoList); + AssertJUnit.assertEquals(orgUnitPatientAreaRelationVoList.size(), 2); + } + + /** + * 测试删除科室关联病区设置 + */ + @SuppressWarnings("unchecked") + @Test + public void testDeleteOrgUnitPatientAreaRelation(){ + AssertJUnit.assertNotNull(patientAreaHttpOptionList); + String patientAreaHttpOptionIds = ""; + List patientAreaHttpOptionIdList = new ArrayList(); + if(CollectionUtils.isNotEmpty(patientAreaHttpOptionList)){ + for (HttpOption httpOption : patientAreaHttpOptionList) { + patientAreaHttpOptionIdList.add(httpOption.getId()); + } + patientAreaHttpOptionIds = StringTools.join(patientAreaHttpOptionIdList, ";"); + } + + //测试内科关联病区 + OrgUnitPatientAreaRelationVo orgUnitPatientAreaRelationVo = new OrgUnitPatientAreaRelationVo(); + orgUnitPatientAreaRelationVo.setOrgUnitId(applyDepartNeiKe.getId()); + orgUnitPatientAreaRelationVo.setPatientAreaHttpOptionIds(patientAreaHttpOptionIds); + orgUnitPatientAreaRelationManager.saveOrgUnitPatientAreaRelation(orgUnitPatientAreaRelationVo); + + //测试外科关联病区 + orgUnitPatientAreaRelationVo = new OrgUnitPatientAreaRelationVo(); + orgUnitPatientAreaRelationVo.setOrgUnitId(applyDepartWaiKe.getId()); + orgUnitPatientAreaRelationVo.setPatientAreaHttpOptionIds(patientAreaHttpOptionIds); + orgUnitPatientAreaRelationManager.saveOrgUnitPatientAreaRelation(orgUnitPatientAreaRelationVo); + + String orgUnitIds = applyDepartNeiKe.getId() + ";" + applyDepartWaiKe.getId(); + orgUnitPatientAreaRelationManager.deleteOrgUnitPatientAreaRelationByOrgUnitId(orgUnitIds); + PageEntity page = new PageEntity(0, 20); + orgUnitPatientAreaRelationManager.loadOrgUnitPatientAreaRelation(page); + List orgUnitPatientAreaRelationVoList = page.getList(); + AssertJUnit.assertNotNull(orgUnitPatientAreaRelationVoList); + AssertJUnit.assertEquals(orgUnitPatientAreaRelationVoList.size(), 0); + } + + /** + * 测试检查申请科室是否关联病区 + */ + @Test + public void testCheckApplyDepartPatientAreaRelation(){ + + boolean enableDepartmentToWardAssociation = ConfigUtils.getSystemSetConfigByNameBool("enableDepartmentToWardAssociation"); + boolean enablePatientAreaSetting = ConfigUtils.getSystemSetConfigByNameBool("enablePatientAreaSetting"); + if(!enableDepartmentToWardAssociation || !enablePatientAreaSetting){ + //开启配置项才会生效 + return; + } + + AssertJUnit.assertNotNull(patientAreaHttpOptionList); + String patientAreaHttpOptionIds = ""; + List patientAreaHttpOptionIdList = new ArrayList(); + if(CollectionUtils.isNotEmpty(patientAreaHttpOptionList)){ + for (HttpOption httpOption : patientAreaHttpOptionList) { + patientAreaHttpOptionIdList.add(httpOption.getId()); + } + patientAreaHttpOptionIds = StringTools.join(patientAreaHttpOptionIdList, ";"); + } + + ForeignTousseApplication fta = new ForeignTousseApplication(); + fta.setDepart(Constants.ORG_UNIT_NAME_NEIKE); + fta.setDepartCoding(Constants.ORG_UNIT_CODE_NEIKE); + + //1、申请单病区为空; + String message = null; + try { + orgUnitPatientAreaRelationManager.checkApplyDepartPatientAreaRelation(fta); + } catch (Exception e) { + message = e.getMessage(); + } + //不会返回异常提示信息 + AssertJUnit.assertNull(message); + + //2、申请单病区不为测试内科关联病区; + fta.setPatientArea(patientAreaHttpOptionList.get(0).getOptionText()); + message = null; + try { + orgUnitPatientAreaRelationManager.checkApplyDepartPatientAreaRelation(fta); + } catch (Exception e) { + message = e.getMessage(); + } + //返回异常提示信息:申请科室1没有和病区“XXX”有关联,是否继续操作? + AssertJUnit.assertNotNull(message); + + //3、申请单病区为测试内科关联病区; + OrgUnitPatientAreaRelationVo orgUnitPatientAreaRelationVo = new OrgUnitPatientAreaRelationVo(); + orgUnitPatientAreaRelationVo.setOrgUnitId(applyDepartNeiKe.getId()); + orgUnitPatientAreaRelationVo.setPatientAreaHttpOptionIds(patientAreaHttpOptionIds); + orgUnitPatientAreaRelationManager.saveOrgUnitPatientAreaRelation(orgUnitPatientAreaRelationVo); + message = null; + try { + orgUnitPatientAreaRelationManager.checkApplyDepartPatientAreaRelation(fta); + } catch (Exception e) { + message = e.getMessage(); + } + //不会返回异常提示信息 + AssertJUnit.assertNull(message); + + } + + @After + public void clearTestData(){ + List orgUnitIdList = new ArrayList(); + orgUnitIdList.add(applyDepartNeiKe.getId()); + orgUnitIdList.add(applyDepartWaiKe.getId()); + //删除旧的设置 + List dbOrgUnitPatientAreaRelationList = orgUnitPatientAreaRelationManager.getCollection("orgUnitId", orgUnitIdList); + if(CollectionUtils.isNotEmpty(dbOrgUnitPatientAreaRelationList)){ + for (OrgUnitPatientAreaRelation orgUnitPatientAreaRelation : dbOrgUnitPatientAreaRelationList) { + orgUnitPatientAreaRelationManager.delete(orgUnitPatientAreaRelation); + } + } + //删除所有病区 + if(CollectionUtils.isNotEmpty(patientAreaHttpOptionList)){ + for (HttpOption httpOption : patientAreaHttpOptionList) { + httpOptionManager.delete(httpOption); + } + } + } + +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/orgunitpatientarearelation/controller/OrgUnitPatientAreaRelationController.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/orgunitpatientarearelation/controller/OrgUnitPatientAreaRelationController.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/orgunitpatientarearelation/controller/OrgUnitPatientAreaRelationController.java (revision 40716) @@ -0,0 +1,90 @@ +package com.forgon.disinfectsystem.basedatamanager.orgunitpatientarearelation.controller; + +import net.sf.json.JSONObject; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.forgon.directory.vo.OrgUnitPatientAreaRelationVo; +import com.forgon.disinfectsystem.basedatamanager.orgunitpatientarearelation.service.OrgUnitPatientAreaRelationManager; +import com.forgon.entity.PageEntity; +import com.forgon.tools.json.JSONUtil; + +/** + * 申请科室关联病区设置的controller + * DGSETYY-122 + */ +@RestController +@RequestMapping(value = "/disinfectSystem/core/orgUnitPatientAreaRelationController", produces = "application/json;charset=UTF-8") +public class OrgUnitPatientAreaRelationController { + + @Autowired + private OrgUnitPatientAreaRelationManager orgUnitPatientAreaRelationManager; + + /** + * 保存或者修改“申请科室关联病区设置” + * @param orgUnitPatientAreaRelationVo “申请科室关联病区设置”vo + */ + @RequestMapping("/saveOrgUnitPatientAreaRelation") + public String saveOrgUnitPatientAreaRelation(OrgUnitPatientAreaRelationVo orgUnitPatientAreaRelationVo){ + JSONObject result = JSONUtil.buildJsonObject(true, "保存成功"); + try { + orgUnitPatientAreaRelationManager.saveOrgUnitPatientAreaRelation(orgUnitPatientAreaRelationVo); + } catch (Exception e) { + e.printStackTrace(); + result = JSONUtil.buildJsonObject(false, "保存失败:" + e.getMessage()); + } + return result.toString(); + } + + /** + * 删除“申请科室关联病区设置” + * @param orgUnitIds 科室id,多个id用;分割,例如:1;2;3 + */ + @RequestMapping("/deleteOrgUnitPatientAreaRelationByOrgUnitId") + public String deleteOrgUnitPatientAreaRelationByOrgUnitId(String orgUnitIds){ + JSONObject result = JSONUtil.buildJsonObject(true, "删除成功"); + try { + orgUnitPatientAreaRelationManager.deleteOrgUnitPatientAreaRelationByOrgUnitId(orgUnitIds); + } catch (Exception e) { + e.printStackTrace(); + result = JSONUtil.buildJsonObject(false, "删除失败:" + e.getMessage()); + } + return result.toString(); + } + + /** + * 查看“申请科室关联病区设置”列表 + * @param page 分页参数 + */ + @RequestMapping("/loadOrgUnitPatientAreaRelation") + public String loadOrgUnitPatientAreaRelation(PageEntity page){ + JSONObject result = JSONUtil.buildJsonObject(true); + try { + orgUnitPatientAreaRelationManager.loadOrgUnitPatientAreaRelation(page); + result = JSONUtil.buildJsonObject(true, JSONObject.fromObject(page)); + } catch (Exception e) { + e.printStackTrace(); + result = JSONUtil.buildJsonObject(false, "加载失败:" + e.getMessage()); + } + return result.toString(); + } + + /** + * 检查装配任务关联的外来器械包申请单的申请科室和病区的关联 + * @param page 装配任务id + */ + @RequestMapping("/checkPackingTaskApplyOrgUnitPatientAreaRelation") + public String checkPackingTaskApplyOrgUnitPatientAreaRelation(String packingTaskIds){ + JSONObject result = JSONUtil.buildJsonObject(true); + try { + orgUnitPatientAreaRelationManager.checkPackingTaskApplyOrgUnitPatientAreaRelation(packingTaskIds); + } catch (Exception e) { + e.printStackTrace(); + result = JSONUtil.buildJsonObject(false, e.getMessage()); + } + return result.toString(); + } + +} Index: ssts-web/src/test/java/test/forgon/directory/AllTests.java =================================================================== diff -u -r26155 -r40716 --- ssts-web/src/test/java/test/forgon/directory/AllTests.java (.../AllTests.java) (revision 26155) +++ ssts-web/src/test/java/test/forgon/directory/AllTests.java (.../AllTests.java) (revision 40716) @@ -5,14 +5,15 @@ import org.junit.runners.Suite.SuiteClasses; import test.forgon.directory.service.OrgUnitManagerTest; +import test.forgon.directory.service.OrgUnitPatientAreaRelationManagerTest; /** * * @author Terry Kwan * 2019-04-05 * */ @RunWith(Suite.class) -@SuiteClasses({ OrgUnitManagerTest.class }) +@SuiteClasses({ OrgUnitManagerTest.class, OrgUnitPatientAreaRelationManagerTest.class }) public class AllTests { } Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/action/ForeignTousseApplicationAction.java =================================================================== diff -u -r40564 -r40716 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/action/ForeignTousseApplicationAction.java (.../ForeignTousseApplicationAction.java) (revision 40564) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/action/ForeignTousseApplicationAction.java (.../ForeignTousseApplicationAction.java) (revision 40716) @@ -392,6 +392,8 @@ String returneeOfSupplier1= StrutsParamUtils.getPraramValue("returneeOfSupplier1", ""); //超时处理方式GYEY-758 String timeoutHandType = StrutsParamUtils.getPraramValue("timeoutHandType", null); + //检查申请科室是否关联病区DGSETYY-122 + boolean checkApplyDepartPatientAreaRelation = StrutsParamUtils.getBoolPraramValue("checkApplyDepartPatientAreaRelation", false); if(StringUtils.isNotBlank(returnMan1)){ foreignTousseApplication.setReturnMan(returnMan1); } @@ -411,7 +413,7 @@ //simon-add foreignTousseApplication.setHandleDepart(handleDepart); foreignTousseApplication.setHandleDepartCoding(handleDepartCoding); - foreignTousseApplicationManager.saveOrUpdate(origineFta, foreignTousseApplication, foreignTousseInfo, actionType, timeoutHandType); + foreignTousseApplicationManager.saveOrUpdate(origineFta, foreignTousseApplication, foreignTousseInfo, actionType, timeoutHandType, checkApplyDepartPatientAreaRelation); jsonObject.put("id", foreignTousseApplication.getId()); //供前台打印 jsonObject.put("applicationTime", ForgonDateUtils.safelyFormatDate(foreignTousseApplication.getApplicationTime(), ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS, "")); //供前台打印 } catch (Exception e) { Index: forgon-core/src/main/java/com/forgon/directory/model/OrgUnitPatientAreaRelation.java =================================================================== diff -u --- forgon-core/src/main/java/com/forgon/directory/model/OrgUnitPatientAreaRelation.java (revision 0) +++ forgon-core/src/main/java/com/forgon/directory/model/OrgUnitPatientAreaRelation.java (revision 40716) @@ -0,0 +1,65 @@ +package com.forgon.directory.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Index; +import javax.persistence.Table; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; + +/** + * 申请科室、病区的关联关系 + * DGSETYY-122 + */ +@Entity +@DynamicInsert(false) +@DynamicUpdate(true) +@Table(indexes={@Index(columnList="orgUnitId",name="org_patArea_orgId_index") +,@Index(columnList="patientAreaHttpOptionId",name="org_patArea_areaId_index")}) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class OrgUnitPatientAreaRelation { + + private Long id; + + /** + * 科室ID + */ + private Long orgUnitId; + + /** + * 病区ID + */ + private Long patientAreaHttpOptionId; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getOrgUnitId() { + return orgUnitId; + } + + public void setOrgUnitId(Long orgUnitId) { + this.orgUnitId = orgUnitId; + } + + public Long getPatientAreaHttpOptionId() { + return patientAreaHttpOptionId; + } + + public void setPatientAreaHttpOptionId(Long patientAreaHttpOptionId) { + this.patientAreaHttpOptionId = patientAreaHttpOptionId; + } + +} Index: ssts-web/src/test/java/test/forgon/system/systemsetting/HttpOptionManagerTests.java =================================================================== diff -u -r39196 -r40716 --- ssts-web/src/test/java/test/forgon/system/systemsetting/HttpOptionManagerTests.java (.../HttpOptionManagerTests.java) (revision 39196) +++ ssts-web/src/test/java/test/forgon/system/systemsetting/HttpOptionManagerTests.java (.../HttpOptionManagerTests.java) (revision 40716) @@ -2,18 +2,36 @@ import static org.junit.Assert.assertEquals; +import java.util.ArrayList; import java.util.List; +import org.apache.commons.collections.CollectionUtils; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.testng.AssertJUnit; + +import com.forgon.directory.model.OrgUnit; +import com.forgon.directory.model.OrgUnitPatientAreaRelation; +import com.forgon.directory.service.OrgUnitManager; +import com.forgon.runwithtrans.model.RunWithTransNewTask; +import com.forgon.runwithtrans.service.RunWithTransNewManager; import com.forgon.systemsetting.model.HttpOption; import com.forgon.systemsetting.service.HttpOptionManager; +import com.forgon.tools.hibernate.ObjectDao; +import test.forgon.constant.Constants; import test.forgon.disinfectsystem.AbstractCSSDTest; public class HttpOptionManagerTests extends AbstractCSSDTest{ @Autowired private HttpOptionManager httpOptionManager; + @Autowired + private ObjectDao objectDao; + @Autowired + private OrgUnitManager orgUnitManager; + @Autowired + private RunWithTransNewManager runWithTransNewManager; + /** * 新增 排重 修改 序号是否组自动添加正确 */ @@ -79,4 +97,98 @@ assertEquals(true,find1); assertEquals(true,find2); } + + @Test + public void testSaveOrUpdatePatientAreaHttpOption(){ + String listId = HttpOption.SYSTEMSETTING_PATIENT_AREA; + + //先清除旧数据 + List dbOptionList = httpOptionManager.getHttpOptionListById(listId); + if(CollectionUtils.isNotEmpty(dbOptionList)){ + for (HttpOption httpOption : dbOptionList) { + httpOptionManager.delete(httpOption); + } + } + List optionList = new ArrayList(); + HttpOption httpOption1 = new HttpOption(); + httpOption1.setId(null); + httpOption1.setOptionListId(listId); + httpOption1.setOptionText("病区01"); + httpOption1.setOptionValue(null); + httpOption1.setSequence(1); + httpOption1.setStatus(1); + optionList.add(httpOption1); + + HttpOption httpOption2 = new HttpOption(); + httpOption2.setId(null); + httpOption2.setOptionListId(listId); + httpOption2.setOptionText("病区02"); + httpOption2.setOptionValue(null); + httpOption2.setSequence(2); + httpOption2.setStatus(1); + optionList.add(httpOption2); + + //测试新建 + httpOptionManager.saveOrUpdateByListId(optionList, listId); + dbOptionList = httpOptionManager.getHttpOptionListById(listId); + AssertJUnit.assertNotNull(dbOptionList); + AssertJUnit.assertEquals(dbOptionList.size(), 2); + AssertJUnit.assertEquals(dbOptionList.get(0).getOptionText(), "病区01"); + AssertJUnit.assertEquals(dbOptionList.get(0).getSequence(), 1); + AssertJUnit.assertEquals(dbOptionList.get(0).getStatus().intValue(), 1); + AssertJUnit.assertEquals(dbOptionList.get(1).getOptionText(), "病区02"); + AssertJUnit.assertEquals(dbOptionList.get(1).getSequence(), 2); + AssertJUnit.assertEquals(dbOptionList.get(1).getStatus().intValue(), 1); + + //测试排序 + dbOptionList.get(0).setSequence(2); + dbOptionList.get(1).setSequence(1); + httpOptionManager.saveOrUpdateByListId(dbOptionList, listId); + dbOptionList = httpOptionManager.getHttpOptionListById(listId); + AssertJUnit.assertNotNull(dbOptionList); + AssertJUnit.assertEquals(dbOptionList.size(), 2); + AssertJUnit.assertEquals(dbOptionList.get(0).getOptionText(), "病区02"); + AssertJUnit.assertEquals(dbOptionList.get(0).getSequence(), 1); + AssertJUnit.assertEquals(dbOptionList.get(1).getOptionText(), "病区01"); + AssertJUnit.assertEquals(dbOptionList.get(1).getSequence(), 2); + + //测试关联了科室的病区不能删除 + OrgUnit ou = orgUnitManager.getByCode(Constants.ORG_UNIT_CODE_NEIKE); + Long dbOptionId = dbOptionList.get(0).getId(); + OrgUnitPatientAreaRelation opRelation = new OrgUnitPatientAreaRelation(); + runWithTransNewManager.runWith_TRANS_NEW(new RunWithTransNewTask() { + @Override + public void runTask() { + opRelation.setOrgUnitId(ou.getId()); + opRelation.setPatientAreaHttpOptionId(dbOptionId); + objectDao.saveOrUpdate(opRelation); + } + }); + try { + httpOptionManager.saveOrUpdateByListId(new ArrayList(), listId); + } catch (Exception e) {} + dbOptionList = httpOptionManager.getHttpOptionListById(listId); + //删除失败,关联了科室的病区不能删除 + AssertJUnit.assertNotNull(dbOptionList); + AssertJUnit.assertEquals(dbOptionList.size(), 2); + AssertJUnit.assertEquals(dbOptionList.get(0).getOptionText(), "病区02"); + + //测试删除 + runWithTransNewManager.runWith_TRANS_NEW(new RunWithTransNewTask() { + @Override + public void runTask() { + objectDao.deleteById(OrgUnitPatientAreaRelation.class.getSimpleName(), opRelation.getId().toString()); + } + }); + httpOptionManager.saveOrUpdateByListId(new ArrayList(), listId); + dbOptionList = httpOptionManager.getHttpOptionListById(listId); + //删除成功 + if(dbOptionList != null){ + AssertJUnit.assertEquals(dbOptionList.size(), 0); + }else{ + AssertJUnit.assertNull(dbOptionList); + } + + } + } Index: forgon-core/src/main/java/com/forgon/systemsetting/model/HttpOption.java =================================================================== diff -u -r40684 -r40716 --- forgon-core/src/main/java/com/forgon/systemsetting/model/HttpOption.java (.../HttpOption.java) (revision 40684) +++ forgon-core/src/main/java/com/forgon/systemsetting/model/HttpOption.java (.../HttpOption.java) (revision 40716) @@ -234,6 +234,12 @@ * 技术难度 */ public final static String SYSTEMSETTING_TECHNICALDIFFICULTY = "technicalDifficulty"; + + /** + * 病区 + */ + public final static String SYSTEMSETTING_PATIENT_AREA = "patientArea"; + /**参数设置id*/ private Long id; /**参数名称*/ Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/service/ForeignTousseApplicationManager.java =================================================================== diff -u -r40564 -r40716 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/service/ForeignTousseApplicationManager.java (.../ForeignTousseApplicationManager.java) (revision 40564) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/foreigntousseapplication/service/ForeignTousseApplicationManager.java (.../ForeignTousseApplicationManager.java) (revision 40716) @@ -46,8 +46,17 @@ * @param eventCode 事件代码 * @param eventName 事件名称 */ + /** + * 保存外来器械包申请单,并设置不良事件GYEY-758 + * @param origineFta 外来器械包申请单 + * @param foreignTousseApplication 外来器械包申请单 + * @param foreignTousseTreeData 外来器械包申请单物品明细 + * @param actionType 保存外来器械包的动作(值目前有三种:1、新增 2、干预 3、确认归还) + * @param timeoutHandType 超时处理方式 + * @param checkApplyDepartPatientAreaRelation 检查申请科室是否关联病区DGSETYY-122 + */ public void saveOrUpdate(ForeignTousseApplication origineFta, ForeignTousseApplication foreignTousseApplication, - String foreignTousseTreeData, String actionType, String timeoutHandType); + String foreignTousseTreeData, String actionType, String timeoutHandType, boolean checkApplyDepartPatientAreaRelation); public List findForeignTousseApplication(String tousseName,String supplierName); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/systemsetting/service/HttpOptionManagerSSTSImpl.java =================================================================== diff -u -r40521 -r40716 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/systemsetting/service/HttpOptionManagerSSTSImpl.java (.../HttpOptionManagerSSTSImpl.java) (revision 40521) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/systemsetting/service/HttpOptionManagerSSTSImpl.java (.../HttpOptionManagerSSTSImpl.java) (revision 40716) @@ -18,6 +18,7 @@ import org.apache.commons.lang3.StringUtils; import com.forgon.directory.model.OrgUnit; +import com.forgon.directory.model.OrgUnitPatientAreaRelation; import com.forgon.directory.service.OrgUnitManager; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; @@ -246,48 +247,108 @@ @Override public String saveOrUpdateByListId(List optionList, String listId) { String message = "保存成功!"; + List dbList = getHttpOptionListById(listId); - List optionIdList = new ArrayList(); - for (HttpOption submitHttpOption : optionList) { - if(DatabaseUtil.isPoIdValid(submitHttpOption.getId())){ - optionIdList.add(submitHttpOption.getId()); + //需要删除的设置 + List deleteHttpOptionList = new ArrayList(); + //需要保存的设置 + List saveHttpOptionList = new ArrayList(); + + Map optionTextHttpOptionMap = new HashMap(); + if(CollectionUtils.isNotEmpty(dbList)){ + for (HttpOption dbHttpOption : dbList) { + optionTextHttpOptionMap.put(dbHttpOption.getId(), dbHttpOption); } + deleteHttpOptionList.addAll(dbList); } - if(CollectionUtils.isNotEmpty(optionIdList)){ - // 删除页面已经删除的记录 - String deleteSql = String.format(" delete from %s where optionListId = '%s' and %s", HttpOption.class.getSimpleName(), listId, SqlUtils.getNonStringFieldNotInCollectionsPredicate("id", optionIdList)); - objectDao.excuteSQL(deleteSql); - } - List toSaveList = new ArrayList(); - // 页面新添加的记录 - for (HttpOption httpOption : optionList) { - if(!DatabaseUtil.isPoIdValid(httpOption.getId())){ - httpOption.setId(null); - toSaveList.add(httpOption); - } - } - List dbList = getHttpOptionListById(listId); - // 处理修改 - for (HttpOption dbHttpOption : dbList) { + + if(CollectionUtils.isNotEmpty(optionList)){ for (HttpOption submitHttpOption : optionList) { - if(dbHttpOption.getId() != null && submitHttpOption.getId() != null && dbHttpOption.getId().longValue() == submitHttpOption.getId().longValue()){ + HttpOption dbHttpOption = optionTextHttpOptionMap.get(submitHttpOption.getId()); + if(dbHttpOption != null){ + //修改 synchronizeModification(dbHttpOption, submitHttpOption, listId); - if(!StringUtils.equals(submitHttpOption.getOptionText(), dbHttpOption.getOptionText()) - || submitHttpOption.getSequence() != dbHttpOption.getSequence() - || !StringUtils.equals(submitHttpOption.getOptionValue(), dbHttpOption.getOptionValue())){ - dbHttpOption.setOptionText(submitHttpOption.getOptionText()); - dbHttpOption.setOptionValue(submitHttpOption.getOptionValue()); - dbHttpOption.setSequence(submitHttpOption.getSequence()); - toSaveList.add(dbHttpOption); + dbHttpOption.setOptionText(submitHttpOption.getOptionText()); + dbHttpOption.setOptionValue(submitHttpOption.getOptionValue()); + dbHttpOption.setSequence(submitHttpOption.getSequence()); + saveHttpOptionList.add(dbHttpOption); + deleteHttpOptionList.remove(dbHttpOption); + }else{ + //新建 + saveHttpOptionList.add(submitHttpOption); + } + } + } + + //删除 + if(CollectionUtils.isNotEmpty(deleteHttpOptionList)){ + if(StringUtils.equals(listId, HttpOption.SYSTEMSETTING_PATIENT_AREA)){ + Map> optionTextOrgUnitNameMap = loadPatientAreaOptionTextOrgUnitNameMap(deleteHttpOptionList); + for (HttpOption httpOption : deleteHttpOptionList) { + if(optionTextOrgUnitNameMap.containsKey(httpOption.getOptionText())){ + return String.format("%s已经关联科室%s,不允许删除!", httpOption.getOptionText(), StringTools.join(optionTextOrgUnitNameMap.get(httpOption.getOptionText()), "、")); } } } + for (HttpOption httpOption : deleteHttpOptionList) { + this.delete(httpOption); + } } - objectDao.batchSaveOrUpdate(toSaveList); - + //保存 + if(CollectionUtils.isNotEmpty(saveHttpOptionList)){ + for (HttpOption httpOption : saveHttpOptionList) { + saveOrUpdate(httpOption); + } + } return message; } + + /** + * 查询病区关联的科室 + * @param deleteHttpOptionList 病区 + * @return 病区及关联科室的map + */ + private Map> loadPatientAreaOptionTextOrgUnitNameMap(List deleteHttpOptionList) { + Map> patientAreaOptionTextOrgUnitNameMap = new HashMap>(); + if(CollectionUtils.isEmpty(deleteHttpOptionList)){ + return patientAreaOptionTextOrgUnitNameMap; + } + List optionIdList = new ArrayList(); + for (HttpOption httpOption : deleteHttpOptionList) { + optionIdList.add(httpOption.getId()); + } + StringBuffer sqlBuffer = new StringBuffer(); + sqlBuffer.append("select ou.name, opt.optionText from "); + sqlBuffer.append(OrgUnitPatientAreaRelation.class.getSimpleName()); + sqlBuffer.append(" oar join "); + sqlBuffer.append(OrgUnit.class.getSimpleName()); + sqlBuffer.append(" ou on ou.id = oar.orgUnitId join "); + sqlBuffer.append(HttpOption.class.getSimpleName()); + sqlBuffer.append(" opt on opt.id = oar.patientAreaHttpOptionId where "); + sqlBuffer.append(SqlUtils.getNonStringFieldInLargeCollectionsPredicate("oar.patientAreaHttpOptionId", optionIdList)); + + ResultSet rs = null; + try { + rs = objectDao.executeSql(sqlBuffer.toString()); + while(rs.next()){ + String optionText = rs.getString("optionText"); + String orgUnitName = rs.getString("name"); + List orgUnitNameList = patientAreaOptionTextOrgUnitNameMap.get(optionText); + if(orgUnitNameList == null){ + orgUnitNameList = new ArrayList(); + } + orgUnitNameList.add(orgUnitName); + patientAreaOptionTextOrgUnitNameMap.put(optionText, orgUnitNameList); + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("查询病区关联的科室时出现异常:" + e.getMessage()); + } + + return patientAreaOptionTextOrgUnitNameMap; + } + private void synchronizeModification(HttpOption dbHttpOption,HttpOption submitHttpOption,String listId){ String dbText = dbHttpOption.getOptionText(); String submitText = submitHttpOption.getOptionText(); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/orgunitpatientarearelation/service/OrgUnitPatientAreaRelationManagerImpl.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/orgunitpatientarearelation/service/OrgUnitPatientAreaRelationManagerImpl.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/orgunitpatientarearelation/service/OrgUnitPatientAreaRelationManagerImpl.java (revision 40716) @@ -0,0 +1,394 @@ +package com.forgon.disinfectsystem.basedatamanager.orgunitpatientarearelation.service; + +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.model.OrgUnit; +import com.forgon.directory.model.OrgUnitPatientAreaRelation; +import com.forgon.directory.service.OrgUnitManager; +import com.forgon.directory.vo.OrgUnitPatientAreaRelationVo; +import com.forgon.disinfectsystem.basedatamanager.supplyroomconfig.service.SupplyRoomConfigManager; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.entity.foreigntousseapplication.ForeignTousseApplication; +import com.forgon.disinfectsystem.entity.packing.PackingTask; +import com.forgon.entity.PageEntity; +import com.forgon.exception.SystemException; +import com.forgon.log.model.Log; +import com.forgon.log.service.LogManager; +import com.forgon.systemsetting.model.HttpOption; +import com.forgon.systemsetting.service.HttpOptionManager; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.hibernate.BasePoManagerImpl; +import com.forgon.tools.string.StringTools; +import com.forgon.tools.util.ConfigUtils; +import com.forgon.tools.util.SqlUtils; + +@Service("orgUnitPatientAreaRelationManager") +@Transactional +public class OrgUnitPatientAreaRelationManagerImpl extends BasePoManagerImpl implements OrgUnitPatientAreaRelationManager { + + @Autowired + private HttpOptionManager httpOptionManager; + + @Autowired + private OrgUnitManager orgUnitManager; + + @Autowired + private SupplyRoomConfigManager supplyRoomConfigManager; + + @Autowired + private LogManager appLogManager; + + @Override + public void saveOrgUnitPatientAreaRelation(OrgUnitPatientAreaRelationVo orgUnitPatientAreaRelationVo) { + if(orgUnitPatientAreaRelationVo == null){ + throw new SystemException("参数异常!"); + } + Long orgUnitId = orgUnitPatientAreaRelationVo.getOrgUnitId(); + if(!DatabaseUtil.isPoIdValid(orgUnitId)){ + throw new SystemException("科室不能空!"); + } + OrgUnit orgUnit = orgUnitManager.get(orgUnitId); + if(orgUnit == null){ + throw new SystemException("科室不能空!"); + } + if(orgUnit.isDisable()){ + throw new SystemException(String.format("%s(%s)已停用!", orgUnit.getName(), orgUnit.getOrgUnitCoding())); + } + String patientAreaHttpOptionIdStr = orgUnitPatientAreaRelationVo.getPatientAreaHttpOptionIds(); + if(StringUtils.isBlank(patientAreaHttpOptionIdStr)){ + throw new SystemException("关联的病区不能空!"); + } + Collection patientAreaHttpOptionIds = StringTools.parseToLongs(patientAreaHttpOptionIdStr, ";"); + if(CollectionUtils.isEmpty(patientAreaHttpOptionIds)){ + throw new SystemException("关联的病区不能空!"); + } + List patientAreaHttpOptionList = httpOptionManager.getCollection(patientAreaHttpOptionIds); + if(CollectionUtils.isEmpty(patientAreaHttpOptionList)){ + throw new SystemException("关联的病区不能空!"); + } + if(!supplyRoomConfigManager.isApplicationDepartment(orgUnit.getOrgUnitCoding())){ + throw new SystemException(String.format("%s(%s)不是申请科室!", orgUnit.getName(), orgUnit.getOrgUnitCoding())); + } + //删除旧的设置 + String actionType = Log.TYPE_ADD; + List dbOrgUnitPatientAreaRelationList = this.getByProperty("orgUnitId", orgUnit.getId()); + if(CollectionUtils.isNotEmpty(dbOrgUnitPatientAreaRelationList)){ + actionType = Log.TYPE_UPDATE; + for (OrgUnitPatientAreaRelation orgUnitPatientAreaRelation : dbOrgUnitPatientAreaRelationList) { + this.delete(orgUnitPatientAreaRelation); + } + } + //保存新的设置 + List relationPatientAreaList = new ArrayList(); + for (HttpOption patientAreaHttpOption : patientAreaHttpOptionList) { + OrgUnitPatientAreaRelation orgUnitPatientAreaRelation = new OrgUnitPatientAreaRelation(); + orgUnitPatientAreaRelation.setOrgUnitId(orgUnitId); + orgUnitPatientAreaRelation.setPatientAreaHttpOptionId(patientAreaHttpOption.getId()); + this.save(orgUnitPatientAreaRelation); + relationPatientAreaList.add(patientAreaHttpOption.getOptionText()); + } + StringBuffer logBuffer = new StringBuffer(); + if(StringUtils.equals(actionType, Log.TYPE_UPDATE)){ + logBuffer.append(String.format("修改申请科室[%s(%s)]关联病区设置,关联病区[%s]", orgUnit.getName(), orgUnit.getOrgUnitCoding(), StringTools.join(relationPatientAreaList, "、"))); + }else{ + logBuffer.append(String.format("新增了申请科室[%s(%s)]关联病区设置,关联病区[%s]", orgUnit.getName(), orgUnit.getOrgUnitCoding(), StringTools.join(relationPatientAreaList, "、"))); + } + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_BASEDATA, actionType, logBuffer.toString()); + } + + @Override + public void deleteOrgUnitPatientAreaRelationByOrgUnitId(String orgUnitIds) { + if(StringUtils.isBlank(orgUnitIds)){ + throw new SystemException("科室id不能空!"); + } + Collection orgUnitIdList = StringTools.parseToLongs(orgUnitIds, ";"); + if(CollectionUtils.isEmpty(orgUnitIdList)){ + throw new SystemException("科室id不能空!"); + } + + List orgUnitList = orgUnitManager.getCollection(orgUnitIdList); + if(CollectionUtils.isEmpty(orgUnitList)){ + throw new SystemException("科室id不能空!"); + } + + //删除旧的设置 + List dbOrgUnitPatientAreaRelationList = this.getCollection("orgUnitId", orgUnitIdList); + if(CollectionUtils.isEmpty(dbOrgUnitPatientAreaRelationList)){ + return; + } + Map> orgUnitIdRelationListMap = new HashMap>(); + for (OrgUnitPatientAreaRelation orgUnitPatientAreaRelation : dbOrgUnitPatientAreaRelationList) { + Long orgUnitId = orgUnitPatientAreaRelation.getOrgUnitId(); + List relationList = orgUnitIdRelationListMap.get(orgUnitId); + if(relationList == null){ + relationList = new ArrayList(); + } + relationList.add(orgUnitPatientAreaRelation); + orgUnitIdRelationListMap.put(orgUnitId, relationList); + } + List deleteOrgUnitNameList = new ArrayList(); + for (OrgUnit orgUnit : orgUnitList) { + List relationList = orgUnitIdRelationListMap.get(orgUnit.getId()); + if(CollectionUtils.isEmpty(relationList)){ + continue; + } + for (OrgUnitPatientAreaRelation orgUnitPatientAreaRelation : relationList) { + this.delete(orgUnitPatientAreaRelation); + } + deleteOrgUnitNameList.add(String.format("%s(%s)", orgUnit.getName(), orgUnit.getOrgUnitCoding())); + } + StringBuffer logBuffer = new StringBuffer(); + logBuffer.append("删除申请科室:"); + logBuffer.append(StringTools.join(deleteOrgUnitNameList, "、")); + logBuffer.append("的病区关联设置。"); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_BASEDATA, Log.TYPE_DELETE, logBuffer.toString()); + } + + @Override + public void loadOrgUnitPatientAreaRelation(PageEntity page) { + + int firstIndex = 0; + int maxResults = 0; + if(page != null){ + firstIndex = page.getStart(); + maxResults = page.getLimit(); + } + if(firstIndex <= 0){ + firstIndex = 0; + page.setStart(firstIndex); + } + if(maxResults <= 0){ + maxResults = 20; + page.setLimit(maxResults); + } + + StringBuffer sqlBuffer = new StringBuffer(); + sqlBuffer.append(" id in (select orgUnitId from "); + sqlBuffer.append(OrgUnitPatientAreaRelation.class.getSimpleName()); + sqlBuffer.append(")"); + + int count = orgUnitManager.count(sqlBuffer.toString()); + page.setCount(count); + if(count == 0){ + return; + } + + List orgUnitList = orgUnitManager.getByHql(sqlBuffer.toString(), firstIndex, maxResults, "id"); + if(CollectionUtils.isEmpty(orgUnitList)){ + return; + } + List orgUnitPatientAreaRelationVoList = new ArrayList(); + for (OrgUnit orgUnit : orgUnitList) { + OrgUnitPatientAreaRelationVo vo = new OrgUnitPatientAreaRelationVo(); + vo.setOrgUnitId(orgUnit.getId()); + vo.setOrgUnitName(orgUnit.getName()); + orgUnitPatientAreaRelationVoList.add(vo); + } + //查询关联的病区信息 + setPatientAreaHttpOptionInfo(orgUnitPatientAreaRelationVoList); + page.setList(orgUnitPatientAreaRelationVoList); + } + + /** + * 查询科室关联的病区信息 + * @param orgUnitPatientAreaRelationVoList 科室关联病区vo + */ + private void setPatientAreaHttpOptionInfo(List orgUnitPatientAreaRelationVoList) { + if(CollectionUtils.isEmpty(orgUnitPatientAreaRelationVoList)){ + return; + } + List orgUnitIdList = new ArrayList(); + for (OrgUnitPatientAreaRelationVo orgUnitPatientAreaRelationVo : orgUnitPatientAreaRelationVoList) { + if(DatabaseUtil.isPoIdValid(orgUnitPatientAreaRelationVo.getOrgUnitId())){ + orgUnitIdList.add(orgUnitPatientAreaRelationVo.getOrgUnitId()); + } + } + + if(CollectionUtils.isEmpty(orgUnitIdList)){ + return; + } + + Map> orgUnitIdHttpOptionIdListMap = new HashMap>(); + Map> orgUnitIdHttpOptionOptionTextListMap = new HashMap>(); + + StringBuffer sqlBuffer = new StringBuffer(); + sqlBuffer.append("select oar.orgUnitId, opt.id optId, opt.optionText from "); + sqlBuffer.append(OrgUnitPatientAreaRelation.class.getSimpleName()); + sqlBuffer.append(" oar join "); + sqlBuffer.append(HttpOption.class.getSimpleName()); + sqlBuffer.append(" opt on opt.id = oar.patientAreaHttpOptionId where "); + sqlBuffer.append(SqlUtils.getNonStringFieldInLargeCollectionsPredicate("oar.orgUnitId", orgUnitIdList)); + + ResultSet rs = null; + try { + rs = objectDao.executeSql(sqlBuffer.toString()); + while(rs.next()){ + Long orgUnitId = rs.getLong("orgUnitId"); + Long optId = rs.getLong("optId"); + String optionText = rs.getString("optionText"); + List httpOptionIdList = orgUnitIdHttpOptionIdListMap.get(orgUnitId); + if(httpOptionIdList == null){ + httpOptionIdList = new ArrayList(); + } + httpOptionIdList.add(optId); + orgUnitIdHttpOptionIdListMap.put(orgUnitId, httpOptionIdList); + + List httpOptionOptionTextList = orgUnitIdHttpOptionOptionTextListMap.get(orgUnitId); + if(httpOptionOptionTextList == null){ + httpOptionOptionTextList = new ArrayList(); + } + httpOptionOptionTextList.add(optionText); + orgUnitIdHttpOptionOptionTextListMap.put(orgUnitId, httpOptionOptionTextList); + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("查询病区关联的科室时出现异常:" + e.getMessage()); + } + + for (OrgUnitPatientAreaRelationVo orgUnitPatientAreaRelationVo : orgUnitPatientAreaRelationVoList) { + if(DatabaseUtil.isPoIdValid(orgUnitPatientAreaRelationVo.getOrgUnitId())){ + List httpOptionIdList = orgUnitIdHttpOptionIdListMap.get(orgUnitPatientAreaRelationVo.getOrgUnitId()); + List httpOptionOptionTextList = orgUnitIdHttpOptionOptionTextListMap.get(orgUnitPatientAreaRelationVo.getOrgUnitId()); + orgUnitPatientAreaRelationVo.setPatientAreaHttpOptionIds(StringTools.join(httpOptionIdList, ";")); + orgUnitPatientAreaRelationVo.setPatientAreaHttpOptionOptionText(StringTools.join(httpOptionOptionTextList, ";")); + } + } + + } + + @Override + public void checkApplyDepartPatientAreaRelation(ForeignTousseApplication foreignTousseApplication) { + boolean enableDepartmentToWardAssociation = ConfigUtils.getSystemSetConfigByNameBool("enableDepartmentToWardAssociation"); + boolean enablePatientAreaSetting = ConfigUtils.getSystemSetConfigByNameBool("enablePatientAreaSetting"); + if(!enableDepartmentToWardAssociation || !enablePatientAreaSetting){ + return; + } + if(foreignTousseApplication == null){ + throw new RuntimeException("申请科室和病区关联检查失败,申请单不能为空!"); + } + if(StringUtils.isBlank(foreignTousseApplication.getDepart())){ + throw new RuntimeException("申请科室和病区关联检查失败,申请单申请科室不能为空!"); + } + if(StringUtils.isBlank(foreignTousseApplication.getDepartCoding())){ + throw new RuntimeException("申请科室和病区关联检查失败,申请单申请科室编码不能为空!"); + } + if(StringUtils.isBlank(foreignTousseApplication.getPatientArea())){ + //申请单病区为空时,不需要检查申请科室是否关联病区 + return; + } + + if(!applyDepartPatientAreaRelation(foreignTousseApplication.getDepartCoding(), foreignTousseApplication.getPatientArea())){ + throw new SystemException(String.format("%s没有和病区“%s”有关联,是否继续操作?", foreignTousseApplication.getDepart(), foreignTousseApplication.getPatientArea())); + } + } + + /** + * 检查申请科室和病区的值是否有关联 + * @param applyDepartCode 科室编码 + * @param patientArea 病区 + * @return true/false + */ + private boolean applyDepartPatientAreaRelation(String orgUnitCode, String patientArea){ + boolean enableDepartmentToWardAssociation = ConfigUtils.getSystemSetConfigByNameBool("enableDepartmentToWardAssociation"); + boolean enablePatientAreaSetting = ConfigUtils.getSystemSetConfigByNameBool("enablePatientAreaSetting"); + if(!enableDepartmentToWardAssociation || !enablePatientAreaSetting){ + return true; + } + if(StringUtils.isBlank(patientArea) || StringUtils.isBlank(orgUnitCode)){ + throw new RuntimeException("参数异常!"); + } + StringBuffer sqlBuffer = new StringBuffer(); + sqlBuffer.append("select count(1) from "); + sqlBuffer.append(OrgUnitPatientAreaRelation.class.getSimpleName()); + sqlBuffer.append(" opar join "); + sqlBuffer.append(OrgUnit.class.getSimpleName()); + sqlBuffer.append(" ou on ou.id = opar.orgUnitId join "); + sqlBuffer.append(HttpOption.class.getSimpleName()); + sqlBuffer.append(" opt on opt.id = opar.patientAreaHttpOptionId where ou.orgUnitCoding = '"); + sqlBuffer.append(orgUnitCode); + sqlBuffer.append("' and opt.optionText = '"); + sqlBuffer.append(patientArea); + sqlBuffer.append("'"); + + if(objectDao.countBySql(sqlBuffer.toString()) <= 0){ + return false; + } + + return true; + } + + @Override + public void checkApplyDepartPatientAreaRelation(String applyDepartCode, String patientArea) { + boolean enableDepartmentToWardAssociation = ConfigUtils.getSystemSetConfigByNameBool("enableDepartmentToWardAssociation"); + boolean enablePatientAreaSetting = ConfigUtils.getSystemSetConfigByNameBool("enablePatientAreaSetting"); + if(!enableDepartmentToWardAssociation || !enablePatientAreaSetting){ + return; + } + if(StringUtils.isBlank(applyDepartCode)){ + throw new RuntimeException("申请科室编码不能为空!"); + } + if(StringUtils.isBlank(patientArea)){ + return; + } + OrgUnit orgUnit = orgUnitManager.getByCode(applyDepartCode); + if(orgUnit == null){ + throw new RuntimeException("申请科室编码不能为空!"); + } + if(!applyDepartPatientAreaRelation(applyDepartCode, patientArea)){ + throw new SystemException(String.format("%s没有和病区“%s”有关联,是否继续操作?", orgUnit.getName(), patientArea)); + } + } + + @SuppressWarnings("unchecked") + @Override + public void checkPackingTaskApplyOrgUnitPatientAreaRelation(String packingTaskIds) { + boolean enableDepartmentToWardAssociation = ConfigUtils.getSystemSetConfigByNameBool("enableDepartmentToWardAssociation"); + boolean enablePatientAreaSetting = ConfigUtils.getSystemSetConfigByNameBool("enablePatientAreaSetting"); + if(!enableDepartmentToWardAssociation || !enablePatientAreaSetting){ + return; + } + if(StringUtils.isBlank(packingTaskIds)){ + throw new RuntimeException("装配任务id不能为空!"); + } + List packingTaskIdList = (List) StringTools.parseToLongs(packingTaskIds, ";"); + if(CollectionUtils.isEmpty(packingTaskIdList)){ + throw new RuntimeException("装配任务id不能为空!"); + } + List packingTaskList = objectDao.findByIds(PackingTask.class.getSimpleName(), packingTaskIdList); + if(CollectionUtils.isEmpty(packingTaskList)){ + throw new RuntimeException("装配任务id不能为空!"); + } + List foreignTousseApplicationIdList = new ArrayList(); + for (PackingTask packingTask : packingTaskList) { + TousseDefinition tousseDefinition = packingTask.getTousseDefinition(); + if(tousseDefinition == null || !tousseDefinition.isForeignTousse()){ + continue; + } + foreignTousseApplicationIdList.add(tousseDefinition.getInvoicePlanID()); + } + if(CollectionUtils.isEmpty(foreignTousseApplicationIdList)){ + return; + } + List foreignTousseApplicationList = objectDao.findByIds(ForeignTousseApplication.class.getSimpleName(), foreignTousseApplicationIdList); + if(CollectionUtils.isEmpty(foreignTousseApplicationList)){ + throw new RuntimeException("装配任务关联的外来器械包申请单不存在!"); + } + for (ForeignTousseApplication foreignTousseApplication : foreignTousseApplicationList) { + checkApplyDepartPatientAreaRelation(foreignTousseApplication); + } + } + + +} Index: forgon-core/src/main/java/com/forgon/directory/vo/OrgUnitPatientAreaRelationVo.java =================================================================== diff -u --- forgon-core/src/main/java/com/forgon/directory/vo/OrgUnitPatientAreaRelationVo.java (revision 0) +++ forgon-core/src/main/java/com/forgon/directory/vo/OrgUnitPatientAreaRelationVo.java (revision 40716) @@ -0,0 +1,60 @@ +package com.forgon.directory.vo; + +/** + * 申请科室关联病区设置vo + */ +public class OrgUnitPatientAreaRelationVo { + + /** + * 科室ID + */ + private Long orgUnitId; + + /** + * 科室名称 + */ + private String orgUnitName; + + /** + * 病区ID + */ + private String patientAreaHttpOptionIds; + + /** + * 病区名称 + */ + private String patientAreaHttpOptionOptionText; + + public Long getOrgUnitId() { + return orgUnitId; + } + + public void setOrgUnitId(Long orgUnitId) { + this.orgUnitId = orgUnitId; + } + + public String getOrgUnitName() { + return orgUnitName; + } + + public void setOrgUnitName(String orgUnitName) { + this.orgUnitName = orgUnitName; + } + + public String getPatientAreaHttpOptionIds() { + return patientAreaHttpOptionIds; + } + + public void setPatientAreaHttpOptionIds(String patientAreaHttpOptionIds) { + this.patientAreaHttpOptionIds = patientAreaHttpOptionIds; + } + + public String getPatientAreaHttpOptionOptionText() { + return patientAreaHttpOptionOptionText; + } + + public void setPatientAreaHttpOptionOptionText(String patientAreaHttpOptionOptionText) { + this.patientAreaHttpOptionOptionText = patientAreaHttpOptionOptionText; + } + +}