Index: ssts-web/src/main/webapp/disinfectsystem/packing/packingView.jsp =================================================================== diff -u -r16672 -r16876 --- ssts-web/src/main/webapp/disinfectsystem/packing/packingView.jsp (.../packingView.jsp) (revision 16672) +++ ssts-web/src/main/webapp/disinfectsystem/packing/packingView.jsp (.../packingView.jsp) (revision 16876) @@ -308,6 +308,8 @@ .script("splitForeignTousseView.js") .script("${ctx}/disinfectsystem/packing/printRecyclingDetailWin.js") + + .script("comboToussePackingView.js") .script("${ctx}/disinfectsystem/foreigntousseapplication/foreignTousseApplicationForm.js") Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionManagerImpl.java =================================================================== diff -u -r16854 -r16876 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionManagerImpl.java (.../TousseDefinitionManagerImpl.java) (revision 16854) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionManagerImpl.java (.../TousseDefinitionManagerImpl.java) (revision 16876) @@ -44,6 +44,7 @@ import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.materialinstance.MaterialInstance; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.ComboTousseComposite; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; @@ -2603,4 +2604,53 @@ materialItemsJson.toString(),ancestorTD.getId()); } + @Override + public JSONArray loadAllComboTousseDefinition() { + String sql = String.format("select po.id,po.name,po.packageType,po.sterilingMethod,io.id,io.name,io.packageType from %s po, %s bo, %s io where po.id = bo.comboTousseDefinitionId " + + "and bo.tousseDefinitionId = io.id and po.tousseType = '%s' and (po.isDisable = '%s' or po.isDisable is null)", + TousseDefinition.class.getSimpleName(),ComboTousseComposite.class.getSimpleName(), + TousseDefinition.class.getSimpleName(),TousseDefinition.PACKAGE_TYPE_COMBO, Constants.STR_NO); + ResultSet rs = objectDao.executeSql(sql); + Map resultMap = new HashMap(); + try { + while(rs.next()){ + Long id = rs.getLong(1); + String comboTousseName = rs.getString(2); + String packageType = rs.getString(3); + String sterilingMethod = rs.getString(4); + Long tousseId = rs.getLong(5); + String tousseName = rs.getString(6); + String toussePackageType = rs.getString(7); + JSONObject comboTousseItem = resultMap.get(id); + if(comboTousseItem == null){ + comboTousseItem = new JSONObject(); + comboTousseItem.put("id", id); + comboTousseItem.put("name", comboTousseName); + comboTousseItem.put("packageType", packageType); + comboTousseItem.put("sterilingMethod", sterilingMethod); + resultMap.put(id, comboTousseItem); + } + JSONArray includeTousses = comboTousseItem.optJSONArray("includeTousses"); + if(includeTousses == null){ + includeTousses = new JSONArray(); + } + JSONObject ordinaryItem = new JSONObject(); + ordinaryItem.put("id", tousseId); + ordinaryItem.put("name", tousseName); + ordinaryItem.put("packageType", toussePackageType); + includeTousses.add(ordinaryItem); + comboTousseItem.put("includeTousses", includeTousses); + } + } catch (SQLException e) { + e.printStackTrace(); + } finally{ + DatabaseUtil.closeResultSetAndStatement(rs); + } + JSONArray array = new JSONArray(); + for (Long id : resultMap.keySet()) { + array.add(resultMap.get(id)); + } + return array; + } + } Index: ssts-web/src/test/java/test/forgon/disinfectsystem/packing/service/ComboToussePackingTests.java =================================================================== diff -u --- ssts-web/src/test/java/test/forgon/disinfectsystem/packing/service/ComboToussePackingTests.java (revision 0) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/packing/service/ComboToussePackingTests.java (revision 16876) @@ -0,0 +1,669 @@ +package test.forgon.disinfectsystem.packing.service; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; + +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +import javax.servlet.http.HttpSession; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.testng.annotations.Test; + +import test.forgon.constant.Constants; +import test.forgon.disinfectsystem.AbstractCSSDTest; + +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.ComboTousseComposite; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.disinfectsystem.entity.packing.PackingRecord; +import com.forgon.disinfectsystem.entity.packing.PackingTask; +import com.forgon.disinfectsystem.packing.dwr.table.PackingTableManager; +import com.forgon.disinfectsystem.packing.service.PackingManager; +import com.forgon.disinfectsystem.recyclingrecord.service.RecyclingRecordManager; +import com.forgon.disinfectsystem.washanddisinfectmanager.washanddisinfectrecord.service.WashAndDisinfectRecordManager; + + +/** + * @author wangyi + * Date:2017-1-19 上午11:55:15 + * 聚合包装配 + */ +public class ComboToussePackingTests extends AbstractCSSDTest { + @Autowired + private PackingManager packingManager; + @Autowired + private RecyclingRecordManager recyclingRecordManager; + @Autowired + private WashAndDisinfectRecordManager washAndDisinfectRecordManager; + @Autowired + private PackingTableManager packingTableManagerTX; + + + private Long createPackingTask(TousseDefinition td,Integer amount){ + PackingTask task = new PackingTask(); + task.setTousseDefinition(td); + task.setAmount(amount); + task.setUnPackAmount(amount); + task.setTaskType(PackingTask.TASK_RECYCLINGRECORD); + task.setDepartCoding(Constants.ORG_UNIT_CODE_NEIKE); + task.setDepartment(Constants.ORG_UNIT_NAME_NEIKE); + task.setOrgUnitCoding(Constants.ORG_UNIT_CODE_CSSD); + task.setStatus(PackingTask.STATUS_AWAIT_PACKING); + objectDao.saveOrUpdate(task); + return task.getId(); + } + + + /** + * 创建装配任务 + */ + private List initPackingTask(){ + TousseDefinition td_开胸包 = tousseDefinitionManager.getTousseDefinitionByName("Test开胸包"); + TousseDefinition td_开颅包 = tousseDefinitionManager.getTousseDefinitionByName("Test开颅包"); + Long taskId = createPackingTask(td_开胸包,3); + Long taskId2 = createPackingTask(td_开颅包,2); + List list = new ArrayList(); + list.add(taskId); + list.add(taskId2); + return list; + } + + private void initData(){ + initCSSDData(); + makeActiveUser("cssduser1"); + } + + /** + * 正常数据能否装配聚合包 + */ + @Test + public void testNormalPackingComboTousse() { + + initData(); + + List taskIdList = initPackingTask(); + + String sql = String.format("where po.id in(%s)", StringUtils.join(taskIdList, ",")); + @SuppressWarnings("unchecked") + List taskList = objectDao.findBySql(PackingTask.class.getSimpleName(), sql); + assertTrue(taskList.size() == 2); + + String ids = ""; + String operator = "cssduser1"; + String operatorCode = "002107"; + String reviewer = "cssduser2"; + String reviewerCode = "fw130"; + String packageType = "棉布"; + String sterilingType = "P1器械"; + String packAmountStr = "8"; + String taskGroup = "术科组"; + String sterilizer = "1号灭菌炉"; + String frequency = "3"; + HttpSession session = null; + JSONObject params = new JSONObject(); + params.put("taskIds", ids); + params.put("operator", operator); + params.put("operatorCode", operatorCode); + params.put("reviewer", reviewer); + params.put("reviewerCode", reviewerCode); + params.put("packageType", packageType); + params.put("sterilingType", sterilingType); + + String sterileDate = "2017-01-19"; + Calendar calendar = Calendar.getInstance(); + try { + calendar.setTimeInMillis(com.forgon.Constants.SIMPLEDATEFORMAT_YYYYMMDD.parse(sterileDate).getTime()); + } catch (ParseException e) { + e.printStackTrace(); + } + + params.put("sterileDate", calendar.getTimeInMillis()); + params.put("packAmount", packAmountStr); + params.put("taskGroup", taskGroup); + params.put("sterilizer", sterilizer); + params.put("frequency", frequency); + params.put("confirmContinue", "true"); + + TousseDefinition ctDefinition = tousseDefinitionManager.getTousseDefinitionByName("Test聚合包"); + JSONArray data = new JSONArray(); + JSONObject comboTousse1 = new JSONObject(); + comboTousse1.put("id", ctDefinition.getId()); + comboTousse1.put("tousseName", ctDefinition.getName()); + comboTousse1.put("packageType", "棉布"); + comboTousse1.put("departCoding", Constants.ORG_UNIT_CODE_NEIKE); + + //聚合包内普通器械包 + JSONArray comboTousseJsonArray = new JSONArray(); + TousseDefinition td_开胸包 = tousseDefinitionManager.getTousseDefinitionByName("Test开胸包"); + TousseDefinition td_开颅包 = tousseDefinitionManager.getTousseDefinitionByName("Test开颅包"); + + JSONObject tousseJson = new JSONObject(); + tousseJson.put("id", td_开胸包.getId()); + tousseJson.put("tousseName", td_开胸包.getName()); + tousseJson.put("amount", 3); + + JSONObject tousseJson2 = new JSONObject(); + tousseJson2.put("id", td_开颅包.getId()); + tousseJson2.put("tousseName", td_开颅包.getName()); + tousseJson2.put("amount", 2); + + comboTousseJsonArray.add(tousseJson); + comboTousseJsonArray.add(tousseJson2); + comboTousse1.put("includeTousseJsonArray", comboTousseJsonArray); + data.add(comboTousse1); + params.put("comboTousseJsonArray", data); + + String result = packingTableManagerTX.packingComboTousse(params.toString(), session); + assertNotNull(result); + + JSONObject resultJson = JSONObject.fromObject(result); + assertEquals(true,resultJson.optBoolean("success")); + assertEquals(1, resultJson.optJSONArray("tousses").size()); + + @SuppressWarnings("unchecked") + List instanceList = objectDao.findBySql( + TousseInstance.class.getSimpleName(), + "where po.comboTousseDefinitionId = " + ctDefinition.getId()); + + assertNotNull(instanceList); + assertEquals(1, instanceList.size()); + //验证失效期、预警期 + TousseInstance ti = instanceList.get(0); + Date validUntil = ti.getValidUntil(); + String validUntilDate = com.forgon.Constants.SIMPLEDATEFORMAT_YYYYMMDD.format(validUntil); + assertEquals("2017-01-26",validUntilDate); + Date WarningUntil = ti.getWarningUntil(); + String WarningUntilDate = com.forgon.Constants.SIMPLEDATEFORMAT_YYYYMMDD.format(WarningUntil); + assertEquals("2017-01-22",WarningUntilDate); + //装配任务校验 + @SuppressWarnings("unchecked") + List packingTaskList = objectDao.findBySql(PackingTask.class.getSimpleName(), sql); + assertTrue(packingTaskList.size() == 0); + //验证装配记录 + PackingRecord record = (PackingRecord)objectDao.getByProperty(PackingRecord.class.getSimpleName(), "id", ti.getPackingRecord_id()); + assertNotNull(record); + assertEquals(1,record.getAmount().intValue()); + + @SuppressWarnings("unchecked") + List instanceList2 = objectDao.findBySql( + TousseInstance.class.getSimpleName(), + "where po.comboTousseInstanceId = " + ti.getId()); + assertNotNull(instanceList2); + assertEquals(5, instanceList2.size()); + //普通器械包是否有关联装配记录 + for (TousseInstance tousseInstance : instanceList2) { + assertTrue(tousseInstance.getPackingRecord_id() == null); + } + //页面返回值校验 + JSONArray dataArray = resultJson.optJSONArray("tousses"); + assertEquals(1, dataArray.size()); + JSONObject printItem = dataArray.optJSONObject(0); + assertEquals("Test聚合包", printItem.optString("tousseName")); + assertEquals("2017-01-26", printItem.optString("validDate")); + assertEquals("1", printItem.optString("printAmount")); + + JSONObject materialObj = printItem.optJSONObject("tousseDefinition"); + assertNotNull(materialObj); + assertEquals(true, materialObj.optBoolean("isPrintMaterialForPacking")); + JSONArray materialInstances = materialObj.optJSONArray("materialInstances"); + assertNotNull(materialInstances); + assertEquals(2, materialInstances.size()); + for(int i = 0 ; i < materialInstances.size() ; i++){ + JSONObject materialJson = materialInstances.optJSONObject(i); + String tName = materialJson.optJSONObject("materialDefinition").optString("name"); + if("Test开胸包".equals(tName)){ + assertEquals(3, materialJson.optInt("count")); + }else if("Test开颅包".equals(tName)){ + assertEquals(2, materialJson.optInt("count")); + } + } + } + + + private List initPackingTask2(){ + TousseDefinition td_开胸包 = tousseDefinitionManager.getTousseDefinitionByName("Test开胸包"); + TousseDefinition td_开颅包 = tousseDefinitionManager.getTousseDefinitionByName("Test开颅包"); + Long taskId = createPackingTask(td_开胸包,1); + Long taskId2 = createPackingTask(td_开颅包,2); + Long taskId3 = createPackingTask(td_开胸包,1); + List list = new ArrayList(); + list.add(taskId); + list.add(taskId2); + list.add(taskId3); + return list; + } + + /** + * 聚合包内普通器械包的聚合数量大于当前数据库中该包的装配总数量 + * 例如:Test聚合包内开胸包填写的聚合数量是3, + * 但是装配时发现数据库里开胸包的装配总数是2, + * 这种场景不能装配 + */ + @Test + public void testPackingComboTousse2() { + + initData(); + initPackingTask2(); + + String ids = ""; + String operator = "cssduser1"; + String operatorCode = "002107"; + String reviewer = "cssduser2"; + String reviewerCode = "fw130"; + String packageType = "棉布"; + String sterilingType = "P1器械"; + String packAmountStr = "8"; + String taskGroup = "术科组"; + String sterilizer = "1号灭菌炉"; + String frequency = "3"; + HttpSession session = null; + JSONObject params = new JSONObject(); + params.put("taskIds", ids); + params.put("operator", operator); + params.put("operatorCode", operatorCode); + params.put("reviewer", reviewer); + params.put("reviewerCode", reviewerCode); + params.put("packageType", packageType); + params.put("sterilingType", sterilingType); + params.put("sterileDate", String.valueOf(System.currentTimeMillis())); + params.put("packAmount", packAmountStr); + params.put("taskGroup", taskGroup); + params.put("sterilizer", sterilizer); + params.put("frequency", frequency); + params.put("confirmContinue", "true"); + + TousseDefinition ctDefinition = tousseDefinitionManager.getTousseDefinitionByName("Test聚合包"); + JSONArray data = new JSONArray(); + JSONObject comboTousse1 = new JSONObject(); + comboTousse1.put("id", ctDefinition.getId()); + comboTousse1.put("tousseName", ctDefinition.getName()); + comboTousse1.put("packageType", "棉布"); + comboTousse1.put("departCoding", Constants.ORG_UNIT_CODE_NEIKE); + + //聚合包内普通器械包 + JSONArray comboTousseJsonArray = new JSONArray(); + TousseDefinition td_开胸包 = tousseDefinitionManager.getTousseDefinitionByName("Test开胸包"); + TousseDefinition td_开颅包 = tousseDefinitionManager.getTousseDefinitionByName("Test开颅包"); + + JSONObject tousseJson = new JSONObject(); + tousseJson.put("id", td_开胸包.getId()); + tousseJson.put("tousseName", td_开胸包.getName()); + tousseJson.put("amount", 3); + + JSONObject tousseJson2 = new JSONObject(); + tousseJson2.put("id", td_开颅包.getId()); + tousseJson2.put("tousseName", td_开颅包.getName()); + tousseJson2.put("amount", 2); + + comboTousseJsonArray.add(tousseJson); + comboTousseJsonArray.add(tousseJson2); + comboTousse1.put("includeTousseJsonArray", comboTousseJsonArray); + data.add(comboTousse1); + params.put("comboTousseJsonArray", data); + + String result = packingTableManagerTX.packingComboTousse(params.toString(), session); + assertNotNull(result); + + JSONObject resultJson = JSONObject.fromObject(result); + assertEquals(false,resultJson.optBoolean("success")); + assertEquals(td_开胸包.getName()+"当前可装配数量小于3,装配失败!", resultJson.optString("message")); + } + + private List initPackingTask3(){ + TousseDefinition td_开胸包 = tousseDefinitionManager.getTousseDefinitionByName("Test开胸包"); + TousseDefinition td_开颅包 = tousseDefinitionManager.getTousseDefinitionByName("Test开颅包"); + Long taskId = createPackingTask(td_开胸包,1); + Long taskId2 = createPackingTask(td_开颅包,2); + Long taskId3 = createPackingTask(td_开胸包,1); + Long taskId4 = createPackingTask(td_开胸包,2); + List list = new ArrayList(); + list.add(taskId); + list.add(taskId2); + list.add(taskId3); + list.add(taskId4); + return list; + } + + + /** + * 聚合包内普通器械包的聚合数量小于当前数据库中该包的装配总数量 + * 例如:Test聚合包内开胸包填写的聚合数量是3, + * 数据库里开胸包的装配总数是4, + * 验证装配任务是否异常 + */ + @Test + public void testPackingComboTousse3() { + + initData(); + initPackingTask3(); + + String ids = ""; + String operator = "cssduser1"; + String operatorCode = "002107"; + String reviewer = "cssduser2"; + String reviewerCode = "fw130"; + String packageType = "棉布"; + String sterilingType = "P1器械"; + String packAmountStr = "8"; + String taskGroup = "术科组"; + String sterilizer = "1号灭菌炉"; + String frequency = "3"; + HttpSession session = null; + JSONObject params = new JSONObject(); + params.put("taskIds", ids); + params.put("operator", operator); + params.put("operatorCode", operatorCode); + params.put("reviewer", reviewer); + params.put("reviewerCode", reviewerCode); + params.put("packageType", packageType); + params.put("sterilingType", sterilingType); + params.put("sterileDate", String.valueOf(System.currentTimeMillis())); + params.put("packAmount", packAmountStr); + params.put("taskGroup", taskGroup); + params.put("sterilizer", sterilizer); + params.put("frequency", frequency); + params.put("confirmContinue", "true"); + + TousseDefinition ctDefinition = tousseDefinitionManager.getTousseDefinitionByName("Test聚合包"); + JSONArray data = new JSONArray(); + JSONObject comboTousse1 = new JSONObject(); + comboTousse1.put("id", ctDefinition.getId()); + comboTousse1.put("tousseName", ctDefinition.getName()); + comboTousse1.put("packageType", "棉布"); + comboTousse1.put("departCoding", Constants.ORG_UNIT_CODE_NEIKE); + + //聚合包内普通器械包 + JSONArray comboTousseJsonArray = new JSONArray(); + TousseDefinition td_开胸包 = tousseDefinitionManager.getTousseDefinitionByName("Test开胸包"); + TousseDefinition td_开颅包 = tousseDefinitionManager.getTousseDefinitionByName("Test开颅包"); + + JSONObject tousseJson = new JSONObject(); + tousseJson.put("id", td_开胸包.getId()); + tousseJson.put("tousseName", td_开胸包.getName()); + tousseJson.put("amount", 3); + + JSONObject tousseJson2 = new JSONObject(); + tousseJson2.put("id", td_开颅包.getId()); + tousseJson2.put("tousseName", td_开颅包.getName()); + tousseJson2.put("amount", 2); + + comboTousseJsonArray.add(tousseJson); + comboTousseJsonArray.add(tousseJson2); + comboTousse1.put("includeTousseJsonArray", comboTousseJsonArray); + data.add(comboTousse1); + params.put("comboTousseJsonArray", data); + + String result = packingTableManagerTX.packingComboTousse(params.toString(), session); + assertNotNull(result); + + JSONObject resultJson = JSONObject.fromObject(result); + assertEquals(true,resultJson.optBoolean("success")); + + List unPackingTasks = objectDao.findBySql(PackingTask.class.getSimpleName(), "where po.tousseDefinition.id = " + td_开胸包.getId()); + assertNotNull(unPackingTasks); + int totalUnPackingAmount = 0 ; + for (PackingTask packingTask : unPackingTasks) { + totalUnPackingAmount += packingTask.getUnPackAmount(); + } + assertEquals(1, totalUnPackingAmount); + } + + + + private TousseDefinition bulidComboTousseDefinition2(){ + //聚合包定义 + TousseDefinition comboTousse = new TousseDefinition(); + comboTousse.setName("Test穿刺聚合包"); + comboTousse.setTousseType(TousseDefinition.PACKAGE_TYPE_COMBO); + comboTousse.setHandlerDepartCode(Constants.ORG_UNIT_CODE_NEIKE); + comboTousse.setHandlerDepartName(Constants.ORG_UNIT_NAME_NEIKE); + objectDao.saveOrUpdate(comboTousse); + + //聚合包内普通器械包 + TousseDefinition td_穿刺包 = tousseDefinitionManager.getTousseDefinitionByName("Test穿刺包"); + ComboTousseComposite ct = new ComboTousseComposite(); + ct.setComboTousseDefinitionId(comboTousse.getId()); + ct.setTousseDefinitionId(td_穿刺包.getId()); + objectDao.saveOrUpdate(ct); + return comboTousse; + } + + private List initPackingTask4(){ + TousseDefinition Test穿刺包 = tousseDefinitionManager.getTousseDefinitionByName("Test穿刺包"); + Long taskId = createPackingTask(Test穿刺包,3); + Long taskId2 = createPackingTask(Test穿刺包,4); + Long taskId3 = createPackingTask(Test穿刺包,3); + List list = new ArrayList(); + list.add(taskId); + list.add(taskId2); + list.add(taskId3); + return list; + } + + /** + * 测试同时装配2种不同名称的聚合包 + * 装配聚合包:Test聚合包、Test穿刺聚合包 + */ + @Test + public void testPackingComboTousse4() { + + + initData(); + bulidComboTousseDefinition2(); + + List taskIdList = initPackingTask(); + List taskIdList2 =initPackingTask4(); + + String sql = String.format("where po.id in(%s)", StringUtils.join(taskIdList, ",")); + @SuppressWarnings("unchecked") + List taskList = objectDao.findBySql(PackingTask.class.getSimpleName(), sql); + assertTrue(taskList.size() == 2); + + String sql2 = String.format("where po.id in(%s)", StringUtils.join(taskIdList2, ",")); + @SuppressWarnings("unchecked") + List taskList2 = objectDao.findBySql(PackingTask.class.getSimpleName(), sql2); + assertTrue(taskList2.size() == 3); + + String ids = ""; + String operator = "cssduser1"; + String operatorCode = "002107"; + String reviewer = "cssduser2"; + String reviewerCode = "fw130"; + String packageType = "棉布"; + String sterilingType = "P1器械"; + String packAmountStr = "8"; + String taskGroup = "术科组"; + String sterilizer = "1号灭菌炉"; + String frequency = "3"; + HttpSession session = null; + JSONObject params = new JSONObject(); + params.put("taskIds", ids); + params.put("operator", operator); + params.put("operatorCode", operatorCode); + params.put("reviewer", reviewer); + params.put("reviewerCode", reviewerCode); + params.put("packageType", packageType); + params.put("sterilingType", sterilingType); + String sterileDate = "2017-01-19"; + Calendar calendar = Calendar.getInstance(); + try { + calendar.setTimeInMillis(com.forgon.Constants.SIMPLEDATEFORMAT_YYYYMMDD.parse(sterileDate).getTime()); + } catch (ParseException e) { + e.printStackTrace(); + } + params.put("sterileDate", calendar.getTimeInMillis()); + params.put("packAmount", packAmountStr); + params.put("taskGroup", taskGroup); + params.put("sterilizer", sterilizer); + params.put("frequency", frequency); + params.put("confirmContinue", "true"); + + TousseDefinition test聚合包 = tousseDefinitionManager.getTousseDefinitionByName("Test聚合包"); + JSONArray data = new JSONArray(); + JSONObject comboTousse1 = new JSONObject(); + comboTousse1.put("id", test聚合包.getId()); + comboTousse1.put("tousseName", test聚合包.getName()); + comboTousse1.put("packageType", "棉布"); + comboTousse1.put("departCoding", Constants.ORG_UNIT_CODE_NEIKE); + + //Test聚合包参数 + JSONArray comboTousseJsonArray = new JSONArray(); + TousseDefinition td_开胸包 = tousseDefinitionManager.getTousseDefinitionByName("Test开胸包"); + TousseDefinition td_开颅包 = tousseDefinitionManager.getTousseDefinitionByName("Test开颅包"); + JSONObject tousseJson = new JSONObject(); + tousseJson.put("id", td_开胸包.getId()); + tousseJson.put("tousseName", td_开胸包.getName()); + tousseJson.put("amount", 3); + JSONObject tousseJson2 = new JSONObject(); + tousseJson2.put("id", td_开颅包.getId()); + tousseJson2.put("tousseName", td_开颅包.getName()); + tousseJson2.put("amount", 2); + comboTousseJsonArray.add(tousseJson); + comboTousseJsonArray.add(tousseJson2); + comboTousse1.put("includeTousseJsonArray", comboTousseJsonArray); + data.add(comboTousse1); + params.put("comboTousseJsonArray", data); + //Test穿刺聚合包参数 + TousseDefinition Test穿刺聚合包 = tousseDefinitionManager.getTousseDefinitionByName("Test穿刺聚合包"); + JSONObject comboTousse2 = new JSONObject(); + comboTousse2.put("id", Test穿刺聚合包.getId()); + comboTousse2.put("tousseName", Test穿刺聚合包.getName()); + comboTousse2.put("packageType", "纸塑"); + comboTousse2.put("departCoding", Constants.ORG_UNIT_CODE_NEIKE); + + JSONArray comboTousseJsonArray2 = new JSONArray(); + TousseDefinition Test穿刺包 = tousseDefinitionManager.getTousseDefinitionByName("Test穿刺包"); + JSONObject tousseJson3 = new JSONObject(); + tousseJson3.put("id", Test穿刺包.getId()); + tousseJson3.put("tousseName", Test穿刺包.getName()); + tousseJson3.put("amount", 8); + comboTousseJsonArray2.add(tousseJson3); + comboTousse2.put("includeTousseJsonArray", comboTousseJsonArray2); + data.add(comboTousse2); + params.put("comboTousseJsonArray", data); + + + String result = packingTableManagerTX.packingComboTousse(params.toString(), session); + assertNotNull(result); + + JSONObject resultJson = JSONObject.fromObject(result); + assertEquals(true,resultJson.optBoolean("success")); + assertEquals(2, resultJson.optJSONArray("tousses").size()); + + @SuppressWarnings("unchecked") + List test聚合包List = objectDao.findBySql( + TousseInstance.class.getSimpleName(), + "where po.comboTousseDefinitionId = " + test聚合包.getId()); + + assertNotNull(test聚合包List); + assertEquals(1, test聚合包List.size()); + + @SuppressWarnings("unchecked") + List test穿刺聚合包List = objectDao.findBySql( + TousseInstance.class.getSimpleName(), + "where po.comboTousseDefinitionId = " + Test穿刺聚合包.getId()); + + assertNotNull(test穿刺聚合包List); + assertEquals(1, test穿刺聚合包List.size()); + //验证失效期、预警期 + TousseInstance ti = test聚合包List.get(0); + Date validUntil = ti.getValidUntil(); + String validUntilDate = com.forgon.Constants.SIMPLEDATEFORMAT_YYYYMMDD.format(validUntil); + assertEquals("2017-01-26",validUntilDate); + Date WarningUntil = ti.getWarningUntil(); + String WarningUntilDate = com.forgon.Constants.SIMPLEDATEFORMAT_YYYYMMDD.format(WarningUntil); + assertEquals("2017-01-22",WarningUntilDate); + + TousseInstance ti2 = test穿刺聚合包List.get(0); + Date validUntil2 = ti2.getValidUntil(); + String validUntilDate2 = com.forgon.Constants.SIMPLEDATEFORMAT_YYYYMMDD.format(validUntil2); + assertEquals("2017-07-19",validUntilDate2); + //装配任务校验 + @SuppressWarnings("unchecked") + List packingTaskList = objectDao.findBySql(PackingTask.class.getSimpleName(), sql); + assertTrue(packingTaskList.size() == 0); + @SuppressWarnings("unchecked") + List packingTaskList2 = objectDao.findBySql(PackingTask.class.getSimpleName(), sql2); + assertTrue(packingTaskList2.size() == 1); + assertEquals(2, packingTaskList2.get(0).getUnPackAmount().intValue()); + //验证装配记录 + PackingRecord record = (PackingRecord)objectDao.getByProperty(PackingRecord.class.getSimpleName(), "id", ti.getPackingRecord_id()); + assertNotNull(record); + assertEquals(1,record.getAmount().intValue()); + PackingRecord record2 = (PackingRecord)objectDao.getByProperty(PackingRecord.class.getSimpleName(), "id", ti2.getPackingRecord_id()); + assertNotNull(record2); + assertEquals(1,record2.getAmount().intValue()); + + @SuppressWarnings("unchecked") + List instanceList3 = objectDao.findBySql( + TousseInstance.class.getSimpleName(), + "where po.comboTousseInstanceId = " + ti.getId()); + assertNotNull(instanceList3); + assertEquals(5, instanceList3.size()); + //普通器械包是否有关联装配记录 + for (TousseInstance tousseInstance : instanceList3) { + assertTrue(tousseInstance.getPackingRecord_id() == null); + } + @SuppressWarnings("unchecked") + List instanceList4 = objectDao.findBySql( + TousseInstance.class.getSimpleName(), + "where po.comboTousseInstanceId = " + ti2.getId()); + assertNotNull(instanceList4); + assertEquals(8, instanceList4.size()); + //普通器械包是否有关联装配记录 + for (TousseInstance tousseInstance : instanceList4) { + assertTrue(tousseInstance.getPackingRecord_id() == null); + } + //页面返回值校验 + JSONArray dataArray = resultJson.optJSONArray("tousses"); + assertEquals(2, dataArray.size()); + JSONObject printItem = dataArray.optJSONObject(0); + assertEquals("Test聚合包", printItem.optString("tousseName")); + assertEquals("2017-01-26", printItem.optString("validDate")); + assertEquals("1", printItem.optString("printAmount")); + JSONObject printItem2 = dataArray.optJSONObject(1); + assertEquals("Test穿刺聚合包", printItem2.optString("tousseName")); + assertEquals("2017-07-19", printItem2.optString("validDate")); + assertEquals("1", printItem2.optString("printAmount")); + + JSONObject materialObj = printItem.optJSONObject("tousseDefinition"); + assertNotNull(materialObj); + assertEquals(true, materialObj.optBoolean("isPrintMaterialForPacking")); + JSONArray materialInstances = materialObj.optJSONArray("materialInstances"); + assertNotNull(materialInstances); + assertEquals(2, materialInstances.size()); + for(int i = 0 ; i < materialInstances.size() ; i++){ + JSONObject materialJson = materialInstances.optJSONObject(i); + String tName = materialJson.optJSONObject("materialDefinition").optString("name"); + if("Test开胸包".equals(tName)){ + assertEquals(3, materialJson.optInt("count")); + }else if("Test开颅包".equals(tName)){ + assertEquals(2, materialJson.optInt("count")); + } + } + JSONObject materialObj2 = printItem2.optJSONObject("tousseDefinition"); + assertNotNull(materialObj2); + assertEquals(true, materialObj2.optBoolean("isPrintMaterialForPacking")); + JSONArray materialInstances2 = materialObj2.optJSONArray("materialInstances"); + assertNotNull(materialInstances2); + assertEquals(1, materialInstances2.size()); + for(int i = 0 ; i < materialInstances2.size() ; i++){ + JSONObject materialJson = materialInstances2.optJSONObject(i); + String tName = materialJson.optJSONObject("materialDefinition").optString("name"); + assertEquals("Test穿刺包", tName); + assertEquals(8, materialJson.optInt("count")); + } + + } + +} Index: ssts-web/src/main/webapp/ext/fontSize12/styles/common.css =================================================================== diff -u -r12331 -r16876 --- ssts-web/src/main/webapp/ext/fontSize12/styles/common.css (.../common.css) (revision 12331) +++ ssts-web/src/main/webapp/ext/fontSize12/styles/common.css (.../common.css) (revision 16876) @@ -339,6 +339,9 @@ .btn_ext_application_side { background-image:url( ../../../images/web/application_side_contract.png) !important; } +.btn_ext_application_todo { + background-image:url( ../../../images/web/options.png) !important; +} .btn_ext_basket_put { background-image:url( ../../../images/web/basket_put.png) !important; } Index: ssts-web/src/main/webapp/disinfectsystem/packing/comboToussePackingView.js =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/packing/comboToussePackingView.js (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/packing/comboToussePackingView.js (revision 16876) @@ -0,0 +1,940 @@ +/** + * 聚合包装配界面 + */ + +/** + * 获取聚合包内普通包总数量 + */ +function resetComboTousseTotolAmount(){ + var totalAmount = 0; + var splitedMaterialStore = top.Ext4.getCmp("comboGrid").getStore(); + for ( var n = 0; n < splitedMaterialStore.getCount(); n++) { + var record = splitedMaterialStore.getAt(n); + var amount = record.get('amount'); + totalAmount += amount; + } + var str = "            "; + str += "            "; + str += "     "; + top.Ext4.getCmp("comboGrid").setTitle("已聚合的器械包" + str + "器械包总数量:" + totalAmount); +} + +/** + * << 或 <<<< + */ +function addTousseToComboGrid(sourceStore,id,tousseName,amount,packageType){ + if(amount <= 0){ + return false; + } + var index = sourceStore.findExact("id", id); + if (index == -1){ + var addItem = [{ + id : id, + tousseName : tousseName, + amount : amount, + maxAmount : amount, + packageType : packageType + }] + sourceStore.insert(0,addItem); + }else{ + var splitRecord = sourceStore.getAt(index); + splitRecord.set('maxAmount', amount + splitRecord.get("maxAmount")); + } +} + +/** + * >> 或 >>>> + */ +function addTousseToTousseGrid(sourceStore,id,tousseName,amount,packageType){ + if(amount <= 0){ + return false; + } + var index = sourceStore.findExact("id", id); + if (index == -1){ + var addItem = [{ + id : id, + tousseName : tousseName, + amount : amount, + packageType : packageType + }] + sourceStore.insert(0,addItem); + }else{ + var splitRecord = sourceStore.getAt(index); + splitRecord.set('amount', amount + splitRecord.get("amount")); + } +} + + +/** + * >> 或 >>>> + */ +function toComboTousseGrid(isAllMove){ + + var waitComboTousseGrid = top.Ext4.getCmp("waitComboTousseGrid"); + var waitComboTousseStore = waitComboTousseGrid.getStore(); + var comboGridStore = top.Ext4.getCmp("comboGrid").getStore(); + + if(isAllMove){ + var store = waitComboTousseGrid.getStore(); + for(var i = 0 ; i < store.getCount() ; i++){ + var record = store.getAt(i); + addTousseToTousseGrid(comboGridStore,record.get("id"),record.get("tousseName"),record.get("maxAmount"),record.get("packageType")); + } + waitComboTousseStore.removeAll(); + }else{ + var records = waitComboTousseGrid.getSelectionModel().getSelection(); + if (records.length == 0) { + showResult("请选择!"); + return false; + } + for(var i = 0 ; i < records.length ; i++){ + var id = records[i].data["id"]; + var tousseName = records[i].data["tousseName"]; + var amount = records[i].data['amount'];//拆分数量 + var maxAmount = records[i].data["maxAmount"];//总数量 + var packageType = records[i].data["packageType"]; + + if(amount > maxAmount){ + showResult("聚合数量不能大于总数量!"); + return false; + } + addTousseToTousseGrid(comboGridStore,id,tousseName,amount,packageType); + + if(amount == maxAmount){ + waitComboTousseStore.remove(records[i]); + }else{ + var num = Number(maxAmount) - Number(amount); + records[i].set('amount', num); + records[i].set('maxAmount', num); + } + } + } + resetComboTousseTotolAmount(); +} + +/** + *<< 或 <<<< + */ +function toTousseGrid(isAllMove){ + + var comboGrid = top.Ext4.getCmp("comboGrid"); + var comboGridStore = comboGrid.getStore(); + var waitComboTousseGridStore = top.Ext4.getCmp("waitComboTousseGrid").getStore(); + + if(isAllMove){ + for(var i = 0 ; i < comboGridStore.getCount() ; i++){ + var record = comboGridStore.getAt(i); + addTousseToComboGrid(waitComboTousseGridStore,record.get("id"),record.get("tousseName"),record.get("amount"),record.get("packageType")); + } + comboGridStore.removeAll(); + }else{ + var records = comboGrid.getSelectionModel().getSelection(); + if (records.length == 0) { + showResult("请选择!"); + return false; + } + for(var i = 0 ; i < records.length ; i++){ + var id = records[i].data["id"]; + var tousseName = records[i].data["tousseName"]; + var amount = records[i].data["amount"];//总数量 + var packageType = records[i].data["packageType"]; + addTousseToComboGrid(waitComboTousseGridStore,id,tousseName,amount,packageType); + comboGridStore.remove(records[i]); + } + } + resetComboTousseTotolAmount(); +} + +/** + * 生成聚合包 + */ +function comboTousseGrid(id,tousseName){ + var tousseDetail = ""; + + var tousseJsonArray = []; + + var comboGridStore = top.Ext4.getCmp("comboGrid").getStore(); + for ( var i = 0; i < comboGridStore.getCount(); i++) { + var record = comboGridStore.getAt(i); + + var temp = record.get('tousseName') + "x" +record.get('amount'); + if (tousseDetail == null || tousseDetail.length <= 0) { + tousseDetail = temp; + } else { + tousseDetail = tousseDetail + ";" + temp; + } + + var tousseObj = {}; + tousseObj.id = record.get("id"); + tousseObj.tousseName = record.get('tousseName'); + tousseObj.amount = record.get('amount'); + tousseObj.packageType = record.get('packageType'); + tousseJsonArray.push(tousseObj); + } + var type = top.Ext4.getCmp("comboToussePackageType").getValue(); + + var comboTousseDataGridStore = top.Ext4.getCmp("comboTousseDataGrid").getStore(); + + if(tousseDetail != ""){ + var item = [{ + comboId : id, + tousseName : tousseName, + includeTousseDetail : tousseDetail, + includeTousseJsonArray : tousseJsonArray, + packageType : type + }]; + comboTousseDataGridStore.add(item); + //删除 + comboGridStore.removeAll(); + }else{ + showResult("请选择聚合的器械包!"); + } +} + +/** + * 获取聚合包数据 + */ +function getComboTousseData(){ + var packages = []; + var comboTousseDataStore = top.Ext4.getCmp("comboTousseDataGrid").getStore(); + for ( var i = 0; i < comboTousseDataStore.getCount(); i++) { + var record = comboTousseDataStore.getAt(i); + + var tousse = {}; + tousse.id = record.get('comboId'); + tousse.tousseName = record.get('tousseName'); + tousse.includeTousseDetail = record.get('includeTousseDetail'); + tousse.includeTousseJsonArray = record.get('includeTousseJsonArray'); + tousse.packageType = record.get('packageType'); + packages.push(tousse); + + } + if(packages.length > 0){ + top.Ext4.getCmp('comboPackages').setValue(JSON.stringify(packages)); + return true; + }else{ + top.Ext4.getCmp('comboPackages').setValue(null); + return false; + } +} + +function loadBarcodeInfo(barcodeField,elementName,elementCode){ + var nameTextfieldObj = top.Ext4.getCmp(elementName); + var codeTextfieldObj = top.Ext4.getCmp(elementCode); + + var peopleOfBarcode = barcodeField.getValue(); + if(peopleOfBarcode){ + UserTableManager.getUserByBarcode(peopleOfBarcode,function(responseText){ + if(responseText){ + var result = Ext.decode(responseText); + if(!result.success){ + showResult("输入的条码有误!"); + return; + }else{ + nameTextfieldObj.setValue(result.fullName); + codeTextfieldObj.setValue(result.name); + if(elementName == "operator3"){ + top.Ext4.getCmp('reviewerBarcode3').focus('', 10); + } + } + }else{ + codeTextfieldObj.setValue(""); + nameTextfieldObj.setValue(""); + showResult('找不到该条码所对应的人员信息'); + } + }); + } + barcodeField.setValue(""); +} + +function packingComboTousse(){ + + top.Ext4.define('cellEditingGrid',{ + extend: 'top.Ext4.grid.Panel', + xtype: 'cell-editing', + useArrows: true, + columnLines: true, + rowLines: true, + cls: 'no-leaf-icons', + initComponent: function() { + this.cellEditing = new top.Ext4.grid.plugin.CellEditing({ + clicksToEdit: 1 + }); + Ext4.apply(this, { + plugins: [this.cellEditing] + }); + this.superclass.initComponent.call(this); + } + }); + + var cToussePackageTypeStore = new Ext4.data.Store({ + proxy : { + type : 'ajax', + url : WWWROOT + '/disinfectSystem/baseData/expirationDateInfoAction!getPackageTypeAndExpirationDateInfo.do', + reader : { + type : 'array' + } + }, + fields : ['typeName','validDate','validDateUnit','warningDate'], + autoLoad : true + }); + + var cTousseSterilizerTypeStore = new Ext4.data.Store({ + proxy : { + type : 'ajax', + url : WWWROOT + '/disinfectSystem/baseData/sterilizerAction!getSterilizerTypeAndSterilizationPurpose.do', + reader : { + type : 'array' + } + }, + fields : [ 'id','typeName','typeNameAndPurpose'], + autoLoad : true + }); + + var cTousseSterilizerJsonStore = new Ext4.data.Store({ + proxy : { + type : 'ajax', + url : WWWROOT + '/disinfectSystem/baseData/sterilizerAction!getAllSterilizer.do?includeNone=yes', + reader : { + type : 'array' + } + }, + fields : [ 'sterilizerName' ], + autoLoad : true + }); + + var comboTousseStore = new Ext4.data.Store({ + proxy : { + type : 'ajax', + url : WWWROOT + '/disinfectSystem/packingAction!getComboTousseStore.do', + reader : { + type : 'json', + totalProperty : 'totalCount', + root : 'data' + } + }, + fields : [ + {name : 'id',mapping : 'id'}, + {name : 'name',mapping : 'name'}, + {name : 'packageType',mapping : 'packageType'}, + {name : 'sterilingMethod',mapping : 'sterilingMethod'}, + {name : 'includeTousses',mapping : 'includeTousses'} + ] + }) + + var tbar = [{ + text:'聚合包名称:' + },{ + xtype : 'combo', + id : 'comboTousseName', + name : 'comboTousseName', + minChars : 0, + valueField : 'id', + displayField : 'name', + width : 180, + store : comboTousseStore, + forceSelection : true, + lazyInit : true, + triggerAction : 'all', + hideTrigger : false, + typeAhead : false, + allowBlank : true, + editable:false, + listeners : { + select : function(combo, records, index) { + + var waitComboTousseStore = top.Ext4.getCmp("waitComboTousseGrid").getStore(); + waitComboTousseStore.removeAll(); + var comboGrid = top.Ext4.getCmp("comboGrid").getStore(); + comboGrid.removeAll(); + + var record = records; + if (records.length > 0){ + record = records[0]; + } + var packageType = record.data.packageType; + var sterilingMethod = record.data.sterilingMethod; + top.Ext4.getCmp("comboToussePackageType").setValue(packageType); + top.Ext4.getCmp("sterilingType3").setValue(sterilingMethod); + + var includeTousses = record.data.includeTousses; + if(includeTousses.length > 0){ + Ext4.Ajax.request({ + url : WWWROOT + '/disinfectSystem/packingAction!findComboTousseIncludeToussePackingTaskAmount.do', + params : { + id : record.data.id, + includeTousses : JSON.stringify(includeTousses) + },success : function(response, options) { + var result = Ext4.decode(response.responseText); + if(!result.success){ + showResult(result.message); + return false; + } + var includeTousseJson = result.data; + + for(var i = 0 ; i < includeTousseJson.length ; i++){ + var id = includeTousseJson[i].id; + var name = includeTousseJson[i].name; + var amount = includeTousseJson[i].currrentTaskAmount; + var packageType = includeTousseJson[i].packageType; + var addItem = [{ + id : id, + tousseName : name, + amount : amount, + maxAmount : amount, + packageType:packageType + }] + waitComboTousseStore.insert(0,addItem); + } + }, + failure : function(response, options) { + var result = Ext4.decode(response.responseText); + showResult(result.cause); + } + }); + } + } + } + }]; + + var selModel = top.Ext4.create('top.Ext4.selection.CheckboxModel'); + var waitComboTousseGrid = top.Ext4.create('cellEditingGrid', { + id : 'waitComboTousseGrid', + title : '器械包列表', + height: 250, + selModel: selModel, + border : false, + tbar : tbar, + store: new Ext4.data.Store({ + fields : [ + {name : 'id',mapping : 'id'}, + {name : 'tousseName',mapping : 'tousseName'}, + {name : 'amount',mapping : 'amount'}, + {name : 'maxAmount',mapping : 'maxAmount'}, + {name : 'packageType',mapping : 'packageType'} + ] + }), + columns:[{ + header : "器械包名称", + dataIndex : 'tousseName', + width : 160 + }, { + header : "聚合数量", + dataIndex : 'amount', + width : 100, + editor : { + xtype: 'numberfield', + allowDecimals : false, + minValue : 0, + allowBlank: false, + listeners:{ + focus : function(thiz){ + thiz.selectText(); + } + } + } + }, { + header : "总数量", + dataIndex : 'maxAmount', + width : 100 + }] + }); + + var comboGrid = top.Ext4.create('cellEditingGrid', { + id : 'comboGrid', + title : '已聚合的器械包', + height : 250, + border : false, + store: new Ext4.data.Store({ + fields : [ + {name : 'id',mapping : 'id'}, + {name : 'tousseName',mapping : 'tousseName'}, + {name : 'amount',mapping : 'amount'}, + {name : 'packageType',mapping : 'packageType'} + ] + }), + columns:[{ + header : "器械包名称", + dataIndex : 'tousseName', + width : 240 + }, { + header : "数量", + dataIndex : 'amount', + width : 130 + }] + }); + + var comboTousseDataGrid = top.Ext4.create('cellEditingGrid', { + id : 'comboTousseDataGrid', + title : '聚合包列表', + width:300, + height: 300, + border : false, + store: new Ext4.data.Store({ + fields : [ + {name : 'comboId',mapping : 'comboId'}, + {name : 'tousseName',mapping : 'tousseName'}, + {name : 'packageType',mapping : 'packageType'}, + {name : 'includeTousseDetail',mapping : 'includeTousseDetail'}, + {name : 'includeTousseJsonArray',mapping : 'includeTousseJsonArray'} + ] + }), + columns:[{ + header : "聚合包名称", + dataIndex : 'tousseName', + sortable:false, + width : 280 + },{ + header : "包装类型", + dataIndex : 'packageType', + width : 170, + sortable:false, + editor : new top.Ext4.form.field.ComboBox({ + typeAhead: true, + valueField : 'typeName', + displayField : 'typeName', + triggerAction: 'all', + allowBlank : false, + editable:false, + store: cToussePackageTypeStore + }) + }, { + header : "普通器械包明细", + dataIndex : 'includeTousseDetail', + sortable:false, + width : 380 + }] + }); + + var packingComboToussePanel = new top.Ext4.form.Panel( { + id : 'packingComboToussePanel', + region: 'center', + border: true, + frame:true, + buttonAlign : 'center', + layout: "column", + items : [{ + xtype : 'hidden', + id : 'taskGroup3', + name : 'taskGroup' + },{ + xtype : 'hidden', + id : 'comboPackages', + name : 'comboPackages' + },{ + xtype : 'hidden', + id : 'operatorCode3', + name : 'operatorCode', + value : $Id('userLoginName').value + },{ + xtype : 'hidden', + id : 'reviewerCode3', + name : 'reviewerCode', + value : reviewerCode + },{ + xtype : 'hidden', + id : 'sterileCode3', + name : 'sterileCode', + value : sterileUserCode + },{ + xtype:'hidden', + id : 'comboToussePackageType', + name : 'comboToussePackageType' + },{ + xtype : 'textfield', + columnWidth : .33, + labelWidth : 70, + fieldLabel : "配包人条码", + name : "packerBarcode", + id : "packerBarcode3", + labelAlign:'right', + allowBlank : true, + listeners : { + specialkey : function(thiz, e){ + if(e.getKey() == 13){ + loadBarcodeInfo(thiz,"operator3","operatorCode3"); + } + } + }, + anchor : '80%' + },{ + xtype : 'textfield', + fieldLabel : '配包人', + columnWidth : .33, + labelWidth : 70, + maxLength : '16', + id : 'operator3', + name : 'operator', + labelAlign:'right', + componentCls:'formItemMgn', + value : $Id('userName').value, + allowBlank : false, + readOnly : true, + anchor : '80%' + },{ + xtype : 'textfield', + columnWidth : .33, + labelWidth : 70, + hidden: sstsConfig.hideReviewerField, + fieldLabel : "审核人条码", + name : "reviewerBarcode", + id : "reviewerBarcode3", + labelAlign:'right', + componentCls:'formItemMgn', + hidden: sstsConfig.hideReviewerField, + allowBlank : true, + listeners : { + specialkey : function(thiz, e){ + if(e.getKey() == 13){ + loadBarcodeInfo(thiz,"reviewer3","reviewerCode3"); + } + } + }, + anchor : '80%' + },{ + xtype : 'textfield', + columnWidth : .33, + labelWidth : 70, + hidden: sstsConfig.hideReviewerField, + margin :'5 0 0 0', + fieldLabel : "审核人", + name : "reviewer", + id : "reviewer3", + labelAlign:'right', + hidden: sstsConfig.hideReviewerField, + anchor : '80%', + value : jobType_review_name, + readOnly: true + },{ + xtype : 'textfield', + columnWidth : .33, + labelWidth : 70, + hidden : !sstsConfig.showSterileField, + fieldLabel : "灭菌人条码", + name : "sterileBarcode", + id : "sterileBarcode3", + labelAlign:'right', + margin :'5 0 0 0', + allowBlank : true, + listeners : { + specialkey : function(thiz, e){ + if(e.getKey() == 13){ + loadBarcodeInfo(thiz,"sterileUser3","sterileCode3"); + } + } + }, + anchor : '80%' + },{ + xtype : 'textfield', + columnWidth : .33, + labelWidth : 70, + hidden : !sstsConfig.showSterileField, + fieldLabel : "灭菌人", + name : "sterileUser", + id : "sterileUser3", + labelAlign:'right', + margin :'5 0 0 0', + allowBlank : true, + anchor : '80%', + value : jobType_sterile_name, + readOnly: true + }, { + xtype : "combo", + columnWidth : .33, + labelWidth : 70, + fieldLabel : "灭菌程序", + valueField : "typeName", + displayField : "typeNameAndPurpose", + labelAlign:'right', + margin :'5 0 0 0', + store : cTousseSterilizerTypeStore, + forceSelection : true, + editable : false, + triggerAction : "all", + name : "sterilingType", + id : "sterilingType3", + anchor : "80%", + allowBlank : false + },{ + xtype : 'combo', + columnWidth : .33, + labelWidth : 70, + hidden : !sstsConfig.showSterilizer, + fieldLabel : '灭菌炉', + id : 'sterilizer3', + name : 'sterilizer', + valueField : 'sterilizerName', + displayField : 'sterilizerName', + labelAlign:'right', + margin :'5 0 0 0', + store : cTousseSterilizerJsonStore, + triggerAction : 'all', + mode : 'remote', + editable : false, + forceSelection : true, + allowBlank : !sstsConfig.sterilizerNotAllowBlank, + anchor : '80%', + listeners : { + select : function(combo, record, index) { + SterilizationRecordTableManager.getMaxFrequency(combo.value,0,function(frequency){ + top.Ext4.getCmp('frequency3').setValue(frequency); + }); + } + } + },{ + xtype : 'numberfield', + columnWidth : .33, + labelWidth : 70, + hidden : !sstsConfig.showSterilizer, + fieldLabel : '炉次', + allowDecimals : false, + allowNegative : false, + minValue : 1, + id : 'frequency3', + name : 'frequency', + labelAlign:'right', + margin :'5 0 0 0', + allowBlank : !sstsConfig.sterilizerNotAllowBlank, + value : 1, + anchor : '80%' + },{ + columnWidth :.33, + xtype : 'datefield', + fieldLabel : '灭菌日期', + componentCls:'formItemMgn', + labelWidth:70, + labelAlign:'right', + id : 'sterileDate3', + margin :'5 0 0 0', + name : 'sterileDate', + hidden : sstsConfig.printLabelWhenReviewing, + emptyText : '默认为今天', + inputAttrTpl: " data-qtip='空白表示灭菌日期为今天' ", + editable : false, + altFormats:'Y-m-d|Y-n-j|y-n-j|y-m-j|y-m-d|y-n-d|Y-n-d|Y-m-j|Ymd|Ynj|ynj|ymj|ymd|ynd|Ynd|Ymj|Y/m/d|Y/n/j|y/n/j|y/m/j|y/m/d|y/n/d|Y/n/d|Y/m/j', + selectOnFocus :true, + format : 'Y-m-d', + allowBlank : true, + anchor : '90%' + }], + buttons : [{ + text : packingBtnText, + handler : function() { + if (!packingComboToussePanel.form.isValid()) { + showResult('请正确填写表单各值'); + this.enable(); + return false; + } + + packingToussesArray = []; // 清除所装配的器械包数组 + + var comboTousseStore = top.Ext4.getCmp("comboGrid").getStore(); + + v = comboTousseStore.getCount(); + if(v > 0){ + showResult("还有部分器械包未确认!"); + return false; + } + + top.Ext4.getCmp('taskGroup3').setValue(taskGroup); + + var reviewer = top.Ext4.getCmp('reviewer3'); + if(reviewer.isVisible() && !reviewer.getValue()){ + showResult("请扫描审核人条码!"); + return false; + } + var comboTousseDataStore = top.Ext4.getCmp("comboTousseDataGrid").getStore(); + var isHaveEmptyPackingType = false; + for ( var i = 0; i < comboTousseDataStore.getCount(); i++) { + var record = comboTousseDataStore.getAt(i); + var packageType = record.get("packageType"); + if(packageType == ""){ + isHaveEmptyPackingType = true; + break; + } + } + if(isHaveEmptyPackingType){ + showResult("有聚合包未设置包装类型!"); + return false; + } + + if(!getComboTousseData()){ + showResult("装配物品不能为空!"); + return false; + } + + + operator = top.Ext4.getCmp('operator3').getValue(); + operatorCode = top.Ext4.getCmp('operatorCode3').getValue(); + reviewer = top.Ext4.getCmp('reviewer3').getValue(); + reviewerCode = top.Ext4.getCmp('reviewerCode3').getValue(); + sterileUserName = top.Ext4.getCmp('sterileUser3').getValue(); + sterileUserCode = top.Ext4.getCmp('sterileCode3').getValue(); + + var sterilingType = top.Ext4.getCmp('sterilingType3').getValue(); + var comboPackages = top.Ext4.getCmp('comboPackages').getValue(); + var sterilizer = top.Ext4.getCmp("sterilizer3").getValue(); + var frequency = top.Ext4.getCmp("frequency3").getValue(); + + var sterileDate = top.Ext4.getCmp('sterileDate3').getValue(); + if(isUndefinedOrNullOrEmpty(sterileDate)){ + sterileDate = new Date(); + } + + var params = { + operator: operator, + operatorCode: operatorCode, + reviewer: reviewer, + reviewerCode: reviewerCode, + sterileUserName : sterileUserName, + sterileUserCode : sterileUserCode, + sterilingType: sterilingType, + sterileDate: sterileDate.getTime(), + packAmount: 1, + taskGroup: taskGroup, + comboTousseJsonArray: comboPackages, + sterilizer: sterilizer, + frequency: frequency + } + DWREngine.setAsync(false); + PackingTableManager.packingComboTousse(JSON.stringify(params),function(rs){ + if (rs != null){ + var result = Ext.decode(rs); + if (result.success){ + + var tousses = result.tousses; + + packingToussesArray = packingToussesArray.concat(tousses); + + // 审核时打印标签 + if (sstsConfig.printLabelWhenReviewing == true){ + showResult("装配完成"); + } + // 装配时打印标签 + else{ + var printAmount = tousses[0].printAmount; + for(var pi=0;pi>', + minWidth:48, + handler : function(){ + toComboTousseGrid(false); + } + }, { + xtype :'button', + text : '<<', + minWidth:48, + handler : function(){ + toTousseGrid(false); + } + }, { + xtype :'button', + text : '>>>>', + minWidth:48, + handler : function(){ + toComboTousseGrid(true); + } + }, { + xtype :'button', + text : '<<<<', + minWidth:48, + handler : function(){ + toTousseGrid(true); + } + },{ + xtype :'button', + text:'确定', + border:false, + minWidth:48, + handler : function(){ + var tousseName = top.Ext4.getCmp('comboTousseName').getRawValue(); + var id = top.Ext4.getCmp('comboTousseName').getValue(); + comboTousseGrid(id,tousseName); + } + } ] + }, { + layout : 'form', + columnWidth : 0.47, + items : [ comboGrid ] + } ] + }, { + region : 'south', + height : 220, + layout : 'fit', + items : [ comboTousseDataGrid ] + }] + }); + + comboTousseWin.show(); + + if (sstsConfig.printLabelWhenReviewing == true){ + var reviewer3 = top.Ext4.getCmp("reviewer3"); + reviewer3.disable(); + reviewer3.hide(); + var reviewerBarcode3 = top.Ext4.getCmp("reviewerBarcode3"); + reviewerBarcode3.disable(); + reviewerBarcode3.hide(); + } +} Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/PackingAction.java =================================================================== diff -u -r16764 -r16876 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/PackingAction.java (.../PackingAction.java) (revision 16764) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/action/PackingAction.java (.../PackingAction.java) (revision 16876) @@ -781,4 +781,68 @@ StrutsResponseUtils.output(result); } + + /** + * 加载聚合包store + */ + public void getComboTousseStore(){ + JSONArray comboTousses = tousseDefinitionManager.loadAllComboTousseDefinition(); + JSONObject result = new JSONObject(); + result.put("totalCount", comboTousses.size()); + result.put("data", comboTousses); + StrutsResponseUtils.output(result); + } + + /** + * 获取聚合包内普通器械包装配任务数量 + */ + public void findComboTousseIncludeToussePackingTaskAmount(){ + Long comboTousseDefinitionId = StrutsParamUtils.getPraramLongValue("id", null); + String includeTousseString = StrutsParamUtils.getPraramValue("includeTousses", ""); + boolean success = true; + String message = "查询成功!"; + JSONArray array = null; + try { + if (!DatabaseUtil.isPoIdValid(comboTousseDefinitionId)) { + throw new RuntimeException("参数错误,ID不能为空!"); + } + if (StringUtils.isBlank(includeTousseString)) { + throw new RuntimeException("该聚合包没有包含的器械包!"); + } + TousseDefinition comboTousseTD = tousseDefinitionManager + .getTousseDefinitionById(comboTousseDefinitionId); + if (comboTousseTD == null) { + throw new RuntimeException("聚合包定义已不存在!"); + } + String departCoding = comboTousseTD.getHandlerDepartCode(); + if (StringUtils.isBlank(departCoding)) { + throw new RuntimeException("该聚合包未定义所属科室"); + } + array = JSONArray.fromObject(includeTousseString); + String handlerDepartCode = AcegiHelper.getLoginUser() + .getOrgUnitCodingFromSupplyRoomConfig(); + for (int i = 0; i < array.size(); i++) { + JSONObject item = array.optJSONObject(i); + Long tousseDefinitionId = item.optLong("id"); + List taskList = packingManager + .findPackingTaskBySQL(tousseDefinitionId, + handlerDepartCode, departCoding); + if (taskList != null) { + int totalAmount = 0; + for (PackingTask packingTask : taskList) { + totalAmount += packingTask.getUnPackAmount(); + } + item.put("currrentTaskAmount", totalAmount); + } + } + } catch (Exception e) { + success = false; + message = e.getMessage(); + } + JSONObject result = new JSONObject(); + result.put("success", success); + result.put("message", message); + result.put("data", array); + StrutsResponseUtils.output(result); + } } Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionManager.java =================================================================== diff -u -r16816 -r16876 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionManager.java (.../TousseDefinitionManager.java) (revision 16816) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseDefinitionManager.java (.../TousseDefinitionManager.java) (revision 16876) @@ -355,4 +355,9 @@ * @return */ public TousseDefinition newDisinfectGoodsDefinitionWithoutInvoicePlanId(TousseDefinition ancestorTD,JSONArray materialItemsJson); + + /** + * 加载所有的聚合包定义,聚合包量比较小,暂时不考虑拼音五笔码检索 + */ + public JSONArray loadAllComboTousseDefinition(); } Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java =================================================================== diff -u -r16845 -r16876 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 16845) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManagerImpl.java (.../PackingManagerImpl.java) (revision 16876) @@ -2855,11 +2855,11 @@ // 包实例 TousseInstance tousseInstance = createTousseInstance(operator, operatorCode, reviewer, reviewerCode,sterileUserName, sterileUserCode, packageType, - sterilingType, stock,washBasket, sterilizer, frequency, sterileStartTime, validUntil, warningUntil, packingRecord, + sterilingType, stock,washBasket, sterilizer, frequency, sterileStartTime, validUntil, warningUntil, packingRecord.getId(), tousseDefinition, tousseType, tousseName, foreignTousseApplication, packingDate, foreignTprice, fluctuationPrice, tousseAmount, orgUnitCoding, orgUnitName, - isUnTraceableTousse, barcodeStr ,tousseWeight, currentPackingTask,idToWashRecordMap,idToRecyclingRecordMap,washJson); + isUnTraceableTousse, barcodeStr ,tousseWeight, currentPackingTask,idToWashRecordMap,idToRecyclingRecordMap,washJson,null); tousseInstanceManager.saveOrUpdate(tousseInstance); @@ -3425,6 +3425,7 @@ String confirmContinue = JSONUtil.optString(paramsObj, "confirmContinue", null); String urgentAmountStr = JSONUtil.optString(paramsObj, "urgentAmount", null); String tousseWeight = JSONUtil.optString(paramsObj, "tousseWeight", null); + Long comboTousseInstanceId = JSONUtil.optLong(paramsObj, "comboTousseInstanceId", null); String packageTypeAbbreviation = TousseInstanceUtils.getPackageTypeAbbreviation(objectDao, packageType); @@ -3747,27 +3748,38 @@ logger.debug("添加历史装配记录,器械包名称=" + td.getName() + ",装配数量=" + packingAmountForThisTask); //logger.debug("Thread " + Thread.currentThread().getName() + ",完成批量装配器械包:" + tousseName); // 先创建PackingRecord - PackingRecord packingRecord = createPackingRecord(inspector, - operator, wrapper, orgUnitCoding,orgUnitName, taskGroup, - sterilizerName, sterileFrequency, td, packingDate, - packingAmountForThisTask, currentPackingTask , currentPackingTaskAsList); + PackingRecord packingRecord = null; + //聚合包内普通器械包不创建装配记录 + if(!DatabaseUtil.isPoIdValid(comboTousseInstanceId)){ + packingRecord = createPackingRecord(inspector, + operator, wrapper, orgUnitCoding,orgUnitName, taskGroup, + sterilizerName, sterileFrequency, td, packingDate, + packingAmountForThisTask, currentPackingTask , currentPackingTaskAsList); + } + + Long packignRecordId = null; + if(packingRecord != null){ + packignRecordId = packingRecord.getId(); + } // 汇总装配记录对应的一次性物品扣减信息 // summaryOutDisposableGoodsStockInfo(packingRecordToDisposableGoodsOutAmount, packingRecord, disposableGoodsIdToAmount); JSONObject result = batchCreateTousseInstance( operator, operatorCode, reviewer,reviewerCode,sterileUserName,sterileUserCode, packageType, sterilingType, stock,idCardDefinitionId,idCardInstanceID, washBasket,sterilizerName, sterileFrequency,sterileStartTime, - validUntil, warningUntil,currentPackingTaskAsList,packingRecord, + validUntil, warningUntil,currentPackingTaskAsList,packignRecordId, td, tousseType,tousseName,foreignTousseApplication,packingDate, packingAmountForThisTask, toussePrice, fluctuationPrice,tousseAmount, orgUnitCoding,orgUnitName,basketBarcode, !isTraceable, confirmContinue,tousseInstances,withoutReviewingAndSterilingTousseInstanceList, - idToWashRecordMap, idToRecyclingRecordMap,urgentAmountJson,taskGroup,tousseWeight); + idToWashRecordMap, idToRecyclingRecordMap,urgentAmountJson,taskGroup,tousseWeight,comboTousseInstanceId); needPackingAmount -= currentPackingTask.getUnPackAmount(); if(!"true".equals(confirmContinue) && "false".equals(result.optString("success"))){ - objectDao.delete(packingRecord); + if(packingRecord != null){ + objectDao.delete(packingRecord); + } batchLoadToVirtaulBasket = false; batchLoadMsg = result.optString("msg"); }else{ @@ -4177,12 +4189,12 @@ private JSONObject batchCreateTousseInstance(String operator, String operatorCode, String reviewer, String reviewerCode,String sterileUserName, String sterileUserCode,String packageType, String sterilingType, String stock, String idCardDefinitionId,String idCardInstanceID, String washBasket,String sterilizerName, String sterileFrequency, - Date sterileStartTime, Date validUntil, Date warningUntil,List packingTaskList, PackingRecord packingRecord, + Date sterileStartTime, Date validUntil, Date warningUntil,List packingTaskList, Long packingRecordId, TousseDefinition tousseDefinition,String tousseType, String tousseName,ForeignTousseApplication foreignTousseApplication,Date packingDate, Integer currentPackAmount, double toussePrice,double fluctuationPrice, Integer tousseAmount,String orgUnitCoding, String orgUnitName, String basketBarcode,boolean unTraceableTousse, String confirmContinue,List tousseInstances, List withoutReviewingAndSterilingTousseInstanceList,Map idToWashRecordMap, - Map idToRecyclingRecordMap,JSONObject urgentAmountJson,String taskGroup,String tousseWeight) { + Map idToRecyclingRecordMap,JSONObject urgentAmountJson,String taskGroup,String tousseWeight,Long comboTousseInstanceId) { JSONObject obj = new JSONObject(); long t1 = System.currentTimeMillis(); @@ -4263,10 +4275,10 @@ TousseInstance tousseInstance = createTousseInstance(operator, operatorCode, reviewer, reviewerCode,sterileUserName,sterileUserCode, packageType,sterilingType, stock, - washBasket, sterilizerName, sterileFrequency, sterileStartTime, validUntil, warningUntil, packingRecord, + washBasket, sterilizerName, sterileFrequency, sterileStartTime, validUntil, warningUntil, packingRecordId, tousseDefinition, tousseType, tousseName,foreignTousseApplication, packingDate, toussePrice, fluctuationPrice, tousseAmount, orgUnitCoding, orgUnitName,unTraceableTousse, barcodeStr, tousseWeight, - prePackingTask,idToWashRecordMap,idToRecyclingRecordMap,washJson); + prePackingTask,idToWashRecordMap,idToRecyclingRecordMap,washJson,comboTousseInstanceId); //加急数量处理 if(urgentAmountJson != null){ @@ -4543,15 +4555,15 @@ String sterilingType, String stock,String washBasket, String sterilizerName, String sterileFrequency, Date sterileStartTime, Date validUntil, Date warningUntil, - PackingRecord packingRecord, TousseDefinition td, + Long packingRecordId, TousseDefinition td, String tousseType, String tousseName, ForeignTousseApplication foreignTousseApplication, Date packingDate, double toussePrice, double fluctuationPrice, Integer tousseAmount, String orgUnitCoding, String orgUnitName, boolean unTraceableTousse, String barcodeStr, String tousseWeight, PackingTask currentPackingTask, Map idToWashRecordMap, - Map idToRecyclingRecordMap,JSONObject washJson) { + Map idToRecyclingRecordMap,JSONObject washJson,Long comboTousseInstanceId) { TousseInstance tousseInstance = new TousseInstance(); tousseInstance.setBarcode(barcodeStr); @@ -4622,7 +4634,7 @@ tousseInstance.setOrgUnitCoding(orgUnitCoding); tousseInstance.setOrgUnitName(orgUnitName); - + tousseInstance.setComboTousseInstanceId(comboTousseInstanceId); Long washRecordId = null; if (currentPackingTask != null) { tousseInstance.setClassifyBasket_id(currentPackingTask @@ -4660,7 +4672,7 @@ washAndDisinfectRecordManager.setWashInfo(tousseInstance,lastWashRecord); } - tousseInstance.setPackingRecord_id(packingRecord.getId()); + tousseInstance.setPackingRecord_id(packingRecordId); // 外来器械包关联外来器械申请单 if (TousseDefinition.PACKAGE_TYPE_FOREIGN.equals(tousseType)) { @@ -5640,4 +5652,364 @@ sterileUserName,sterileUserCode,wrapper, wrapperCode, packageType, sterilingType, sterilizer, frequency); } } + + @Override + public String packingComboTousse(String params, HttpSession session)throws Exception { + JSONObject paramsObj = JSONObject.fromObject(params); + String comboTousseData = JSONUtil.optString(paramsObj, "comboTousseJsonArray", ""); + Long sterileDate = JSONUtil.optLong(paramsObj, "sterileDate", null); + if(StringUtils.isBlank(comboTousseData)){ + throw new RuntimeException("无聚合包可装配!"); + } + if(sterileDate == null){ + throw new RuntimeException("灭菌日期不能为空!"); + } + JSONArray comboTousseJsonArray = JSONArray.fromObject(comboTousseData); + //验证数据 + comboTousseDataValidate(comboTousseJsonArray,sterileDate); + //装配聚合包、装配记录 + JSONArray jsonArray = new JSONArray(); + SupplyRoomConfig systemConfig = supplyRoomConfigManager.getSystemParamsObj(); + for (int i = 0; i < comboTousseJsonArray.size(); i++) { + JSONObject comboTousseJson = comboTousseJsonArray.optJSONObject(i); + Long comboTousseId = comboTousseJson.optLong("id"); + TousseDefinition comboTousseTD = tousseDefinitionManager + .getTousseDefinitionById(comboTousseId); + //装配聚合包 + TousseInstance comboTousseInstance = createComboTousseInstanceAndPackingRecord( + paramsObj, comboTousseTD, comboTousseJson); + // 装配普通器械包 + JSONArray includeTousseJsonArray = comboTousseJson.optJSONArray("includeTousseJsonArray"); + for(int j = 0 ; j < includeTousseJsonArray.size() ; j++){ + JSONObject tousseJson = includeTousseJsonArray.optJSONObject(j); + paramsObj.put("taskIds", tousseJson.optString("taskIds")); + paramsObj.put("packAmount", tousseJson.optInt("packAmount")); + paramsObj.put("comboTousseInstanceId", comboTousseInstance.getId()); + paramsObj.put("packageType", tousseJson.optString("packageType")); + packingTousse_internal(paramsObj.toString(), session); + } + //页面返回值处理 + JSONObject result = buildReturnResult(comboTousseInstance,systemConfig,comboTousseJson); + jsonArray.add(result); + } + + JSONObject printJson = new JSONObject(); + printJson.put("success", true); + printJson.put("message", "保存成功"); + printJson.put("tousses", jsonArray); + return printJson.toString(); + } + + + /** + * 构造页面返回值 + * @param ti + * @return + */ + private JSONObject buildReturnResult(TousseInstance ti,SupplyRoomConfig systemConfig,JSONObject comboTousseJson){ + TousseDefinition td = ti.getTousseDefinition(); + String packageTypeAbbreviation = TousseInstanceUtils.getPackageTypeAbbreviation(objectDao, ti.getPackageType()); + + String validUntilDateToPrint = comboTousseJson.optString("validDateToPrint"); + String sterileDateToPrint = comboTousseJson.optString("sterilizationDateToPrint"); + boolean markTousse = JSONUtil.optBoolean(comboTousseJson, "markTousse", false); + + JSONArray subBarcodeArray = new JSONArray(); + subBarcodeArray.add(ti.getBarcode()); + + JSONObject tdJson = getTousseDefinitionPrintJsonForComboTousse(ti,comboTousseJson); + + boolean isReview = true; + if (TousseDefinition.STR_NO.equals(td.getIsReview())) { + isReview = false; + } + + boolean isTraceable = true; + if (TousseDefinition.STR_NO.equals(td.getIsPrint())) { + isTraceable = false; + } else { + if (TousseDefinition.STR_NO.equals(td + .getIsTraceable())) { + isTraceable = false; + } + } + + return CssdUtils.getTousseObjForPrint(td.getName(), tdJson, + subBarcodeArray, null, td.getTousseType(), td.getPackageType(), + packageTypeAbbreviation, td.getSterilingMethod(), + ti.getSterilizerName(), ti.getSterileFrequency(), + systemConfig.isPrintUserFullName(), ti.getOperator(), + ti.getOperatorCode(), ti.getReviewer(), ti.getReviewerCode(), + ti.getSterilizationUser(), ti.getSterilizationUserCode(), + validUntilDateToPrint, sterileDateToPrint, markTousse, + ti.getOperationTime(), false, false, true, isReview, + isTraceable, td.getIsBigPackage(), "", null, 0l, "", 0, + 0, "", false, 0l, objectDao, td.getBarcodePaperType(), "", "", + "", td.getPrintAmount()); + } + + private JSONObject getTousseDefinitionPrintJsonForComboTousse( + TousseInstance ti,JSONObject comboTousseJson) { + JSONObject tdJson = new JSONObject(); + tdJson.put("isPrintMaterialForPacking", true); + tdJson.put("name", ti.getTousseDefinition().getName()); + JSONArray includeTousseJsonArray = comboTousseJson.optJSONArray("includeTousseJsonArray"); + if(includeTousseJsonArray != null){ + JSONArray materialInstanceJsonArray = new JSONArray(); + JSONObject materialInstanceJsonObject = null; + JSONObject materialDefinitionJsonObject = null; + for(int i = 0 ; i < includeTousseJsonArray.size() ; i++){ + JSONObject tousseItemJson = includeTousseJsonArray.optJSONObject(i); + materialInstanceJsonObject = new JSONObject(); + materialInstanceJsonObject.put("count", tousseItemJson.optInt("amount")); + materialDefinitionJsonObject = new JSONObject(); + materialDefinitionJsonObject.put("name", tousseItemJson.optString("tousseName")); + materialDefinitionJsonObject.put("specification", ""); + materialDefinitionJsonObject.put("type", ""); + materialInstanceJsonObject.put("materialDefinition", materialDefinitionJsonObject); + materialInstanceJsonArray.add(materialInstanceJsonObject); + } + tdJson.put("materialInstances", materialInstanceJsonArray); + } + return tdJson; + } + + /** + * 聚合包组合数据校验 + * @param comboTousseJsonArray + * @return + */ + private void comboTousseDataValidate(JSONArray comboTousseJsonArray,Long produceDate){ + if(comboTousseJsonArray != null){ + String handlerDepartCode = AcegiHelper.getLoginUser().getOrgUnitCodingFromSupplyRoomConfig(); + for(int i = 0 ; i < comboTousseJsonArray.size() ; i++){ + JSONObject tousseItem = comboTousseJsonArray.optJSONObject(i); + String id = tousseItem.optString("id"); + String comboTousseName = tousseItem.optString("tousseName"); + String packageType = tousseItem.optString("packageType"); + if(StringUtils.isBlank(packageType)){ + throw new RuntimeException(comboTousseName + ",未设置包装类型!"); + } + //聚合包属于哪个临床科室 + TousseDefinition comboTousseTD = tousseDefinitionManager.getTousseDefinitionById(id); + if (comboTousseTD == null) { + throw new RuntimeException(comboTousseName + "定义已不存在!"); + } + String departCoding = comboTousseTD.getHandlerDepartCode(); + if(StringUtils.isBlank(departCoding)){ + throw new RuntimeException(comboTousseName + ",包定义未设置所属科室!"); + } + //验证失效期 + validateExpirationDate(produceDate, packageType,tousseItem); + //聚合包内普通器械包校验 + JSONArray includeTousseJsonArray = tousseItem.optJSONArray("includeTousseJsonArray"); + if(includeTousseJsonArray == null || includeTousseJsonArray.size() == 0){ + throw new RuntimeException(comboTousseName + "内物品不能为空!"); + } + for(int j = 0 ; j < includeTousseJsonArray.size() ; j++){ + JSONObject tousseJson = includeTousseJsonArray.optJSONObject(j); + Long tousseDefinitionId = tousseJson.optLong("id"); + String tousseName = tousseJson.optString("tousseName"); + Integer packingAmount = tousseJson.optInt("amount"); + Integer amount = tousseJson.optInt("amount"); + if(amount > 0){ + List taskList = findPackingTaskBySQL(tousseDefinitionId, handlerDepartCode, departCoding); + String ids = ""; + if(taskList != null){ + for (PackingTask packingTask : taskList) { + if(amount <= 0){ + break; + } + if(StringUtils.isNotBlank(ids)){ + ids += ";"; + } + ids += packingTask.getId(); + amount -= packingTask.getUnPackAmount(); + } + } + if(taskList == null || amount > 0){ + throw new RuntimeException(tousseName + "当前可装配数量小于" + packingAmount + ",装配失败!"); + } + //关联上装配任务id + tousseJson.put("taskIds", ids); + tousseJson.put("packAmount", packingAmount); + } + } + } + } + } + + @SuppressWarnings("unchecked") + public List findPackingTaskBySQL(Long tousseDefinitionId,String handlerDepartCode,String departCoding){ + if(tousseDefinitionId == null){ + return null; + } + String sql = String.format("where po.tousseDefinition.id = %s and po.orgUnitCoding = '%s' " + + "and po.departCoding = '%s' and po.status = '%s'", tousseDefinitionId,handlerDepartCode, + departCoding,PackingTask.STATUS_AWAIT_PACKING); + if(StringUtils.isNotBlank(sql)){ + return objectDao.findBySql(PackingTask.class.getSimpleName(), sql); + } + return null; + } + + private void validateExpirationDate(Long sterileDate, String packingType,JSONObject tousseItem) { + try{ + Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(sterileDate); + Date sterileStartTime = calendar.getTime(); + JSONObject json = expirationDateInfoManager.getExpirationDate(sterileStartTime.getTime() + "", packingType); + boolean isDefined = json.optBoolean("isDefined"); + if (!isDefined){ + throw new RuntimeException(packingType + ",未定义有效期!"); + } + + Date validUntil = (Date)JSONObject.toBean(json.optJSONObject("validUntil"), Date.class); + tousseItem.put("sterileDateTime", json.optString("sterileDateTime")); + tousseItem.put("validUntil", json.optJSONObject("validUntil")); + tousseItem.put("warningUntil", json.optJSONObject("warningUntil")); + tousseItem.put("validDateToPrint", Constants.SIMPLEDATEFORMAT_YYYYMMDD.format(validUntil)); + tousseItem.put("sterilizationDateToPrint", Constants.SIMPLEDATEFORMAT_YYYYMMDD.format(sterileStartTime)); + tousseItem.put("markTousse", json.optBoolean("markTousse")); + } catch(Exception e){ + e.printStackTrace(); + } + } + + /** + * 创建聚合包实例、装配记录 + * @param paramsObj + * @return + */ + private TousseInstance createComboTousseInstanceAndPackingRecord(JSONObject paramsObj,TousseDefinition comboTousseTD,JSONObject comboTousseJson){ + if(paramsObj == null){ + throw new RuntimeException("参数错误!"); + } + String operator = JSONUtil.optString(paramsObj, "operator", null); + String operatorCode = JSONUtil.optString(paramsObj, "operatorCode", null); + String reviewer = JSONUtil.optString(paramsObj, "reviewer", null); + String reviewerCode = JSONUtil.optString(paramsObj, "reviewerCode", null); + String sterileUserName = JSONUtil.optString(paramsObj, "sterileUserName", null); + String sterileUserCode = JSONUtil.optString(paramsObj, "sterileUserCode", null); + String packageType = JSONUtil.optString(comboTousseJson, "packageType", null); + String sterilingType = JSONUtil.optString(paramsObj, "sterilingType", null); + String sterilizerName = JSONUtil.optString(paramsObj, "sterilizer", null); + String sterileFrequency = JSONUtil.optString(paramsObj, "frequency", null); + String taskGroup = JSONUtil.optString(paramsObj, "taskGroup", null); + + Date packingDate = new Date(); + LoginUserData loginUser = AcegiHelper.getLoginUser(); + String orgUnitName = loginUser.getOrgUnitNameCodingFromSupplyRoomConfig(); + String orgUnitCoding = loginUser.getOrgUnitCodingFromSupplyRoomConfig(); + + PackingRecord packingRecord = buildPackingRecordWithoutPackingTask( + comboTousseTD, operator, sterilizerName, sterileFrequency, + taskGroup, packingDate, orgUnitName, orgUnitCoding); + + TousseInstance tousseInstance = buildTousseInstanceWithoutPackingTask( + comboTousseTD, comboTousseJson, operator, operatorCode, + reviewer, reviewerCode, sterileUserName, sterileUserCode, + packageType, sterilingType, sterilizerName, sterileFrequency, + packingDate, orgUnitName, orgUnitCoding, packingRecord); + + return tousseInstance; + } + + /** + * 创建没有装配任务的包实例 + * @return + */ + private TousseInstance buildTousseInstanceWithoutPackingTask( + TousseDefinition comboTousseTD, JSONObject comboTousseJson, + String operator, String operatorCode, String reviewer, + String reviewerCode, String sterileUserName, + String sterileUserCode, String packageType, String sterilingType, + String sterilizerName, String sterileFrequency, Date packingDate, + String orgUnitName, String orgUnitCoding, + PackingRecord packingRecord) { + TousseInstance tousseInstance = new TousseInstance(); + tousseInstance.setBarcode(serialNumManager.getSerialNumberStr(SerialNum.TYPE_BARCODE)); + tousseInstance.setType(BarcodeDevice.BARCODE_TYPE_PACKAGE); + tousseInstance.setSterilizationUser(sterileUserName); + tousseInstance.setSterilizationUserCode(sterileUserCode); + tousseInstance.setTousseDefinition(comboTousseTD); + // 装配时输入了审核人信息 + if (StringUtils.isNotBlank(reviewer) + && StringUtils.isNotBlank(reviewerCode)) { + tousseInstance.setReviewer(reviewer);// 审核员 + tousseInstance.setReviewerCode(reviewerCode); + } + // 对于不需要审核的器械包,修改其状态 + if (TousseDefinition.STR_NO.equals(comboTousseTD.getIsReview())) { + tousseInstance.setStatus(TousseInstance.STATUS_REVIEWED); + // 将审核人和审核时间设置为装配人 + if (StringUtils.isBlank(tousseInstance.getReviewer())) { + tousseInstance.setReviewer(operator); + tousseInstance.setReviewerCode(operatorCode); + } + tousseInstance.setReviewTime(packingDate); + } else { + tousseInstance.setStatus(TousseInstance.STATUS_PACKED); + } + tousseInstance.setTousseName(comboTousseTD.getName()); + tousseInstance.setOperator(operator); + tousseInstance.setOperatorCode(operatorCode); + tousseInstance.setOperationTime(packingDate); + // 设置临床科室编码 + tousseInstance.setDepart(comboTousseTD.getHandlerDepartName()); + tousseInstance.setDepartCoding(comboTousseTD.getHandlerDepartCode()); + tousseInstance.setPackageType(packageType);// 包装类型 + tousseInstance.setSterilingType(sterilingType);// 灭菌程序 + tousseInstance.setUnTraceableTousse(false); + tousseInstance.setSterilizerName(sterilizerName); + tousseInstance.setSterileFrequency(sterileFrequency); + Date validUntil = (Date)JSONObject.toBean(comboTousseJson.optJSONObject("validUntil"), Date.class);; + Date warningUntil = (Date)JSONObject.toBean(comboTousseJson.optJSONObject("warningUntil"), Date.class);; + tousseInstance.setSterileStartTime(comboTousseJson.optString("sterileDateTime")); + tousseInstance.setValidUntil(validUntil);// 失效期 + tousseInstance.setWarningUntil(warningUntil);// 预警日期 + tousseInstance.setOrgUnitCoding(orgUnitCoding); + tousseInstance.setOrgUnitName(orgUnitName); + tousseInstance.setPackingRecord_id(packingRecord.getId()); + tousseInstance.setComboTousseDefinitionId(comboTousseTD.getId()); + objectDao.saveOrUpdate(tousseInstance); + return tousseInstance; + } + + /** + * 创建没有装配任务的装配记录 + * @param comboTousseTD + * @param operator + * @param sterilizerName + * @param sterileFrequency + * @param taskGroup + * @param packingDate + * @param orgUnitName + * @param orgUnitCoding + * @return + */ + private PackingRecord buildPackingRecordWithoutPackingTask( + TousseDefinition comboTousseTD, String operator, + String sterilizerName, String sterileFrequency, String taskGroup, + Date packingDate, String orgUnitName, String orgUnitCoding) { + PackingRecord packingRecord = new PackingRecord(); + packingRecord.setIsDirectPacking(false); + packingRecord.setSterilizer(sterilizerName); + packingRecord.setFrequency(sterileFrequency); + packingRecord.setInspector(""); + packingRecord.setPacker(operator); + packingRecord.setPackTime(packingDate); + packingRecord.setTousseName(comboTousseTD.getName()); + packingRecord.setTousseType(comboTousseTD.getTousseType()); + packingRecord.setTousseDefinitionId(comboTousseTD.getId()); + packingRecord.setDepart(comboTousseTD.getHandlerDepartName()); + packingRecord.setDepartCoding(comboTousseTD.getHandlerDepartCode()); + packingRecord.setAmount(1); + packingRecord.setTaskGroup(taskGroup); + packingRecord.setOrgUnitCoding(orgUnitCoding); + packingRecord.setOrgUnitName(orgUnitName); + saveOrUpdate(packingRecord); + return packingRecord; + } + } Index: ssts-web/src/main/webapp/ext/fontSize15/styles/common.css =================================================================== diff -u -r14608 -r16876 --- ssts-web/src/main/webapp/ext/fontSize15/styles/common.css (.../common.css) (revision 14608) +++ ssts-web/src/main/webapp/ext/fontSize15/styles/common.css (.../common.css) (revision 16876) @@ -325,6 +325,9 @@ .btn_ext_application_add { background-image:url( ../../../images/web/application_add.png) !important; } +.btn_ext_application_todo { + background-image:url( ../../../images/web/options.png) !important; +} .btn_ext_application_edit { background-image:url( ../../../images/web/application_edit.png ) !important; } Index: ssts-web/src/test/java/test/forgon/disinfectsystem/AbstractCSSDTest.java =================================================================== diff -u -r16849 -r16876 --- ssts-web/src/test/java/test/forgon/disinfectsystem/AbstractCSSDTest.java (.../AbstractCSSDTest.java) (revision 16849) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/AbstractCSSDTest.java (.../AbstractCSSDTest.java) (revision 16876) @@ -62,6 +62,7 @@ import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntry; import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryItem; import com.forgon.disinfectsystem.entity.basedatamanager.container.Container; +import com.forgon.disinfectsystem.entity.basedatamanager.expirationdateinfo.ExpirationDateInfo; import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.materialinstance.MaterialInstance; import com.forgon.disinfectsystem.entity.basedatamanager.sterilizer.Sterilizer; @@ -783,10 +784,33 @@ */ bulidComboTousseDefinition(); + /** + * 初始化失效期 + */ + initExpirationDateInfo(); + ForgonThreadLocalResourceManager.afterRequest(); // createDiposableGoods(); } + + private void initExpirationDateInfo(){ + ExpirationDateInfo info = new ExpirationDateInfo(); + info.setPackageType("棉布"); + info.setValidDate(7); + info.setWarningDate(3); + info.setValidDateUnit(ExpirationDateInfo.DATEUNIT_DAY); + objectDao.saveOrUpdate(info); + + ExpirationDateInfo info2 = new ExpirationDateInfo(); + info2.setPackageType("纸塑"); + info2.setValidDate(6); + info2.setWarningDate(1); + info2.setValidDateUnit(ExpirationDateInfo.DATEUNIT_MONTH); + objectDao.saveOrUpdate(info2); + + + } public void cleanAll() { Index: ssts-web/src/main/webapp/disinfectsystem/packing/packingView.js =================================================================== diff -u -r16720 -r16876 --- ssts-web/src/main/webapp/disinfectsystem/packing/packingView.js (.../packingView.js) (revision 16720) +++ ssts-web/src/main/webapp/disinfectsystem/packing/packingView.js (.../packingView.js) (revision 16876) @@ -2509,6 +2509,14 @@ handler : function() { additionalMaterial(type_damage,""); } + },"-",{ + id : 'packingComboTousseBtn', + text : '装配聚合包', + iconCls : 'btn_ext_application_todo', + hidden : !(sstsConfig.enableComboTousse), + handler : function() { + packingComboTousse(); + } } ] }); Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManager.java =================================================================== diff -u -r16298 -r16876 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManager.java (.../PackingManager.java) (revision 16298) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/service/PackingManager.java (.../PackingManager.java) (revision 16876) @@ -129,6 +129,12 @@ public String getIDCardInfoForPackingView(String barcode); public String packingTousse_TRANS_REQUIRED(String params,HttpSession session) throws Exception; + + /** + * 装配聚合包 + */ + public String packingComboTousse(String params,HttpSession session) throws Exception; + public boolean addTousseInstanceToIdCardInstance( String idCardDefinitionId,String idCardInstanceID, PackingTask packingTask, TousseInstance tousseInstance); @@ -154,4 +160,12 @@ public void packingWithoutTask(JSONObject retObj,HttpServletRequest request); + /** + * 查找某个临床科室某个包的所有装配任务 + * @param tousseDefinitionId + * @param handlerDepartCode + * @param departCoding + * @return + */ + public List findPackingTaskBySQL(Long tousseDefinitionId,String handlerDepartCode,String departCoding); } Index: ssts-web/src/main/webapp/ext/fontSize17/styles/common.css =================================================================== diff -u -r12331 -r16876 --- ssts-web/src/main/webapp/ext/fontSize17/styles/common.css (.../common.css) (revision 12331) +++ ssts-web/src/main/webapp/ext/fontSize17/styles/common.css (.../common.css) (revision 16876) @@ -278,6 +278,9 @@ .btn_ext_application_add { background-image:url( ../../../images/web/application_add.png) !important; } +.btn_ext_application_todo { + background-image:url( ../../../images/web/options.png) !important; +} .btn_ext_application_edit { background-image:url( ../../../images/web/application_edit.png ) !important; } Index: ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/dwr/table/PackingTableManager.java =================================================================== diff -u -r15100 -r16876 --- ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/dwr/table/PackingTableManager.java (.../PackingTableManager.java) (revision 15100) +++ ssts-packing/src/main/java/com/forgon/disinfectsystem/packing/dwr/table/PackingTableManager.java (.../PackingTableManager.java) (revision 16876) @@ -445,6 +445,24 @@ } /** + * 装配聚合包 + * @param params + * @param session + * @return + */ + public synchronized String packingComboTousse(String params,HttpSession session){ + boolean success = true; + String message = "保存成功!"; + try { + return packingManager.packingComboTousse(params,session); + } catch (Exception e) { + success = false; + message = e.getMessage(); + } + return JSONUtil.buildJsonObject(success, message).toString(); + } + + /** * 干预外来器械拆包 * @param params * @param session