Index: ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/service/ServiceManagerImpl.java =================================================================== diff -u -r26462 -r26543 --- ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/service/ServiceManagerImpl.java (.../ServiceManagerImpl.java) (revision 26462) +++ ssts-webservice/src/main/java/com/forgon/disinfectsystem/webservice/service/ServiceManagerImpl.java (.../ServiceManagerImpl.java) (revision 26543) @@ -1,5 +1,6 @@ package com.forgon.disinfectsystem.webservice.service; +import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.math.BigDecimal; @@ -13,6 +14,7 @@ import java.util.Date; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -29,8 +31,12 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.Predicate; +import org.apache.commons.collections4.Transformer; +import org.apache.commons.collections4.map.MultiValueMap; import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.encoding.Md5PasswordEncoder; @@ -44,6 +50,7 @@ import com.forgon.databaseadapter.service.DateQueryAdapter; import com.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.model.BarcodeDevice; +import com.forgon.directory.model.CssdServiceDepts; import com.forgon.directory.model.OrgUnit; import com.forgon.directory.model.OrgUserRelation; import com.forgon.directory.service.OrgUnitManager; @@ -63,16 +70,21 @@ import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; import com.forgon.disinfectsystem.common.CSSDConstants; import com.forgon.disinfectsystem.common.CssdUtils; +import com.forgon.disinfectsystem.departmentapplicationtemplate.service.DepartmentAppTemplateManager; import com.forgon.disinfectsystem.diposablegoods.service.DiposableGoodsManager; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatch; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveGoodsInstance; import com.forgon.disinfectsystem.entity.basedatamanager.container.Container; +import com.forgon.disinfectsystem.entity.basedatamanager.departmentapplicationtemplate.DepartmentAppTemplate; +import com.forgon.disinfectsystem.entity.basedatamanager.departmentapplicationtemplate.DiposableGoodsTemplateItem; +import com.forgon.disinfectsystem.entity.basedatamanager.departmentapplicationtemplate.TousseDefinitionTemplateItem; import com.forgon.disinfectsystem.entity.basedatamanager.position.Position; import com.forgon.disinfectsystem.entity.basedatamanager.position.TousseOperation; import com.forgon.disinfectsystem.entity.basedatamanager.sterilisation.Sterilisation; import com.forgon.disinfectsystem.entity.basedatamanager.sterilizer.Sterilizer; +import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; import com.forgon.disinfectsystem.entity.basedatamanager.taskGroup.TaskGroup; import com.forgon.disinfectsystem.entity.basedatamanager.tousseGroup.TousseGroup; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; @@ -88,6 +100,7 @@ import com.forgon.disinfectsystem.entity.printRecyclingApplicationConfig.PrintConfig; import com.forgon.disinfectsystem.entity.qualitymonitoringmanager.qualitymonitoring.QualityMonitoringInstance; import com.forgon.disinfectsystem.entity.recycledepartmentgroup.DepartmentGroup; +import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; import com.forgon.disinfectsystem.entity.returngoodsrecord.ReturnGoodsItem; import com.forgon.disinfectsystem.entity.returngoodsrecord.ReturnGoodsRecord; import com.forgon.disinfectsystem.entity.sterilizationTransition.SterilizationTransition; @@ -103,21 +116,28 @@ import com.forgon.disinfectsystem.entity.urgent.UrgentLevel; import com.forgon.disinfectsystem.entity.useRecord.UseRecord; import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washanddisinfectrecord.WashAndDisinfectRecord; +import com.forgon.disinfectsystem.exception.RecyclingRecordException; +import com.forgon.disinfectsystem.goodFilterConfig.service.GoodFilterConfigManager; import com.forgon.disinfectsystem.invoicemanager.service.InvoiceDepartmentManage; import com.forgon.disinfectsystem.invoicemanager.service.InvoiceManager; import com.forgon.disinfectsystem.invoicemanager.vo.InvoiceStaticsVo; import com.forgon.disinfectsystem.invoicemanager.vo.WaitSignGoodsSummary; import com.forgon.disinfectsystem.operationreservation.service.OperationReservationManager; import com.forgon.disinfectsystem.packing.service.PackingManager; import com.forgon.disinfectsystem.printRecyclingApplicationConfig.service.PrintConfigManager; +import com.forgon.disinfectsystem.project.service.ProjectManager; import com.forgon.disinfectsystem.qualitymonitoring.definition.service.QualityMonitoringDefinitionManager; import com.forgon.disinfectsystem.qualitymonitoring.instance.service.QualityMonitoringInstanceManager; import com.forgon.disinfectsystem.recyclingapplication.service.InvoicePlanManager; +import com.forgon.disinfectsystem.recyclingapplication.service.RecyclingApplicationComparator; import com.forgon.disinfectsystem.recyclingapplication.service.RecyclingApplicationManager; +import com.forgon.disinfectsystem.recyclingapplication.service.RecyclingApplicationUtils; +import com.forgon.disinfectsystem.recyclingapplication.updateLog.ApplicationLogManager; import com.forgon.disinfectsystem.recyclingapplication.vo.ApplicationGoodsVo; import com.forgon.disinfectsystem.recyclingapplication.vo.ExpressInvoiceApplicationGoodsVo; import com.forgon.disinfectsystem.recyclingapplication.vo.ExpressInvoiceInvoicePlanVo; import com.forgon.disinfectsystem.recyclingapplication.vo.InvoicePlanVo; +import com.forgon.disinfectsystem.recyclingapplication.vo.ReturnGoodVo; import com.forgon.disinfectsystem.returngoodsrecord.service.ReturnGoodsRecordManager; import com.forgon.disinfectsystem.signRecord.service.SignRecordManager; import com.forgon.disinfectsystem.signRecord.vo.SignRecordVo; @@ -129,6 +149,7 @@ import com.forgon.disinfectsystem.sterilizationmanager.sterilizationrecord.service.SterilizationRecordManager; import com.forgon.disinfectsystem.sterilizationmanager.sterilizationunload.service.SterileUnloadScanTousseManager; import com.forgon.disinfectsystem.tousse.cssdhandletousses.service.CssdHandleTousseManager; +import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseDefinitionHelper; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseDefinitionManager; import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; import com.forgon.disinfectsystem.tousseReturnDisinfectRecord.service.TousseReturnDisinfectRecordManager; @@ -138,14 +159,19 @@ import com.forgon.disinfectsystem.useRecord.service.UseRecordManager; import com.forgon.disinfectsystem.useRecord.service.UseRecordToJson; import com.forgon.disinfectsystem.useRecord.util.UseRecordUtil; +import com.forgon.disinfectsystem.vo.ApplicationItemVO; +import com.forgon.disinfectsystem.vo.RecyclingApplicationVo; +import com.forgon.disinfectsystem.vo.TousseItemVo; import com.forgon.disinfectsystem.vo.TousseSimpleVO; import com.forgon.disinfectsystem.washTransition.service.WashTransitionItemManager; import com.forgon.disinfectsystem.washTransition.service.WashTransitionMaterialManager; import com.forgon.disinfectsystem.washTransition.service.WashTransitionRecordManager; import com.forgon.disinfectsystem.washanddisinfectmanager.washanddisinfectrecord.action.WashAndDisinfectRecordAction; import com.forgon.disinfectsystem.washanddisinfectmanager.washanddisinfectrecord.service.WashAndDisinfectRecordManager; +import com.forgon.exception.OperationException; import com.forgon.exception.SystemException; import com.forgon.keyvalue.service.KeyValueManager; +import com.forgon.log.enums.ApplicationLogStatusEnum; import com.forgon.log.model.Log; import com.forgon.log.service.LogManager; import com.forgon.security.bean.ModelNameBean; @@ -168,6 +194,7 @@ import com.forgon.tools.Path; import com.forgon.tools.SpringBeanManger; import com.forgon.tools.SqlBuilder; +import com.forgon.tools.StrutsParamUtils; import com.forgon.tools.date.DateTools; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.hibernate.ObjectDao; @@ -183,7 +210,6 @@ import com.google.gson.FieldAttributes; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -304,8 +330,28 @@ private TousseGroupManager tousseGroupManager; @Autowired private DiposableGoodsManager diposableGoodsManager; + @Autowired + private ApplicationLogManager applicationLogManager; + + private final Md5PasswordEncoder passwordEncoder = new Md5PasswordEncoder(); - + + private ProjectManager projectManager; + + public void setProjectManager(ProjectManager projectManager) { + this.projectManager = projectManager; + } + + private DepartmentAppTemplateManager departmentAppTemplateManager; + public void setDepartmentAppTemplateManager( + DepartmentAppTemplateManager departmentAppTemplateManager) { + this.departmentAppTemplateManager = departmentAppTemplateManager; + } + private GoodFilterConfigManager goodFilterConfigManagerImpl; + public void setGoodFilterConfigManagerImpl( + GoodFilterConfigManager goodFilterConfigManagerImpl) { + this.goodFilterConfigManagerImpl = goodFilterConfigManagerImpl; + } @Override public String invoke(String remoteAddr, String jsonParams) { JSONObject jsonObject = null; @@ -4276,4 +4322,1220 @@ } return resultObj.toString(); } + /** + * 获取pda当前登录科室的申请单 + * @param departCode 科室 + * @param startDate 申请开始时间 + * @param endDate 申请结束时间 + * @param firstIndex 结果集的开始下标(注意从0开始取值)????? 还是等于(pageNo-1)*pageSize?? + * 请参照PDA获取清洗记录的方法getWashRecordList的同名参数firstIndex + * @param maxResultCount 每页显示条数 + * @param invoicePlanType 申请单类型,多种则,号分隔 + * @return + */ + public String getRecyclingApplicationList(JSONObject params) { + String departCode = params.optString("departCode"); + if (StringUtils.isBlank(departCode)) { + return JSONUtil.buildErrorMsgJsonResult("缺失参数departCode"); + } + /* + //时间过滤 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date startDate = null; + Date endDate = null; + try { + startDate = sdf.parse(params.optString("startDate")); + endDate = sdf.parse(params.optString("endDate")); + } catch (ParseException e) { + e.printStackTrace(); + } + String dataSql = String.format(" and applicationTime between %s and %s ", dateQueryAdapter.dateAdapter(startDate), dateQueryAdapter.dateAdapter(endDate)); + */ + int firstIndex = params.optInt("firstIndex"); + int maxResultCount = params.optInt("maxResultCount"); + String invoicePlanType = params.optString("invoicePlanType"); + String typeSql = ""; + Set tousseTypeSet = new HashSet(); + if(StringUtils.isNotBlank(invoicePlanType)){ + String[] tousseTypesArray = invoicePlanType.split(","); + for (int i = 0; i < tousseTypesArray.length; i++) { + tousseTypeSet.add(tousseTypesArray[i]); + } + typeSql = " and " + SqlUtils.getStringFieldInLargeCollectionsPredicate("type", tousseTypeSet); + } + + String sql = String.format("where po.departCoding='%s' and " + + "po.deliverStatus!='%s' %s ", departCode, InvoicePlan.STATUS_END, typeSql); + Collection invoicePlans = objectDao.findBySql( + InvoicePlan.class.getSimpleName(), sql, firstIndex, + maxResultCount, "applicationTime desc"); + JsonConfig jc = JSONUtil.buildJsonConfig("id","depart","applicationTime","applicant","deliverStatus","recyclingStatus","type"); + jc.registerJsonValueProcessor(Date.class,_defaultDateJsonValueProcessor2); + + JSONArray invoicePlansJsonArray = JSONArray.fromObject(invoicePlans,jc); + return new JSONStringer().object().key("success").value(true) + .key("invoicePlans").value(invoicePlansJsonArray).endObject() + .toString(); + } + /** + * 根据申请单id获取对应的申请项数据(为pda做类似pc鼠标悬浮申请单的功能) + * @param params + * @param params.invoicePlanId 申请单id + * @return + */ + public String findApplicationItemVOListByInvoicePlanId(JSONObject params){ + JSONObject resultObj = new JSONObject(); + try { + String invoicePlanId = params.optString("invoicePlanId"); + if (StringUtils.isBlank(invoicePlanId)) { + return JSONUtil.buildErrorMsgJsonResult("缺失参数invoicePlanId"); + } + List items = invoicePlanManager.findApplicationItemVOListByInvoicePlanId(invoicePlanId); + resultObj.put("data", items); + resultObj.put("success", true); + } catch (Exception e) { + e.printStackTrace(); + resultObj.put("success", false); + } + return resultObj.toString(); + } + /** + * 针对单个申请单的终止方法 + * @param params + * @param params.invoicePlanId 要终止的申请单的id + * @param params.endCause 终止原因 为空则为"不明" + * @param params.params + * @return + */ + public String terminateInvoicePlan(JSONObject params){ + JsonObject json = new JsonObject(); + try { + String id = params.optString("invoicePlanId",""); + InvoicePlan invoicePlan = null; + if (DatabaseUtil.isPoIdValid(id)) { + invoicePlan = invoicePlanManager.get(id); + } + if(invoicePlan == null){ + throw new RuntimeException("终止失败,找不到相关记录!"); + } + String endCause = params.optString("endCause", ""); + if(StringUtils.isBlank(endCause)){ + endCause = "不明"; + } + endCause = endCause.trim(); + String userName = AcegiHelper.getLoginUser().getUserFullName(); + invoicePlanManager.terminateInvoicePlan(invoicePlan, userName, endCause); + List endCauses = httpOptionManager.getHttpOptionTextById(HttpOption.SYSTEMSETTING_APPLICATION_END_CAUSE); + if(CollectionUtils.isNotEmpty(endCauses) && !endCauses.contains(endCause.trim())){ + HttpOption option = new HttpOption(); + option.setOptionListId(HttpOption.SYSTEMSETTING_APPLICATION_END_CAUSE); + option.setOptionText(endCause); + option.setOptionValue(endCause); + option.setSequence(httpOptionManager.getMaxSequence(HttpOption.SYSTEMSETTING_APPLICATION_END_CAUSE)+1); + httpOptionManager.saveOrUpdate(option); + } + json.addProperty("success", true); + } catch (Exception e) { + e.printStackTrace(); + json.addProperty("success", false); + json.addProperty("errMsg", e.getMessage()); + } + return json.toString(); + } + /** + * pda删除申请单 + * @param params + * @param params.ids 需要删除的申请单id,多个则以;号分隔 + * @return + */ + public String deleteRecyclingApplication(JSONObject params){ + JsonObject json = new JsonObject(); + String ids = params.optString("ids", ""); + String message = null; + int deleteSucceeded = 0; + if (StringUtils.isNotBlank(ids)) { + for (String id : ids.split(";")) { + if(StringUtils.isBlank(id) || !StringUtils.isNumeric(id)){ + continue; + } + try { + if(recyclingApplicationManager.deleteRecyclingApplication(id)){ + deleteSucceeded++; + } + } catch (Exception e) { + e.printStackTrace(); + message = e.getMessage(); + } + } + if (deleteSucceeded == 0) { + json.addProperty("success", false); + if(StringUtils.isBlank(message)){ + message = "删除失败!"; + } + } else { + message = deleteSucceeded + "条申请单删除成功。"; + json.addProperty("success", true); + } + }else{ + message = "缺失参数ids"; + json.addProperty("success", false); + } + json.addProperty("msg", message); + return json.toString(); + } + /** + * pda搜索组合物品,包含器械包和一次性物品(用于科室申请的物品combo) + * @param spell 拼音码 + * @param appCode 申请科室编码 + * @param settleAccountsDepartCoding 结算科室编码 + * @param cssdOrgUnitCode 处理科室编码 + * @param tousseType 打开的申请单类型 + * @param specifyDisposableTypes 格式:{include:是否包含(即true or false),disposableTypes:'一次性物品类型集合'} 是否包含指定的一次性物品类型 + * @param params + * @return + */ + public String searchComboGoodsData(JSONObject params){ + String spell = params.optString("spell", ""); + //“申请科室编码”、“结算科室编码”、“处理科室编码” + String appCode = params.optString("appCode", ""); + String settleAccountsDepartCoding = params.optString("settleAccountsDepartCoding", ""); + String cssdOrgUnitCode = params.optString("cssdOrgUnitCode", ""); + //打开申请单的类型 + String tousseType = params.optString("tousseType", ""); + //是否包含指定的一次性物品类型,格式:{include:是否包含,disposableTypes:'一次性物品类型集合'} + String specifyDisposableTypes = params.optString("specifyDisposableTypes", ""); + TousseDefinitionHelper tousseDefinitionHelper = TousseDefinitionHelper.getInstance(); + tousseDefinitionHelper.setTousseDefinitionManager(tousseDefinitionManager); + tousseType = tousseDefinitionHelper.setGoodTypeByFormType(tousseType); + if (spell == null) { + spell = ""; + } + JSONObject json = new JSONObject(); + try { + //需要转大写,因为拼音码全部是大写,数据库查询区分大小写 + spell = java.net.URLDecoder.decode(spell, "UTF-8").toUpperCase().trim(); + //是否显示一次性物品的参考价 + boolean hideDiposableGoodsPrice = CssdUtils.getSystemSetConfigByNameBool("hideDiposableGoodsPrice", false); + boolean showReferencePrice = true; + if(hideDiposableGoodsPrice){ + showReferencePrice = false; + } + //是否显示一次性物品的外部编码 + boolean showExternalCodeOfDisposableGoods = CssdUtils.getSystemSetConfigByNameBool("showExternalCodeOfDisposableGoods", false); + //如果处理科室编码不为空则进行过滤 + if(StringUtils.isNotBlank(cssdOrgUnitCode)){ + int totalCount = 0; + Map result = new HashMap(); + List> mapList = new ArrayList>(); + List> mapList2 = new ArrayList>(); + JSONObject retObj = new JSONObject(); + //如果不为一次性物品,则先查出器械包. + if(!TousseItem.TYPE_DIPOSABLE_GOODS.equals(tousseType)){ + OrgUnit cssd = new OrgUnit(); + cssd.setOrgUnitCoding(cssdOrgUnitCode); + Set predicates = tousseDefinitionHelper.getPredicates(tousseType); + //开启器械包黑白名单过滤 + String appIsUseBwList = CssdUtils.getSystemSetConfigByName("appIsUseBwList"); + if (StringUtils.isNotBlank(appIsUseBwList) && "true".equals(appIsUseBwList)){ + retObj.put("needToBw", true); + retObj.put("appCode", appCode); + } + List tousseDefinitiionList = tousseDefinitionManager.getCssdHandleTousseDefinitionList(cssd,spell,0,0,predicates,retObj,true); + if(CollectionUtils.isNotEmpty(tousseDefinitiionList)){ + for(TousseDefinition tousseDefinition : tousseDefinitiionList){ + Map map = tousseDefinitionHelper.filterResultByTousseType2(tousseType,tousseDefinition); + if(map != null){ + mapList.add(map); + } + } + } + }else{ + //只查出一次性物品 + mapList2 = tousseDefinitionManager.searchTousseOrDiposableGoodsBySpellAndWbCode( + spell, false, false, false,false,showReferencePrice,"1","0",false,showExternalCodeOfDisposableGoods,settleAccountsDepartCoding,cssdOrgUnitCode,specifyDisposableTypes,false); + } + //如果申请单类型为组合申请单,则需要再查询一次性物品出来和上面的器械包物品合并 + if("combo".equals(tousseType)){ + mapList2 = (tousseDefinitionManager.searchTousseOrDiposableGoodsBySpellAndWbCode( + spell, false, false, false,false,showReferencePrice,"1","0",false,showExternalCodeOfDisposableGoods,settleAccountsDepartCoding,cssdOrgUnitCode,null,false)); + } + List> mapDataList = new ArrayList>(); + mapDataList.addAll(mapList); + mapDataList.addAll(mapList2); + totalCount = mapDataList.size(); + result.put("totalCount", totalCount); + result.put("data", mapDataList); + json = JSONObject.fromObject(result); + }else{ //申请时处理科室为空的是不合理的 + Map result = tousseDefinitionManager.searchComboGoods(spell, tousseType,showReferencePrice,showExternalCodeOfDisposableGoods,settleAccountsDepartCoding,null,true); + List> mapList = (List>)result.get("data"); + List> mapDataList = mapList; + result.put("data", mapDataList); + json = JSONObject.fromObject(result); + } + //增加success,rows和total的赋值,支持bootstrap框架 + JSONUtil.addProperty(json, JSONUtil.JSON_KEY_SUCCESS, true); + JSONUtil.addProperty(json, JSONUtil.JSON_KEY_TOTAL, json.opt("totalCount")); + JSONUtil.addProperty(json, JSONUtil.JSON_KEY_ROWS, json.opt("data")); + } catch (IOException e) { + e.printStackTrace(); + JSONUtil.addProperty(json, JSONUtil.JSON_KEY_SUCCESS, false); + } + return json.toString(); + } + //------------------------保存申请单 start------------------------------ + /** + * 保存申请单 + * @param params.applicantCode 申请人编码 + * @param params.applicant 申请人 + * @param params.applicationTimeStr 申请时间 + * @param params.depart 申请科室 + * @param params.departCoding 申请科室编码 + * @param params.settleAccountsDepart 结算科室 + * @param params.settleAccountsDepartCoding 结算科室编码 + * @param params.handleDepart 处理科室 + * @param params.handleDepartCoding 处理科室编码 + * @param params.remark 备注 + * @param params.type 申请单类型 + * @param params.specifyDisposableTypes 格式:{include:是否包含(即true or false),disposableTypes:'一次性物品类型集合'} 是否包含指定的一次性物品类型 + * @param params.tousseInstanceInfos 申请的物品信息 + * @param params.isInterveneAmount 是否干预申请数量(PDA暂不开放,前台不需要传) + * @param params.id 申请单id + * @return + */ + public String saveRecyclingApplication(JSONObject params){ + String applicantCode = params.optString("applicantCode"); + String applicant = params.optString("applicant"); + String applicationTimeStr = params.optString("applicationTimeStr"); + String depart = params.optString("depart"); + String departCoding = params.optString("departCoding"); + String settleAccountsDepart = params.optString("settleAccountsDepart"); + String settleAccountsDepartCoding = params.optString("settleAccountsDepartCoding"); + String handleDepart = params.optString("handleDepart"); + String handleDepartCoding = params.optString("handleDepartCoding"); + String remark = params.optString("remark"); + String type = params.optString("type"); + String id = params.optString("id", ""); + RecyclingApplication recyclingApplication = null; + if (StringUtils.isNotBlank(id) && !id.equals("0")) { + recyclingApplication = recyclingApplicationManager + .getRecyclingApplicationById(id); + } else { + recyclingApplication = new RecyclingApplication(); + } + recyclingApplication.setApplicantCode(applicantCode); + recyclingApplication.setApplicant(applicant); + recyclingApplication.setApplicationTimeStr(applicationTimeStr); + recyclingApplication.setDepart(depart); + recyclingApplication.setDepartCoding(departCoding); + recyclingApplication.setSettleAccountsDepart(settleAccountsDepart); + recyclingApplication.setSettleAccountsDepartCoding(settleAccountsDepartCoding); + recyclingApplication.setHandleDepart(handleDepart); + recyclingApplication.setHandleDepartCoding(handleDepartCoding); + recyclingApplication.setRemark(remark); + recyclingApplication.setType(type); + RecyclingApplicationVo oldRecyclingApplication = new RecyclingApplicationVo(); + //是否干预申请数量 + //boolean isInterveneAmount = "true".equals(params.optString("isInterveneAmount", "").trim()); + /*if (isInterveneAmount) { + resultObj = recyclingApplicationManager.interveneApplyAmount(recyclingApplication, oldRecyclingApplication, getTousseItemVos(params)); + } else { + resultObj = createReturnApplicationOrRecyclingApplication(recyclingApplication,oldRecyclingApplication, params); + }*/ + return createReturnApplicationOrRecyclingApplication(recyclingApplication,oldRecyclingApplication, params).toString(); + } + /** + * 检查并创建还物单或通用申请单 + * @param recyclingApplication + * @param oldRecyclingApplication + * @param params + * @return + */ + private JSONObject createReturnApplicationOrRecyclingApplication(RecyclingApplication recyclingApplication,RecyclingApplicationVo oldRecyclingApplication,JSONObject params) { + Collection srcTousseItemVoList = getTousseItemVos(params); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_APPLICATION, Log.TYPE_ADD, + "保存申请单:recyclingApplication=" + JSONUtil.toJsonObjecttWithSimpleProperty(recyclingApplication) + + ",tousseItems=" + JSONUtil.toJsonArraytWithSimpleProperty(srcTousseItemVoList)); + //验证科室名称和科室编码是否一致 + if (!recyclingApplicationManager.validateDepartment(recyclingApplication.getDepartCoding(), recyclingApplication.getDepart())) { + return JSONUtil.buildJsonObject(false, "申请科室名称和科室编码不一致,请联系系统管理员!"); + } + if (!recyclingApplicationManager.validateDepartment(recyclingApplication.getSettleAccountsDepartCoding(), recyclingApplication.getSettleAccountsDepart())) { + return JSONUtil.buildJsonObject(false, "结算科室名称和科室编码不一致,请联系系统管理员!"); + } + if (!recyclingApplicationManager.validateDepartment(recyclingApplication.getHandleDepartCoding(), recyclingApplication.getHandleDepart())) { + return JSONUtil.buildJsonObject(false, "处理科室名称和科室编码不一致,请联系系统管理员!"); + } + + //设置includeSpecifyDisposableTypes属性 + String specifyDisposableTypes = params.optString("specifyDisposableTypes", ""); + if (recyclingApplication.isDiposableGoodsAppliaction() && StringTools.isNotBlank(specifyDisposableTypes)) { + JSONObject specifyDisposableTypesObj = JSONObject.fromObject(specifyDisposableTypes); + if (specifyDisposableTypesObj.optBoolean("include")) { + recyclingApplication.setIncludeSpecifyDisposableTypes(com.forgon.Constants.STR_YES); + } else { + recyclingApplication.setIncludeSpecifyDisposableTypes(com.forgon.Constants.STR_NO); + } + } + + + Map> checkList = new HashMap<>(); + checkList.put(TousseDefinition.PACKAGE_TYPE_INSIDE, new ArrayList<>()); + checkList.put(TousseDefinition.PACKAGE_TYPE_DISINFECTION, new ArrayList<>()); + checkList.put(DisposableGoods.TYPE_NAME, new ArrayList<>()); + //遍历提交的数据,如果加急数量大于申请数量则提示失败 + JSONArray urgentItems = new JSONArray(); + JSONArray tempItemsForTest = new JSONArray(); //用于调试程序 + //申请项的类型 + Set tousseTypesForTousseItem = new HashSet(); + for (TousseItemVo tousseItemVo : srcTousseItemVoList) { + JSONObject tempObj = new JSONObject(); + tempObj.put("tousseDefinitionId", tousseItemVo.getTousseDefinitionID()); + tempObj.put("tousseName", tousseItemVo.getTousseName()); + tempObj.put("tousseType", tousseItemVo.getTousseType()); + tempItemsForTest.add(tempObj); + tousseTypesForTousseItem.add(tousseItemVo.getTousseType()); + + Integer urgentAmount = tousseItemVo.getUrgentAmount(); + if (!tousseItemVo.disposable() && urgentAmount != null && urgentAmount.intValue() > 0) { + JSONObject urgentItem = new JSONObject(); + urgentItem.put("tousseName", tousseItemVo.getTousseName()); + urgentItem.put("urgentAmount", tousseItemVo.getUrgentAmount()); + urgentItems.add(urgentItem); + } + JSONObject jsonObject = tousseDefinitionManager.handleUrgentAmountAndAmount(tousseItemVo); + if (jsonObject != null){ + return jsonObject; + } + //校验提交的数据是否存在相同名字的器械包 + JSONObject repeatObj = tousseDefinitionManager.validateRepeatedTd(checkList, tousseItemVo); + if (repeatObj != null){ + return repeatObj; + } + } + //如果单类型与物品类型出现不相匹配的时,给出失败的提示 + if(recyclingApplication.isTousseAppliaction()){ + //1.器械包申请单必须有且只有器械包、消毒物品、敷料包其中的一种类型物品,不允许有其它类型的物品 + if(!tousseTypesForTousseItem.contains(TousseDefinition.PACKAGE_TYPE_INSIDE) + && !tousseTypesForTousseItem.contains(TousseDefinition.PACKAGE_TYPE_DISINFECTION) + && !tousseTypesForTousseItem.contains(TousseDefinition.PACKAGE_TYPE_DRESSING)){ + return JSONUtil.buildJsonObject(false, "器械包申请单必须申请器械包、消毒物品、敷料包中的其中至少一种类型物品"); + } + if(tousseTypesForTousseItem.contains(DisposableGoods.TYPE_NAME)){ + return JSONUtil.buildJsonObject(false, "器械包申请单不能申请一次性物品"); + } + }else if(recyclingApplication.isDisinfectGoodsAppliaction()){ + //2.消毒物品申请单必须有且只有消毒物品,不允许有其它类型的物品 + if(!tousseTypesForTousseItem.contains(TousseDefinition.PACKAGE_TYPE_DISINFECTION) || tousseTypesForTousseItem.size() > 1){ + return JSONUtil.buildJsonObject(false, "消毒物品申请单必须且只能申请消毒物品,不能申请其它类型物品"); + } + }else if(recyclingApplication.isDiposableGoodsAppliaction()){ + //3.一次性物品申请单必须有且只有一次性物品,不允许有其它类型的物品 + if(!tousseTypesForTousseItem.contains(DisposableGoods.TYPE_NAME) || tousseTypesForTousseItem.size() > 1){ + return JSONUtil.buildJsonObject(false, "一次性物品申请单必须且只能申请一次性物品,不能申请其它类型物品"); + } + } + + boolean autoReturnTheBorrowingTousse = "true".equals(params.optString("autoReturnTheBorrowingTousse", "").trim()); + String compareResult = new RecyclingApplicationComparator().doCompare(oldRecyclingApplication, + invoicePlanManager.invoicePlan2RecyclingApplicationVo(recyclingApplication,false), srcTousseItemVoList); + //如果比较结果不是空的,或者这张申请单id还没有值,则需要写到日志 + boolean isWriteToLog = StringUtils.isNotBlank(compareResult) || recyclingApplication.getId() == null; + + if (!autoReturnTheBorrowingTousse) { + JSONObject jsonObject = saveRecyclingApplication(recyclingApplication, srcTousseItemVoList, params); + //如果申请的物品有加急物品,则清空UrgentGoodsWarning表 + if (CssdUtils.getSystemSetConfigByNameBool("enableTousseVoluntarilyUrgent", false) + && urgentItems.size() > 0) { + objectDao.executeUpdate("delete from UrgentGoodsWarning"); + } + //保存申请单后插入更新的日志 + if (isWriteToLog && jsonObject == null){ + applicationLogManager.saveApplicationLog(recyclingApplication, compareResult, ApplicationLogStatusEnum.SUBMIT); + } + applicationLogManager.saveApplicationLog(recyclingApplication, String.format("申请的物品:%s", tempItemsForTest), ApplicationLogStatusEnum.SUBMIT); + return jsonObject; + } + + ReturnGoodVo returnGoodVo = recyclingApplicationManager.handleReturnGoodByApplication(this.convertVosToMap(srcTousseItemVoList), recyclingApplication); + MultiValueMap actualAllReturnTousses = returnGoodVo.getActualAllReturnTousses(); + Map restApplyTousses = returnGoodVo.getRestApplyTousses(); + // 添加备注 + StringBuilder sb = RecyclingApplicationUtils.generateReturnGoodsRemark(RecyclingApplicationUtils.RETURNGOODSOPERATIONTYPE_APPLY, + actualAllReturnTousses, restApplyTousses); + CssdUtils.appendRemarkOfInvoicePlan(recyclingApplication,sb.toString()); + + if (recyclingApplicationManager.isAllReturn(restApplyTousses)) { + // if (restApplyTousses.isEmpty()) { + // 若全部物品转换为还物单,则保存原申请单的状态为已终止 + saveRecyclingApplication(recyclingApplication, srcTousseItemVoList, params); + + String userName = AcegiHelper.getLoginUser().getUserFullName(); + String remark = "本次申请的所有物品已转换为申请还物单。"; + invoicePlanManager.terminateInvoicePlan(recyclingApplication, userName, remark); + objectDao.save(recyclingApplication); + + } else { + // 若还有剩余物品,则以剩余的物品提交申请单 + final Map restApplyTousses2 = restApplyTousses; + Collection restApplyResult = CollectionUtils.select( + srcTousseItemVoList, new Predicate() { + @Override + public boolean evaluate(TousseItemVo vo) { + Integer restApplyAmount = restApplyTousses2.get(vo + .getTousseName()); + if (restApplyAmount == null) { + return false; + } else { + // 转换为还物单后,原有申请数量应修改 + vo.setAmount(restApplyAmount); + return true; + } + } + }); + saveRecyclingApplication(recyclingApplication, restApplyResult, params); + } + return JSONUtil.buildJsonObject(true, "保存成功"); + } + /** + * 把前台传过来的申请物品转成TousseItemVo对象 + * @return + */ + private List getTousseItemVos(JSONObject params) { + String appGoodsStr = params.optString("tousseInstanceIds"); + String tousseInstanceInfos= params.optString("tousseInstanceInfos"); + + List vos = new ArrayList(); + if (StringUtils.isNotBlank(tousseInstanceInfos)) { + List tousses = new Gson().fromJson(tousseInstanceInfos, new TypeToken>(){}.getType()); + if(tousses != null){ + vos = tousses; + } + }else{ + // 此处代码应该删掉,为了以防万一,有些地方没改过来 + if (StringUtils.isNotBlank(appGoodsStr)) { + String[] goodsItemStrArray = appGoodsStr.split("#@"); + for (String goodsItemStr : goodsItemStrArray) { + String[] itemArray = goodsItemStr.split("#&"); + TousseItemVo goodsVo = new TousseItemVo(); + goodsVo.setId(Long.valueOf(itemArray[0])); + goodsVo.setTousseName(itemArray[1]); + goodsVo.setAmount(MathTools.object2Integer(itemArray[2])); + goodsVo.setPrice(MathTools.object2Double(itemArray[3])); + goodsVo.setRowPrice(MathTools.object2Double(itemArray[4])); + goodsVo.setDiposable(itemArray[5]); + if(itemArray.length > 6){ + goodsVo.setTousseType(itemArray[6]); + } + if (itemArray.length > 7){ + goodsVo.setUnit(itemArray[7]); + } + if(itemArray.length > 8){ + goodsVo.setDisinfectMaterilas(itemArray[8]); + } + vos.add(goodsVo); + } + } + } + + return vos; + } + /** + * 保存或提交申请单或借物单 + * (中山眼科中心:如果申请项有申领一次性物品,且科室为科教项目经费,则需验证项目编码是否为空,再根据项目编码调用验证是否超支) + * @param application 申请单对象 + * @param newTousseItemVoList 申请单上新的物品集合,{@link TousseItemVo} + * @return + */ + private JSONObject saveRecyclingApplication(RecyclingApplication application, + Collection newTousseItemVoList, JSONObject params) { + JSONObject jsonObject = null; + try { + //校验申请的物品(器械包)能否被所选处理科室(供应室)处理以及申请的科室能否被所选处理科室(供应室)服务 + jsonObject = tousseDefinitionManager.validateRecyclingApplicationCssdPrivilege(application, newTousseItemVoList); + + //如果校验不通过,则直接返回至前端 + if(jsonObject != null && !jsonObject.optBoolean("success")){ + return jsonObject; + } + if(projectManager != null && StringUtils.isNotBlank(application.getProjCode())){ + //验证是否必须选择项目及所选项目是否已经超支 + jsonObject = projectManager.judgeOverspendByProjCode(application.getProjCode() , application, newTousseItemVoList , new HashMap()); + if(jsonObject != null && jsonObject.optBoolean("success") == false){ + return jsonObject; + } + } + // 如果为true,则为提交申请单(默认值),否则暂存申请单 + boolean committedStatus = "true".equals(params.optString("committedStatus", "true").trim()); + if(!committedStatus){ + application.setCommittedStatus(false); + } + String code = AcegiHelper.getLoginUser().getOrgUnitCodingFromSupplyRoomConfig(); + SupplyRoomConfig cssd = supplyRoomConfigManager.getFirstSupplyRoomConfig(); + if (committedStatus && !StringTools.equals(code, cssd.getOrgUnitCoding()) + && application.readed()) { + return JSONUtil.buildJsonObject(true, "该申请单已被阅读过,不能修改。如果需要修改,请联系管理员!"); + } + // 科室基数增大后器械包扩充申请单,申请后直接发货(不回收装配) + if (InvoicePlan.TYPE_TOUSSE_EXPANSION_FORM.equals(application.getType())) { + return saveTousseExpansion(application, params); + } + String message = committedStatus ? "提交成功" + : "保存成功"; + try{ + //省医需求:如果是借物单,则将申请物品明细转换至物品简要属性 + if(InvoicePlan.TYPE_BORROWINGSINGLE.equals(application.getType())){ + application.tousseItemList2LendGoodsBrief(); + if(CollectionUtils.isNotEmpty(newTousseItemVoList)){ + List lendGoodsBriefList = new ArrayList(); + String[] lendGoodsBriefArray = null; + Map map = new HashMap(); + for(TousseItemVo ti : newTousseItemVoList){ + if(map.get(ti.getTousseName()) == null){ + map.put(ti.getTousseName() , ti.getAmount()); + }else{ + map.put(ti.getTousseName() , map.get(ti.getTousseName()) + ti.getAmount()); + } + } + for(String key : map.keySet()){ + lendGoodsBriefList.add(key + "x" + map.get(key)); + } + lendGoodsBriefArray = new String[lendGoodsBriefList.size()]; + lendGoodsBriefList.toArray(lendGoodsBriefArray); + application.setLendGoodsBrief(StringUtils.join(lendGoodsBriefArray, ",")); + } + } + + String msg = recyclingApplicationManager.saveRecyclingApplication(application, newTousseItemVoList, + committedStatus); + if (StringUtils.isNotBlank(msg)){ + message = msg; + } + } + catch(RecyclingRecordException e){ + message = e.getMessage(); + } + jsonObject = JSONUtil.buildJsonObject(true, message); + } catch (Exception e) { + e.printStackTrace(); + jsonObject = JSONUtil.buildJsonObject(false, e.getMessage()); + } + return jsonObject; + } + /** + * 取物品名称及数量. + * @param vos + * @return + */ + private Map convertVosToMap(Collection vos) { + Map applyTousses = new HashMap<>(); + for (TousseItemVo vo : vos) { + applyTousses.put(vo.getTousseName(), vo.getAmount()); + } + return applyTousses; + } + /** + * 保存器械包扩充申请单 + * @param recyclingApplication 申请单 + * @param params + * @return + */ + private JSONObject saveTousseExpansion(RecyclingApplication recyclingApplication, JSONObject params) { + JSONObject resultObj = null; + String tousseInstanceItems = params.optString("tousseInstanceIds",""); + List items = new ArrayList(); + if (StringUtils.isNotBlank(tousseInstanceItems)) { + try { + String[] tousseInstance = tousseInstanceItems.split("#@"); + int len = tousseInstance.length; + for (int i = 0; i < len; i++) { + String[] value = tousseInstance[i].split("#&"); + String id = value[0]; + String tousseName = value[1]; + Integer amount = Integer.parseInt(value[2]); + String diposable = value[3]; + TousseItem tousseItem = null; + if ("0".equals(id)) { + tousseItem = new TousseItem(); + tousseItem.setTousseName(tousseName); + tousseItem.setDiposable(diposable); + tousseItem.setAmount(amount); + tousseItem.setInvoicePlan(recyclingApplication); + + } else { + tousseItem = tousseItemManager.get(value[0]); + if (tousseItem != null) { + tousseItem.setAmount(amount); + } + } + items.add(tousseItem); + } + recyclingApplication.setApplicationItems(items); + recyclingApplication.setCommittedStatus(true); + if (StringUtils.isBlank(recyclingApplication.getDeliverStatus())) { + recyclingApplication + .setDeliverStatus(InvoicePlan.DELIVERSTATUS_AWAITDELIVER); + recyclingApplication.setOrderByFiled(InvoicePlan.DELIVER_AWAITDELIVER); + } + // TODO 编辑时删除旧数据 + recyclingApplication.setApplicationTime(Calendar.getInstance() + .getTime()); + + recyclingApplication.setReaders(";ORGUNIT_" + + recyclingApplication.getDepartCoding() + ";"); + if (recyclingApplication.getId() == null) { + recyclingApplication + .setSerialNumber(serialNumManager + .getSerialNumberStr(SerialNum.TYPE_RECYCLINGAPPLICATION)); + // 设置回收单与发货单的科室排序顺序 + recyclingApplication.setSequence(supplyRoomConfigManager + .getOrgUnitSequence(recyclingApplication + .getDepartCoding())); + } + recyclingApplicationManager.saveOrUpdate(recyclingApplication); + resultObj = JSONUtil.buildJsonObject(true, "保存器械包扩充申请单成功"); + } catch (Exception e) { + e.printStackTrace(); + resultObj = JSONUtil.buildJsonObject(false, "保存器械包扩充申请单失败"); + } + } + return resultObj; + } + //------------------------保存申请单 end------------------------------ + /** + * 根据申请单id查询申请单信息(并列出所有申请物品) + * @param id 申请单id + * @return + */ + public String getRecyclingApplicationAndVerifyEdit(JSONObject params) { + String id = params.optString("id", ""); + JSONObject json = null; + try { + JsonConfig config = new JsonConfig(); + PropertyFilter propertyFilter = new JsonPropertyFilter(new String[] { + "applicationItems", "invoice", + "recyclingRecord", "recyclingApplications", "parent", + "recyclingRecords" }); + config.setJsonPropertyFilter(propertyFilter); + //设置hibernate延时加载器句柄,以防申请单的submitTime值为空时调用JSONObject.fromObject报错 + config.setExcludes(new String[]{"handler","hibernateLazyInitializer"}); + json = JSONObject.fromObject(recyclingApplicationManager.getInvoicePlanAndVerifyEdit(id),config); + json.put("success", true); + } catch (Exception e) { + json = JSONUtil.buildJsonObject(false, "查询出错"); + } + return json.toString(); + } + /** + * 终止选中的物品,科室申领界面打开一张申请单选中物品后点终止选中的物品时调用 + * @param params.tousseItemIds 终止的物品id数组 参考格式:["263801","263802"] + * @param params.endCase 终止原因 + * @return + */ + public String terminateTousseItems(JSONObject params){ + String tousseItemIdsStr = params.optString("tousseItemIds", ""); + String endCase = params.optString("endCase", ""); + Collection tousseItemIdStrs = new Gson().fromJson(tousseItemIdsStr, new TypeToken>() {}.getType() ); + Collection tousseItemIds = CollectionUtils.collect( + tousseItemIdStrs, new Transformer() { + @Override + public Long transform(String input) { + return NumberUtils.toLong(input); + } + }); + JSONObject resultObj = null; + try{ + //终止物品前先校验该物品是否已经发货 + invoicePlanManager.checkTousseItemCanCancel(tousseItemIds); + invoicePlanManager.terminateTousseItemByIds(tousseItemIds, endCase); + resultObj = JSONUtil.buildJsonObject(true, "终止成功!"); + } catch (Exception e) { + if (e instanceof OperationException){ + logger.warn(e); + }else { + logger.error(e, e); + } + resultObj = JSONUtil.buildJsonObject(false, "终止失败!" + e.getMessage()); + } + return resultObj.toString(); + } + /** + * 根据申请科室编码、申请单的物品类型加载处理科室、结算科室 + * @param params.applyDepartCode 申请科室编码 + * @param params.tousseType 申请单的物品类型 + * @return + */ + public String getCssdsAndSettleorgUnitByApplyDepartAndType(JSONObject params){ + Map result = new HashMap(); + JSONObject resultObj = null; + try { + String applyDepartCode = params.optString("applyDepartCode", ""); + String tousseType = params.optString("tousseType", ""); + SupplyRoomConfig supplyRoomConfig = supplyRoomConfigManager.getSupplyRoomConfigByOrgUnitCodingAndType(applyDepartCode, 3); + if(supplyRoomConfig == null){ + throw new RuntimeException("获取供应室配置失败"); + } + Collection list = orgUnitManager.getCssdsByApplyDepartAndType( + applyDepartCode, tousseType); + List> resultMapList = new ArrayList>(); + if(CollectionUtils.isNotEmpty(list)){ + Map resultMap = null; + for(CssdServiceDepts cssdServiceDepts : list){ + resultMap = new HashMap(); + resultMap.put("defaultHandleDepart", cssdServiceDepts.getDefaultHandleDepart()); + resultMap.put("cssdOrgUnitCode", cssdServiceDepts.getCssdOrgUnitCode()); + resultMap.put("cssdOrgUnitName", cssdServiceDepts.getCssdOrgUnitName()); + resultMapList.add(resultMap); + } + } + result.put("cssdOrgUnitList", resultMapList); + resultObj = JSONObject.fromObject(result); + resultObj.put("success", true); + resultObj.put("settleAccountsDepart", supplyRoomConfig.getSettleAccountsDepart()); + resultObj.put("settleAccountsDepartCoding", supplyRoomConfig.getSettleAccountsDepartCoding()); + } catch (Exception e) { + e.printStackTrace(); + resultObj = JSONUtil.buildJsonObject(false, "查询处理科室,结算科室失败"); + } + return resultObj.toString(); + } + /** + * 查询申请单配置的终止原因 + * @param params + * @return + */ + public String getEndCauseList(JSONObject params){ + JSONObject obj = new JSONObject();; + try { + List endCauseList = httpOptionManager.getHttpOptionTextById(HttpOption.SYSTEMSETTING_APPLICATION_END_CAUSE); + obj.put("success", true); + obj.put("data", endCauseList); + } catch (Exception e) { + e.printStackTrace(); + obj.put("success", false); + obj.put("message", "查询终止原因出错"); + } + return obj.toString(); + } + //-------------------------加载科室申请的器械包模板 start------------------------------ + /** + * 加载科室申请的器械包模板 + * 同时加载了已经申请的物品信息,根据传入的申请单的id。 + * @param params.specifyDisposableTypes 格式:{include:是否包含(即true or false),disposableTypes:'一次性物品类型集合'} 是否包含指定的一次性物品类型 + * @param params.applicationType 申请单类型 + * @param params.settleAccountsDepartCoding 结算科室编码 + * @param params.handleDepartCoding 处理科室编码 + * @param params.templateId 选择模板时的模板Id + * @param params.id 申请单Id + * @param params.reloadTemplate 是否需要重新加载模板(应该是切换申请科室的编码,根据新的申请科室编码加载对应的模板) + */ + public String loadDepartmentAppTemplate(JSONObject params) { + JSONObject obj = null; + try { + String specifyDisposableTypes = params.optString("specifyDisposableTypes", ""); + String applicationFormType = params.optString("applicationType", ""); + String settleAccountsDepartCoding = params.optString("settleAccountsDepartCoding", ""); + String handleDepartCoding = params.optString("handleDepartCoding", ""); + //器械包申请单的物品视图是否分成两个grid + boolean tousseApplicationFormGridSplit = false; + if (CssdUtils.getSystemSetConfigByNameBool("tousseApplicationFormGridSplit", false) + && InvoicePlan.TYPE_TOUSSE_APPLICATION_FORM.equals(applicationFormType)) { + tousseApplicationFormGridSplit = true; + } + TousseDefinitionHelper tousseDefinitionHelper = TousseDefinitionHelper.getInstance(); + //根据申请单类型来设置物品类型,用于后面filterGoodByType()方法来过滤对应的物品 + String goodType = tousseDefinitionHelper.setGoodTypeByFormType(applicationFormType); + // 模板Id + String templateId = params.optString("templateId", null); + // 申请单Id + String applicationId =params.optString("id", null); + StringBuffer leftStoreJson = new StringBuffer(); + StringBuffer rightStoreJson = new StringBuffer(); + // 申请单申请的物品(注意key的取值:如果是“消毒物品”=类型;名称,其他的物品=类型;id) + Map applicationItemMap = new HashMap(); + InvoicePlan application = null; + if (StringUtils.isNotBlank(applicationId)) { + application = invoicePlanManager.get(applicationId); + if (application != null) { + for (TousseItem tousseItem : application.getApplicationItems()) { + String tousseType = tousseItem.getTousseType(); + String key = ""; + if (TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals(tousseType)) { + key = String.format("%s;%s", tousseType, tousseItem.getTousseName()); + } else { + key = String.format("%s;%s", tousseType, (tousseItem.disposable() ? tousseItem.getDisposableGoodsId() : tousseItem.getTousseDefinitionId())); + } + applicationItemMap.put(key, tousseItem); + } + } + } + boolean isUpdateStatus = true;// 是否更新借物单状态为已归还 + + // 当前登录用户所属的科室 + String orgunitCodes = ""; + // 编辑时模板为申请科室模板 + if (application != null) { + orgunitCodes = application.getDepartCoding(); + } else { + orgunitCodes = AcegiHelper.getLoginUser().getCurrentOrgUnitCode(); + } + //判断是否需要重新加载模板,如果不为空,则根据对应的科室code来加载 + String reloadTemplate = params.optString("reloadTemplate", null); + if(reloadTemplate != null){ + orgunitCodes = reloadTemplate; + } + SupplyRoomConfig config = supplyRoomConfigManager + .getFirstSupplyRoomConfig(); + // 是否一级供应室 + boolean isSupplyRoom = false; + if (config != null && StringUtils.isNotBlank(config.getOrgUnitCoding())) { + if (orgunitCodes.equals(config.getOrgUnitCoding())) { + isSupplyRoom = true; + } + } + + List templates = null; + if (StringUtils.isNotBlank(templateId)) { + templates = new ArrayList(); + DepartmentAppTemplate template = departmentAppTemplateManager.getAppTemplateById(templateId); + templates.add(template); + } else { + templates = departmentAppTemplateManager.getDepartmentAppTemplates(orgunitCodes); + } + double disposableFloatPercent = supplyRoomConfigManager.getDisposableGoodsFluctuationDoubleByOrgUnitCoding(settleAccountsDepartCoding); //一次性物品的浮动系数 + double tousseDefinitionFloatPercent = supplyRoomConfigManager.getTousseFluctuationPercent(); + + //1、处理科室申领模板配置的物品 + if (InvoicePlan.TYPE_COMBO_FORM.equals(applicationFormType)) { + // 组合申请单的处理逻辑 + JSONArray toussesJsonArray = new JSONArray(); + JSONArray diposableJsonArray = new JSONArray(); + + if (templates != null){ + List tousseItems = departmentAppTemplateManager.getTousseDefinitionTemplateItems(templates); + List diposableGoodsItems = departmentAppTemplateManager.getDiposableGoodsTemplateItems(templates); + + departmentAppTemplateManager.tousseDefinitionTemplateItems2JsonArray(toussesJsonArray, tousseItems,tousseDefinitionFloatPercent); + departmentAppTemplateManager.diposableTemplateItems2JsonArray(handleDepartCoding, diposableJsonArray, diposableGoodsItems,disposableFloatPercent,null); + } + + updateItemsApplyInfo(applicationItemMap, toussesJsonArray); + updateItemsApplyInfo(applicationItemMap, diposableJsonArray); + + appendJsonString(leftStoreJson, toussesJsonArray.toString()); + appendJsonString(rightStoreJson, diposableJsonArray.toString()); + } else { + // 一级供应室默认拿第一个模板(供应室支持多张模板,页面提供模板切换功能)(为什么“器械包申请单”或者“消毒物品申请单”这两种申请单类型,会拿全部非一次性物品模板,而“一次性物品申请单”只拿第一个一次性物品模板呢???) + if (isSupplyRoom) { + if (InvoicePlan.TYPE_DIPOSABLE_GOODS_APPLICATION_FORM.equals(applicationFormType)) {// 一次性物品 + if (templates != null && templates.size() > 0) { + DepartmentAppTemplate diposableTemplate = null; + for (DepartmentAppTemplate template : templates) { + if (DepartmentAppTemplate.TEMPLATE_TYPE_DIPOSABLEGOODS.equals(template.getTemplateType())) { + diposableTemplate = template; + break; + } + } + if (diposableTemplate != null) { + JSONArray diposableJsonArray = new JSONArray(); + departmentAppTemplateManager.diposableTemplateItems2JsonArray(handleDepartCoding, diposableJsonArray, + diposableTemplate.getDiposableGoodsTemplateItems(), disposableFloatPercent, specifyDisposableTypes); + updateItemsApplyInfo(applicationItemMap, diposableJsonArray); + appendJsonString(rightStoreJson, diposableJsonArray.toString()); + } + } + } else { + if (templates != null && templates.size() > 0) { + for (DepartmentAppTemplate template : templates) { + String templateType = template.getTemplateType(); + if (DepartmentAppTemplate.TEMPLATE_TYPE_DIPOSABLEGOODS.equals(templateType)) { + continue; + } + JSONArray toussesJsonArray = new JSONArray(); + List tempList = tousseDefinitionHelper.filterGoodByType(template, goodType); + departmentAppTemplateManager.tousseDefinitionTemplateItems2JsonArray(toussesJsonArray, tempList, tousseDefinitionFloatPercent); + updateItemsApplyInfo(applicationItemMap, toussesJsonArray); + + if (DepartmentAppTemplate.TEMPLATE_TYPE_TOUSSE1.equals(templateType) && tousseApplicationFormGridSplit) { + appendJsonString(leftStoreJson, toussesJsonArray.toString()); + } else { + appendJsonString(rightStoreJson, toussesJsonArray.toString()); + } + } + } + } + // 临床科室查询所有申请模板后合并所有模板 + } else { + if (InvoicePlan.TYPE_DIPOSABLE_GOODS_APPLICATION_FORM.equals(applicationFormType)) {// 一次性物品 + if (templates != null){ + JSONArray diposableJsonArray = new JSONArray(); + for (DepartmentAppTemplate template : templates) { + departmentAppTemplateManager.diposableTemplateItems2JsonArray(handleDepartCoding, diposableJsonArray, + template.getDiposableGoodsTemplateItems(), disposableFloatPercent, specifyDisposableTypes); + } + + updateItemsApplyInfo(applicationItemMap, diposableJsonArray); + appendJsonString(rightStoreJson, diposableJsonArray.toString()); + } + } else { + if (templates != null) { + for (DepartmentAppTemplate template : templates) { + String templateType = template.getTemplateType(); + if (DepartmentAppTemplate.TEMPLATE_TYPE_DIPOSABLEGOODS.equals(templateType)) { + continue; + } + + JSONArray toussesJsonArray = new JSONArray(); + List tempList = tousseDefinitionHelper.filterGoodByType(template, goodType); + //按照sortNumber重新排序 + departmentAppTemplateManager.sortTousseTemplateItems(tempList); + departmentAppTemplateManager.tousseDefinitionTemplateItems2JsonArray(toussesJsonArray, tempList, tousseDefinitionFloatPercent); + updateItemsApplyInfo(applicationItemMap, toussesJsonArray); + + if (DepartmentAppTemplate.TEMPLATE_TYPE_TOUSSE1.equals(templateType) && tousseApplicationFormGridSplit) { + appendJsonString(leftStoreJson, toussesJsonArray.toString()); + } else { + appendJsonString(rightStoreJson, toussesJsonArray.toString()); + } + } + } + } + } + } + + //2、被科室申领模版过滤后的剩下的申请物品 + Iterator iterator = applicationItemMap.keySet().iterator(); + while (iterator.hasNext()) { + String key = iterator.next(); + TousseItem tousseItem = applicationItemMap.get(key); + if (InvoicePlan.TYPE_COMBO_FORM.equals(applicationFormType) || InvoicePlan.TYPE_RECYCLINGCREATE_APPLICATION.equals(applicationFormType)) { + if (TousseItem.TYPE_DIPOSABLE_GOODS.equals(tousseItem.getTousseType())){ + JSONObject json = this.getDisposableGoodMsg(tousseItem,disposableFloatPercent); + // 设置是否已经终止的状态的checkbox + boolean isTerminated = BooleanUtils.isTrue(tousseItem.getIsTerminated()); + json.put("isTerminated", isTerminated); + json.put("checked", isTerminated); + + //如果urgentAmount是空或者是0,则给页面返回空字符串 + String urgentAmount = StringTools.handleNullOrZero(tousseItem.getUrgentAmount()); + String urgentLevel = tousseItem.getUrgentLevel(); + json.put("urgentAmount",urgentAmount); + json.put("urgentLevel",urgentLevel); + appendJsonString(rightStoreJson, json.toString()); + } else { + TousseDefinition td = tousseDefinitionManager.getTousseDefinitionByTousseItem(tousseItem); + JSONObject json = departmentAppTemplateManager.tousseItem2Json(tousseItem, td, tousseDefinitionFloatPercent); + if (InvoicePlan.TYPE_RECYCLINGCREATE_APPLICATION.equals(applicationFormType)) { + appendJsonString(rightStoreJson, json.toString()); + } else { + appendJsonString(leftStoreJson, json.toString()); + } + } + } else { + if (InvoicePlan.TYPE_DIPOSABLE_GOODS_APPLICATION_FORM.equals(applicationFormType)) { + JSONObject json = this.getDisposableGoodMsg(tousseItem,disposableFloatPercent); + appendJsonString(rightStoreJson, json.toString()); + } else { + TousseDefinition td = tousseDefinitionManager.getTousseDefinitionByTousseItem(tousseItem); + JSONObject json = departmentAppTemplateManager.tousseItem2Json(tousseItem, td, tousseDefinitionFloatPercent); + + if (tousseApplicationFormGridSplit) { + appendJsonString(leftStoreJson, json.toString()); + } else { + appendJsonString(rightStoreJson, json.toString()); + } + } + } + } + JSONObject leftStore = new JSONObject(); + JSONObject rightStore = new JSONObject(); + String left = goodFilterConfigManagerImpl.buildBWListTemplate(leftStoreJson.toString(), orgunitCodes); + String right = goodFilterConfigManagerImpl.buildBWListTemplate(rightStoreJson.toString(), orgunitCodes); + leftStore.put("children", left); + rightStore.put("children", right); + setApplicationReaded(application, config); + obj = JSONUtil.buildJsonObject(true); + obj.put("disposableFloatPercent", disposableFloatPercent); + obj.put("updateStatus", isUpdateStatus); + obj.put("leftStore", leftStore); + obj.put("rightStore", rightStore); + } catch (Exception e) { + e.printStackTrace(); + obj = JSONUtil.buildJsonObject(false, e.getMessage()); + } + return obj.toString(); + } + /** + * 获得对应的一次性物品信息 + * @param tousseItem 一次物品的申请项 + * @param diposableFloatPercent 浮动价格 + * @return json格式的一次性物品 + */ + private JSONObject getDisposableGoodMsg(TousseItem tousseItem, double diposableFloatPercent){ + Long itemId = tousseItem.getId(); + Integer itemAmount = tousseItem.getAmount(); + DisposableGoods disposableGoods = diposableGoodsManager.get(tousseItem.getDisposableGoodsId()); + JSONObject json = departmentAppTemplateManager.diposableItem2Json(tousseItem.getInvoicePlan().getHandleDepartCoding(), itemId.toString(), itemAmount, disposableGoods, diposableFloatPercent, tousseItem); + this.resetUnitAndCountAndRowPrice(tousseItem,json); + this.setTerminatedAndChecked(tousseItem, json); + return json; + } + /** + * 把appendContent拼接到jsonStore的后面,如果appendContent有被[]包围则去掉 + * @param jsonStore + * @param appendContent + */ + private void appendJsonString(StringBuffer jsonStore, String appendContent) { + if (appendContent.startsWith("[")){ + appendContent = appendContent.substring(1,appendContent.length() - 1); + } + if (StringUtils.isNotBlank(appendContent)){ + jsonStore.append(jsonStore.length() > 0 ? "," : "").append(appendContent); + } + } + /** + * 设置InvoicePlan的readed属性,即是否已读 + * @param application + * @param config + */ + private void setApplicationReaded(InvoicePlan application, + SupplyRoomConfig config) { + String userOrgCode = AcegiHelper.getLoginUser().getCurrentOrgUnitCode(); + userOrgCode = "5071"; + if (userOrgCode != null && userOrgCode.equals(config.getOrgUnitCoding()) + && application != null && application.getCommittedStatus() + && !application.readed()) { + application.setReaded(InvoicePlan.READED); + objectDao.saveOrUpdate(application); + } + } + /** + * 遍历所定义的模板的物品的toussesJsonArray,查找其中的物品是否有已申领的物品,如果有,则更新数量和价格信息,并且从applicationItemMap删除. + * @param applicationItemMap 申请项的Map<如果是消毒物品 key="类型;名称",其他的物品则key="类型;id",申请项> + * @param toussesJsonArray 科室申领模版配置的物品集合 + */ + private void updateItemsApplyInfo( + Map applicationItemMap, + JSONArray toussesJsonArray) { + if (applicationItemMap.size() <= 0) { + return; + } + for (int i = 0; i < toussesJsonArray.size(); i++) { + JSONObject obj = toussesJsonArray.getJSONObject(i); + //这个json对象的tousseDefinitionID既可以表示一次性物品定义的id也可以表示器械包定义的id + String goodsId = obj.optString("tousseDefinitionID"); + String tousseType = obj.optString("tousseType"); + String goodsName = obj.optString("name"); + //注意key的取值:如果是消毒物品,key="类型;名称";其他的物品,key="类型;id" + String key = null; + if (TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals(tousseType)) { + key = String.format("%s;%s", tousseType, goodsName); + } else { + key = String.format("%s;%s", tousseType, goodsId); + } + TousseItem tousseItem = applicationItemMap.get(key); + if (tousseItem != null) { + String amountStr = tousseItem.getAmount().toString(); + String urgentAmount = StringTools.handleNullOrZero(tousseItem.getUrgentAmount()); + String urgentLevel = tousseItem.getUrgentLevel(); + //删除科室申领模板里面配置的 + applicationItemMap.remove(key); + JSONArray materialsArray = new JSONArray(); + if(TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals(tousseType)){ + Long tousseDefinitionId = tousseItem.getTousseDefinitionId(); + TousseDefinition td = tousseDefinitionManager.get(tousseDefinitionId); + materialsArray = tousseDefinitionManager.getMaterialsOfDisinfectionGoods(td); + String materialsString = materialsArray.toString(); + + obj.put("materials",materialsString); + obj.put("children",materialsString); + obj.put("isApplyEntireTousse", td.getIsApplyEntireTousse()); + + // 对于非整包清洗的消毒物品,不显示包数量 + if (!td.applyEntireTousse()){ + amountStr = ""; + } + } + obj.put("urgentLevel", urgentLevel); + obj.put("id", tousseItem.getId().toString()); + obj.put("recyclingAmount", tousseItem.getRecyclingAmount()); + obj.put("urgentAmount", urgentAmount); + obj.put("count", amountStr); + obj.put("countBackup", amountStr); //申请的数量备份起来 + obj.put("sendOutAmount", tousseItem.getSendOutAmount()); //已经发货的数量 + obj.put("price", tousseItem.getPrice()); + obj.put("totalPrice", tousseItem.getRowPrice()); + boolean isTerminated = BooleanUtils.isTrue(tousseItem.getIsTerminated()); + obj.put("isTerminated", isTerminated); + obj.put("checked", isTerminated); + this.resetUnitAndCountAndRowPrice(tousseItem,obj); + toussesJsonArray.set(i, obj); + } + } + } + /** + * 重新设置单位和数量和总价(这个是用于有中包装规格的) + * @param tousseItem + * @param json + */ + private void resetUnitAndCountAndRowPrice(TousseItem tousseItem,JSONObject json){ + //如果是该一次性物品配置了中包装单位,中包装单位装换单位系数,中包装数量,则需要重新设置页面显示的数量,单位,总价 + if (StringUtils.isNotEmpty(tousseItem.getMiddlePackageUnit()) && tousseItem.getMiddlePackageAmount() != null && tousseItem.getTransferScale() != null) { + json.put("count", tousseItem.getMiddlePackageAmount()); + json.put("unitCount", tousseItem.getAmount()); + json.put("unit", tousseItem.getMiddlePackageUnit()); + json.put("minUnit", tousseItem.getUnit()); + json.put("transferScale", tousseItem.getTransferScale()); + Double totalPrice = MathTools.mul(Double.parseDouble(json.get("price").toString()), tousseItem.getAmount()).doubleValue(); + json.put("totalPrice", totalPrice); + } + } + /** + * 设置终止状态和已选状态, 返回页面使用,如果该物品是已经终止了的,则会有isTerminated和checked,页面上该行会被选中并且变成红色 + * @param tousseItem 该申请物品 + * @param json 返回页面的json格式数据 + */ + private void setTerminatedAndChecked(TousseItem tousseItem, JSONObject json){ + if(tousseItem != null){ + boolean isTerminated = BooleanUtils.isTrue(tousseItem.getIsTerminated()); + json.put("isTerminated", isTerminated); + json.put("checked", isTerminated); + } + } + //-------------------------加载科室申请的器械包模板 end------------------------------ + /** + * pda根据关键字搜索科室. + * return [totalCount:"结果条数",data:[{departmentName:"科室名称",departmentCode:"科室编码"},{},{}...]] + * @param onlyOneself 临床科室是否只能看到自己直属的科室默认是 + */ + public String searchApplyDepartmentByKeyWord(JSONObject params) { + JSONObject resultObj = new JSONObject(); + try { + String spell = params.optString("spell", ""); + String departmentCode = params.optString("departmentCode", ""); + int pageSize = params.optInt("pageSize", 0); + int pageNo = params.optInt("pageNo", 1); + List> list = new ArrayList>(); + //如果指定了要加载哪个科室,则直接返回即可 + if (StringTools.isNotBlank(departmentCode)) { + OrgUnit specifyDepartment = orgUnitManager.getByCode(departmentCode); + if (specifyDepartment != null) { + JSONObject obj = new JSONObject(); + obj.put("departmentName", specifyDepartment.getName()); + obj.put("departmentCode", specifyDepartment.getOrgUnitCoding()); + list.add(obj); + } + } else { + boolean onlyOneself = params.optBoolean("onlyOneself", true); + list = orgUnitManager.searchDepartmentByKeyWord(spell, onlyOneself, 3, pageSize, (pageNo - 1) * pageSize); + } + resultObj.put("success", true); + resultObj.put("data", list); + } catch (Exception e) { + e.printStackTrace(); + resultObj.put("success", false); + resultObj.put("message", "查询异常"); + } + return resultObj.toString(); + } }