Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/signRecord/dto/SignRecordDto.java =================================================================== diff -u --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/signRecord/dto/SignRecordDto.java (revision 0) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/signRecord/dto/SignRecordDto.java (revision 41115) @@ -0,0 +1,115 @@ +package com.forgon.disinfectsystem.signRecord.dto; + +import java.util.List; + +/** + * 签收的dto + * BJDXZLYY-78 + */ +public class SignRecordDto { + + /** + * 待签收器械包条码 + */ + private String barcode; + + /** + * 签收科室编码 + */ + private String signOrgUnitCode; + + /** + * 签收科室名称 + */ + private String signOrgUnitName; + + /** + * 签收人工号 + */ + private String signUserCode; + + /** + * 签收人姓名 + */ + private String signUserFullName; + + /** + * 签收时间 + */ + private String signTime; + + /** + * 签收物品照片 + */ + private List itemPhotos; + + /** + * 签收人照片 + */ + private List signerPhotos; + + public String getBarcode() { + return barcode; + } + + public void setBarcode(String barcode) { + this.barcode = barcode; + } + + public String getSignOrgUnitCode() { + return signOrgUnitCode; + } + + public void setSignOrgUnitCode(String signOrgUnitCode) { + this.signOrgUnitCode = signOrgUnitCode; + } + + public String getSignOrgUnitName() { + return signOrgUnitName; + } + + public void setSignOrgUnitName(String signOrgUnitName) { + this.signOrgUnitName = signOrgUnitName; + } + + public String getSignUserCode() { + return signUserCode; + } + + public void setSignUserCode(String signUserCode) { + this.signUserCode = signUserCode; + } + + public String getSignUserFullName() { + return signUserFullName; + } + + public void setSignUserFullName(String signUserFullName) { + this.signUserFullName = signUserFullName; + } + + public String getSignTime() { + return signTime; + } + + public void setSignTime(String signTime) { + this.signTime = signTime; + } + + public List getItemPhotos() { + return itemPhotos; + } + + public void setItemPhotos(List itemPhotos) { + this.itemPhotos = itemPhotos; + } + + public List getSignerPhotos() { + return signerPhotos; + } + + public void setSignerPhotos(List signerPhotos) { + this.signerPhotos = signerPhotos; + } + +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/imagefilemanager/ImageFile.java =================================================================== diff -u -r39254 -r41115 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/imagefilemanager/ImageFile.java (.../ImageFile.java) (revision 39254) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/basedatamanager/imagefilemanager/ImageFile.java (.../ImageFile.java) (revision 41115) @@ -93,6 +93,14 @@ * 聚力康灭菌数据图片(聚力康通过webservice接口推送)GDSRMYY-571 */ public static final String IMAGE_TYPE_STERILIZATION_DATA_JLK = "聚力康灭菌数据图片"; + /** + * 签收物品图片BJDXZLYY-78 + */ + public static final String IMAGE_TYPE_SIGN_ITEM = "签收物品图片"; + /** + * 签收人图片BJDXZLYY-78 + */ + public static final String IMAGE_TYPE_SIGNER = "签收人图片"; public static final Set PICTURE_TYPE = new HashSet(); static{ @@ -237,6 +245,11 @@ * 批次图片编号(根据"批次号+图片子类型+批次图片编号"匹配聚力康推送的图片) */ private String jlkImageNum; + + /** + * 器械包实例id + */ + private Long tousseInstanceId; @Id @GeneratedValue(strategy = GenerationType.AUTO) @@ -441,4 +454,12 @@ this.jlkImageNum = jlkImageNum; } + public Long getTousseInstanceId() { + return tousseInstanceId; + } + + public void setTousseInstanceId(Long tousseInstanceId) { + this.tousseInstanceId = tousseInstanceId; + } + } Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManager.java =================================================================== diff -u -r40808 -r41115 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManager.java (.../TousseInstanceManager.java) (revision 40808) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/toussedefinition/service/TousseInstanceManager.java (.../TousseInstanceManager.java) (revision 41115) @@ -31,6 +31,7 @@ import com.forgon.disinfectsystem.entity.sterilizationmanager.sterilizationrecord.SterilizationRecord; import com.forgon.disinfectsystem.entity.useRecord.UseRecord; import com.forgon.disinfectsystem.entity.washanddisinfectmanager.washanddisinfectrecord.WashAndDisinfectRecord; +import com.forgon.disinfectsystem.signRecord.dto.SignRecordDto; import com.forgon.disinfectsystem.stockmanage.departmentstock.vo.TousseInstanceVo; import com.forgon.disinfectsystem.tousse.toussedefinition.vo.SplitForeignTousseVo; import com.forgon.disinfectsystem.tousse.toussedefinition.vo.TousseOperationRecordDetailVo; @@ -1488,5 +1489,11 @@ * @return */ public List getChildTousseInstance(Long comboTousseInstanceId); + + /** + * 扫描条码签收器械包 + * @param signRecordDto 签收的dto + */ + public void signTousseInstanceByBarcode(SignRecordDto signRecordDto); } Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/signRecord/controller/ButtJointSignRecordController.java =================================================================== diff -u --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/signRecord/controller/ButtJointSignRecordController.java (revision 0) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/signRecord/controller/ButtJointSignRecordController.java (revision 41115) @@ -0,0 +1,43 @@ +package com.forgon.disinfectsystem.signRecord.controller; + +import net.sf.json.JSONObject; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.disinfectsystem.signRecord.dto.SignRecordDto; +import com.forgon.disinfectsystem.tousse.toussedefinition.service.TousseInstanceManager; +import com.forgon.log.model.Log; +import com.forgon.log.service.LogManager; +import com.forgon.tools.json.JSONUtil; + +/** + * 高拍仪物品签收上传接口BJDXZLYY-78 + */ +@RestController +@RequestMapping(value = "/buttjoint/buttjointSignRecordController", produces = "application/json;charset=UTF-8") +public class ButtJointSignRecordController { + + @Autowired + private TousseInstanceManager tousseInstanceManager; + + @Autowired + private LogManager appLogManager; + + @RequestMapping("/signTousseInstanceByBarcode") + public String signTousseInstanceByBarcode(@RequestBody SignRecordDto signRecordDto){ + JSONObject result = JSONUtil.buildJsonObject(true, "签收成功"); + try { + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_SIGN, Log.TYPE_UPDATE, "物品签收上传接口入参:" + JSONObject.fromObject(signRecordDto).toString()); + tousseInstanceManager.signTousseInstanceByBarcode(signRecordDto); + } catch (Exception e) { + result = JSONUtil.buildJsonObject(false, "签收失败," + e.getMessage()); + } + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_SIGN, Log.TYPE_UPDATE, "物品签收上传接口出参:" + result.toString()); + return result.toString(); + } + +} Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/imagefilemanager/service/ImageFileManager.java =================================================================== diff -u -r36976 -r41115 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/imagefilemanager/service/ImageFileManager.java (.../ImageFileManager.java) (revision 36976) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/imagefilemanager/service/ImageFileManager.java (.../ImageFileManager.java) (revision 41115) @@ -12,6 +12,7 @@ import net.sf.json.JSONObject; import com.forgon.disinfectsystem.entity.basedatamanager.imagefilemanager.ImageFile; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; import com.forgon.disinfectsystem.vo.JLKBatchImageVo; /** @@ -198,4 +199,22 @@ * @param jLKBatchImageVoList */ public void saveOrUpdateJLKBatchImage(List jLKBatchImageVoList); + + /** + * 保存签收物品的图片 + * @param barcode 签收的器械包实例条码 + * @param itemPhotos 签收物品的图片的Base64字符串 + * @param uploadUserCode 上传图片的用户工号 + * @param uploadUserName 上传图片的用户名 + */ + public void saveSignItemPhotos(List tousseInstanceList, List itemPhotosBase64, String uploadUserCode, String uploadUserName); + + /** + * 保存签收人的图片 + * @param barcode 签收的器械包实例条码 + * @param signerPhotosBase64 签收人的图片的Base64字符串 + * @param uploadUserCode 上传图片的用户工号 + * @param uploadUserName 上传图片的用户名 + */ + public void saveSignerPhotosPhotos(List tousseInstanceList, List signerPhotosBase64, String uploadUserCode, String uploadUserName); } Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/imagefilemanager/service/ImageFileManagerImpl.java =================================================================== diff -u -r40819 -r41115 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/imagefilemanager/service/ImageFileManagerImpl.java (.../ImageFileManagerImpl.java) (revision 40819) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/imagefilemanager/service/ImageFileManagerImpl.java (.../ImageFileManagerImpl.java) (revision 41115) @@ -2276,5 +2276,91 @@ } return imageType; } + + @Override + public void saveSignItemPhotos(List tousseInstanceList, List itemPhotosBase64List, String uploadUserCode, String uploadUserName) { + if(CollectionUtils.isEmpty(tousseInstanceList)){ + throw new SystemException("器械包实例不能为空!"); + } + if(CollectionUtils.isEmpty(itemPhotosBase64List)){ + throw new SystemException("物品的照片不能为空!"); + } + if(itemPhotosBase64List.size() > 10){ + throw new SystemException("最多上传10张物品照片!"); + } + List imageFileList = new ArrayList(); + for (String base64 : itemPhotosBase64List) { + byte[] imgByteArr = Base64.getDecoder().decode(base64); + for (int i=0;i tousseInstanceList, List signerPhotosBase64List, String uploadUserCode, String uploadUserName) { + if(CollectionUtils.isEmpty(tousseInstanceList)){ + throw new SystemException("器械包实例不能为空!"); + } + if(CollectionUtils.isEmpty(signerPhotosBase64List)){ + throw new SystemException("签收人的照片不能为空!"); + } + if(signerPhotosBase64List.size() > 10){ + throw new SystemException("最多上传10张签收人照片!"); + } + List imageFileList = new ArrayList(); + for (String base64 : signerPhotosBase64List) { + byte[] imgByteArr = Base64.getDecoder().decode(base64); + for (int i=0;i */ - private List getCanSignTousseInstanceListByTousseDefinitionId(Long tdId, String beginDateStr, String endDateStr){ + private List getCanSignTousseInstanceListByTousseDefinitionId(TousseDefinition td, String beginDateStr, String endDateStr, String currentUserOrgUnitCoding){ List canSignTis = new ArrayList(); - if(DatabaseUtil.isPoIdValid(tdId)){ + if(td != null && DatabaseUtil.isPoIdValid(td.getId())){ //根据器械包定义id,器械包实例状态,是否有签收人过滤 - String hql = String.format(" po.signedUser is null and po.status = '%s' and po.tousseDefinition.ancestorID = %s ", - TousseInstance.STATUS_SHIPPED,tdId); + String hql = String.format(" po.signedUser is null and po.status = '%s' and po.tousseDefinition.ancestorID = %s and ((po.location = '%s' and po.location_2 is null) or po.location_2 = '%s')", + TousseInstance.STATUS_SHIPPED, td.getId(), currentUserOrgUnitCoding, currentUserOrgUnitCoding); // 第二个版本签收需要根据时间判断是否可以签收,第一个版本的不需要做判断 if (StringUtils.isNotEmpty(beginDateStr) && StringUtils.isNotEmpty(endDateStr)) { hql += " and " + dateQueryAdapter.dateAreaSql("po.invoiceSendTime", beginDateStr, endDateStr); } - - List tis = this.getByHql(hql); - if(CollectionUtils.isNotEmpty(tis)){ - //根据当前科室过滤 - String currentUserOrgUnitCoding = AcegiHelper.getLoginUser().getCurrentOrgUnitCode(); - for (int index = tis.size()-1 ;index >= 0;index--) { - TousseInstance ti = tis.get(index); - String location = ti.getLocation(); - String location_2 = ti.getLocation_2(); - if(StringUtils.isNotBlank(location_2)){ - //有二次发货,验证二次发货的位置 - location = location_2; - } - if (StringUtils.isNotBlank(location) && !StringUtils.equals(currentUserOrgUnitCoding , location)) { - tis.remove(index); - } - } - canSignTis.addAll(tis); - } + + return this.getByHql(hql, 0, td.getScanAmount(), "id desc"); } return canSignTis; } @@ -6496,7 +6488,7 @@ //若为不可追溯物品则: if(!td.traceable()){ //根据器械包定义获取待签收的器械包实例 - List canSignTis = this.getCanSignTousseInstanceListByTousseDefinitionId(td.getId(), beginDate, endDate); + List canSignTis = this.getCanSignTousseInstanceListByTousseDefinitionId(td, beginDate, endDate, signOrgUnitCode); //每次扫描数量 Integer scanAmount = td.getScanAmount(); //根据器械包定义的每次扫描数量:获得这次扫描最多能签收的器械包实例 @@ -12078,7 +12070,7 @@ * @param signUserFullName 签收人姓名 * @param signDate 签收时间 * @param signInvoice 是否签收发货单(整单签收时,不需要计算签收状态,直接设置签收状态为“已签收”) - * @return + * @return 签收结果vo */ private SignResultVo batchSignTousseInstanceAndReturnSignResult(List tousseInstanceList, String invoiceBeginDate, String invoiceEndDate, @@ -15719,4 +15711,149 @@ return getByHql(conditionBuilder.toString()); } + + @Override + public void signTousseInstanceByBarcode(SignRecordDto signRecordDto) { + //参数校验 + validateSignRecordDto(signRecordDto); + //根据条码查询待签收的器械包实例,支持器械包实例条码及固定条码签收 + List tousseInstanceList = getWaiteSignTousseInstanceListByBarcode(signRecordDto.getBarcode(), signRecordDto.getSignOrgUnitCode()); + //签收器械包 + Long signRecordId = null; + String beginDate = null; + String endDate = null; + Date signDate = null; + if(StringUtils.isNotBlank(signRecordDto.getSignTime())){ + signDate = DateTools.coverStrToDate(signRecordDto.getSignTime(), DateTools.COMMON_DATE_HMS); + } + SignResultVo signResultVo = batchSignTousseInstanceAndReturnSignResult(tousseInstanceList, beginDate, endDate, signRecordId, + signRecordDto.getSignOrgUnitCode(), signRecordDto.getSignOrgUnitName(), + signRecordDto.getSignUserCode(), signRecordDto.getSignUserFullName(), signDate, false); + if(!signResultVo.getSuccess()){ + throw new SystemException(signResultVo.getMessage()); + } + //保存签收物品及签收人图片 + imageFileManager.saveSignItemPhotos(tousseInstanceList, signRecordDto.getItemPhotos(), signRecordDto.getSignUserCode(), signRecordDto.getSignUserFullName()); + imageFileManager.saveSignerPhotosPhotos(tousseInstanceList, signRecordDto.getSignerPhotos(), signRecordDto.getSignUserCode(), signRecordDto.getSignUserFullName()); + } + + /** + * 签收参数校验 + * @param signRecordDto 签收参数 + */ + private void validateSignRecordDto(SignRecordDto signRecordDto) { + if(signRecordDto == null){ + throw new SystemException("参数异常!"); + } + if(StringUtils.isBlank(signRecordDto.getSignOrgUnitCode())){ + throw new SystemException("签收科室编码不能为空!"); + } + if(StringUtils.isBlank(signRecordDto.getSignOrgUnitName())){ + throw new SystemException("签收科室名称不能为空!"); + } + if(StringUtils.isBlank(signRecordDto.getSignUserCode())){ + throw new SystemException("签收人工号不能为空!"); + } + if(StringUtils.isBlank(signRecordDto.getSignUserFullName())){ + throw new SystemException("签收人姓名不能为空!"); + } + if(StringUtils.isBlank(signRecordDto.getBarcode())){ + throw new SystemException("器械包条码不能为空!"); + } + if(StringUtils.isBlank(signRecordDto.getSignTime())){ + throw new SystemException("签收时间不能为空!"); + } + if(CollectionUtils.isEmpty(signRecordDto.getItemPhotos())){ + throw new SystemException("物品照片不能为空!"); + } + if(CollectionUtils.isEmpty(signRecordDto.getSignerPhotos())){ + throw new SystemException("签收人照片不能为空!"); + } + OrgUnit orgUnit = orgUnitManager.getByCode(signRecordDto.getSignOrgUnitCode()); + if(orgUnit == null){ + throw new SystemException(String.format("签收科室编码异常,不存在科室编码为【%s】的科室!", signRecordDto.getSignOrgUnitCode())); + } + if(!StringUtils.equals(orgUnit.getName(), signRecordDto.getSignOrgUnitName())){ + signRecordDto.setSignOrgUnitName(orgUnit.getName()); + } + User user = (User) objectDao.getByProperty(User.class.getName(), "name", signRecordDto.getSignUserCode()); + if(user == null){ + throw new SystemException(String.format("签收人工号异常,不存在工号为【%s】的人员!", signRecordDto.getSignUserCode())); + } + if(!StringUtils.equals(user.getFullName(), signRecordDto.getSignUserFullName())){ + signRecordDto.setSignUserFullName(user.getFullName()); + } + } + + /** + * 根据条码查询待签收的器械包实例 + * @param barcode 条码 + * @return 待签收的器械包实例 + */ + @SuppressWarnings("deprecation") + private List getWaiteSignTousseInstanceListByBarcode(String barcode, String signOrgUnitCode) { + if(StringUtils.isBlank(barcode)){ + throw new SystemException("条码不能为空!"); + } + //签收器械包实例,并返回签收结果vo + BarcodeDevice barcodeDevice = barcodeManager.getBarcodeByBarcode(barcode); + if(barcodeDevice == null){ + throw new SystemException("该条码下没有可签收的器械包!"); + } + if(!(barcodeDevice instanceof TousseInstance)){ + throw new SystemException("该条码下没有可签收的器械包!"); + } + List tousseInstanceList = new ArrayList(); + TousseInstance tousseInstance = (TousseInstance) barcodeDevice; + if(tousseInstance.fixedBarcode()){ + //根据器械包固定条码获取器械包定义 + TousseDefinition td = tousseInstance.getTousseDefinition(); + if(td == null){ + throw new SystemException(String.format("条码为【%s】的器械包实例的器械包定义为空!", barcode)); + } + //若为不可追溯物品则: + if(!td.traceable()){ + //根据器械包定义的每次扫描数量:获得这次扫描最多能签收的器械包实例 + List canSignTis = this.getCanSignTousseInstanceListByTousseDefinitionId(td, null, null, signOrgUnitCode); + if(CollectionUtils.isNotEmpty(canSignTis)){ + tousseInstanceList.addAll(canSignTis); + } + }else{ + throw new SystemException(String.format("固定条码为【%s】的器械包【%s】为可追溯,请扫描该器械包实例的条码", barcode, td.getName())); + } + }else{ + //若该包实例的包定义为不追溯则:提示只能扫包定义的固定条码 + TousseDefinition ancestor = tousseInstance.getTousseDefinition(); + if(ancestor == null){ + throw new SystemException(String.format("条码为【%s】的器械包实例的器械包定义为空!", barcode)); + } + // 外来器械申请单 + if(TousseDefinition.PACKAGE_TYPE_DISINFECTION.equals(ancestor.getTousseType()) + || TousseDefinition.PACKAGE_TYPE_FOREIGN.equals(ancestor.getTousseType())){ + // 消毒物品、外来器械包需要根据祖先包进行判断 + if(!DatabaseUtil.isPoIdValid(ancestor.getAncestorID())){ + throw new SystemException(String.format("条码为【%s】的器械包实例的祖先器械包定义id为空!", barcode)); + } + ancestor = (TousseDefinition) objectDao.getById(TousseDefinition.class.getSimpleName(), ancestor.getAncestorID()); + } else if(ancestor.isSplit()){ + // 外来器械拆分小包 + TousseDefinition td = (TousseDefinition) objectDao.getById(TousseDefinition.class.getSimpleName(), ancestor.getParentID()); + if(td == null){ + throw new SystemException(String.format("条码为【%s】的器械包实例的器械包定义为空!", barcode)); + } + if(!DatabaseUtil.isPoIdValid(td.getAncestorID())){ + throw new SystemException(String.format("条码为【%s】的器械包实例的祖先器械包定义id为空!", barcode)); + } + ancestor = (TousseDefinition) objectDao.getById(TousseDefinition.class.getSimpleName(), td.getAncestorID()); + } + if(ancestor == null){ + throw new SystemException(String.format("条码为【%s】的器械包实例的器械包定义为空!", barcode)); + } + if(!ancestor.traceable()){ + throw new SystemException(String.format("条码为【%s】的器械包【%s】为不可追溯,请扫描该器械包定义的固定条码!", barcode, ancestor.getName())); + } + tousseInstanceList.add(tousseInstance); + } + return tousseInstanceList; + } }