Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManager.java =================================================================== diff -u -r17643 -r17914 --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManager.java (.../UseRecordManager.java) (revision 17643) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManager.java (.../UseRecordManager.java) (revision 17914) @@ -117,7 +117,25 @@ * @param applicationFormType 转换申请单的模式,config.js配置 * @return */ - public String createRecyclingApplicationByUseRecords(Collection ids,String applicant, String depart, String departCoding,Date applicationCreateDate,String applicationFormType); + public String createRecyclingApplicationByUseRecords(Collection ids, + String applicant, String depart, String departCoding, + Date applicationCreateDate,String applicationFormType); + /** + * 根据使用记录id创建申请单。移动护理PDA调用,由于没有登录,需要传参 + * @param ids + * @param applicant + * @param depart + * @param departCoding + * @param applicationCreateDate + * @param applicationFormType + * @param reviewer 审核人 + * @param reviewerCode 审核人条码 + * @return + */ + public String createRecyclingApplicationByUseRecords(Collection ids, + String applicant, String depart, String departCoding, + Date applicationCreateDate,String applicationFormType, + String reviewer,String reviewerCode); /** * 根据使用记录创建申请单(原中六的方法) @@ -141,9 +159,32 @@ * @param ids:需要返回成"未审核"状态的使用记录的id的集合 */ public void becomeNotAudited(List ids); - // 保存并审核生成申请单 + /** + * 保存并审核生成申请单 + * @param modified + * @param applicant + * @param depart + * @param departCodeing + * @param applicationCreateDate + * @param applicationFormType + * @throws Exception + */ public void saveAndReviewAndConvertUseRecordForm_TRANS_REQUIRED(UseRecord modified,String applicant, String depart, String departCodeing,Date applicationCreateDate,String applicationFormType)throws Exception; /** + * 保存并审核生成申请单 + * @param modified + * @param operator + * @param depart + * @param departCoding + * @param applicationCreateDate + * @param applicationFormType + * @param reviewer + * @param reviewCode + * @throws Exception + */ + public void saveAndReviewAndConvertUseRecordForm_TRANS_REQUIRED(UseRecord modified,String operator, String depart, + String departCoding,Date applicationCreateDate,String applicationFormType,String reviewer,String reviewCode) throws Exception; + /** * 根据病历号及申请人提交回调(中山六院以外的医院通用) * @param patientNumber 病历号 * @param applicant 申请人 Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordAction.java =================================================================== diff -u -r17544 -r17914 --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordAction.java (.../UseRecordAction.java) (revision 17544) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordAction.java (.../UseRecordAction.java) (revision 17914) @@ -1,7 +1,6 @@ package com.forgon.disinfectsystem.useRecord.action; import java.io.IOException; -import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; @@ -10,47 +9,31 @@ import java.util.List; import java.util.Map; -import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang3.BooleanUtils; import org.apache.log4j.Logger; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; import com.forgon.Constants; import com.forgon.directory.acegi.tools.AcegiHelper; -import com.forgon.directory.model.BarcodeDevice; -import com.forgon.disinfectsystem.barcode.service.BarcodeManager; -import com.forgon.disinfectsystem.basedatamanager.goodsdepartshareconfig.service.GoodsDepartShareConfigManager; -import com.forgon.disinfectsystem.common.CssdUtils; -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.ExpensiveDisposablegoods; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstanceUseRecord; -import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; -import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.entity.useRecord.UseDiposableGoodsItem; import com.forgon.disinfectsystem.entity.useRecord.UseRecord; -import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; -import com.forgon.disinfectsystem.useRecord.service.UseRecordManager; import com.forgon.disinfectsystem.vo.UseMaterialGoodsItem; import com.forgon.systemsetting.model.HttpOption; import com.forgon.systemsetting.service.HttpOptionManager; import com.forgon.tools.StrutsParamUtils; import com.forgon.tools.StrutsResponseUtils; import com.forgon.tools.date.DateTools; -import com.forgon.tools.db.DatabaseUtil; -import com.forgon.tools.hibernate.ObjectDao; import com.forgon.tools.json.JSONUtil; import com.forgon.tools.string.StringTools; import com.google.gson.Gson; @@ -65,32 +48,16 @@ @ParentPackage(value = "default") @Namespace(value = "/disinfectSystem") @Action(value = "useRecordAction") -public class UseRecordAction implements ModelDriven { +public class UseRecordAction extends UseRecordActionBase implements ModelDriven { private static final Logger logger = Logger .getLogger(UseRecordAction.class); // 使用记录 private UseRecord useRecord = new UseRecord(); private String tousseInstanceBarcodes; - private UseRecordManager useRecordManager; - - private TousseInstanceManager tousseInstanceManager; - private HttpOptionManager httpOptionManager; - private BarcodeManager barcodeManager; - - private DiposableGoodsManager diposableGoodsManager; - - private GoodsDepartShareConfigManager goodsDepartShareConfigManager; - - private ObjectDao objectDao; - - public void setBarcodeManager(BarcodeManager barcodeManager) { - this.barcodeManager = barcodeManager; - } - public void setHttpOptionManager(HttpOptionManager httpOptionManager) { this.httpOptionManager = httpOptionManager; } @@ -99,32 +66,10 @@ this.tousseInstanceBarcodes = tousseInstanceBarcodes; } - public void setTousseInstanceManager( - TousseInstanceManager tousseInstanceManager) { - this.tousseInstanceManager = tousseInstanceManager; - } - public void setUseRecord(UseRecord useRecord) { this.useRecord = useRecord; } - public void setUseRecordManager(UseRecordManager useRecordManager) { - this.useRecordManager = useRecordManager; - } - - public void setDiposableGoodsManager(DiposableGoodsManager diposableGoodsManager) { - this.diposableGoodsManager = diposableGoodsManager; - } - - public void setGoodsDepartShareConfigManager( - GoodsDepartShareConfigManager goodsDepartShareConfigManager) { - this.goodsDepartShareConfigManager = goodsDepartShareConfigManager; - } - - public void setObjectDao(ObjectDao objectDao) { - this.objectDao = objectDao; - } - public void getOperationName() { List list = httpOptionManager .getHttpOptionTextById(HttpOption.SYSTENSETTING_OPERATION_NAME); @@ -143,7 +88,16 @@ e.printStackTrace(); } } - + /** + * 加载扫描物品 + */ + public void loadScanedGoods() { + String barcode = StrutsParamUtils.getPraramValue("barcode", null); + String scanedBarcodes = StrutsParamUtils.getPraramValue("scanedBarcodes", ""); + String currentOrgUnitCode = AcegiHelper.getCurrentOrgUnitCode(); + + loadBarcode(barcode, scanedBarcodes, currentOrgUnitCode); + } // @Deprecated // 没有做并发控制,没有地方调用了 // public void saveUseRecord() { // @@ -161,58 +115,6 @@ // } // } - // 设置items参数 - private void setUseRecordItemsFromParams(UseRecord useRecord,String items){ - // items列表 - List tousseInstanceList = new LinkedList(); - List diposableGoodsList = new LinkedList(); - useRecord.setTousseInstanceList(tousseInstanceList); - useRecord.setDiposableGoodsItems(diposableGoodsList); - JSONArray itemsArray = JSONArray.fromObject(items); - int size = itemsArray.size(); - BarcodeDevice barcodeDevice = null; - for (int i = 0; i < size; ++i) { - JSONObject obj = itemsArray.getJSONObject(i); - if(obj == null){ - throw new RuntimeException("器械包参数错误!"); - } - String type = obj.optString("tousseType"); - String barcode = JSONUtil.optString(obj,"barcode",""); - if("一次性物品".equals(type)){ - Long itemId = JSONUtil.optLong(obj,"id",null); - UseDiposableGoodsItem di = new UseDiposableGoodsItem(); - di.setId(itemId); - di.setName(obj.optString("showTousseName")); - di.setBarcode(barcode); - di.setBatchNo(obj.optString("batchNo")); - di.setAmount(obj.optInt("amount")); - di.setValidUntil(obj.optString("validUntil")); - //根据条码查询对应的一次性物品或高值耗材,并记录最后的一次性物品id - barcodeDevice = barcodeManager.getBarcodeByBarcode(barcode); - if(barcodeDevice instanceof DisposableGoodsBatch || barcodeDevice instanceof ExpensiveDisposablegoods){ - if(barcodeDevice instanceof DisposableGoodsBatch){ - di.setDisposableGoodsId(((DisposableGoodsBatch)barcodeDevice).getDiposableGoods().getId()); - }else if(barcodeDevice instanceof ExpensiveDisposablegoods){ - di.setDisposableGoodsId(((ExpensiveDisposablegoods)barcodeDevice).getDisposableGoodsID()); - } - }else{ - //通常不会有这种情况,此处暂不处理,也不丢弃此数据 - } - diposableGoodsList.add(di); - }else{ - TousseInstance tousseInstance = new TousseInstance(); - Long itemId = JSONUtil.optLong(obj,"id",null); - tousseInstance.setId(itemId); - tousseInstance.setBarcode(barcode); - tousseInstance.setIsUrgentForUseRecord(JSONUtil.optString(obj, "isUrgentForUseRecord", Constants.STR_NO)); - tousseInstance.setActualUsed(JSONUtil.optString(obj, "actualUsed", Constants.STR_YES)); - //设置使用记录顺序号 - tousseInstance.setUseRecordSortNumber(i + 1); - tousseInstanceList.add(tousseInstance); - } - } - } - private void buildUseRecordParamsForUpdate( UseRecord modified) { String items = StrutsParamUtils.getPraramValue("items", ""); @@ -267,11 +169,6 @@ return original; } - private void buildUseRecordParamsForSave(UseRecord modified) { - String items = StrutsParamUtils.getPraramValue("items", ""); - setUseRecordItemsFromParams(modified, items); - } - // 增加并发控制 public void saveUseRecord2() { JSONObject json = JSONUtil.buildJsonObject(false); @@ -501,9 +398,7 @@ String applicationFormType = StrutsParamUtils.getPraramValue("applicationFormType", ""); String operator = StrutsParamUtils.getPraramValue("operator", ""); String depart = StrutsParamUtils.getPraramValue("depart", ""); - String departCoding = StrutsParamUtils.getPraramValue("departCoding", - ""); - String returnMsg = "{success:true,msg:'"; + String departCoding = StrutsParamUtils.getPraramValue("departCoding",""); String msg = "";// 定义只能为空字符串,不要赋其它值,否则前端判断会当成失败的消息,从而导致正常转换后申请单后未刷新界面 List failedMessages = new LinkedList(); @@ -523,13 +418,9 @@ if (failedMessages.size() > 0) { msg = StringUtils.join(failedMessages, ","); } - StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); - try { - StrutsParamUtils.getResponse().getWriter() - .println(returnMsg + msg + "'}"); - } catch (IOException e) { - e.printStackTrace(); - } + JSONObject json = JSONUtil.buildJsonObject(true); + json.put("msg", msg); + StrutsResponseUtils.output(json); } public void loadUseRecord() { @@ -615,264 +506,6 @@ } } - /** - * 加载扫描物品 - */ - public void loadScanedGoods(){ - String barcode = StrutsParamUtils.getPraramValue("barcode", null); - String scanedBarcodes = StrutsParamUtils.getPraramValue("scanedBarcodes", ""); - JSONObject obj = new JSONObject(); - HttpServletResponse response = StrutsParamUtils.getResponse(); - response.setCharacterEncoding("UTF-8"); - PrintWriter out = null; - try { - out = response.getWriter(); - obj.put("success", true); - if (StringUtils.isNotBlank(barcode)) { - BarcodeDevice bd = barcodeManager.getBarcodeByBarcode(barcode); - if (bd != null) { - //检测器械包所属科室是否与当前用户所在科室为物品共用科室 - String currentOrgUnitCode = AcegiHelper.getCurrentOrgUnitCode(); - if (bd instanceof TousseInstance) { - TousseInstance ti = (TousseInstance) bd; - - // 1.判断是否为聚合包内的普通包实例,如果是则提示该包不能录入使用记录 - if(DatabaseUtil.isPoIdValid(ti.getComboTousseInstanceId())){ - obj.put("success", false); - obj.put("error", "条码为" + barcode + "的包属于聚合包内的器械包,不能录入使用记录"); - return; - } - - // 2.判断是否为聚合包,如果是,则需要验证所录入的使用记录次数是否大于其包内普通包实例个数 - if(ti.isComboTousse()){ - int useTimes = objectDao.countBySql("select count(0) from TousseInstanceUseRecord where tousseInstanceId=" + ti.getId()); - List tousseInstanceList = ti.getTousseInstancesBelongToThisComboTousse(objectDao); - int size = CollectionUtils.isNotEmpty(tousseInstanceList) ? tousseInstanceList.size() : 0; - if(useTimes >= size){ - obj.put("success", false); - obj.put("error", "条码为" + barcode + "的聚合包使用次数已经达到其包内器械包的数量,不能再录入"); - return; - } - - // 如果有签收时间则还原为签收状态,否则还原为器械包实例“已发货”状态,便于继续录使用记录 - if (ti.getSignedDate() != null) { - ti.setStatus(TousseInstance.STATUS_SIGNED); - } else { - ti.setStatus(TousseInstance.STATUS_SHIPPED); - } - } - - // 3.检测该器械包有没有被召回 - if (TousseInstance.STATUS_WAIT_FOR_RECALL.equals(ti.getStatus()) || TousseInstance.STATUS_RECALLED.equals(ti.getStatus())) { - obj.put("msg", "该器械包不能被使用,已被召回!"); - } else if(!TousseInstance.STATUS_SHIPPED.equals(ti.getStatus()) && !TousseInstance.STATUS_SIGNED.equals(ti.getStatus())){ - obj.put("msg", "该器械包状态为" + ti.getStatus() + ",不能录入使用记录!"); - } else { - List acceptStatus = new ArrayList<>(); - boolean notSignedItemsCanRegistUseRecord = CssdUtils.getSystemSetConfigByNameBool("notSignedItemsCanRegistUseRecord"); - if(notSignedItemsCanRegistUseRecord){ - acceptStatus.add(TousseInstance.STATUS_SHIPPED); - } - acceptStatus.add(TousseInstance.STATUS_SIGNED); - TousseInstance older = tousseInstanceManager.getExpireNearest(ti, acceptStatus,StringTools.toCollectionIgnoreNullAndBlank(scanedBarcodes)); - //判断当前用户登录科室是否存在共用科室配置 - if(CollectionUtils.isNotEmpty(goodsDepartShareConfigManager.getGoodsShareDepartList(currentOrgUnitCode))){ - //判断包实例所属科室是否与当前用户登录科室配置物品共享 - if(goodsDepartShareConfigManager.canShareGoodsforTwoDepart(currentOrgUnitCode, ti.getLocation())){ - String validUntilStr = ti.getValidUntilStr(Constants.SIMPLEDATEFORMAT_YYYYMMDD); - TousseDefinition td = ti.getTousseDefinition(); - String tousseDefinitionName = ""; - String tousseType = ""; - String includeImplant = ""; - if (td != null) { - tousseType = td.getTousseType(); - tousseDefinitionName = td.getName(); - includeImplant = td.getIncludeImplantStr(); - } - obj.put("id", ti.getId()); - obj.put("barcode", ti.getBarcode()); - obj.put("tousseDefinitionName", tousseDefinitionName); - obj.put("showTousseName", ti.getShowTousseName()); - obj.put("packageType", ti.getPackageType()); - obj.put("validUntil", validUntilStr); - obj.put("status", ti.getStatus()); - obj.put("location",ti.getLocation()); - obj.put("locationForDisplay",ti.getLocationForDisplay()); - obj.put("materials", null); - obj.put("foreignTousseApp_id",ti.getForeignTousseApp_id()); - obj.put("tousseType", tousseType); - obj.put("includeImplant", includeImplant); - obj.put("actualUsed", Constants.STR_YES); //扫描的时候,都取默认值,为是。以免录了使用记录之后,又删除了,就把包实例这个属性修改了,再扫描,就不是默认的值了 - obj.put("haveUnSupplementMaterials", BooleanUtils.toBooleanDefaultIfNull(ti.getHaveUnSupplementMaterials(), false)); - }else{ - obj.put("msg", "该器械包所属科室为" + ti.getLocationForDisplay() + ",未配置与当前科室共用,不能录入使用记录!"); - } - }else{ - //判断包实例所在位置与当前用户所在科室是否一致 - if(StringUtils.equals(currentOrgUnitCode, ti.getLocation())){ - String validUntilStr = ti.getValidUntilStr(Constants.SIMPLEDATEFORMAT_YYYYMMDD); - TousseDefinition td = ti.getTousseDefinition(); - String tousseDefinitionName = ""; - String tousseType = ""; - String includeImplant = ""; - if (td != null) { - tousseType = td.getTousseType(); - tousseDefinitionName = td.getName(); - includeImplant = td.getIncludeImplantStr(); - } - obj.put("id", ti.getId()); - obj.put("barcode", ti.getBarcode()); - obj.put("tousseDefinitionName", tousseDefinitionName); - obj.put("showTousseName", ti.getShowTousseName()); - obj.put("packageType", ti.getPackageType()); - obj.put("validUntil", validUntilStr); - obj.put("status", ti.getStatus()); - obj.put("location",ti.getLocation()); - obj.put("locationForDisplay",ti.getLocationForDisplay()); - obj.put("materials", null); - obj.put("foreignTousseApp_id",ti.getForeignTousseApp_id()); - obj.put("tousseType", tousseType); - obj.put("includeImplant", includeImplant); - obj.put("actualUsed", Constants.STR_YES); - obj.put("haveUnSupplementMaterials", BooleanUtils.toBooleanDefaultIfNull(ti.getHaveUnSupplementMaterials(), false)); - }else{ - obj.put("msg", "该器械包所属科室为" + ti.getLocationForDisplay() + ",不能录入使用记录!"); - } - } - if(older != null){ - JSONObject json = new JSONObject(); - json.put("barcode", older.getBarcode()); - json.put("tousseName", older.getTousseDefinitionName()); - obj.put("older", json); - } - } - } else if (bd instanceof ExpensiveDisposablegoods) { - // 高值耗材 - ExpensiveDisposablegoods expensiveDisposablegoods = (ExpensiveDisposablegoods) bd; - if(!ExpensiveDisposablegoods.STATUS_DELIVERED.equals(expensiveDisposablegoods.getStatus())){ - obj.put("success", false); - obj.put("error", String.format("条码为[%s]的高值耗材状态为%s,不能录使用记录", barcode,expensiveDisposablegoods.getStatus())); - return; - } - - //判断该高值耗材关联的一次性物品定义的物品类型是否为高值耗材(防止入库时定义为高值耗材,后来修改定义为非高值耗材) - if(expensiveDisposablegoods.getDisposableGoodsID() == null){ - obj.put("success", false); - obj.put("error", String.format("条码为[%s]的高值耗材未找到一次性物品定义", barcode)); - return; - } - DisposableGoods disposableGoods = - diposableGoodsManager.getDisposableGoodsById(String.valueOf(expensiveDisposablegoods.getDisposableGoodsID())); - if(disposableGoods == null){ - obj.put("success", false); - obj.put("error", String.format("条码为[%s]的高值耗材一次性物品定义已被删除", barcode)); - return; - } - - if(!DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS.equals(disposableGoods.getGoodsType())){ - obj.put("success", false); - obj.put("error", String.format("条码为[%s]的高值耗材对应一次性物品不为高值耗材", barcode)); - return; - } - - //需要判断发货单是否存在且发货科室与当前登录用户是否为同一个科室,否则给予提示 - Long invoiceId = expensiveDisposablegoods.getInvoiceId(); - if(invoiceId == null){ - obj.put("success", false); - obj.put("error", String.format("条码为[%s]的高值耗材发货单已被删除", barcode)); - return; - } - - Invoice invoice = useRecordManager.getInvoiceById(invoiceId); - if(invoice == null){ - obj.put("success", false); - obj.put("error", String.format("条码为[%s]的高值耗材发货单已被删除", barcode)); - return; - } - - /*if(!StringUtils.equals(invoice.getDepart(), AcegiHelper.getLoginUser().getCurrentOrgUnitName())){ - obj.put("success", false); - obj.put("error", String.format("条码为[%s]的高值耗材所属科室与当前登录用户所属科室不一致", barcode)); - return; - }*/ - //判断当前用户登录科室是否存在共用科室配置 - if(CollectionUtils.isNotEmpty(goodsDepartShareConfigManager.getGoodsShareDepartList(currentOrgUnitCode))){ - //判断包实例所属科室是否与当前用户登录科室配置物品共享 - if(!goodsDepartShareConfigManager.canShareGoodsforTwoDepart(currentOrgUnitCode, expensiveDisposablegoods.getLocation())){ - obj.put("success", false); - obj.put("error", String.format("条码为[%s]的高值耗材所属科室为" + invoice.getDepart() + ",未配置与当前科室共用,不能录入使用记录!", barcode)); - return; - } - }else{ - //判断包实例所在位置与当前用户所在科室是否一致 - if(!StringUtils.equals(currentOrgUnitCode, expensiveDisposablegoods.getLocation())){ - obj.put("success", false); - obj.put("error", String.format("条码为[%s]的高值耗材所属科室为" + invoice.getDepart() + ",未配置与当前科室共用,不能录入使用记录!", barcode)); - return; - } - } - - Long disposableGoodsBatchId = expensiveDisposablegoods.getDisposableGoodsBatchID(); - if(disposableGoodsBatchId == null){ - obj.put("success", false); - obj.put("error", String.format("条码为[%s]的高值耗材数据异常,批次定义id为空", barcode)); - return; - } - DisposableGoodsBatch batch = diposableGoodsManager.getDisposableGoodsBatchById(disposableGoodsBatchId); - if(batch == null){ - obj.put("success", false); - obj.put("error", String.format("条码为[%s]的高值耗材批次定义已被删除", barcode)); - return; - } - - //扫描时判断该高值耗材是否已录过使用记录(即在UseDisposableGoodsItem表存中,按barcode查询),保存时也要校验,防止多人同时操作同一条码。普通物品暂不用校验 - if(CollectionUtils.isNotEmpty(useRecordManager.getUseDiposableGoodsItemList(barcode))){ - obj.put("success", false); - obj.put("error", String.format("条码为[%s]的高值耗材已被使用,不能重复添加", barcode)); - return; - } - - obj.put("barcode", bd.getBarcode()); - obj.put("showTousseName", CssdUtils.getDiposableGoodsName(batch.getDiposableGoods())); - obj.put("batchNo", batch.getBatchNumber()); - obj.put("validUntil", batch.getExpDateStr()); - obj.put("tousseType", TousseItem.TYPE_DIPOSABLE_GOODS); - obj.put("goodsType", DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS); - } else if (bd instanceof DisposableGoodsBatch) { - DisposableGoodsBatch batch = (DisposableGoodsBatch) bd; - DisposableGoods disposableGoods = batch.getDiposableGoods(); - if(disposableGoods == null){ - obj.put("success", false); - obj.put("error", String.format("条码为[%s]的一次性物品定义已被删除", barcode)); - return; - } - if(DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS.equals(disposableGoods.getGoodsType())){ - obj.put("success", false); - obj.put("error", String.format("条码为[%s]的一次性物品为高值耗材,只能扫描高值耗材的条码", barcode)); - return; - } - obj.put("barcode", batch.getBarcode()); - obj.put("showTousseName", CssdUtils.getDiposableGoodsName(batch.getDiposableGoods())); - obj.put("batchNo", batch.getBatchNumber()); - obj.put("validUntil", batch.getExpDateStr()); - obj.put("tousseType", TousseItem.TYPE_DIPOSABLE_GOODS); - } - }else{ - obj.put("success", false); - obj.put("error", "条码" + barcode + "为无效条码!"); - } - }else{ - obj.put("success", false); - obj.put("error", "条码不能为空!"); - } - } catch (IOException e) { - e.printStackTrace(); - }finally{ - out.print(obj.toString()); - out.close(); - } - } - public UseRecord getModel() { if (useRecord == null) useRecord = new UseRecord(); Index: ssts-web/src/main/webapp/buttjoint/useRecord/useRecordForm.js =================================================================== diff -u --- ssts-web/src/main/webapp/buttjoint/useRecord/useRecordForm.js (revision 0) +++ ssts-web/src/main/webapp/buttjoint/useRecord/useRecordForm.js (revision 17914) @@ -0,0 +1,1085 @@ + +var entityName = '使用记录'; +Ext4.define('TousseInstance',{ + extend : 'Ext4.data.Model', + fields:['id','barcode','tousseDefinitionName', + 'amount','batchNo','packageType', + 'goodsType','validUntil','showTousseName', + 'tousseType','foreignTousseApp_id','isUrgentForUseRecord', + 'includeImplant','actualUsed','haveUnSupplementMaterials'] + }); + +var tousseInstanceStore = new Ext4.data.Store({ + proxy : { + type : 'ajax', + url : WWWROOT + '/disinfectSystem/useRecordAction!loadTousseInstaceByUseRecordId.do' + }, + model : 'TousseInstance' + }); +/** + * 移除对象 + */ +function removeGridItem() { + var rows = Ext4.getCmp('tousseInstanceGrid').getSelectionModel() + .getSelections();// 返回值为 + if (rows) { + for ( var i = 0; i < rows.length; i++) { + tousseInstanceStore.remove(rows[i]); + useAmount--; + Ext4.getCmp('useAmount').setValue(useAmount); + + } + } +} +//获取扫描的物品所有条码 +function getTousseGridData() { + var tousseInstanceBarcodes = ""; + for ( var i = 0; i < tousseInstanceStore.getCount(); i++) { + var barcode = tousseInstanceStore.getAt(i).get('barcode'); + if (tousseInstanceBarcodes == "") { + tousseInstanceBarcodes = barcode; + } else { + tousseInstanceBarcodes += ("," + barcode); + } + } + Ext4.getCmp('tousseInstanceBarcodes').setValue(tousseInstanceBarcodes); + return tousseInstanceBarcodes; +} + +// 检测该条码是否已在扫描的物品里 +function checkBarcodeIsExist(currentBarcode) { + var exist = false; + if (currentBarcode == "") + return exist; + for ( var i = 0; i < tousseInstanceStore.getCount(); i++) { + var barcode = tousseInstanceStore.getAt(i).get('barcode'); + if (currentBarcode == barcode) { + exist = true; + break; + } + } + return exist; +} +var useAmount = 0; +/** + * 扫描处理 + * @param barcode 扫描的条码 + */ +function scanedBarcode(barcode){ + if(!userCode){ + showResult('用户工号不能为空'); + return; + } + if(!barcode){ + showResult('条码不能为空'); + return; + } + if (checkBarcodeIsExist(barcode)) { + showResult('条码为:' + barcode + '的物品已在当前扫描物品里!'); + return; + } + Ext4.Ajax.request({ + url : WWWROOT + '/buttjoint/buttjointUseRecordAction!loadScanedGoods.do', + params : { + barcode : barcode, + userCode : userCode, + scanedBarcodes : getTousseGridData() + }, + success : function(response, options) { + var result = response.responseText; + if (result != "" && result != "{}") { + var goodsInfo = Ext4.decode(result); + + if(!goodsInfo.success || goodsInfo.success != true){ + showResult(goodsInfo.error); + return; + } + if(goodsInfo.tousseType != '一次性物品'){ + //检测该器械包有没有被召回 + if('msg' in goodsInfo){ + showResult(goodsInfo.msg); + return; + } + var validTime = goodsInfo.validUntil; + var currentTime = Ext4.util.Format.date(new Date(), + 'Y-m-d'); + if(goodsInfo.status == '已退货'){ + showResult('该器械包已退货,不能被使用!'); + return; + } + // 未签收的器械包不能登记使用记录 + if(goodsInfo.status == hadShipped && sstsConfig.notSignedItemsCanRegistUseRecord == false){ + showResult('该器械包未签收,不能被使用!'); + return; + } + if ((goodsInfo.status == hadShipped && sstsConfig.notSignedItemsCanRegistUseRecord != false)|| goodsInfo.status == hadSigned) { + if (!compareDate(currentTime, validTime)) { + showResult('该器械包已过期!'); + } else { + function addTousse(){ + var record = new TousseInstance({ + id : goodsInfo.id, + barcode : goodsInfo.barcode, + amount : 1, + batchNo : '', + tousseDefinitionName : goodsInfo.tousseDefinitionName, + showTousseName : goodsInfo.showTousseName, + packageType : goodsInfo.packageType, + validUntil : validTime, + tousseType : goodsInfo.tousseType, + foreignTousseApp_id : goodsInfo.foreignTousseApp_id, + includeImplant : goodsInfo.includeImplant, + actualUsed : goodsInfo.actualUsed, + haveUnSupplementMaterials : goodsInfo.haveUnSupplementMaterials + }); + tousseInstanceStore.insert(0 , record); + useAmount++; + Ext4.getCmp('useAmount').setValue(useAmount); + } + if(sstsConfig.olderTousseComfirmForUserecord && goodsInfo.older){ + if(confirm(goodsInfo.older.tousseName+"[条码:"+goodsInfo.older.barcode+"]更接近失效期,是否继续?")){ + addTousse(); + } + }else{ + addTousse(); + } + } + } else { + if (sstsConfig.notSignedItemsCanRegistUseRecord == false){ + showResult('器械包状态为【' + goodsInfo.status + '】,只能登记已签收并且未被使用的器械包!'); + } + else{ + showResult('器械包状态为【' + goodsInfo.status + '】,只能登记已发货并且未被使用的器械包!'); + } + } + //一次性物品 + }else{ + showResult('暂时不支持录入一次性物品!'); +// var record = new addTousseInstance({ +// id : '', +// barcode : goodsInfo.barcode, +// tousseDefinitionName : '', +// amount : 1, +// batchNo : goodsInfo.batchNo, +// showTousseName : goodsInfo.showTousseName, +// packageType : '', +// validUntil : goodsInfo.validUntil, +// tousseType : goodsInfo.tousseType, +// goodsType : goodsInfo.goodsType, +// foreignTousseApp_id : '', +// includeImplant : '否', +// actualUsed:'是', +// haveUnSupplementMaterials : false +// }); +// tousseInstanceStore.add(record); +// useAmount++; +// Ext4.getCmp('useAmount').setValue(useAmount); + } + } else { + showResult('找不到该条码的器械包或一次性物品!'); + } + }, + failure : function(response, options) { + showResult('加载出错!请稍候再试。'); + } + }); +} +/** + * 将病人显示到对应使用记录的表单上 + * @param patientInfo 病人信息json对象 + * 示例:{ + * clinicNumber:"", + * hospitalNumber:"", + * patientName:"", + * patientAge:"", + * patientIDCard:"", + * patientSex:"", + * bedNumber:"", + * doctorName:"", + * operation:"", + * roomNumber:"", + * visitId:"", + * opRoomId:"", + * remark:"", + * circuitNurse:"", + * washHandNurse:"", + * specialInfection:"", + * operationScheduleId:"", + * operationTime:"" + * } + */ +function showPatientInfo(patientInfo){ + if(patientInfo){ + if(patientInfo.clinicNumber){ + Ext4.getCmp('treatmentNum').setValue(patientInfo.clinicNumber); + } + if(patientInfo.hospitalNumber){ + Ext4.getCmp('hospitalNum').setValue(patientInfo.hospitalNumber); + } + if(patientInfo.patientName){ + Ext4.getCmp('patientName').setValue(patientInfo.patientName); + } + if(patientInfo.patientAge){ + Ext4.getCmp('patientAge').setValue(patientInfo.patientAge); + } + if(patientInfo.patientIDCard){ + Ext4.getCmp('patientIDCard').setValue(patientInfo.patientIDCard); + } + if(patientInfo.patientSex){ + if(patientInfo.patientSex == '男'){ + Ext4.getCmp('patientSex').setValue('男'); + }else if(patientInfo.patientSex == '女'){ + Ext4.getCmp('patientSex').setValue('女'); + }else{ + Ext4.getCmp('patientSex').setValue(''); + } + } + if(patientInfo.bedNumber){ + Ext4.getCmp('bedNumber').setValue(patientInfo.bedNumber); + } + if(patientInfo.doctorName){ + Ext4.getCmp('doctorName').setValue(patientInfo.doctorName); + } +// if(patientInfo.operation){ +// Ext4.getCmp('operation').setValue(patientInfo.operation); +// } + if(patientInfo.roomNumber){ + Ext4.getCmp('roomNumber').setValue(patientInfo.roomNumber); + } + if(patientInfo.visitId){ + Ext4.getCmp('visitId').setValue(patientInfo.visitId); + } + if(patientInfo.remark){ + Ext4.getCmp('remark').setValue(patientInfo.remark); + } + if(patientInfo.circuitNurse){ + Ext4.getCmp('circuitNurse').setValue(patientInfo.circuitNurse); + } + if(patientInfo.washHandNurse){ + Ext4.getCmp('washHandNurse').setValue(patientInfo.washHandNurse); + } +// if(patientInfo.specialInfection){ +// Ext4.getCmp('specialInfection').setValue(patientInfo.specialInfection); +// } + if(patientInfo.opRoomId){ + Ext4.getCmp('operationRoom').setValue(patientInfo.opRoomId); + } + if(patientInfo.operationTime){ + //把所有的减号替换成/ + Ext4.getCmp('operationTime').setValue(new Date(patientInfo.operationTime.replace(/-/g,"/"))); + } + if(patientInfo.operationScheduleId){ + Ext4.getCmp('operationScheduleId').setValue(patientInfo.operationScheduleId); + } + } +} + +Ext4.onReady(function(){ + Ext4.QuickTips.init(); + + //巡回护士项的标签 + var circuitNurseLabelName = sstsConfig.circuitNurseLabelName ? sstsConfig.circuitNurseLabelName : '巡回护士'; + useRecordOperationRoomAllowBlank = getBoolValueFromJs('sstsConfig.useRecordOperationRoomAllowBlank',true); + + var yesNoStore = new Ext4.data.Store( { + fields : [{name:'value'},{name:'text'}], + data : [{value:'0',text:'否'}, {value:'1',text:'是'}] + }); + + function onTextfieldFoucus(thiz){ + thiz.selectText(); + } + + Ext4.define('DepartUser',{ + extend : 'Ext4.data.Model', + fields:['id','fullName','orgUnitName'] + }); + // 查找某科室的人员的store + var departUsersStore = new Ext4.data.Store({ + proxy : { + type : 'ajax', + url : WWWROOT + '/systemmanage/user/userAction!loadUsersBySearchString.do' + }, + model : 'DepartUser' + }); + + var sexStore = new Ext4.data.Store( { + fields : [{name:'value'},{name:'text'}], + data : [{value:'男',text:'男'}, {value:'女',text:'女'}] + }); + + var tousseCm = [{id : 'id',dataIndex : 'id',hidden : true}, + {header : "条码",dataIndex : 'barcode',width : 100,menuDisabled : true/*,renderer : renderTousseInstanceInfoShowFun*/}, + {header : "name",dataIndex : 'tousseDefinitionName',hidden : true,menuDisabled : true}, + {header : "名称",dataIndex : 'showTousseName',width : 150,menuDisabled : true/*,renderer : renderTousseInstanceNameForUrgent*/}, + {header : '加急',width : 35,hidden : true, + renderer : function(v, p, record,rowIndex, colIndex) { + var imgName = (record.data.isUrgentForUseRecord=='是')?'arrow_down':'arrow_top'; + var str = "
"; + return str; + }, + menuDisabled : true + },{header : "是否真正使用",hidden : true,dataIndex : 'actualUsed',width : 70,menuDisabled : true,hidden:!sstsConfig.enableActualUsed, + renderer: function(v, p, record,rowIndex, colIndex){ + var str = v; + var id = record.id; + if(record.data.actualUsed == '否'){ + str = "是 否"; + }else if(record.data.actualUsed == '是'){ + str = "是 否"; + } + return str; + }}, + {header : "数量",dataIndex : 'amount',width : 80,menuDisabled : true,editor : new Ext4.form.NumberField({ + allowBlank : false, + listeners : { + focus : function(thiz){ + var record = Ext4.getCmp('tousseInstanceGrid').getSelectionModel().getSelected(); + if(record.data.tousseType == '一次性物品' && record.data.goodsType != '高值耗材'){ + thiz.selectText(); + }else if(record.data.tousseType != '一次性物品'){ + Ext4.MessageBox.alert("提示","不能修改器械包数量!"); + }else if(record.data.goodsType == '高值耗材'){ + Ext4.MessageBox.alert("提示","不能修改高值耗材数量!"); + } + } + } + })}, + {header : "包装类型",dataIndex : 'packageType',width : 100,menuDisabled : true}, + {header : "物品类型",dataIndex : 'goodsType',hidden : true}, +// {header : "批次",dataIndex : 'batchNo',width : 100,menuDisabled : true}, + {header : "有效期",dataIndex : 'validUntil',menuDisabled : true,width : 100}, + {hidden : true,header : "图片",dataIndex : 'tousseDefinitionName',menuDisabled : true,width : 35,renderer : function(v, p, record){ + if(record.data.tousseType != '一次性物品'){ + var str = "
"; + return str; + } + }}, + {hidden : true,header : "植入物使用情况",dataIndex : 'tousseDefinitionName',menuDisabled : true,width : 90,renderer : function(v, p, record){ + var tousseType = record.get("tousseType"); + var includeImplant = record.get("includeImplant"); + var tousseBarcode = record.get("barcode"); + if("外来器械包" == tousseType || "外来器械拆分小包" == tousseType || "是" == includeImplant){ + var app_id = record.get("foreignTousseApp_id"); + if(app_id == undefined){ + app_id = ""; + } + var str = "
"; + return str; + } + return ""; + }}, + {header : '删除操作',id : 'delAction',width : 100, + renderer : function(v, p, record) { + var str = "
"; + return str; + }, + menuDisabled : true, + dataIndex : 'button' + }]; + + var formObj = new Ext4.form.Panel({ + frame:true, + labelSeparator:':', + title: '录入使用记录', + bodyStyle:'padding:5px 5px 0px 25px', + width: 720, + items: [{ + xtype : "fieldset", + title : "基础数据", + layout : 'column', + autoHeight : true, + width:710, + items : [ { + xtype : 'hidden', + name : 'id', + id : 'id' + },{ + xtype : 'hidden', + name : 'items', + id : 'items' + },{ + xtype : 'hidden', + name : 'originalItems', + id : 'originalItems' + },{ + xtype : 'hidden', + name : 'formParams', + id : 'formParams' + },{ + xtype : 'hidden', + name : 'originalFormParams', + id : 'originalFormParams' + }, { + xtype : 'hidden', + name : 'tousseInstanceBarcodes', + id : 'tousseInstanceBarcodes' + }, { + xtype : 'hidden', + name : 'applicationFormType', + id : 'applicationFormType', + value : sstsConfig.applicationFormType + }, { + xtype : 'hidden', + name : 'audited', + id : 'audited' + },{ + xtype : 'hidden', + name : 'departCoding', + id : 'departCoding', + value : '' + },{ + xtype : 'hidden', + name : 'userCode', + id : 'userCode', + value : userCode + }, { + layout : 'form', + columnWidth : 0.45, + items : [{ + xtype : 'textfield', + fieldLabel : '住院号', + id : 'hospitalNum', + name : 'hospitalNum', + allowBlank : getBoolValueFromJs('sstsConfig.useRecordHospitalNumAllowBlank',true), + enableKeyEvents : true, + maxLength:10, + maxLengthText :'长度超过限制,不能保存!', + listeners : { + render : function(c){ + c.getEl().on('keypress',function(e,thiz){ + if(e.getKey() == 13){ + var patientParams = {}; + patientParams.patientNum = thiz.value; + patientParams.numType = thiz.id; + patientParams.sourcePage = sourcePage_useRecord; + + loadPatientInfoByValAndType(JSON.stringify(patientParams)); + + // 如果洗手护士输入框隐藏,则聚焦到巡回护士输入框,否则聚焦到洗手护士输入框 + if (sstsConfig.hideWashHandNurseOfUseRecord == true){ + Ext4.getCmp('circuitNurse').focus(); + } + else{ + Ext4.getCmp('washHandNurse').focus(); + } + } + }); + } + }, + anchor : '96%' + }] + }, { + layout : 'form', + columnWidth : 0.45, + hidden : sstsConfig.hideTreatmentNumOfUseRecord, + items : [{ + xtype : 'textfield', + fieldLabel : '诊疗号', + id : 'treatmentNum', + name : 'treatmentNum', + allowBlank : true, + maxLength:10, + maxLengthText :'长度超过限制,不能保存!', + enableKeyEvents : true, + listeners : { + render : function(c){ + c.getEl().on('keypress',function(e,thiz){ + if(e.getKey() == 13){ + var patientParams = {}; + patientParams.patientNum = thiz.value; + patientParams.numType = thiz.id; + patientParams.sourcePage = sourcePage_useRecord; + + loadPatientInfoByValAndType(JSON.stringify(patientParams)); + + // 如果洗手护士输入框隐藏,则聚焦到巡回护士输入框,否则聚焦到洗手护士输入框 + if (sstsConfig.hideWashHandNurseOfUseRecord == true){ + Ext4.getCmp('circuitNurse').focus(); + } + else{ + Ext4.getCmp('washHandNurse').focus(); + } + } + }); + } + }, + anchor : '96%' + }] + }, { + layout : 'form', + columnWidth : 0.45, + hidden : sstsConfig.hideWashHandNurseOfUseRecord, + items : [{ + xtype : 'combo', + fieldLabel : '洗手护士', + id : 'washHandNurse', + name : 'washHandNurse', + hidden : sstsConfig.hideWashHandNurseOfUseRecord, +// disabled : !fillTousseName, + queryParam : 'spell', + minChars : 0, + displayField : 'fullName', + store : departUsersStore, + forceSelection : false, + lazyInit : true, + triggerAction : 'all', + hideTrigger : true, + typeAhead : false, + allowBlank : true,//getBoolValueFromJs('sstsConfig.useRecordWashHandNurseAllowBlank',false), + anchor : '96%', + listeners : { + render : function(c){ + c.getEl().on('keypress',function(e,thiz){ +// if(e.getKey() == 13){ +// var text = Ext4.getCmp('washHandNurse').getValue(); +// if (isValidBarcode(text)){ +// Ext4.getCmp('washHandNurse').setValue(""); +// UserTableManager.getUserObjByBarcode(text,function(responseText){ +// if(responseText != null && responseText != ""){ +// var userName = responseText.split(",")[0]; +// Ext4.getCmp('washHandNurse').setValue(userName); +// Ext4.getCmp('circuitNurse').focus(); +// }else{ +// showResult('找不到该条码所对应的人员信息'); +// } +// }); +// } +// else if (isValidStaffNumber(text)){ +// UserTableManager.getUserObjByName(text,function(responseText){ +// if(responseText != null && responseText != ""){ +// var userName = responseText.split(",")[0]; +// Ext4.getCmp('washHandNurse').setValue(userName); +// Ext4.getCmp('circuitNurse').focus(); +// }else{ +// showResult('找不到该工号对应的人员信息'); +// } +// }); +// } +// else{ +// Ext4.getCmp('circuitNurse').focus(); +// } +// } + }); + c.getEl().on('dblclick',function(e,thiz){ + c.doQuery(c.allQuery, true); + c.expand(); + }); + } + } + }] + },{ + layout : 'form', + columnWidth : 0.45, + items : [{ + xtype : 'combo', + fieldLabel : circuitNurseLabelName, + id : 'circuitNurse', + name : 'circuitNurse', +// disabled : !fillTousseName, + queryParam : 'spell', + minChars : 0, + displayField : 'fullName', + store : departUsersStore, + forceSelection : false, + lazyInit : true, + triggerAction : 'all', + hideTrigger : true, + typeAhead : false, + allowBlank : true,//getBoolValueFromJs('sstsConfig.useRecordCircuitNurseAllowBlank',false), + anchor : '96%', + listeners : { + render : function(c){ + c.getEl().on('keypress',function(e,thiz){ +// if(e.getKey() == 13){ +// var text = Ext4.getCmp('circuitNurse').getValue(); +// if (isValidBarcode(text)){ +// Ext4.getCmp('circuitNurse').setValue(""); +// UserTableManager.getUserObjByBarcode(text,function(responseText){ +// if(responseText != null && responseText != ""){ +// var userName = responseText.split(",")[0]; +// Ext4.getCmp('circuitNurse').setValue(userName); +// Ext4.getCmp('operationRoom').focus(); +// +// Ext4.getCmp("tempBarcode").focus(); +// +// }else{ +// showResult('找不到该条码所对应的人员信息'); +// } +// +// }); +// } +// else if (isValidStaffNumber(text)){ +// UserTableManager.getUserObjByName(text,function(responseText){ +// if(responseText != null && responseText != ""){ +// var userName = responseText.split(",")[0]; +// Ext4.getCmp('circuitNurse').setValue(userName); +// Ext4.getCmp('tempBarcode').focus(); +// }else{ +// showResult('找不到该工号对应的人员信息'); +// } +// }); +// } +// else{ +// Ext4.getCmp('tempBarcode').focus(); +// } +// } + }); + c.getEl().on('dblclick',function(e,thiz){ + c.doQuery(c.allQuery, true); + c.expand(); + }); + } + } + }] + },{ + layout : 'form', + columnWidth : 0.45, + hidden:true, + items : [{ + xtype : 'textfield', + fieldLabel : '科室', + id : 'depart', + name : 'depart', + disabled : true, + allowBlank : true, + anchor : '96%' + }] + }, { + layout : 'form', + columnWidth : 0.45, + items : [{ + xtype : 'textfield', + fieldLabel : '手术间', + id : 'operationRoom', + name : 'operationRoom', + maxLength:10, + maxLengthText :'长度超过限制,不能保存!', + allowBlank : useRecordOperationRoomAllowBlank, + anchor : '96%', + listeners:{ + render : function(c) { + c.getEl().on('keypress', function(e) { + if (e.getKey() == 13) {// + Ext4.getCmp("hospitalNum").focus(); + } + }); + } + } + }] + },{ + layout : 'form', + columnWidth : 0.45, + items : [{ + xtype : 'textfield', + fieldLabel : '姓名', + maxLength : '100', + id : 'patientName', + name : 'patientName', + anchor : '96%' + }] + }, { + layout : 'form', + columnWidth : 0.45, + items : [{ + xtype : 'textfield', + fieldLabel : '年龄', + maxLength : '10', + id : 'patientAge', + name : 'patientAge', + //allowDecimals : false, + //allowNegative : false, + anchor : '96%' + }] + }, { + layout : 'form', + columnWidth : 0.45, + items : [{ + xtype : 'combo', + fieldLabel : '性别', + valueField : 'value', + displayField : 'text', + id : 'patientSex', + name : 'patientSex', + mode : 'local', + triggerAction : 'all', + forceSelection : true, + editable : false, + store : sexStore, + anchor : '96%' + }] + }, { + layout : 'form', + columnWidth : 0.45, + hidden : sstsConfig.hideRoomNumber, + items : [{ + xtype : 'textfield', + fieldLabel : '病室', + maxLength : '16', + id : 'roomNumber', + name : 'roomNumber', + anchor : '96%' + }] + },{ + layout : 'form', + columnWidth : 0.45, + items : [{ + xtype : 'textfield', + fieldLabel : '床位', + maxLength : '16', + id : 'bedNumber', + name : 'bedNumber', + anchor : '96%' + }] + },{ + layout : 'form', + columnWidth : 0.45, + items : [{ + xtype : 'textfield', + fieldLabel : '身份证', + maxLength : '18', + id : 'patientIDCard', + name : 'patientIDCard', + allowDecimals : false, + allowNegative : false, + anchor : '96%' + }] + }, { + layout : 'form', + columnWidth : 0.45, + items : [{ + xtype : 'textfield', + fieldLabel : '医生', + maxLength : '16', + id : 'doctorName', + name : 'doctorName', + allowBlank : true, + anchor : '96%' + }] + },{ + layout : 'form', + columnWidth : 0.45, + hidden:true, + items : [{ + xtype : 'textfield', + fieldLabel : '手术单号', + maxLength : '16', + id : 'operationScheduleId', + name : 'operationScheduleId', + allowBlank : true, + anchor : '96%' + }] + },{ + layout : 'form', + columnWidth : 0.45, + items : [{ + xtype : 'datefield', + fieldLabel : '手术时间', + id : 'operationTime', + name : 'operationTime', + 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', + format : 'Y-m-d H:i', + readOnly : true, + width : 150 + }] + },{ + layout : 'form', + columnWidth : 0.45, + items : [{ + xtype : 'numberfield', + fieldLabel : '住院次数', + minValue:0, + id : 'visitId', + name : 'visitId', + allowBlank : true, + anchor : '96%' + }] + },{ + layout : 'form', + columnWidth : 0.45, + hidden:true, + items : [{ + xtype : 'textfield', + fieldLabel : '录入人', + maxLength : '41', + id : 'operator', + name : 'operator', + readOnly : true, + allowBlank : true, + anchor : '96%', + cls : 'fieldReadOnlyNoRemove' + }] + },{ + layout : 'form', + columnWidth : 0.45, + hidden:true, + items : [{ + xtype : 'datefield', + fieldLabel : '录入时间', + id : 'enteringTime', + name : 'enteringTime', + 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', + format : 'Y-m-d H:i', + readOnly : true + }] + },{ + layout : 'form', + columnWidth : 0.45, + hidden:true, + items : [{ + xtype : 'textfield', + fieldLabel : '审核人', + maxLength : '41', + id : 'reviewer', + name : 'reviewer', + readOnly : true, + allowBlank : true, + anchor : '96%', + cls : 'fieldReadOnlyNoRemove' + }] + }, { + layout : 'form', + columnWidth : 0.45, + hidden:true, + items : [{ + xtype : 'textfield', + fieldLabel : '审核时间', + maxLength : '41', + id : 'reviewTime', + name : 'reviewTime', + readOnly : true, + anchor : '96%', + cls : 'fieldReadOnlyNoRemove' + }] + }, { + layout : 'form', + columnWidth : 0.45, + hidden:true, + items : [{ + xtype : 'textfield', + fieldLabel : '申请时间', + maxLength : '41', + id : 'applicationTime', + name : 'applicationTime', + readOnly : true, + anchor : '96%', + cls : 'fieldReadOnlyNoRemove' + }] + }, { + layout : 'form', + columnWidth : 0.9, + items : [{ + xtype : 'textfield', + fieldLabel : '备注', + id : 'remark', + name : 'remark', + anchor : '97%', + height : 25 + }] + }] + },{ + xtype : "fieldset", + title : "器械包信息", + layout : 'column', + autoHeight : true, + items : [new Ext4.grid.Panel({ + id : 'tousseInstanceGrid', + store : tousseInstanceStore, +// selModel:Ext4.create('Ext4.selection.CheckboxModel'), + columns : tousseCm, + height : 600, + width:710, + autoHeight : true, + autoExpandColumn : 'delAction', + frame : false, + viewConfig: { + forceFit:true + }, + bodyStyle : 'border:1px solid #afd7af', +// selModel :sm, + tbar : [{ + xtype : 'textfield', + fieldLabel : '扫描条码', + id : 'tempBarcode', + name : 'tempBarcode', + width : 200, + anchor : '99%', + enableKeyEvents : true, + listeners : { + render : function(c) { + c.getEl().on('keypress', function(e) { + if (e.getKey() == 13) {// + scanedBarcode(Ext4.getCmp('tempBarcode').getValue()); + Ext4.getCmp('tempBarcode').setValue(''); + } + }); + } + } + },{ + text : '已扫描数量:' + }, { + xtype : 'textfield', + id : 'useAmount', + name : 'useAmount', + cls : 'fieldReadOnlyNoRemove', + width : 70, + value:0, + anchor : '99%' + }] + })] + }], + + buttons: [{ + id:'saveBtn', + text: '保存并审核生成申请单', + handler: saveAndReviewAndConvertUseRecordForm + },{ + text: '取消', + handler:function(){history.go(-1);} + }] + }); + + formObj.render("formDiv"); + + function checkForSave(){ + var enteringTime = Ext4.getCmp('enteringTime').getValue(); + if (!formObj.isValid()) { + showResult('请正确填写表单各值'); + return false; + } + if(!sstsConfig.noInputTreatmentNumOrHospitalNum && Ext4.getCmp('treatmentNum').getValue() == '' && Ext4.getCmp('hospitalNum').getValue() == '' && Ext4.getCmp('patientName').getValue() == ''){ + showResult('请输入诊疗号或者住院号或者病人姓名'); + return false; + } + // 获取扫描的物品所有条码 + var barcodes = getTousseGridData(); + if (barcodes != "") { + return true; + }else{ + showResult('器械包列表信息不能为空'); + return false; + } + return false; + + } + + function buildJSONObjectFromAtts(atts){ + var obj = {}; + if(typeof(atts) == 'undefined'){ + return obj; + } + for(var i=0;i +<%@ page contentType="text/html; charset=UTF-8"%> +<%@ include file="/common/taglibs.jsp"%> +<%@ page import="com.forgon.tools.SpringBeanManger" %> +<%@ page import="com.forgon.directory.acegi.tools.AcegiHelper" %> +<%@ page import="com.forgon.disinfectsystem.common.CssdUtils" %> +<%@ page import="com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance" %> +<%@ page import="com.forgon.disinfectsystem.entity.useRecord.UseRecord" %> + +<% + //request.setAttribute("userName",AcegiHelper.getLoginUser().getUserName()); + String hospitalNum = request.getParameter("hospitalNum"); + String clinicNum = request.getParameter("clinicNum"); + String userCode = request.getParameter("userCode"); + + String project = CssdUtils.getConfigProperty("project"); + session.setAttribute("profile", project); + +%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+
+ + + \ No newline at end of file Index: ssts-web/src/main/webapp/WEB-INF/web.xml =================================================================== diff -u -r16619 -r17914 --- ssts-web/src/main/webapp/WEB-INF/web.xml (.../web.xml) (revision 16619) +++ ssts-web/src/main/webapp/WEB-INF/web.xml (.../web.xml) (revision 17914) @@ -64,7 +64,7 @@ com.forgon.register.filter.VersionManagerFilter noFilterUrl - /debug/;/disinfectsystem/config/;/disinfectsystem/common/;/disinfectSystem/fileUploadServlet;/CodeImageServlet;/fckeditor/;/UserUpLoadFiles/;/openSystemMainPage.jsp;/logon.jsp;/favicon.ico;/js/;/common/taglibs.jsp;/jquery/;/ext/;/dwr/;/images/;/styles/;/scripts/;/wap/index.jsp;/themes/;/services/;/ikey/;/mobileClient/;/disinfectSystem/sterilization/sterilizationRecordAction!uploadSterilizationRecordPic.do + /ext-4.2.3/;/buttjoint/;/debug/;/disinfectsystem/config/;/disinfectsystem/common/;/disinfectSystem/fileUploadServlet;/CodeImageServlet;/fckeditor/;/UserUpLoadFiles/;/openSystemMainPage.jsp;/logon.jsp;/favicon.ico;/js/;/common/taglibs.jsp;/jquery/;/ext/;/dwr/;/images/;/styles/;/scripts/;/wap/index.jsp;/themes/;/services/;/ikey/;/mobileClient/;/disinfectSystem/sterilization/sterilizationRecordAction!uploadSterilizationRecordPic.do Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/ButtJointUseRecordAction.java =================================================================== diff -u --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/ButtJointUseRecordAction.java (revision 0) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/ButtJointUseRecordAction.java (revision 17914) @@ -0,0 +1,122 @@ +package com.forgon.disinfectsystem.useRecord.action; + +import java.util.Date; + +import net.sf.json.JSONObject; + +import org.apache.log4j.Logger; +import org.apache.struts2.convention.annotation.Action; +import org.apache.struts2.convention.annotation.Namespace; +import org.apache.struts2.convention.annotation.ParentPackage; + +import com.forgon.directory.service.OrgUnitManager; +import com.forgon.disinfectsystem.entity.useRecord.UseRecord; +import com.forgon.security.model.User; +import com.forgon.security.service.UserManager; +import com.forgon.tools.StrutsParamUtils; +import com.forgon.tools.StrutsResponseUtils; +import com.forgon.tools.json.JSONUtil; +import com.forgon.tools.string.StringTools; +import com.forgon.treenode.model.THTreeNode; +import com.opensymphony.xwork2.ModelDriven; +/** + * 与第三方系统对接的使用记录action + * @author kzh + * + */ +@ParentPackage(value = "default") +@Namespace(value = "/buttjoint") +@Action(value = "buttjointUseRecordAction") +public class ButtJointUseRecordAction extends UseRecordActionBase implements ModelDriven { + + private static final Logger logger = Logger + .getLogger(ButtJointUseRecordAction.class); + + private UserManager userManager; + private OrgUnitManager orgUnitManager; + + // 使用记录 + private UseRecord useRecord = new UseRecord(); + + public void setUserManager(UserManager userManager) { + this.userManager = userManager; + } + public void setOrgUnitManager(OrgUnitManager orgUnitManager) { + this.orgUnitManager = orgUnitManager; + } + /** + * 加载扫描物品 + */ + public void loadScanedGoods() { + String barcode = StrutsParamUtils.getPraramValue("barcode", null); + String scanedBarcodes = StrutsParamUtils.getPraramValue("scanedBarcodes", ""); + String userCode = StrutsParamUtils.getPraramValue("userCode", ""); + + User user = userManager.getUserByUserCode(userCode); + if(user == null){ + JSONObject json = JSONUtil.buildJsonObject(false); + json.put("error", "未获取到工号为" + userCode + "的用户"); + StrutsResponseUtils.output(json); + }else{ + String currentOrgUnitCode = userManager.getCurrentOrgUnitCode(user); + if(StringTools.isBlank(currentOrgUnitCode)){ + JSONObject json = JSONUtil.buildJsonObject(false); + json.put("error", "工号为" + userCode + "的用户未设置所属科室"); + StrutsResponseUtils.output(json); + }else{ + loadBarcode(barcode, scanedBarcodes, currentOrgUnitCode); + } + } + } + + // 保存并审核生成申请单 + public void saveAndReviewAndConvertUseRecordForm() { + // 申请表单的类型:1 : 通用申请单(组合申请单),2:分开的申请单 + String applicationFormType = StrutsParamUtils.getPraramValue("applicationFormType", ""); + String userCode = StrutsParamUtils.getPraramValue("userCode", ""); +// String operator = StrutsParamUtils.getPraramValue("operator", ""); +// String depart = StrutsParamUtils.getPraramValue("depart", ""); +// String departCoding = StrutsParamUtils.getPraramValue("departCoding",""); + String msg = "保存成功"; + boolean success = false; + Date applicationCreateDate = new Date(); + try { + User operator = userManager.getUserByUserCode(userCode); + if(operator == null){ + msg = "未获取到工号为" + userCode + "的用户"; + }else{ + String orgUnitCode = userManager.getCurrentOrgUnitCode(operator); + if(StringTools.isBlank(orgUnitCode)){ + msg = "工号为" + userCode + "的用户未设置所属科室"; + }else{ + THTreeNode orgUnit = orgUnitManager.getOrgUnitByCode(orgUnitCode); + if(orgUnit == null){ + msg = "未获取到用户的所属科室"; + }else{ + useRecord.setDepart(orgUnit.getName()); + useRecord.setDepartCoding(orgUnitCode); + useRecord.setOperator(operator.getFullName()); + UseRecord modified = useRecord; + buildUseRecordParamsForSave(modified); + useRecordManager + .saveAndReviewAndConvertUseRecordForm_TRANS_REQUIRED( + modified, null, null, null, + applicationCreateDate,applicationFormType,operator.getFullName(),operator.getName()); + success = true; + } + } + } + } catch (Exception e) { + logger.warn(e.getMessage()); + e.printStackTrace(); + msg = e.getMessage(); + } + JSONObject json = JSONUtil.buildJsonObject(success,msg); + StrutsResponseUtils.output(json); + } + @Override + public UseRecord getModel() { + // TODO Auto-generated method stub + return useRecord; + } +} Index: ssts-web/src/main/webapp/WEB-INF/web-standard.xml =================================================================== diff -u -r16619 -r17914 --- ssts-web/src/main/webapp/WEB-INF/web-standard.xml (.../web-standard.xml) (revision 16619) +++ ssts-web/src/main/webapp/WEB-INF/web-standard.xml (.../web-standard.xml) (revision 17914) @@ -64,7 +64,7 @@ com.forgon.register.filter.VersionManagerFilter noFilterUrl - /debug/;/disinfectsystem/config/;/disinfectsystem/common/;/disinfectSystem/fileUploadServlet;/CodeImageServlet;/fckeditor/;/UserUpLoadFiles/;/openSystemMainPage.jsp;/logon.jsp;/favicon.ico;/js/;/common/taglibs.jsp;/jquery/;/ext/;/dwr/;/images/;/styles/;/scripts/;/wap/index.jsp;/themes/;/services/;/ikey/;/mobileClient/;/disinfectSystem/sterilization/sterilizationRecordAction!uploadSterilizationRecordPic.do + /ext-4.2.3/;/buttjoint/;/debug/;/disinfectsystem/config/;/disinfectsystem/common/;/disinfectSystem/fileUploadServlet;/CodeImageServlet;/fckeditor/;/UserUpLoadFiles/;/openSystemMainPage.jsp;/logon.jsp;/favicon.ico;/js/;/common/taglibs.jsp;/jquery/;/ext/;/dwr/;/images/;/styles/;/scripts/;/wap/index.jsp;/themes/;/services/;/ikey/;/mobileClient/;/disinfectSystem/sterilization/sterilizationRecordAction!uploadSterilizationRecordPic.do Index: ssts-web/src/main/resources/spring/security/applicationContext-acegi-security.xml =================================================================== diff -u -r16595 -r17914 --- ssts-web/src/main/resources/spring/security/applicationContext-acegi-security.xml (.../applicationContext-acegi-security.xml) (revision 16595) +++ ssts-web/src/main/resources/spring/security/applicationContext-acegi-security.xml (.../applicationContext-acegi-security.xml) (revision 17914) @@ -37,6 +37,7 @@ + @@ -49,6 +50,7 @@ + Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java =================================================================== diff -u -r17873 -r17914 --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java (.../UseRecordManagerImpl.java) (revision 17873) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java (.../UseRecordManagerImpl.java) (revision 17914) @@ -1848,7 +1848,20 @@ return createRecyclingApplicationByUseRecords(ids, applicant, depart, departCoding,applicationCreateDate , CssdUtils.getSystemSetConfigByName("applicationFormType")); } - + public String createRecyclingApplicationByUseRecords(Collection ids, + String applicant, String depart, String departCoding, + Date applicationCreateDate,String applicationFormType){ + LoginUserData loginUserData = AcegiHelper.getLoginUser(); + String reviewer = ""; + String reviewerCode = ""; + + if(loginUserData != null){ + reviewer = loginUserData.getUserFullName(); + reviewerCode = loginUserData.getUserName(); + } + return createRecyclingApplicationByUseRecords(ids,applicant,depart,departCoding, + applicationCreateDate,applicationFormType,reviewer,reviewerCode); + } /** * 根据使用记录的id转换生成申请单 * @param ids @@ -1861,7 +1874,8 @@ * @since 2016-07-27 */ public String createRecyclingApplicationByUseRecords(Collection ids,String applicant, - String depart, String departCoding,Date applicationCreateDate,String applicationFormType){ + String depart, String departCoding,Date applicationCreateDate,String applicationFormType, + String reviewer,String reviewerCode){ SupplyRoomConfig config = supplyRoomConfigManager .getSystemParamsObj(); String returnMsg = "保存成功"; @@ -1874,13 +1888,6 @@ List useRecordList = (List) useRecordsMap .get("useRecordList"); - String reviewer = ""; - String reviewerCode = ""; - LoginUserData loginUserData = AcegiHelper.getLoginUser(); - if(loginUserData != null){ - reviewer = loginUserData.getUserFullName(); - reviewerCode = loginUserData.getUserName(); - } String msg = null; for (UseRecord useRecord : useRecordList) { @@ -2124,9 +2131,8 @@ public void auditUseRecords_TRANS_REQUIRED(List ids) { auditUseRecords_internal(ids); } - - // 保存并审核生成申请单 - public void saveAndReviewAndConvertUseRecordForm_TRANS_REQUIRED(UseRecord modified,String operator, String depart, String departCoding,Date applicationCreateDate,String applicationFormType) throws Exception{ + public void saveAndReviewAndConvertUseRecordForm_TRANS_REQUIRED(UseRecord modified,String operator, String depart, + String departCoding,Date applicationCreateDate,String applicationFormType){ if(DatabaseUtil.isPoIdValid(modified.getId())){ modified = (UseRecord)objectDao.getByID_ForUpdate(UseRecord.class.getSimpleName(), modified.getId()); } @@ -2141,6 +2147,23 @@ createRecyclingApplicationByUseRecords(ids, operator, depart, departCoding, applicationCreateDate,applicationFormType); } + // 保存并审核生成申请单 + public void saveAndReviewAndConvertUseRecordForm_TRANS_REQUIRED(UseRecord modified,String operator, String depart, + String departCoding,Date applicationCreateDate,String applicationFormType,String reviewer,String reviewCode) throws Exception{ + if(DatabaseUtil.isPoIdValid(modified.getId())){ + modified = (UseRecord)objectDao.getByID_ForUpdate(UseRecord.class.getSimpleName(), modified.getId()); + } + if(modified.isApplied()){ + throw new RuntimeException("该使用记录已转换申请单!"); + } + // 首先保存 + saveUseRecord_internal(modified); + // 审核并生成申请单 + List ids = new ArrayList(1); + ids.add(modified.getId()); + createRecyclingApplicationByUseRecords(ids, operator, depart, + departCoding, applicationCreateDate,applicationFormType,reviewer,reviewCode); + } private void auditUseRecords_internal(List ids) { if(ids != null){ Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordActionBase.java =================================================================== diff -u --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordActionBase.java (revision 0) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/action/UseRecordActionBase.java (revision 17914) @@ -0,0 +1,375 @@ +package com.forgon.disinfectsystem.useRecord.action; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.BooleanUtils; + +import com.forgon.Constants; +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.model.BarcodeDevice; +import com.forgon.disinfectsystem.barcode.service.BarcodeManager; +import com.forgon.disinfectsystem.basedatamanager.goodsdepartshareconfig.service.GoodsDepartShareConfigManager; +import com.forgon.disinfectsystem.common.CssdUtils; +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.ExpensiveDisposablegoods; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; +import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; +import com.forgon.disinfectsystem.entity.useRecord.UseDiposableGoodsItem; +import com.forgon.disinfectsystem.entity.useRecord.UseRecord; +import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; +import com.forgon.disinfectsystem.useRecord.service.UseRecordManager; +import com.forgon.tools.StrutsParamUtils; +import com.forgon.tools.StrutsResponseUtils; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.json.JSONUtil; +import com.forgon.tools.string.StringTools; + +public class UseRecordActionBase { + + protected BarcodeManager barcodeManager; + protected DiposableGoodsManager diposableGoodsManager; + protected GoodsDepartShareConfigManager goodsDepartShareConfigManager; + protected ObjectDao objectDao; + protected UseRecordManager useRecordManager; + protected TousseInstanceManager tousseInstanceManager; + + protected void loadBarcode(String barcode, String scanedBarcodes, + String currentOrgUnitCode) { + JSONObject obj = new JSONObject(); + try { + obj.put("success", true); + if (StringUtils.isNotBlank(barcode)) { + BarcodeDevice bd = barcodeManager.getBarcodeByBarcode(barcode); + if (bd != null) { + //检测器械包所属科室是否与当前用户所在科室为物品共用科室 + + if (bd instanceof TousseInstance) { + TousseInstance ti = (TousseInstance) bd; + + // 1.判断是否为聚合包内的普通包实例,如果是则提示该包不能录入使用记录 + if(DatabaseUtil.isPoIdValid(ti.getComboTousseInstanceId())){ + obj.put("success", false); + obj.put("error", "条码为" + barcode + "的包属于聚合包内的器械包,不能录入使用记录"); + return; + } + + // 2.判断是否为聚合包,如果是,则需要验证所录入的使用记录次数是否大于其包内普通包实例个数 + if(ti.isComboTousse()){ + int useTimes = objectDao.countBySql("select count(0) from TousseInstanceUseRecord where tousseInstanceId=" + ti.getId()); + List tousseInstanceList = ti.getTousseInstancesBelongToThisComboTousse(objectDao); + int size = CollectionUtils.isNotEmpty(tousseInstanceList) ? tousseInstanceList.size() : 0; + if(useTimes >= size){ + obj.put("success", false); + obj.put("error", "条码为" + barcode + "的聚合包使用次数已经达到其包内器械包的数量,不能再录入"); + return; + } + + // 如果有签收时间则还原为签收状态,否则还原为器械包实例“已发货”状态,便于继续录使用记录 + if (ti.getSignedDate() != null) { + ti.setStatus(TousseInstance.STATUS_SIGNED); + } else { + ti.setStatus(TousseInstance.STATUS_SHIPPED); + } + } + + // 3.检测该器械包有没有被召回 + if (TousseInstance.STATUS_WAIT_FOR_RECALL.equals(ti.getStatus()) || TousseInstance.STATUS_RECALLED.equals(ti.getStatus())) { + obj.put("msg", "该器械包不能被使用,已被召回!"); + } else if(!TousseInstance.STATUS_SHIPPED.equals(ti.getStatus()) && !TousseInstance.STATUS_SIGNED.equals(ti.getStatus())){ + obj.put("msg", "该器械包状态为" + ti.getStatus() + ",不能录入使用记录!"); + } else { + List acceptStatus = new ArrayList<>(); + boolean notSignedItemsCanRegistUseRecord = CssdUtils.getSystemSetConfigByNameBool("notSignedItemsCanRegistUseRecord"); + if(notSignedItemsCanRegistUseRecord){ + acceptStatus.add(TousseInstance.STATUS_SHIPPED); + } + acceptStatus.add(TousseInstance.STATUS_SIGNED); + TousseInstance older = tousseInstanceManager.getExpireNearest(ti, acceptStatus,StringTools.toCollectionIgnoreNullAndBlank(scanedBarcodes)); + //判断当前用户登录科室是否存在共用科室配置 + if(CollectionUtils.isNotEmpty(goodsDepartShareConfigManager.getGoodsShareDepartList(currentOrgUnitCode))){ + //判断包实例所属科室是否与当前用户登录科室配置物品共享 + if(goodsDepartShareConfigManager.canShareGoodsforTwoDepart(currentOrgUnitCode, ti.getLocation())){ + String validUntilStr = ti.getValidUntilStr(Constants.SIMPLEDATEFORMAT_YYYYMMDD); + TousseDefinition td = ti.getTousseDefinition(); + String tousseDefinitionName = ""; + String tousseType = ""; + String includeImplant = ""; + if (td != null) { + tousseType = td.getTousseType(); + tousseDefinitionName = td.getName(); + includeImplant = td.getIncludeImplantStr(); + } + obj.put("id", ti.getId()); + obj.put("barcode", ti.getBarcode()); + obj.put("tousseDefinitionName", tousseDefinitionName); + obj.put("showTousseName", ti.getShowTousseName()); + obj.put("packageType", ti.getPackageType()); + obj.put("validUntil", validUntilStr); + obj.put("status", ti.getStatus()); + obj.put("location",ti.getLocation()); + obj.put("locationForDisplay",ti.getLocationForDisplay()); + obj.put("materials", null); + obj.put("foreignTousseApp_id",ti.getForeignTousseApp_id()); + obj.put("tousseType", tousseType); + obj.put("includeImplant", includeImplant); + obj.put("actualUsed", Constants.STR_YES); //扫描的时候,都取默认值,为是。以免录了使用记录之后,又删除了,就把包实例这个属性修改了,再扫描,就不是默认的值了 + obj.put("haveUnSupplementMaterials", BooleanUtils.toBooleanDefaultIfNull(ti.getHaveUnSupplementMaterials(), false)); + }else{ + obj.put("msg", "该器械包所属科室为" + ti.getLocationForDisplay() + ",未配置与当前科室共用,不能录入使用记录!"); + } + }else{ + //判断包实例所在位置与当前用户所在科室是否一致 + if(StringUtils.equals(currentOrgUnitCode, ti.getLocation())){ + String validUntilStr = ti.getValidUntilStr(Constants.SIMPLEDATEFORMAT_YYYYMMDD); + TousseDefinition td = ti.getTousseDefinition(); + String tousseDefinitionName = ""; + String tousseType = ""; + String includeImplant = ""; + if (td != null) { + tousseType = td.getTousseType(); + tousseDefinitionName = td.getName(); + includeImplant = td.getIncludeImplantStr(); + } + obj.put("id", ti.getId()); + obj.put("barcode", ti.getBarcode()); + obj.put("tousseDefinitionName", tousseDefinitionName); + obj.put("showTousseName", ti.getShowTousseName()); + obj.put("packageType", ti.getPackageType()); + obj.put("validUntil", validUntilStr); + obj.put("status", ti.getStatus()); + obj.put("location",ti.getLocation()); + obj.put("locationForDisplay",ti.getLocationForDisplay()); + obj.put("materials", null); + obj.put("foreignTousseApp_id",ti.getForeignTousseApp_id()); + obj.put("tousseType", tousseType); + obj.put("includeImplant", includeImplant); + obj.put("actualUsed", Constants.STR_YES); + obj.put("haveUnSupplementMaterials", BooleanUtils.toBooleanDefaultIfNull(ti.getHaveUnSupplementMaterials(), false)); + }else{ + obj.put("msg", "该器械包所属科室为" + ti.getLocationForDisplay() + ",不能录入使用记录!"); + } + } + if(older != null){ + JSONObject json = new JSONObject(); + json.put("barcode", older.getBarcode()); + json.put("tousseName", older.getTousseDefinitionName()); + obj.put("older", json); + } + } + } else if (bd instanceof ExpensiveDisposablegoods) { + // 高值耗材 + ExpensiveDisposablegoods expensiveDisposablegoods = (ExpensiveDisposablegoods) bd; + if(!ExpensiveDisposablegoods.STATUS_DELIVERED.equals(expensiveDisposablegoods.getStatus())){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材状态为%s,不能录使用记录", barcode,expensiveDisposablegoods.getStatus())); + return; + } + + //判断该高值耗材关联的一次性物品定义的物品类型是否为高值耗材(防止入库时定义为高值耗材,后来修改定义为非高值耗材) + if(expensiveDisposablegoods.getDisposableGoodsID() == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材未找到一次性物品定义", barcode)); + return; + } + DisposableGoods disposableGoods = + diposableGoodsManager.getDisposableGoodsById(String.valueOf(expensiveDisposablegoods.getDisposableGoodsID())); + if(disposableGoods == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材一次性物品定义已被删除", barcode)); + return; + } + + if(!DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS.equals(disposableGoods.getGoodsType())){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材对应一次性物品不为高值耗材", barcode)); + return; + } + + //需要判断发货单是否存在且发货科室与当前登录用户是否为同一个科室,否则给予提示 + Long invoiceId = expensiveDisposablegoods.getInvoiceId(); + if(invoiceId == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材发货单已被删除", barcode)); + return; + } + + Invoice invoice = useRecordManager.getInvoiceById(invoiceId); + if(invoice == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材发货单已被删除", barcode)); + return; + } + + /*if(!StringUtils.equals(invoice.getDepart(), AcegiHelper.getLoginUser().getCurrentOrgUnitName())){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材所属科室与当前登录用户所属科室不一致", barcode)); + return; + }*/ + //判断当前用户登录科室是否存在共用科室配置 + if(CollectionUtils.isNotEmpty(goodsDepartShareConfigManager.getGoodsShareDepartList(currentOrgUnitCode))){ + //判断包实例所属科室是否与当前用户登录科室配置物品共享 + if(!goodsDepartShareConfigManager.canShareGoodsforTwoDepart(currentOrgUnitCode, expensiveDisposablegoods.getLocation())){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材所属科室为" + invoice.getDepart() + ",未配置与当前科室共用,不能录入使用记录!", barcode)); + return; + } + }else{ + //判断包实例所在位置与当前用户所在科室是否一致 + if(!StringUtils.equals(currentOrgUnitCode, expensiveDisposablegoods.getLocation())){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材所属科室为" + invoice.getDepart() + ",未配置与当前科室共用,不能录入使用记录!", barcode)); + return; + } + } + + Long disposableGoodsBatchId = expensiveDisposablegoods.getDisposableGoodsBatchID(); + if(disposableGoodsBatchId == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材数据异常,批次定义id为空", barcode)); + return; + } + DisposableGoodsBatch batch = diposableGoodsManager.getDisposableGoodsBatchById(disposableGoodsBatchId); + if(batch == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材批次定义已被删除", barcode)); + return; + } + + //扫描时判断该高值耗材是否已录过使用记录(即在UseDisposableGoodsItem表存中,按barcode查询),保存时也要校验,防止多人同时操作同一条码。普通物品暂不用校验 + if(CollectionUtils.isNotEmpty(useRecordManager.getUseDiposableGoodsItemList(barcode))){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材已被使用,不能重复添加", barcode)); + return; + } + + obj.put("barcode", bd.getBarcode()); + obj.put("showTousseName", CssdUtils.getDiposableGoodsName(batch.getDiposableGoods())); + obj.put("batchNo", batch.getBatchNumber()); + obj.put("validUntil", batch.getExpDateStr()); + obj.put("tousseType", TousseItem.TYPE_DIPOSABLE_GOODS); + obj.put("goodsType", DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS); + } else if (bd instanceof DisposableGoodsBatch) { + DisposableGoodsBatch batch = (DisposableGoodsBatch) bd; + DisposableGoods disposableGoods = batch.getDiposableGoods(); + if(disposableGoods == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的一次性物品定义已被删除", barcode)); + return; + } + if(DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS.equals(disposableGoods.getGoodsType())){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的一次性物品为高值耗材,只能扫描高值耗材的条码", barcode)); + return; + } + obj.put("barcode", batch.getBarcode()); + obj.put("showTousseName", CssdUtils.getDiposableGoodsName(batch.getDiposableGoods())); + obj.put("batchNo", batch.getBatchNumber()); + obj.put("validUntil", batch.getExpDateStr()); + obj.put("tousseType", TousseItem.TYPE_DIPOSABLE_GOODS); + } + }else{ + obj.put("success", false); + obj.put("error", "条码" + barcode + "为无效条码!"); + } + }else{ + obj.put("success", false); + obj.put("error", "条码不能为空!"); + } + }finally{ + StrutsResponseUtils.output(obj); + } + } + + public void setBarcodeManager(BarcodeManager barcodeManager) { + this.barcodeManager = barcodeManager; + } + + public void setDiposableGoodsManager(DiposableGoodsManager diposableGoodsManager) { + this.diposableGoodsManager = diposableGoodsManager; + } + + public void setGoodsDepartShareConfigManager(GoodsDepartShareConfigManager goodsDepartShareConfigManager) { + this.goodsDepartShareConfigManager = goodsDepartShareConfigManager; + } + + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + + public void setUseRecordManager(UseRecordManager useRecordManager) { + this.useRecordManager = useRecordManager; + } + + public void setTousseInstanceManager(TousseInstanceManager tousseInstanceManager) { + this.tousseInstanceManager = tousseInstanceManager; + } + + protected void buildUseRecordParamsForSave(UseRecord modified) { + String items = StrutsParamUtils.getPraramValue("items", ""); + setUseRecordItemsFromParams(modified, items); + } + + protected void setUseRecordItemsFromParams(UseRecord useRecord, String items) { + // items列表 + List tousseInstanceList = new LinkedList(); + List diposableGoodsList = new LinkedList(); + useRecord.setTousseInstanceList(tousseInstanceList); + useRecord.setDiposableGoodsItems(diposableGoodsList); + JSONArray itemsArray = JSONArray.fromObject(items); + int size = itemsArray.size(); + BarcodeDevice barcodeDevice = null; + for (int i = 0; i < size; ++i) { + JSONObject obj = itemsArray.getJSONObject(i); + if(obj == null){ + throw new RuntimeException("器械包参数错误!"); + } + String type = obj.optString("tousseType"); + String barcode = JSONUtil.optString(obj,"barcode",""); + if("一次性物品".equals(type)){ + Long itemId = JSONUtil.optLong(obj,"id",null); + UseDiposableGoodsItem di = new UseDiposableGoodsItem(); + di.setId(itemId); + di.setName(obj.optString("showTousseName")); + di.setBarcode(barcode); + di.setBatchNo(obj.optString("batchNo")); + di.setAmount(obj.optInt("amount")); + di.setValidUntil(obj.optString("validUntil")); + //根据条码查询对应的一次性物品或高值耗材,并记录最后的一次性物品id + barcodeDevice = barcodeManager.getBarcodeByBarcode(barcode); + if(barcodeDevice instanceof DisposableGoodsBatch || barcodeDevice instanceof ExpensiveDisposablegoods){ + if(barcodeDevice instanceof DisposableGoodsBatch){ + di.setDisposableGoodsId(((DisposableGoodsBatch)barcodeDevice).getDiposableGoods().getId()); + }else if(barcodeDevice instanceof ExpensiveDisposablegoods){ + di.setDisposableGoodsId(((ExpensiveDisposablegoods)barcodeDevice).getDisposableGoodsID()); + } + }else{ + //通常不会有这种情况,此处暂不处理,也不丢弃此数据 + } + diposableGoodsList.add(di); + }else{ + TousseInstance tousseInstance = new TousseInstance(); + Long itemId = JSONUtil.optLong(obj,"id",null); + tousseInstance.setId(itemId); + tousseInstance.setBarcode(barcode); + tousseInstance.setIsUrgentForUseRecord(JSONUtil.optString(obj, "isUrgentForUseRecord", Constants.STR_NO)); + tousseInstance.setActualUsed(JSONUtil.optString(obj, "actualUsed", Constants.STR_YES)); + //设置使用记录顺序号 + tousseInstance.setUseRecordSortNumber(i + 1); + tousseInstanceList.add(tousseInstance); + } + } + } + +}