Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/action/ExpensiveGoodsImportController.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/action/ExpensiveGoodsImportController.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/action/ExpensiveGoodsImportController.java (revision 20740) @@ -0,0 +1,50 @@ +package com.forgon.disinfectsystem.expensiveGoods.action; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindException; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsManager; +import com.forgon.tools.AppKeys; + +/** + * @author panhaowen + * + * 2012-3-29 上午09:30:26 + */ +@Controller +public class ExpensiveGoodsImportController { + + private ExpensiveGoodsManager diposableGoodsManager; + + public void setDiposableGoodsManager(ExpensiveGoodsManager diposableGoodsManager) { + this.diposableGoodsManager = diposableGoodsManager; + } + + @RequestMapping("/disinfectsystem/assestManagement/diposableGoods/diposableGoodsImport") + protected ModelAndView onSubmit(HttpServletRequest request, + HttpServletResponse response, Object command, BindException errors) + throws Exception { + String redirectUrl = request.getContextPath() + + "/disinfectsystem/assestManagement/diposableGoods/diposableGoodsView.jsp"; + + String resultStr = diposableGoodsManager.importDiposableGoodsFromExcel(request); + + request.setAttribute(AppKeys.TipMsgKey, resultStr); + request.setAttribute(AppKeys.RedirectTo, redirectUrl); + return new ModelAndView("/common/ReloadSelf"); + } + + protected Object formBackingObject(HttpServletRequest request) + throws Exception { + request.setAttribute("poName", "一次性物品"); + request.setAttribute("actionUrl", "/disinfectsystem/assestmanagement/diposableGoodsImport.mhtml"); + request.setAttribute("formatFile", "/disinfectsystem/assestManagement/diposableGoods/diposableGoodsDemo.xls"); + return new Object(); + } + +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/IdentificationOfDiposableGoodsManager.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/IdentificationOfDiposableGoodsManager.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/IdentificationOfDiposableGoodsManager.java (revision 20740) @@ -0,0 +1,20 @@ +/** + * + */ +package com.forgon.disinfectsystem.expensiveGoods.service; + +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsIdentification; + +/** + * @author Jam + * 2013-8-1 下午3:00:29 + */ +public interface IdentificationOfDiposableGoodsManager { + + public DisposableGoodsIdentification getIdentificationOfDiposableGoodsByIdentification(Long warehouseId, + String name, String specification, String batchNumber, + String identification); + public DisposableGoodsIdentification getIdentificationOfDiposableGoodsByIdentification(Long warehouseId, + String diposableGoodsId, String batchNumber, + String identification); +} Index: build.gradle =================================================================== diff -u -r20250 -r20740 --- build.gradle (.../build.gradle) (revision 20250) +++ build.gradle (.../build.gradle) (revision 20740) @@ -510,6 +510,15 @@ } } +project("ssts-expensivegoods") { + dependencies { + compile (project(":forgon-tools")) + compile (project(":forgon-core")) + compile (project(":ssts-basedata")) + compile (project(":ssts-datasync")) + } +} + project("ssts-print") { dependencies { compile (project(":forgon-tools")) @@ -554,6 +563,7 @@ compile (project(":forgon-core")) compile (project(":ssts-basedata")) compile (project(":ssts-diposablegoods")) + compile (project(":ssts-expensivegoods")) compile (project(":ssts-datasync")) compile (project(":ssts-stockmanage")) } @@ -575,6 +585,7 @@ compile (project(":forgon-core")) compile (project(":ssts-basedata")) compile (project(":ssts-diposablegoods")) + compile (project(":ssts-expensivegoods")) compile (project(":ssts-tousse")) } } @@ -596,6 +607,7 @@ compile (project(":ssts-tousse")) compile (project(":ssts-stockmanage")) compile (project(":ssts-diposablegoods")) + compile (project(":ssts-expensivegoods")) compile (project(":ssts-wash")) compile (project(":ssts-expiration")) compile (project(":ssts-idcard")) @@ -607,6 +619,7 @@ compile (project(":forgon-tools")) compile (project(":forgon-core")) compile (project(":ssts-diposablegoods")) + compile (project(":ssts-expensivegoods")) compile (project(":ssts-basedata")) compile (project(":ssts-tousse")) @@ -627,6 +640,7 @@ compile (project(":forgon-tools")) compile (project(":forgon-core")) compile (project(":ssts-diposablegoods")) + compile (project(":ssts-expensivegoods")) compile (project(":ssts-basedata")) compile (project(":ssts-tousse")) @@ -663,6 +677,7 @@ compile (project(":forgon-core")) compile (project(":ssts-basedata")) compile (project(":ssts-diposablegoods")) + compile (project(":ssts-expensivegoods")) compile (project(":ssts-tousse")) compile (project(":ssts-packing")) @@ -688,6 +703,7 @@ compile (project(":ssts-recyclingapplication")) compile (project(":ssts-datasync")) compile (project(":ssts-diposablegoods")) + compile (project(":ssts-expensivegoods")) } } @@ -711,6 +727,7 @@ compile (project(":forgon-core")) compile (project(":ssts-basedata")) compile (project(":ssts-diposablegoods")) + compile (project(":ssts-expensivegoods")) compile (project(":ssts-tousse")) compile (project(":ssts-userecord")) @@ -728,6 +745,7 @@ compile (project(":forgon-core")) compile (project(":ssts-basedata")) compile (project(":ssts-diposablegoods")) + compile (project(":ssts-expensivegoods")) compile (project(":ssts-tousse")) compile (project(":ssts-invoice")) @@ -748,6 +766,7 @@ compile (project(":forgon-core")) compile (project(":ssts-basedata")) compile (project(":ssts-diposablegoods")) + compile (project(":ssts-expensivegoods")) compile (project(":ssts-tousse")) } } @@ -761,6 +780,7 @@ compile (project(":forgon-core")) compile (project(":ssts-tousse")) compile (project(":ssts-diposablegoods")) + compile (project(":ssts-expensivegoods")) } } @@ -782,6 +802,7 @@ compile (project(":forgon-tools")) compile (project(":forgon-core")) compile (project(":ssts-diposablegoods")) + compile (project(":ssts-expensivegoods")) compile (project(":ssts-tousse")) // 引入CAS client,用户单点登录的身份验证 compile group: 'org.jasig.cas.client', name: 'cas-client-core', version: '3.4.1' @@ -805,6 +826,7 @@ compile (project(":forgon-tools")) compile (project(":forgon-core")) compile (project(":ssts-diposablegoods")) + compile (project(":ssts-expensivegoods")) compile (project(":ssts-tousse")) } } @@ -815,6 +837,7 @@ compile (project(":forgon-core")) compile (project(":ssts-basedata")) compile (project(":ssts-diposablegoods")) + compile (project(":ssts-expensivegoods")) compile (project(":ssts-tousse")) compile (project(":ssts-expiration")) compile (project(":ssts-recyclingrecord")) @@ -836,6 +859,7 @@ compile (project(":forgon-core")) compile (project(":ssts-basedata")) compile (project(":ssts-diposablegoods")) + compile (project(":ssts-expensivegoods")) compile (project(":ssts-tousse")) compile (project(":ssts-packing")) compile (project(":ssts-recyclingapplication")) @@ -861,6 +885,7 @@ compile (project(":forgon-core")) compile (project(":ssts-basedata")) compile (project(":ssts-diposablegoods")) + compile (project(":ssts-expensivegoods")) compile (project(":ssts-tousse")) compile (project(":ssts-datasync")) } @@ -874,6 +899,7 @@ compile (project(":forgon-core")) compile (project(":ssts-basedata")) compile (project(":ssts-diposablegoods")) + compile (project(":ssts-expensivegoods")) compile (project(":ssts-tousse")) compile (project(":ssts-print")) compile (project(":ssts-recyclingapplication")) @@ -898,6 +924,7 @@ compile (project(":forgon-knowledge")) compile (project(":ssts-basedata")) compile (project(":ssts-diposablegoods")) + compile (project(":ssts-expensivegoods")) compile (project(":ssts-tousse")) compile (project(":ssts-print")) Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsManager.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsManager.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsManager.java (revision 20740) @@ -0,0 +1,265 @@ +package com.forgon.disinfectsystem.expensiveGoods.service; + +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import net.sf.json.JSONObject; + +import com.forgon.disinfectsystem.disposablegoods.service.DisposableGoodsServiceContext; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatch; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsIdentification; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; +import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; +import com.forgon.disinfectsystem.inventorymanagement.model.Inventory; +import com.forgon.disinfectsystem.vo.PriceAmount; +import com.forgon.tools.hibernate.BasePoManager; + +public interface ExpensiveGoodsManager extends BasePoManager { + + public void saveOrUpdate(DisposableGoodsStock disposableGoodsStock); + + // 更新标识号和相应的批次,一次性物品库存 + public void updateStorage_TRANS_MANDATORY(Iterable identifications); + + public DisposableGoodsStock getDisposableGoodsStockById(String id); + + public DisposableGoodsStock getDisposableGoodsStockByName(Long warehouseId,String name, + String specification); + + /** + * 根据名字和规格获取一次性物品 + * @param name 名字 + * @param specification 规格 + * @return + */ + public DisposableGoods get(String name,String specification); + + public DisposableGoodsBatchStock getDisposableGoodsStockByBatchNumber(Long warehouseID,Long disposableGoodsID, String batchNumber); + public DisposableGoodsBatch getDisposableGoodsBatchByBatchNumber(Long disposableGoodsID, String batchNumber) ; + public DisposableGoodsBatch getDisposableGoodsBatchById(Long disposableGoodsBatchId) ; + public DisposableGoodsStock getDisposableGoodsStockByDisposableGoodsID(Long warehouseID,Long disposableGoodsID); + public DisposableGoodsBatchStock getByWarehouseIDAndBarcode(Long warehouseID,String barcode); + + public boolean verifyDiposableGoods(String id, String name, + String specification); + + public String getDiposableGoodsTypeTreeJson(); + + /** + * 获取一次性物品定义的列表 + * @param simpleSpell 拼音或五笔码,或者是物品名称 + * @param allItems 是否能被科室申请的标志,值yes表示能 + * @param wareHouseId 科室的id,可以为null + * @return + */ + public JSONObject searchDisposableGoodsList(String simpleSpell, String allItems,String handleDepartCode,boolean showExternalCodeOfDisposableGoods); + + + /** + * 获取一次性物品定义的列表(用List返回) + * @see ExpensiveGoodsManager#searchDisposableGoodsList + * @param simpleSpell + * @param allItems + * @param handleDepartCode + * @param canInventory 是否需要盘点 + * @param showExternalCodeOfDisposableGoods + * @return + */ + List> findDisposableGoodsList(String simpleSpell, String allItems, String handleDepartCode,String canInventory,boolean showExternalCodeOfDisposableGoods); + /** + * 获取一次性物品定义及材料定义的列表 + * @param simpleSpell 拼音或五笔码,或者是物品名称 + * @param allItems 是否能被科室申请的标志,值yes表示能 + * @param wareHouseId 科室的id,可以为null + * @return + */ + List> searchDisposableGoodsAndMaterialList(String simpleSpell, String allItems,String handleDepartCode,boolean showExternalCodeOfDisposableGoods); + // public JSONObject searchDisposableGoodsAndMaterialList(String simpleSpell, String allItems,String handleDepartCode,boolean showExternalCodeOfDisposableGoods); + + /** + * 获取材料或者一次性物品的NAME和ID,用于store中 + * @param simpleSpell 名称或者名称的拼音或者五笔 + * @param goodsType 物品类型,可选值为disposableGoods表示一次性物品,material表示材料,其他值两者都查 + * @return + */ + public JSONObject searchMaterialAndDiposableGoods(String simpleSpell,String goodsType); + + /** + * 获取材料或者一次性物品的NAME和ID,用于store中(用list返回) + * @see ExpensiveGoodsManager#searchMaterialAndDiposableGoods + * @param searchString + * @param goodsType + * @return + */ + List> findMaterialAndDisposableGoods(String searchString, String goodsType); + + public String deleteDiposableGoodsAndReturnMessage(String ids); + + public String importDiposableGoodsFromExcel(HttpServletRequest request); + + public DisposableGoods getDisposableGoodsOfTousseMaterialByName(String name, + String specification); + + public String updateOldData(); + + public void getErrorRecyclingApplications(); + + public List getAllDiposableGoods(); + + public void updateDiposableGoodsPriceFromExcelFile(); + + @Deprecated + public List> getDiposableGoodsList(String sql,boolean showReferencePrice,boolean showExternalCodeOfDisposableGoods); + + public List> getDisposableGoodsList(String sql,boolean showReferencePrice,boolean showExternalCodeOfDisposableGoods,String handleDepartCode); + + public DisposableGoodsStock getDiposableGoodsByInventorySerialNumber(String inventorySerialNumber); + + public DisposableGoods getDisposableGoodsByInventorySerialNumber(String inventorySerialNumber); + /////////////// + public DisposableGoods getDisposableGoodsById_ForUpdate(String id); + + public List getDiposableGoodsBySql_ForUpdate(String sql); + + public List getDisposableGoodsBySql(String sql); + + public List getDisposableGoodsBySql_ForUpdate(String sql); + + public List joinFetchDisposableGoodsStockByDisposableGoodsIds(String warehouseID,Collection ids); + public List getDisposableGoodsStockByBatchBarcodes(String warehouseID,Collection barcodes); + + /** + * 根据id获取DisposableGoodsStock. + * @param ids 一次性物品库存id集合 + * @return + */ + public List getDisposableGoodsStockByDisposableGoodsStockIDs(Collection ids); + + public List getDisposableGoodsStockByDisposableGoodsId(String warehouseID,Long disposableGoodsID); + public List getDisposableGoodsStockByDisposableGoodsId(Long disposableGoodsID); + public List getDisposableGoodsStockByDisposableGoodsIDs(String warehouseID,Collection ids); + + public List getDisposableGoodsBatchStocksByDisposableGoodsStockID(Long disposableGoodsID); + public List getDisposableGoodsBatchStocksExcludingZeroStockByDisposableGoodsStockID(Long disposableGoodsStockID); + + public List getDisposableGoodsBatchStocksByDisposableGoodsID(Long disposableGoodsID); + + public List getDisposableGoodsByBatchBarcodes_ForUpdate(Collection barcodes); + + public List getDisposableGoodsByDisposableGoodsIDs_ForUpdate(Collection ids); + public Map getIdsToDisposableGoodsMapBySql(String sql); + public Map getIdsToDisposableGoodsMapByDisposableGoodsIds(Collection ids); + public List getDisposableGoodsBatchByBatchBarcodes(Collection barcodes); + + public List getExpensiveDisposablegoodsByBarcodes(Collection barcodes); + + /** + * 根据id获取高值耗材. + * @param ids 高值耗材的id集合 + * @return + */ + public List getExpensiveDisposablegoodsByIds(Collection ids); + public List getExpensiveDisposablegoodsByIds(String ids); + public List getDisposableGoodsBatchesByDisposableGoodsID(Long disposableGoodsID); + + public List getExpensivediposablegoodsByDisposableGoodsBatchStockId(Long disposableGoodsBatchStockId); + public List getExpensivediposablegoodsByDisposableGoodsId(Long disposableGoodsId); + public List getExpensivediposablegoodsByGodownEntryItemId(Long godownEntryItemId); + + public List getCurrentUserOrgUnitWarehouseExpensivediposablegoodsByDisposableGoodsId(Long disposableGoodsId); + public List getCurrentUserOrgUnitWarehouseExpensivediposableGoods(String disposableGoodsId,String disposableGoodsStockIds,String disposableGoodsBatchStockIds); + // 在新的事务中执行删除。 + public void deleteDiposableGoodsById_TRANS_NEW(String id); + // 获取批次的可以退库的价格数量 + public List getDiposableGoodsPriceAmountInfoCanOutEntryByBatchID( + String batchID); + + + public void updateDisposableGoods_TRANS_REQUIRED( + DisposableGoods diposableGoods); + public void updateExpensiveDisposablegoodsPrintTime(List expensiveDisposablegoodsList); + + public DisposableGoodsStock createDisposableGoodsStock(Long warehouseID,String warehouseName,DisposableGoods disposableGoods); + + public void saveOrUpdate(DisposableGoodsBatch disposableGoodsBatch); + + public void changeGoodsToExpensiveDiposablegoods_TRANS_NEW(String id); + public void changeExpensiveDiposablegoodsToGoods_TRANS_NEW(String id); + + /** + * 构造新的高值耗材记录 + * @param disposableGoodsBatchStock 批次库存信息 + * @param storage 库存 + * @param price 价格 + * @param conclusion 验收结果 + * @param entryDate 入库时间 + * @param identification 标识号 + * @param godownEntryId 入/退库单id + * @param godownEntryItemId 入库明细id + * @param batchIdFromHisSync batchId(同步其它平台的batchId,主要是保存标识表用于回写用) + * @return + */ + public List newExpensivediposablegoods( + DisposableGoodsBatchStock disposableGoodsBatchStock, Long storage,Double price, + String conclusion, Date entryDate, String identification,Long godownEntryId,Long godownEntryItemId , Long batchIdFromHisSync); + + /** + * 获取并锁定一次性物品相关资源. + * @param disposableGoodsServiceContext 发货的一次性物品上下文 + */ + public void lockAndGetDisposableGoodsResources( + DisposableGoodsServiceContext disposableGoodsServiceContext); + + /** + * 根据关键字对DisposableGoods进行模糊查询(注意要根据用户配置的检索习惯进行检索) + * @param keyword 检索关键字 + * @return + */ + public List getDisposableGoodsByKeyword(String keyword); + + /** + * 获取一次性物品定义的价格(以最后入库的批次为准,如果没有就以一次性物品定义的参考价为准). + * @param disposableGoods 一次性物品 + * @return + */ + Double getRecentPrice(DisposableGoods disposableGoods); + + /** + * 获取某处理供应室的某种一次性物品的库存.
+ * 说明:如果config的storageUseStorageSubtractWaitDeliver配置成true则:库存=现有的库存-待发货数量 + * @param handleDepartCoding 处理供应室 + * @param disposableGoods 一次性物品对象 + */ + public int getDisposableGoodsStorage(String handleDepartCoding, DisposableGoods disposableGoods); + + + /** + * 省医需求:科室申领的时候重新计算该一次性物品的库存(库存 = 该物品库存数量–发货计划里该物品的待发货数量). + * @param disposableGoodId 一次性物品id + * @param storageAmount 原来的库存数量 + * @return 计算后的库存数量 + */ + int reCalculateStorageAmount(Long disposableGoodId, int storageAmount); + + /** + * 中山附一需求:根据物资编码获得hrp一次性物品对应的物品基础信息 + * @param SerialNumber 物资编码 + */ + public Inventory getHrpDisposableGoodsByInventorySerialNumber(String InventorySerialNumber); + + + /** + * 获得失效的批次库存 + * @param disposableGoodsID 一次洗物品id + * @param expdateType 即将过期的一次性物品/已过期的一次性物品/全部 + * @return + */ + public List getExpdateDisposableGoodsBatchStocks(Long disposableGoodsID,String expdateType); + +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsPurchasePlanManagerImpl.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsPurchasePlanManagerImpl.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsPurchasePlanManagerImpl.java (revision 20740) @@ -0,0 +1,514 @@ +package com.forgon.disinfectsystem.expensiveGoods.service; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.sf.json.JSONObject; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFFont; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; +import org.apache.poi.ss.usermodel.RichTextString; + +import com.forgon.Constants; +import com.forgon.disinfectsystem.common.CssdUtils; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntry; +import com.forgon.disinfectsystem.entity.assestmanagement.GoodPurchaseItem; +import com.forgon.disinfectsystem.entity.assestmanagement.GoodPurchasePlan; +import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; +import com.forgon.disinfectsystem.vo.GodownEntryItemPrintVO; +import com.forgon.serialnumber.model.SerialNum; +import com.forgon.serialnumber.service.SerialNumManager; +import com.forgon.tools.Path; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.excel.ExcelCellStyle; +import com.forgon.tools.excel.ExcelHelper; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.util.ForgonDateUtils; + +public class ExpensiveGoodsPurchasePlanManagerImpl implements ExpensiveGoodsPurchasePlanManager { + + private ObjectDao objectDao; + + private SerialNumManager serialNumManager; + + private ExpensiveGoodsManager diposableGoodsManager; + + + public void setDiposableGoodsManager(ExpensiveGoodsManager diposableGoodsManager) { + this.diposableGoodsManager = diposableGoodsManager; + } + + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + + public void setSerialNumManager(SerialNumManager serialNumManager) { + this.serialNumManager = serialNumManager; + } + + public void saveOrUpdate(GodownEntry godownEntry) { + objectDao.saveOrUpdate(godownEntry); + } + + @Override + public void saveGoodPurchasePlan(GoodPurchasePlan goodPurchasePlan, + Map result) { + if(StringUtils.isBlank(goodPurchasePlan.getSerialNumber())){ + goodPurchasePlan.setSerialNumber(serialNumManager + .getSerialNumberStr(SerialNum.TYPE_GOOD_PURCHASE)); + } + objectDao.saveOrUpdate(goodPurchasePlan); + } + + @Override + public GoodPurchasePlan getGoodPurchasePlanById(String id) { + return (GoodPurchasePlan) objectDao.getByProperty( + GoodPurchasePlan.class.getSimpleName(), "id", Long.valueOf(id)); + } + + @Override + public GoodPurchaseItem getGoodPurchaseItemById(String itemId) { + return (GoodPurchaseItem) objectDao.getByProperty( + GoodPurchaseItem.class.getSimpleName(), "id", Long.valueOf(itemId)); + } + + private GoodPurchasePlan getGoodPurchasePlanById_ForUpdate(String id){ + return (GoodPurchasePlan) objectDao.getByProperty_ForUpdate( + GoodPurchasePlan.class.getSimpleName(), "id", Long.valueOf(id)); + } + private void deleteGoodPurchaseItem(GoodPurchaseItem goodPurchaseItem) { + // 删除goodPurchaseItem + goodPurchaseItem.getGoodPurchasePlan().getItemsList().remove(goodPurchaseItem); + objectDao.delete(goodPurchaseItem); + } + @Override + public Map deleteGoodPurchasePlan(String id) { + Map result = new HashMap(); + result.put("success", false); + try { + // 锁定并获取采购计划单 + GoodPurchasePlan goodPurchasePlan = getGoodPurchasePlanById_ForUpdate(id); + if (goodPurchasePlan == null) { + // 采购计划单已被删除 + throw new RuntimeException("采购计划单已被删除!"); + } + + List itemList = new ArrayList(goodPurchasePlan.getItemsList()); + for (GoodPurchaseItem goodPurchaseItem : itemList) { + deleteGoodPurchaseItem(goodPurchaseItem); + } + //删除 + objectDao.delete(goodPurchasePlan); + result.put("success", true); + } catch (Exception e) { + e.printStackTrace(); + result.put("errMsg", e.getMessage()); + throw e; + } + + return result; + } + + private static GoodPurchaseItem getGoodPurchaseItemByItemId( + List items, Long id) { + if (id == null) { + return null; + } + for (GoodPurchaseItem item : items) { + Long itemID = item.getId(); + if (itemID != null && itemID.equals(id)) { + return item; + } + } + return null; + } + + @Override + public void updateGoodPurchasePlan(GoodPurchasePlan original, + GoodPurchasePlan entry, Map returnMsg) { + + // 锁定并获取入库单 + GoodPurchasePlan curGoodPurchasePlan = getGoodPurchasePlanById_ForUpdate(original.getId().toString()); + if(curGoodPurchasePlan == null){ + // 入库单已被删除 + throw new RuntimeException("入库单已被删除!"); + } + + + List originalItemList = original.getItemsList(); + List itemList = entry.getItemsList(); + List curItemList = curGoodPurchasePlan.getItemsList(); + + // 处理修改 + for (int i = 0; i < itemList.size(); ++i) { + GoodPurchaseItem goodPurchaseItem = itemList.get(i); + Long itemID = goodPurchaseItem.getId(); + if(itemID == null){ + continue; + } + GoodPurchaseItem originalGodownEntryItem = getGoodPurchaseItemByItemId(originalItemList, itemID); + if(originalGodownEntryItem == null){ + // 在页面上被删除了。 + //continue; + throw new RuntimeException("参数错误!"); + } + GoodPurchaseItem curGodownEntryItem = getGoodPurchaseItemByItemId(curItemList, itemID); + if(curGodownEntryItem == null){ + // 被并发删除了,也不需要处理 + continue; + } + + + // 保存时,每一项都是新建标识号对象 + + boolean updateBatchStock = false; + boolean updateDiposableGoods = false; + // 供应商 + String originalSupplierName = originalGodownEntryItem.getSupplierName(); + String supplierName = goodPurchaseItem.getSupplierName(); + if(!StringUtils.equals(originalSupplierName, supplierName)){ + curGodownEntryItem.setSupplierName(supplierName); + updateBatchStock = true; + } + + // 生产厂家 + String originalManufacturer = originalGodownEntryItem.getManufacturer(); + String manufacturer = goodPurchaseItem.getManufacturer(); + if(!StringUtils.equals(originalManufacturer, manufacturer)){ + curGodownEntryItem.setManufacturer(manufacturer); + updateBatchStock = true; + } + // 修改计划数 + Integer originalAmount = originalGodownEntryItem.getScheduleAmout(); + Integer amount = goodPurchaseItem.getScheduleAmout(); + Integer curAmount = curGodownEntryItem.getScheduleAmout(); + if(originalAmount == null || !originalAmount.equals(amount)){ + if(curAmount != null && !curAmount.equals(originalAmount)){// 有可能被并发修改了库存 + throw new RuntimeException("计划数已被修改!"); + } + Integer amountChange = amount - originalAmount; + + curGodownEntryItem.setScheduleAmout(amount); + } + // 修改价格 + Double originalPrice = originalGodownEntryItem.getPurchase(); + Double price = goodPurchaseItem.getPurchase(); + Double curPrice = curGodownEntryItem.getPurchase(); + if(originalPrice == null || !originalPrice.equals(price)){ + if(price != null && !price.equals(curPrice)){// 这个判断是有必要的,有可能价格已经被并发修改过了。所以就不需要再修改。 + curGodownEntryItem.setPurchase(price); + } + } + //总价也需要更新 + curGodownEntryItem.setTotalPrice(amount * price); + // 修改上期消耗数 + Integer originalLastConsumption = originalGodownEntryItem.getLastConsumption(); + Integer lastConsumption = goodPurchaseItem.getLastConsumption(); + Integer curgetLastConsumption = curGodownEntryItem.getLastConsumption(); + if(originalLastConsumption == null || !originalLastConsumption.equals(lastConsumption)){ + if(lastConsumption != null && !lastConsumption.equals(curgetLastConsumption)){// 这个判断是有必要的,有可能价格已经被并发修改过了。所以就不需要再修改。 + curGodownEntryItem.setLastConsumption(lastConsumption); + } + } + + } + // 处理新增 + for (int i = 0; i < itemList.size(); ++i) { + GoodPurchaseItem godownEntryItem = itemList.get(i); + Long itemID = godownEntryItem.getId(); + if(itemID != null){// 有id就不是新增项 + continue; + } + + + // 保存godownEntryItem + godownEntryItem.setGoodPurchasePlan(curGoodPurchasePlan); + curItemList.add(godownEntryItem); + objectDao.save(godownEntryItem); + } + // 处理删除项 + for (int i = 0; i < originalItemList.size(); ++i) { + GoodPurchaseItem originalGodownEntryItem = originalItemList.get(i); + Long itemID = originalGodownEntryItem.getId(); + if(itemID == null){ + continue; + } + GoodPurchaseItem godownEntryItem = getGoodPurchaseItemByItemId(itemList, itemID); + if(godownEntryItem != null){// 现在还存在,就不是删除项 + // 在页面上被删除了。 + continue; + } + GoodPurchaseItem curGodownEntryItem = getGoodPurchaseItemByItemId(curItemList, itemID); + if(curGodownEntryItem == null){ + // 被并发删除了。也不需要处理 + continue; + } + + // 删除godownEntryItem + curItemList.remove(curGodownEntryItem); + objectDao.delete(curGodownEntryItem); + } + + // 更新入库单属性 + updateGoodPurchasePlanProperties(original, entry, curGoodPurchasePlan); + // 更新入库单对象 + saveOrUpdate(curGoodPurchasePlan); + // 设置GodownEntryItem详细列表 + //setReturnDetails(curGoodPurchasePlan, idToBatchStockMap,result); + + } + + private void updateGoodPurchasePlanProperties(GoodPurchasePlan original, + GoodPurchasePlan entry, GoodPurchasePlan curGodownEntry) { + // 备注 + String originalRemark = original.getRemark(); + String remark = entry.getRemark(); + if(!StringUtils.equals(originalRemark, remark)){ + curGodownEntry.setRemark(remark); + } + // 时间 + Date originalTime = original.getTime(); + Date time = entry.getTime(); + if(originalTime != null && !originalTime.equals(time)){ + curGodownEntry.setTime(time); + } + } + + private void saveOrUpdate(GoodPurchasePlan godownEntry) { + objectDao.saveOrUpdate(godownEntry); + } + + // 获取入库单打印信息 + @Override + public void loadGoodPurchasePlanPrintData( + String[] invoiceIds,JSONObject jsonObject) { + Collection tousseList = CollectionUtils.emptyCollection(); + jsonObject.put("goods", tousseList); + if (ArrayUtils.isEmpty(invoiceIds)){ + return ; + } + + String idsStr = StringUtils.join(invoiceIds, ","); + String sql = String.format(" where po.id in (%s)", idsStr); + List list = objectDao.findBySql( + GoodPurchasePlan.class.getSimpleName(), sql); + if (list == null || list.size() == 0){ + return ; + } + String serialNumber = ""; + String applicant = ""; + String time = ""; + String supplierName = "";//供应商 + if(list.size() == 1){ + GoodPurchasePlan plan = list.get(0); + serialNumber = plan.getSerialNumber(); + time = ForgonDateUtils.safelyFormatDate(plan.getTime(), Constants.DATEFORMAT_YYYYMMDD, ""); + List items = plan.getItemsList(); + if(items != null && items.size() > 0){ + supplierName = items.get(0).getSupplierName(); + } + } + jsonObject.put("serialNumber", serialNumber); + jsonObject.put("applicant", applicant); + jsonObject.put("godownEntryTime", time); + jsonObject.put("supplierName", supplierName); + + tousseList = loadToussePrintData(list); + jsonObject.put("goods", tousseList); + } + + // 找出已经存在项 + private Collection loadToussePrintData( + Collection plans) { + if (CollectionUtils.isEmpty(plans)) { + return CollectionUtils.emptyCollection(); + } + + List voList = new ArrayList(); + for (GoodPurchasePlan plan : plans) { + List items = plan.getItemsList(); + for (GoodPurchaseItem item : items) { + JSONObject obj = CssdUtils.getGoodsNameAndSp(item.getName()); + DisposableGoods diposableGoods = diposableGoodsManager.get( + obj.optString("materialName"), + obj.optString("specification")); + GodownEntryItemPrintVO tempVo = new GodownEntryItemPrintVO(); + if(diposableGoods == null && DatabaseUtil.isPoIdValid(item.getMaterialDefinitionId())){ + MaterialDefinition md = + (MaterialDefinition)objectDao.getBySql(MaterialDefinition.class.getSimpleName(), "where id=" + item.getMaterialDefinitionId()); + if(md == null){ + continue; + } + tempVo.setCode(md.getExternalCode()); + tempVo.setName(md.getName()); + tempVo.setSpecification(md.getSpecification()); + tempVo.setInventorySerialNumber(md.getInventorySerialNumber()); + tempVo.setUnit(md.getUnit()); + }else{ + tempVo.setCode(diposableGoods.getExternalCode()); + tempVo.setName(diposableGoods.getName()); + tempVo.setSpecification(diposableGoods.getSpecification()); + tempVo.setInventorySerialNumber(diposableGoods.getInventorySerialNumber()); + tempVo.setUnit(diposableGoods.getUnit()); + tempVo.setCertification(diposableGoods.getCertification()); + } + tempVo.setAmount(Long.valueOf(item.getScheduleAmout())); + tempVo.setPrice(item.getPurchase()); + tempVo.setRowPrice(item.getTotalPrice()); + tempVo.setTotalPrice(tempVo.getRowPrice()); + tempVo.setBatchNumber(""); + tempVo.setSupplierName(item.getSupplierName()); + voList.add(tempVo); + } + } + return voList; + } + + /** + * 根据名称与规格查找最近一次的采购明细 + * @param name + * @param specification + * @return + */ + @Override + public GoodPurchaseItem getLastGoodPurchaseItemByNameAndSpecification(String name , String specification){ + GoodPurchaseItem goodPurchaseItem = null; + String hql = "from GoodPurchaseItem where 1=1 "; + if(StringUtils.isNotBlank(name)){ + if(StringUtils.isNotBlank(specification)){ + hql += " and name = '" + name + "[" + specification + "]'"; + }else{ + hql += " and name = '" + name + "'"; + } + } + + hql += " order by id desc"; + List list = objectDao.findByHql(hql,0,1); + goodPurchaseItem = CollectionUtils.isNotEmpty(list) ? list.get(0) : null; + return goodPurchaseItem; + } + + @Override + public void exportGoodPurchasePlan(OutputStream ops, String ids) { + String sql = String.format(" where po.id in (%s)", ids); + + @SuppressWarnings("unchecked") + List list = objectDao.findBySql( + GoodPurchasePlan.class.getSimpleName(), sql); + Collection itemVos = loadToussePrintData(list); + createExportFile(itemVos, ops); + + } + private void createExportFile(Collection itemVos, + OutputStream ops) { + String inputFile = Path.getWebAppRoot() + + "/disinfectsystem/reportforms/receiveDetail.xls"; + FileInputStream fos = null; + POIFSFileSystem fs = null; + HSSFWorkbook wb = null; + try { + fos = new FileInputStream(inputFile); + fs = new POIFSFileSystem(fos); + wb = new HSSFWorkbook(fs); + ExcelHelper.setWorkbook(wb); + ExcelCellStyle.iniAllStyles(); + HSSFSheet sheet = wb.getSheetAt(0); + + HSSFCellStyle cellStyle = wb.createCellStyle(); // 数据单元格格式 + cellStyle.setWrapText(true); + cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); + cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); + cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); + cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); + cellStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT); + HSSFFont font = wb.createFont(); + font.setFontHeightInPoints((short) 10); // 设置字体大小为10 + font.setFontName("宋体"); + cellStyle.setFont(font); + + HSSFRow operatingRow1 = sheet.createRow(0); + createCell(operatingRow1, cellStyle, 0, "编码"); + createCell(operatingRow1, cellStyle, 1, "名称"); + createCell(operatingRow1, cellStyle, 2, "规格"); + createCell(operatingRow1, cellStyle, 3, "单位"); + createCell(operatingRow1, cellStyle, 4, "数量"); + createCell(operatingRow1, cellStyle, 5, "进价"); + createCell(operatingRow1, cellStyle, 6, "进价金额"); + createCell(operatingRow1, cellStyle, 7, "产地"); + createCell(operatingRow1, cellStyle, 8, "供应商"); + createCell(operatingRow1, cellStyle, 9, "注册证号"); + + int row = 1; + for (GodownEntryItemPrintVO item : itemVos) { + HSSFRow operatingRow = sheet.createRow(row); + createCell(operatingRow, cellStyle, 0, item.getCode()); + createCell(operatingRow, cellStyle, 1,item.getName()); + createCell(operatingRow, cellStyle, 2, item.getSpecification()); + createCell(operatingRow, cellStyle, 3, item.getUnit()); + Long storage = item.getAmount(); + if (storage != null) { + createCell(operatingRow, cellStyle, 4, + Integer.parseInt("" + storage)); + } else { + createCell(operatingRow, cellStyle, 4, 0); + } + + createCell(operatingRow, cellStyle, 5, item.getPrice()); + createCell(operatingRow, cellStyle, 6,item.getTotalPrice()); + createCell(operatingRow, cellStyle, 7,item.getProducingArea()); + createCell(operatingRow, cellStyle, 8,item.getSupplierName()); + createCell(operatingRow, cellStyle, 9,item.getCertification()); + row++; + } + wb.write(ops); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + ops.close(); + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + private void createCell(HSSFRow row, HSSFCellStyle cellStyle, + int cellIndex,Object value){ + HSSFCell cell = row.createCell(cellIndex); + cell.setCellStyle(cellStyle); + if(value != null){ + if(value instanceof Double){ + cell.setCellValue((Double) value); + }else if(value instanceof Integer){ + cell.setCellValue((Integer)value); + }else if(value instanceof Boolean){ + cell.setCellValue((Boolean)value); + }else if(value instanceof Date){ + cell.setCellValue((Date)value); + }else if(value instanceof Calendar){ + cell.setCellValue((Calendar)value); + }else if(value instanceof RichTextString){ + cell.setCellValue((RichTextString)value); + }else{ + cell.setCellValue(value.toString()); + } + } + } +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/param/AddOrOutStorageParams.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/param/AddOrOutStorageParams.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/param/AddOrOutStorageParams.java (revision 20740) @@ -0,0 +1,129 @@ +/** + * + */ +package com.forgon.disinfectsystem.expensiveGoods.service.param; + +import java.util.Comparator; + +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntry; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryItem; + +/** + * @author Jeff Li + * + */ +public class AddOrOutStorageParams { + + private Long diposableGoodsID; + private Long batchID; + private String batchNumber; + private Long identificationID; + private Double cost; + private long amount; + + private boolean limitBatch = true; + private boolean limitCost = true; + private boolean deleteIdentificationIfNoStorage = true;// 没有库存时删除标识对象 + + public Long getDiposableGoodsID() { + return diposableGoodsID; + } + + public void setDiposableGoodsID(Long diposableGoodsID) { + this.diposableGoodsID = diposableGoodsID; + } + + public Long getBatchID() { + return batchID; + } + + public void setBatchID(Long batchID) { + this.batchID = batchID; + } + + public String getBatchNumber() { + return batchNumber; + } + + public void setBatchNumber(String batchNumber) { + this.batchNumber = batchNumber; + } + + public Long getIdentificationID() { + return identificationID; + } + + public void setIdentificationID(Long identificationID) { + this.identificationID = identificationID; + } + + public Double getCost() { + return cost; + } + + public void setCost(Double cost) { + this.cost = cost; + } + + public long getAmount() { + return amount; + } + + public void setAmount(long amount) { + this.amount = amount; + } + + public boolean isLimitBatch() { + return limitBatch; + } + + public void setLimitBatch(boolean limitBatch) { + this.limitBatch = limitBatch; + } + + public boolean isLimitCost() { + return limitCost; + } + + public void setLimitCost(boolean limitCost) { + this.limitCost = limitCost; + } + + public boolean isDeleteIdentificationIfNoStorage() { + return deleteIdentificationIfNoStorage; + } + + public void setDeleteIdentificationIfNoStorage( + boolean deleteIdentificationIfNoStorage) { + this.deleteIdentificationIfNoStorage = deleteIdentificationIfNoStorage; + } + + public static class DiposableGoodsIdComparator implements + Comparator { + + public static final DiposableGoodsIdComparator INSTANCE = new DiposableGoodsIdComparator(); + + @Override + public int compare(AddOrOutStorageParams o1, AddOrOutStorageParams o2) { + long id1 = o1.diposableGoodsID.longValue(); + long id2 = o2.diposableGoodsID.longValue(); + if (id1 < id2) { + return -1; + } else if (id1 == id2) { + return 0; + } else { + return 1; + } + } + + } + + public void copyFromGodownEntryItem(GodownEntryItem godownEntryItem){ + this.amount = godownEntryItem.getAmount(); + this.batchID = godownEntryItem.getDisposableGoodsBatchStockID(); + this.batchNumber = godownEntryItem.getBatchNumber(); + this.cost = godownEntryItem.getCost(); + this.diposableGoodsID = godownEntryItem.getDisposableGoodsStockID(); + this.identificationID = godownEntryItem.getIdentificationID(); + } +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DisposableGoodsStockManager.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DisposableGoodsStockManager.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DisposableGoodsStockManager.java (revision 20740) @@ -0,0 +1,74 @@ +package com.forgon.disinfectsystem.expensiveGoods.service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; +import net.sf.json.JSONObject; + +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; + +/** + * 一次性物品库存操作的接口。目前很多的接口都定义在DiposableGoodsManager中 + * @author kzh + * + */ +public interface DisposableGoodsStockManager { + /** + * 根据一次性物品的定义,获取对应的一次性物品的库存 + * @return + */ + public DisposableGoodsStock getDisposableGoodsStockByDisposableGoodsId(String disposableGoodsId,String wareHouseId); + /** + * 获取指定仓库集合中的指定一次性物品的集合的一次性物品的库存. + * @param disposableGoodsIds 一次性物品定义的集合 + * @param warehouseIds 仓库id集合 + * @return 同时满足一次性物品定义的集合和仓库集合条件的一次性物品库存的集合 + */ + public List getDisposableGoodsStockList(Collection disposableGoodsIds,Collection warehouseIds); + /** + * 验证库存 + * @param id + * @param name + * @param specification + * @return + */ + public boolean verifyDiposableGoods(String id, String name, + String specification); +/* *//** + * 获取一次性物品库存列表 + * @param spell + * @param allItems + * @param wareHouseId + * @return + *//* + public JSONObject searchDisposableGoodsStockList(String spell, + String allItems, String wareHouseId);*/ + + /** + * 获取一次性物品库存列表 + * @param spell + * @param allItems + * @param wareHouseId + * @return + */ + List> searchDisposableGoodsStockList(String spell, String allItems, String wareHouseId); + + /** + * 根据处理科室编号和一次性物品编号,查这些物品对应的库存状况 + * @param handleDepartCode 处理科室编号 + * @return disposableGoodsIds 一次性物品的id + */ + List getDisposableGoodsStockByCodeAndDisposeGoodIds(String handleDepartCode, Set disposableGoodsIds); + + /** + * 获得该一次性物品的库存(省医需求:该物品的库存-代发货的数量) + *

如果config.js配置storageUseStorageSubtractWaitDeliver为true,则库存数量=该物品的库存-代发货的数量,不配或者为false为取原来的库存数量

+ * @param handleDepartCode 处理科室编号 + * @param disposableGoodsId 一次性物品的id + * @return 重新计算后的库存数量 + */ + int getDisposableGoodsStock(String handleDepartCode, String disposableGoodsId); +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DisposableGoodsBatchManagerImpl.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DisposableGoodsBatchManagerImpl.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DisposableGoodsBatchManagerImpl.java (revision 20740) @@ -0,0 +1,51 @@ +package com.forgon.disinfectsystem.expensiveGoods.service; + +import java.util.List; + +import org.apache.commons.collections4.CollectionUtils; + +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatch; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.hibernate.BasePoManagerImpl; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.string.StringTools; + + +public class DisposableGoodsBatchManagerImpl extends BasePoManagerImpl + implements DisposableGoodsBatchManager { + + public DisposableGoodsBatchManagerImpl() { + super(DisposableGoodsBatch.class); + } + + @SuppressWarnings("unchecked") + @Override + public List getDisposableGoodsBatch(String disposableGoodsId,String spell) { + + if (DatabaseUtil.isPoIdValid(disposableGoodsId)) { + String sql = " where po.diposableGoods.id = " + disposableGoodsId; + if(!StringTools.isBlank(spell)){ + sql += " and po.batchNumber like '%" + spell + "%'"; + } + return objectDao.findBySql(DisposableGoodsBatch.class.getSimpleName(), sql); + } + return null; + + } + + @SuppressWarnings("unchecked") + @Override + public DisposableGoodsBatch getDisposableGoodsBatchProperty( + String disposableGoodsId, String batchNumber) { + String sql = " where po.diposableGoods.id = " + disposableGoodsId; + if(StringTools.isNotBlank(batchNumber)){ + sql += (" and po.batchNumber = '" + batchNumber + "'"); + } + List list = objectDao.findBySql(DisposableGoodsBatch.class.getSimpleName(), sql); + if(CollectionUtils.isNotEmpty(list)){ + return list.get(0); + } + return null; + } + +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/action/ExpensiveGoodsStockAction.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/action/ExpensiveGoodsStockAction.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/action/ExpensiveGoodsStockAction.java (revision 20740) @@ -0,0 +1,811 @@ +package com.forgon.disinfectsystem.expensiveGoods.action; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.sql.Connection; +import java.sql.Statement; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletResponse; + +import com.forgon.tools.StrutsResponseUtils; +import com.forgon.tools.util.PageUtil; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import net.sf.json.JsonConfig; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; +import org.apache.struts2.convention.annotation.Action; +import org.apache.struts2.convention.annotation.Namespace; +import org.apache.struts2.convention.annotation.ParentPackage; +import org.springframework.orm.hibernate4.SessionFactoryUtils; + +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; +import com.forgon.disinfectsystem.expensiveGoods.service.DiposableGoodBatchStockManager; +import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsManager; +import com.forgon.disinfectsystem.expensiveGoods.service.DisposableGoodsStockManager; +import com.forgon.systemsetting.model.HttpOption; +import com.forgon.systemsetting.service.HttpOptionManager; +import com.forgon.tools.StrutsParamUtils; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.json.JSONUtil; +import com.forgon.tools.json.JsonPropertyFilter; +import com.opensymphony.xwork2.ModelDriven; +import com.opensymphony.xwork2.Preparable; + +@ParentPackage(value = "default") +@Namespace(value = "/disinfectSystem") +@Action(value = "disposableGoodsStockAction") +public class ExpensiveGoodsStockAction implements ModelDriven, + Preparable { + + private File[] uploadFiles; + + private String[] uploadFilesFileName; + + private String[] uploadFilesContentType; + + private DisposableGoodsStock disposableGoodsStock; + + private String spell; + + private DisposableGoodsStockManager disposableGoodsStockManager; + + private ExpensiveGoodsManager disposableGoodsManager; + + private HttpOptionManager httpOptionManager; + + private DiposableGoodBatchStockManager diposableGoodBatchStockManager; + + private ObjectDao objectDao; + + private final Pattern pat = Pattern.compile("[\\u4E00-\\u9FA5]+"); + + protected final Logger logger = Logger.getLogger(this.getClass()); + + public void setDiposableGoodBatchStockManager( + DiposableGoodBatchStockManager diposableGoodBatchStockManager) { + this.diposableGoodBatchStockManager = diposableGoodBatchStockManager; + } + + public void setDiposableGoodsManager( + ExpensiveGoodsManager disposableGoodsManager) { + this.disposableGoodsManager = disposableGoodsManager; + } + + public void setSpell(String spell) { + this.spell = spell; + } + + public void setDisposableGoodsStockManager( + DisposableGoodsStockManager disposableGoodsStockManager) { + this.disposableGoodsStockManager = disposableGoodsStockManager; + } + + public void setHttpOptionManager(HttpOptionManager httpOptionManager) { + this.httpOptionManager = httpOptionManager; + } + + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + + public File[] getUploadFiles() { + return uploadFiles; + } + + public void setUploadFiles(File[] uploadFiles) { + this.uploadFiles = uploadFiles; + } + + public String[] getUploadFilesFileName() { + return uploadFilesFileName; + } + + public void setUploadFilesFileName(String[] uploadFilesFileName) { + this.uploadFilesFileName = uploadFilesFileName; + } + + public String[] getUploadFilesContentType() { + return uploadFilesContentType; + } + + public void setUploadFilesContentType(String[] uploadFilesContentType) { + this.uploadFilesContentType = uploadFilesContentType; + } + + /** + * 保存前检查是否重复 + * + * @return + */ + public String validate() { + String id = StrutsParamUtils.getPraramValue("validateId", null); + String name = StrutsParamUtils.getPraramValue("valifateName", null); + String specification = StrutsParamUtils.getPraramValue("specification", + null); + String message = "{success:true,message:'验证成功',stauts:1}"; + boolean result = disposableGoodsStockManager.verifyDiposableGoods(id, name, + specification); + if (!result) { + message = "{success:false,message:'一次性物品的名称不唯一',stauts:0}"; + ; + } + HttpServletResponse httpServletResponse = StrutsParamUtils + .getResponse(); + httpServletResponse.setContentType("text/html;charset=UTF-8"); + try { + httpServletResponse.getWriter().print(message); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + public String loadDisposableGoodsStock() { + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + + Map map = new HashMap(); + map.put("success", true); + map.put("data", disposableGoodsStock); + try { + String jsonStr = JSONUtil.toJSONString(map, true); + StrutsParamUtils.getResponse().getWriter().println(jsonStr); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public void loadGodownEntryItemByid() { + String disposableGoodsID = StrutsParamUtils.getPraramValue("id", ""); + if (StringUtils.isNotBlank(disposableGoodsID) && disposableGoodsID.equals("0") == false) {// 初始化加载的数据 + try { + List disposableGoodsBatchStocks = disposableGoodsManager.getDisposableGoodsBatchStocksByDisposableGoodsID(Long.valueOf(disposableGoodsID)); + + String jsonString = JSONUtil.toJSONString(disposableGoodsBatchStocks, true); + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + StrutsParamUtils.getResponse().getWriter() + .println(jsonString); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public void deleteDisposableGoods() { + String idStr = StrutsParamUtils.getPraramValue("ids", ""); + String message = ""; + try { + if (StringUtils.isNotBlank(idStr)) { + message = disposableGoodsManager + .deleteDiposableGoodsAndReturnMessage(idStr); + } + } catch (Exception e) { + message = "删除失败!"; + e.printStackTrace(); + } + HttpServletResponse httpServletResponse = StrutsParamUtils + .getResponse(); + httpServletResponse.setCharacterEncoding("UTF-8"); + try { + httpServletResponse.getWriter().print(message); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void printBatchNumOfDiposableGoodsByIds() { + String idStr = StrutsParamUtils.getPraramValue("diposableIds", ""); + StringBuffer sb = new StringBuffer(); + if (StringUtils.isNotBlank(idStr)) { + String[] ids = idStr.split(";"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + for (String id : ids) { + List disposableGoodsBatchStockList = diposableGoodBatchStockManager + .getDisposableGoodsBatchStockByDisposableGoodsId(id, false); + if (disposableGoodsBatchStockList != null) { + for (DisposableGoodsBatchStock batchStock : disposableGoodsBatchStockList) { + if (sb.length() > 0) { + sb.append(";"); + } + String expDate = ""; + if (batchStock.getExpDate() != null) { + expDate = sdf.format(batchStock.getExpDate()); + } + + String specification = ""; + if (batchStock.getDiposableGoods().getSpecification() != null) { + specification = batchStock.getDiposableGoods() + .getSpecification().trim(); + } + + sb.append(batchStock.getDiposableGoods().getName() + + "#&" + batchStock.getBarcode() + "#&" + + expDate + "#&" + batchStock.getSupplierName() + + "#&" + batchStock.getBatchNumber() + "#&" + + specification); + } + } + } + } + + HttpServletResponse response = StrutsParamUtils.getResponse(); + response.setCharacterEncoding("UTF-8"); + + try { + PrintWriter out = response.getWriter(); + out.print("{success:true,value:'" + sb.toString() + "'}"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void printDiposableGoods() { + String items = StrutsParamUtils.getPraramValue("items", ""); + StringBuffer buffer = new StringBuffer(); + if (StringUtils.isNotBlank(items)) { + for (String item : items.split(";")) { + if (StringUtils.isNotBlank(item)) { + String goodsName = item.split(",")[0]; + String barcode = item.split(",")[1]; + String expDate = item.split(",")[2]; + String supplierName = item.split(",")[3]; + String batchNumber = item.split(",")[4]; + buffer.append(goodsName + "#&" + barcode + "#&" + expDate + + "#&" + supplierName + "#&" + batchNumber + ";"); + } + } + String printValue = ""; + if (buffer.length() > 0) { + String str = buffer.toString(); + printValue = str.substring(0, str.length() - 1); + } + + HttpServletResponse response = StrutsParamUtils.getResponse(); + response.setCharacterEncoding("UTF-8"); + + try { + PrintWriter out = response.getWriter(); + out.print("{success:true,barcode:'" + printValue + "'}"); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public void getAllDiposableGoods() { + List goodsList = disposableGoodsManager + .getAllDiposableGoods(); + StringBuffer buff = new StringBuffer(); + for (int i = 0; i < goodsList.size(); i++) { + Long id = goodsList.get(i).getId(); + String name = goodsList.get(i).getName(); + String specification = goodsList.get(i).getSpecification(); + if (StringUtils.isNotBlank(specification)) { + name += "[" + specification + "]"; + } + String code = goodsList.get(i).getExternalCode(); + buff.append("{id:'").append(id).append("',code:'") + .append(code == null ? "" : code).append("',name:'") + .append(name).append("'}"); + if (i != goodsList.size() - 1) { + buff.append(","); + } + } + HttpServletResponse response = StrutsParamUtils.getResponse(); + try { + response.setCharacterEncoding("utf-8"); + response.getWriter().print("[" + buff.toString() + "]"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public String treeLoad() { + HttpServletResponse response = StrutsParamUtils.getResponse(); + try { + response.setCharacterEncoding("utf-8"); + response.getWriter().print( + disposableGoodsManager.getDiposableGoodsTypeTreeJson()); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + public void getDiposableGoodsType() { + List list = httpOptionManager + .getHttpOptionTextById(HttpOption.SYSTEMSETTING_DIPOSABLEGOODS_TYPE); + String str = ""; + if (list != null && list.size() > 0) { + for (int i = 0; i < list.size(); i++) { + str = str + "[ '" + list.get(i) + "'],"; + + } + } + StringBuffer buff = new StringBuffer(); + if (str.length() > 0) { + buff.append("["); + buff.append(str.substring(0, str.length() - 1)); + buff.append("]"); + } + HttpServletResponse response = StrutsParamUtils.getResponse(); + try { + response.setCharacterEncoding("utf-8"); + response.getWriter().print(buff.toString()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 根据拼音简拼,获取一次性物品库存NAME和ID + * + * @return + * @throws Exception + */ + public String getDisposableGoodsStockData() { + spell = spell == null ? "" : spell; + if (spell != null) { + try { + spell = java.net.URLDecoder.decode(spell, "UTF-8"); + + Matcher m = pat.matcher(spell); + if (!m.find()) { + spell = spell.toUpperCase(); + } + String allItems = StrutsParamUtils.getPraramValue("allItems", + null); + String wareHouseId = StrutsParamUtils.getPraramValue("wareHouseId", + null); + + System.out.println("wareHouseId:" + wareHouseId); + List> mapList = disposableGoodsStockManager.searchDisposableGoodsStockList(spell, allItems, wareHouseId); + PageUtil.outPutResult(PageUtil.getPagePara(), mapList); + } catch (Exception e) { + e.printStackTrace(); + } + } + return null; + } + + public String getDiposableGoodBatchStockByBarcode() { + String barcode = StrutsParamUtils.getPraramValue("barcode", ""); + String warehouseId = StrutsParamUtils.getPraramValue("warehouseId", ""); + String diposableGoodsStr = ""; + DisposableGoodsBatchStock disposableGoodsBatchStock = diposableGoodBatchStockManager + .getByBarcode(barcode,warehouseId); + if (disposableGoodsBatchStock != null + && disposableGoodsBatchStock.getDiposableGoods() != null) { + diposableGoodsStr = JSONUtil.toJSONStringEx(disposableGoodsBatchStock,true,DisposableGoodsBatchStock.filterProperties); + } + try { + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + StrutsParamUtils.getResponse().getWriter().print(diposableGoodsStr); + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } + + public String getDiposableGoodBatchStockByNameAndBatchNumber() { + String diposableGoodsName = StrutsParamUtils.getPraramValue( + "diposableGoodsName", ""); + String warehouseId = StrutsParamUtils.getPraramValue( + "warehouseId", ""); + String batchNumber = StrutsParamUtils.getPraramValue("batchNumber", ""); + String diposableGoodsStr = null; + String specification = null; + + if (StringUtils.isNotBlank(diposableGoodsName) + && diposableGoodsName.lastIndexOf("[") != -1) { + specification = diposableGoodsName.substring( + diposableGoodsName.lastIndexOf("[") + 1, + diposableGoodsName.length() - 1); + diposableGoodsName = diposableGoodsName.substring(0, + diposableGoodsName.lastIndexOf("[")).trim(); + } + + DisposableGoodsBatchStock disposableGoodsBatchStock = diposableGoodBatchStockManager + .getDisposableGoodsBatchStockByNameAndBatchNumber(Long.valueOf(warehouseId), + diposableGoodsName, specification, batchNumber); + if (disposableGoodsBatchStock != null) { + diposableGoodsStr = "{id:" + disposableGoodsBatchStock.getId() + + ",name:'" + diposableGoodsName + "',batchNumber:'" + + batchNumber + "',storage:" + + disposableGoodsBatchStock.getStorage() + "}"; + } + try { + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + StrutsParamUtils.getResponse().getWriter().print(diposableGoodsStr); + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } + + /** + * 获取一次性物品的批次信息 + * + * @return + */ + public String getBatchNumbersByDiposableGood() { + String diposableGoodsId = StrutsParamUtils.getPraramValue( + "diposableGoodsId", ""); + List stockList = diposableGoodBatchStockManager + .getDisposableGoodsBatchStockByDisposableGoodsId(diposableGoodsId); + JsonConfig jsonConfig = new JsonConfig(); + JsonPropertyFilter filter = new JsonPropertyFilter(new String[] { + "diposableGoods", "barcode", "type" }); + jsonConfig.setJsonPropertyFilter(filter); + JSONArray jsonArray = JSONArray.fromObject(stockList, jsonConfig); + try { + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + StrutsParamUtils.getResponse().getWriter() + .print(jsonArray.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + // 获取一次性物品批次 + public String getBatchesByDiposableGoodsID() { + String diposableGoodsID = StrutsParamUtils.getPraramValue( + "diposableGoodsID", ""); + + List batchStocks = diposableGoodBatchStockManager + .getDisposableGoodsBatchStockByDisposableGoodsId(diposableGoodsID, false); + String batchs = "[]"; + if(batchStocks != null){ + batchs = JSONUtil.toJSONStringEx(batchStocks,true,DisposableGoodsBatchStock.filterProperties); + } + + try { + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + StrutsParamUtils.getResponse().getWriter() + .print(batchs); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 根据一次性物品Id返回该物品的所有入库批次号列表 + * + * @return + */ + public String getBatchNumData() { + String diposableGoodsID = StrutsParamUtils.getPraramValue( + "diposableGoodsID", ""); + String spelling = StrutsParamUtils.getPraramValue("spell", null); + if (StringUtils.isBlank(diposableGoodsID)) + return null; + try { + List stockList = diposableGoodBatchStockManager + .getDisposableGoodsBatchStockByDisposableGoodsId( + diposableGoodsID, false); + List temList = null; + if (spelling != null) { + temList = new ArrayList(); + if (stockList != null && stockList.size() > 0) { + for (DisposableGoodsBatchStock stock : stockList) { + if (stock.getBatchNumber().contains(spelling)) { + temList.add(stock); + } + } + } + } else { + temList = stockList; + } + JsonConfig jsonConfig = new JsonConfig(); + JsonPropertyFilter filter = new JsonPropertyFilter(new String[] { + "diposableGoods", "barcode", "type", "identifications" }); + jsonConfig.setJsonPropertyFilter(filter); + JSONArray jsonArray = JSONArray.fromObject(temList, jsonConfig); + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject jsonObject = jsonArray.getJSONObject(i); + String displayName = jsonObject.getString("batchNumber") + + "(库存量:" + jsonObject.getString("storage") + ")"; + jsonObject.element("displayName", displayName); + } + HttpServletResponse response = StrutsParamUtils.getResponse(); + response.setCharacterEncoding("UTF-8"); + PrintWriter out; + try { + out = response.getWriter(); + out.print(jsonArray.toString()); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 根据一次性物品的id和处理科室编号来查找对应的库存 + * @return + */ + public void loadStorageByDisposableGoodIdAndHandleDepartCode(){ + try { + String disposeGoodId = StrutsParamUtils.getPraramValue("disposeGoodId", ""); + String handleDepartCode = StrutsParamUtils.getPraramValue("handleDepartCode", ""); + if (StringUtils.isBlank(disposeGoodId) || StringUtils.isBlank(handleDepartCode)){ + StrutsResponseUtils.output(false, "处理科室或者一次性物品id不能为空!"); + return; + } + int storage = disposableGoodsStockManager.getDisposableGoodsStock(handleDepartCode, disposeGoodId); + JSONObject json = new JSONObject(); + json.put("storage", storage); + StrutsResponseUtils.output(true, json.toString()); + } + catch (Exception e) { + logger.error(e, e); + StrutsResponseUtils.output(false, e.getMessage()); + } + } + + + + @Override + public void prepare() { + String id = StrutsParamUtils.getPraramValue("id", ""); + if (DatabaseUtil.isPoIdValid(id)) { + disposableGoodsStock = disposableGoodsManager.getDisposableGoodsStockById(id); + } else { + disposableGoodsStock = new DisposableGoodsStock(); + } + } + + @Override + public DisposableGoodsStock getModel() { + return disposableGoodsStock; + } + + public void updateDiposableGoodsPrice(){ + disposableGoodsManager.updateDiposableGoodsPriceFromExcelFile(); + } + + public void loadDiposablegoods(){ + StringBuffer buff = new StringBuffer(); + List list = disposableGoodsManager.getAllDiposableGoods(); + if(list != null){ + for (DisposableGoodsStock goods : list) { + if(buff.length() > 0){ + buff.append(","); + } + buff.append("{id:").append(goods.getId()).append(","); + String goodName = goods.getName(); + if(StringUtils.isNotBlank(goods.getSpecification())){ + goodName += "[" + goods.getSpecification() + "]"; + } + buff.append("tousseName:'").append(goodName).append("'}"); + } + } + HttpServletResponse response = StrutsParamUtils.getResponse(); + response.setCharacterEncoding("UTF-8"); + PrintWriter out; + try { + out = response.getWriter(); + out.print("[" + buff.toString() + "]"); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 上传物资数据文件(目前为省医专用功能) + * 上传完excel文件并进行解析校验、数据入库等处理 + */ + public void uploadInventoryStockFile(){ + String columnNameSourceId = "SourceID"; + String columnNameBatchId = "BatchID"; + String columnNameQuantity = "Quantity"; + String columnNameMaterialNo = "MaterialNo"; + String columnNameMaterialName = "MaterialName"; + String columnNameMaterialSpec = "MaterialSpec"; + String columnNameProductNo = "ProductNo"; + //所需要的列名 + List columnNames = Arrays.asList(columnNameSourceId,columnNameBatchId,columnNameQuantity + ,columnNameMaterialNo,columnNameMaterialName,columnNameMaterialSpec,columnNameProductNo); + + List columnIndexes = new ArrayList(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put(JSONUtil.JSON_KEY_SUCCESS, false); + //检验上传的附件是否有 + if(uploadFiles == null || uploadFiles.length == 0){ + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "请上传附件"); + StrutsResponseUtils.output(jsonObject); + return; + } + //检查上传的附件数量是否大于1 + if(uploadFiles.length > 1){ + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "上传附件数量只能是1个"); + StrutsResponseUtils.output(jsonObject); + return; + } + FileInputStream inputStream = null; + Connection conn = null; + Statement stm = null; + try{ + inputStream = new FileInputStream(uploadFiles[0]); + HSSFWorkbook wb = new HSSFWorkbook(inputStream); + //1.检验sheet存不存在,有没有超过一个,只有一个的话默认取第一个 + HSSFSheet firstSheet = null; + try { + firstSheet = wb.getSheetAt(0); + if(firstSheet == null){ + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "未找到excel文件的sheet"); + StrutsResponseUtils.output(jsonObject); + return; + } + } catch (Exception e) { + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "未找到excel文件的sheet"); + StrutsResponseUtils.output(jsonObject); + return; + } + + //1.检验sheet存不存在,有没有超过一个,只有一个的话默认取第一个 +/* HSSFSheet secondSheet = null; + try { + secondSheet = wb.getSheetAt(1); + if(secondSheet != null){ + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "excel文件的sheet数量超过1个"); + StrutsResponseUtils.output(jsonObject); + return; + } + } catch (Exception e) { + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "excel文件的sheet数量超过1个"); + StrutsResponseUtils.output(jsonObject); + return; + }*/ + + //2.检查是否有数据且列头命名是否正确 + int rowCount = firstSheet.getLastRowNum(); + if(rowCount < 2){ + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "excel文件的数据至少需要两行,一行列头和一行数据"); + StrutsResponseUtils.output(jsonObject); + return; + } + + //3.循环校验数据,同时将数据 + HSSFRow headRow = firstSheet.getRow(0); + int cellCount = headRow.getLastCellNum(); + if(cellCount < columnNames.size()){ + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "excel文件的数据列数少于7列"); + StrutsResponseUtils.output(jsonObject); + return; + } + + //循环所需要找到的列 + for (int i = 0; i < columnNames.size(); i++) { + boolean found = false; + //循环数据表格中的每一列 + for (int j = 0; j < cellCount; j++) { + HSSFCell cell = headRow.getCell(j); + String cellContent = cell.getStringCellValue(); + if(StringUtils.isBlank(cellContent)){ + continue; + } + if(columnNames.get(i).equalsIgnoreCase(cellContent)){ + columnIndexes.add(j); + found = true; + break; + } + } + if(found == false){ + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "excel文件未找到"+ columnNames.get(i) +"列"); + StrutsResponseUtils.output(jsonObject); + return; + } + } + + conn = SessionFactoryUtils.getDataSource(objectDao.getHibernateSessionFactory()).getConnection(); + stm = conn.createStatement(); + stm.addBatch("delete from JXINVENTORYSTOCK"); + JSONObject dataJsonObject = null; + //4.没有异常时,执行导入入库的逻辑 + for (int i = 1; i <= rowCount; i++) { + dataJsonObject = new JSONObject(); + HSSFRow dataRow = firstSheet.getRow(i); + for (int j = 0; j < columnIndexes.size(); j++) { + String columnName = columnNames.get(j); + String cellValue = ""; + HSSFCell dataCell = dataRow.getCell(columnIndexes.get(j)); + if(dataCell != null){ + cellValue = dataCell.getStringCellValue(); + } + if(columnNameSourceId.equals(columnName) || columnNameBatchId.equals(columnName) || columnNameQuantity.equals(columnName)){ + if(cellValue == null){ + cellValue = ""; + } + if(cellValue.indexOf(".") != -1){ + cellValue = cellValue.substring(0 , cellValue.indexOf(".")); + } + boolean isNegative = false; + if(cellValue.startsWith("-")){ + isNegative = true; + cellValue = cellValue.substring(1); + } + if(!StringUtils.isNumeric(cellValue)){ + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "第"+ i +"行,列名为"+ columnName +"的内容不为数字,只能为数字。"); + StrutsResponseUtils.output(jsonObject); + return; + } + if(isNegative){ + cellValue = "-" + cellValue; + } + } + dataJsonObject.put(columnNames.get(j), cellValue); + } + stm.addBatch("insert into JXINVENTORYSTOCK(SourceID,BatchID,Quantity,MaterialNo,MaterialName,MaterialSpec,ProductNo) " + + "values ("+ dataJsonObject.optString(columnNameSourceId) +","+ dataJsonObject.optString(columnNameBatchId) +","+ + dataJsonObject.optString(columnNameQuantity) +",'"+ dataJsonObject.optString(columnNameMaterialNo) +"','"+ + dataJsonObject.optString(columnNameMaterialName) +"','"+ dataJsonObject.optString(columnNameMaterialSpec) +"','"+ + dataJsonObject.optString(columnNameProductNo) +"')"); + } + stm.executeBatch(); + + //5.响应输出结果 + jsonObject.put(JSONUtil.JSON_KEY_SUCCESS, true); + StrutsResponseUtils.output(jsonObject); + }catch(Exception e){ + e.printStackTrace(); + jsonObject.put(JSONUtil.JSON_KEY_MESSAGE, "出现异常:" + e); + StrutsResponseUtils.output(jsonObject); + return; + }finally{ + if(stm != null){ + try { + stm.close(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + if(conn != null){ + try { + conn.close(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + if(inputStream != null){ + try { + inputStream.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + } + +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsGodownEntryItemManager.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsGodownEntryItemManager.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsGodownEntryItemManager.java (revision 20740) @@ -0,0 +1,64 @@ +package com.forgon.disinfectsystem.expensiveGoods.service; + +import java.util.List; + +import net.sf.json.JSONObject; + +import com.forgon.directory.model.OrgUnit; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryItem; +import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; + +public interface ExpensiveGoodsGodownEntryItemManager { + public GodownEntryItem getGodownEntryItemById(String id); + /** + * 获取入库单或者退库单的列表 + * @param startDate 起始日期 + * @param endDate 结束日期 + * @param supplier 供应商 + * @param orderField 排序字段 + * @param warehouseId 仓库id + * @param type 单类型,入库单或者是退库单或者全部 + * @param hasInvoice 是否有发票 + * @param disposableGoodsType 一次性物品类型 + * @return + */ + public List getGodownEntryItemList(String startDate,String endDate, + String supplier,String orderField,String warehouseId,String type,String hasInvoice,String disposableGoodsType); + /** + * 设置物品到对应科室的默认仓库 + * @param entry + */ + public void setDefaultWareHouse(GodownEntryItem item, OrgUnit orgUnit); + /** + * 设置物品到指定的仓库 + * @param item + * @param wareHouse + */ + public void setWareHouse(GodownEntryItem item, WareHouse wareHouse); + /** + * 设置物品到指定的仓库 + * @param item + * @param wareHouseId + * @param wareHouseName + */ + public void setWareHouse(GodownEntryItem item, Long wareHouseId,String wareHouseName); + /** + * 转换json对象为GodownEntryItem + * @param itemObject + * @return 以json对象的信息创建的GodownEntryItem + */ + public GodownEntryItem parseGodownEntryItem(JSONObject itemObject); + /** + * 从源对象中复制一个信息完全一样的副本 + * @param other + * @return + */ + public GodownEntryItem clone(GodownEntryItem other); + + /** + * 根据一次性物品id查询出该一次性物品最近一条入库单明细数据 + * @param disposableGoodsId + * @return + */ + public GodownEntryItem getLastGodownEntryByDisposableGoodsId(String disposableGoodsId); +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DiposableGoodBatchStockManagerImpl.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DiposableGoodBatchStockManagerImpl.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DiposableGoodBatchStockManagerImpl.java (revision 20740) @@ -0,0 +1,378 @@ +/** + * + */ +package com.forgon.disinfectsystem.expensiveGoods.service; + +import java.math.BigDecimal; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Set; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.time.DateFormatUtils; +import org.apache.log4j.Logger; + +import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.disinfectsystem.barcode.service.BarcodeManager; +import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatch; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsIdentification; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; +import com.forgon.disinfectsystem.vo.DiposableGoodsStorageVo; +import com.forgon.serialnumber.service.SerialNumManager; +import com.forgon.tools.Constants; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.db.InitDbConnection; +import com.forgon.tools.hibernate.BasePoManager; +import com.forgon.tools.hibernate.BasePoManagerImpl; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.string.StringTools; +import com.forgon.tools.util.SqlUtils; + +/** + * @author JamZhou + * + * 2012-4-27 上午10:20:04 + */ +public class DiposableGoodBatchStockManagerImpl extends BasePoManagerImpl implements + DiposableGoodBatchStockManager { + + public DiposableGoodBatchStockManagerImpl() { + super(DisposableGoodsBatchStock.class); + } + + private static final Logger logger = Logger + .getLogger(DiposableGoodBatchStockManagerImpl.class); + + private BarcodeManager barcodeManager; + + private DateQueryAdapter dateQueryAdapter; + + private SerialNumManager serialNumManager; + + private InitDbConnection dbConnection; + + private WareHouseManager wareHouseManager; + + public void setDbConnection(InitDbConnection dbConnection) { + this.dbConnection = dbConnection; + } + + public void setWareHouseManager(WareHouseManager wareHouseManager) { + this.wareHouseManager = wareHouseManager; + } + + public void setSerialNumManager(SerialNumManager serialNumManager) { + this.serialNumManager = serialNumManager; + } + + public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { + this.dateQueryAdapter = dateQueryAdapter; + } + + public void setBarcodeManager(BarcodeManager barcodeManager) { + this.barcodeManager = barcodeManager; + } + + @Override + public void saveOrUpdate(DisposableGoodsBatchStock disposableGoodsBatchStock) { + if (disposableGoodsBatchStock != null) { + // 重新计算库存 + disposableGoodsBatchStock.recalculateAmount(); + objectDao.saveOrUpdate(disposableGoodsBatchStock); + } + + } + + + /** + * 获得库存对象 + * + * @param diposableGoodId + * @param batchNumber + * @return + */ + @Override + public DisposableGoodsBatchStock getDiposableGoodBatchStock( + String disposableGoodsStockId, String batchNumber) { + String sql = " where po.diposableGoods.id = " + disposableGoodsStockId + + " and po.batchNumber = '" + batchNumber + "'"; + DisposableGoodsBatchStock disposableGoodsBatchStock = (DisposableGoodsBatchStock) objectDao + .getBySql(DisposableGoodsBatchStock.class.getSimpleName(), sql); + return disposableGoodsBatchStock; + } + + /** + * 通过一次性物品名和批号获得库存 + * + * @param disposableGoodsName + * @param batchNumber + * @return + */ + @Override + public DisposableGoodsBatchStock getDisposableGoodsBatchStockByNameAndBatchNumber( + Long warehouseId, String disposableGoodsName, String specification, + String batchNumber) { + if (!DatabaseUtil.isPoIdValid(warehouseId)) { + return null; + } + if (StringUtils.isBlank(disposableGoodsName) + || StringUtils.isBlank(batchNumber)) { + return null; + } + String disposableGoodsSql = String + .format(" (select d.id from %s d where %s and %s)", + DisposableGoods.class.getSimpleName(), SqlUtils + .getStringFieldPredicate("d.name", + disposableGoodsName), SqlUtils + .getStringFieldPredicateWithBlankHandling( + "d.specification", specification)); + String sql = String.format(" where %s and %s and %s ", SqlUtils + .getLongFieldPredicate("po.warehouseID", warehouseId), SqlUtils + .getNonStringFieldPredicate("po.disposableGoodsId", + disposableGoodsSql), SqlUtils + .getStringFieldPredicate("po.batchNumber", + batchNumber.trim())); + DisposableGoodsBatchStock disposableGoodsBatchStock = (DisposableGoodsBatchStock) objectDao + .getBySql(DisposableGoodsBatchStock.class.getSimpleName(), sql); + return disposableGoodsBatchStock; + } + + @SuppressWarnings("unchecked") + @Override + public String getEarliestNonExpiredDisposableGoodsBatchStock(Long disposableGoodsStockId, String startDate){ + if (DatabaseUtil.isPoIdValid(disposableGoodsStockId)) { + Date curDate = new Date(); + String curDateStr = DateFormatUtils.format(curDate, + DisposableGoodsBatch.EXP_DATE_FORMAT); + String sql = " where po.diposableGoods.id = " + disposableGoodsStockId + + " and po.storage > 0 and po.expDate < " + + dateQueryAdapter.dateAdapter(startDate) + +" and po.expDate > "+dateQueryAdapter.dateAdapter(curDateStr) + + " order by po.expDate asc"; + List disposableGoodsBatchStockList = objectDao + .findBySql(DisposableGoodsBatchStock.class.getSimpleName(), + sql); + if (disposableGoodsBatchStockList != null + && disposableGoodsBatchStockList.size() > 0) { + return disposableGoodsBatchStockList.get(0).getBatchNumber(); + } + } + return null; + } + + @Override + public DisposableGoodsBatchStock getDiposableGoodBatchStockById(String id) { + return (DisposableGoodsBatchStock) objectDao.getByProperty( + DisposableGoodsBatchStock.class.getSimpleName(), "id", + Long.valueOf(id)); + } + + public DisposableGoodsBatchStock getByBarcode(String barcode,String warehouseId){ + if(StringTools.isNotBlank(barcode) && DatabaseUtil.isPoIdValid(warehouseId)){ + String sql = " where po.barcode = '" + barcode + "' and po.warehouseID = " + warehouseId; + List list = objectDao.findBySql(DisposableGoodsBatchStock.class.getSimpleName(), sql); + if(CollectionUtils.isNotEmpty(list)){ + return (DisposableGoodsBatchStock)list.get(0); + } + } + return null; + } + + @SuppressWarnings("unchecked") + @Override + public List getDisposableGoodsBatchStockByDisposableGoodsId( + String disposableGoodsId) { + if (StringUtils.isNotBlank(disposableGoodsId)) { + String sql = " where po.storage > 0 and po.diposableGoods.id = " + + disposableGoodsId; + return objectDao.findBySql( + DisposableGoodsBatchStock.class.getSimpleName(), sql); + } + return null; + } + + /** + * 返回该一次性物品的所有库存大于0的入库批次信息 + * + * @param disposableGoodsId + * @return + */ + @SuppressWarnings("unchecked") + @Override + public List getDisposableGoodsBatchStockByDisposableGoodsId( + String disposableGoodsId, boolean selectAll) { + return getDisposableGoodsBatchStockByDisposableGoodsId(disposableGoodsId,null,selectAll); + } + public List getCurrentUserOrgUnitWarehouseDisposableGoodsBatchStockByDisposableGoodsId( + String disposableGoodsId, boolean selectAll){ + if(StringUtils.isBlank(disposableGoodsId)){ + return null; + } + String sql = String.format(" where %s and %s ",SqlUtils.getNonStringFieldPredicate("po.disposableGoodsId", disposableGoodsId), + SqlUtils.getNonStringFieldInCollectionsPredicate("po.warehouseID", wareHouseManager.getCurrentUserOrgUnitWarehouseIds())); + if (!selectAll) { + sql += " and po.storage > 0"; + } + return objectDao.findBySql( + DisposableGoodsBatchStock.class.getSimpleName(), sql); + } + public DisposableGoodsBatchStock getDisposableGoodsBatchStock(Long disposableGoodsId,String orgUnitCoding){ + Date validUntil = new Date(); + String validUntilSql = " " + + dateQueryAdapter.dateConverAdapter2(com.forgon.Constants.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS.format(validUntil), + "yyyy-mm-dd HH24:MI:SS"); + + String validUntilStr = String.format(" ( %s > %s) ", "po.expDate", validUntilSql); + String storageStr = "i.amount>0"; + String orderBy = "order by i.id"; + String wareHouseStr = SqlUtils.getNonStringFieldInCollectionsPredicate("i.warehouseID", wareHouseManager.getWareHouseIdsByUnitCode(orgUnitCoding)); + String sqlformat = "select distinct po from %s po inner join fetch po.identifications i where %s and %s and (%s) and ( po.disposableGoodsId = %d) %s "; + String queryString = String.format(sqlformat,DisposableGoodsBatchStock.class.getSimpleName(),validUntilStr,storageStr, + wareHouseStr,disposableGoodsId,orderBy); + List stocks = objectDao.findByHql(queryString); + if(CollectionUtils.isNotEmpty(stocks)){ + return stocks.get(0); + }else{ + //获取库存为0的最后一次和入库的批次 + storageStr = "1=1"; + orderBy = "order by i.id desc"; + queryString = String.format(sqlformat,DisposableGoodsBatchStock.class.getSimpleName(),validUntilStr,storageStr, + wareHouseStr,disposableGoodsId,orderBy); + stocks = objectDao.findByHql(queryString); + if(CollectionUtils.isNotEmpty(stocks)){ + return stocks.get(0); + } + } + return null; + } + @SuppressWarnings("unchecked") + @Override + public List getDisposableGoodsBatchStockByDisposableGoodsId( + String disposableGoodsId,String wareHouseId, boolean selectAll) { + if (StringUtils.isNotBlank(disposableGoodsId)) { + String sql = " where po.disposableGoodsId = " + disposableGoodsId; + if (!selectAll) { + sql += " and po.storage > 0"; + } + if(DatabaseUtil.isPoIdValid(wareHouseId)){ + sql += " and po.warehouseID = " + wareHouseId; + } + return objectDao.findBySql( + DisposableGoodsBatchStock.class.getSimpleName(), sql); + } + return null; + } + /** + * 根据一次性物品定义拿到该物品对应的任意一个标识号 + * + * @param disposableGoodsStock + * @return + */ + @Override + public String getIdentificationNumberByDisposableGoodsStock( + DisposableGoodsStock disposableGoodsStock) { + Set dgbs = disposableGoodsStock.getGoodsBatchs(); + if(dgbs == null || dgbs.isEmpty()){ + return null; + } + List identifis = dgbs.iterator().next().getIdentifications(); + if(identifis == null || identifis.isEmpty()){ + return null; + } + return identifis.get(0).getIdentification(); + } + + @Override + @SuppressWarnings("unchecked") + public List getDiposableGoodsStorageVos() { + List vos = new ArrayList(); + List disposableGoodsStockList = objectDao.findBySql( + DisposableGoodsStock.class.getName(), + "where po.amount > 0 order by externalCode"); + for (DisposableGoodsStock disposableGoodsStock : disposableGoodsStockList) { + DiposableGoodsStorageVo vo = new DiposableGoodsStorageVo(); + vo.setExteranlCode(disposableGoodsStock.getExternalCode()); + vo.setName(disposableGoodsStock.getName()); + vo.setSpecification(disposableGoodsStock.getSpecification()); + vo.setAmount(Integer.valueOf(disposableGoodsStock.getAmount().toString())); + DisposableGoodsBatchStock disposableGoodsBatchStock = (DisposableGoodsBatchStock) objectDao + .getBySql( + DisposableGoodsBatchStock.class.getName(), + "where po.diposableGoods.id=" + + disposableGoodsStock.getId()); + vo.setPrice(disposableGoodsBatchStock.getCost()); + vo.setIdentificationNumber(getIdentificationNumberByDisposableGoodsStock(disposableGoodsStock)); + vo.setSupplier(disposableGoodsBatchStock.getSupplierName()); + vo.setTotalPrice(vo.getPrice() * vo.getAmount()); + vo.setUnit(disposableGoodsStock.getUnit()); + vos.add(vo); + } + return vos; + } + public Double getEarliestPrice(Long disposableGoodsStockId,Double referencePrice){ + Double retPrice = 0d; + if(referencePrice != null){ + retPrice = referencePrice; + } + if(DatabaseUtil.isPoIdValid(disposableGoodsStockId)){ + String sql = ""; + if (dbConnection.isSqlServer()) { + sql = "select * from (select top 1 d.cost from DisposableGoodsBatchStock d where d.diposableGoods_id = " + + disposableGoodsStockId + + " and storage > 0 order by d.id asc) as temp"; + } else if (dbConnection.isOracle()) { + sql = "select * from (select d.cost from DisposableGoodsBatchStock d where d.diposableGoods_id = " + + disposableGoodsStockId + + " and storage > 0 order by d.id asc) where rownum =1"; + } + ResultSet rs = objectDao.executeSql(sql); + BigDecimal returnValue = null; + try { + while (rs.next()) { + returnValue = rs.getBigDecimal("cost"); + } + } catch (SQLException e) { + e.printStackTrace(); + }finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + if(returnValue != null){ + retPrice = returnValue.doubleValue(); + } + } + return retPrice; + } + /** + * 拿失效日期最大的那个批次的价格 + * + * @param disposableGoodsStock + * @return + */ + // Terry Kwan,获取库存不为0,并且最早入库的批次的价格(即id为最小的) + // 2015-07-25 + @Override + public Double getEarliestPrice(DisposableGoodsStock disposableGoodsStock) { + return getEarliestPrice(disposableGoodsStock.getId(),disposableGoodsStock.getReferencePrice()); + } + + @SuppressWarnings("unchecked") + @Override + public List getIdentificationsWithNoZeroStroge( + Long disposableGoodsBatchStockId) { + String hql = "from " + DisposableGoodsIdentification.class.getSimpleName() + " po where po.batchStock.id = " + + disposableGoodsBatchStockId; + hql += " and po.amount > 0 order by po.entryDate "; + return objectDao.findByHql(hql); + } + + public List getDisposableGoodsBatchStockBySql(String sql){ + return objectDao.findBySql(DisposableGoodsBatchStock.class.getSimpleName(),sql); + } +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/dwr/table/ExpensiveGoodsGodownEntryTableManager.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/dwr/table/ExpensiveGoodsGodownEntryTableManager.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/dwr/table/ExpensiveGoodsGodownEntryTableManager.java (revision 20740) @@ -0,0 +1,506 @@ +package com.forgon.disinfectsystem.expensiveGoods.dwr.table; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.apache.commons.lang.StringUtils; + +import com.forgon.component.grid.GridManager; +import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntry; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryItem; +import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; +import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsManager; +import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsGodownEntryItemManager; +import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsGodownEntryManager; +import com.forgon.disinfectsystem.vo.PriceAmount; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.json.JSONUtil; +import com.forgon.tools.util.SqlUtils; + +public class ExpensiveGoodsGodownEntryTableManager { + + private GridManager gridManager; + + private DateQueryAdapter dateQueryAdapter; + + private ExpensiveGoodsManager diposableGoodsManager; + + private WareHouseManager wareHouseManager; + + private ExpensiveGoodsGodownEntryItemManager godownEntryItemManager; + + private ExpensiveGoodsGodownEntryManager godownEntryManager; + + public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { + this.dateQueryAdapter = dateQueryAdapter; + } + + public void setGridManager(GridManager gridManager) { + this.gridManager = gridManager; + } + + public void setDiposableGoodsManager( + ExpensiveGoodsManager diposableGoodsManager) { + this.diposableGoodsManager = diposableGoodsManager; + } + public void setWareHouseManager(WareHouseManager wareHouseManager) { + this.wareHouseManager = wareHouseManager; + } + public void setGodownEntryItemManager( + ExpensiveGoodsGodownEntryItemManager godownEntryItemManager) { + this.godownEntryItemManager = godownEntryItemManager; + } + public void setGodownEntryManager(ExpensiveGoodsGodownEntryManager godownEntryManager) { + this.godownEntryManager = godownEntryManager; + } + /** + * 获取调拨单的打印数据。调拨单的打印数据,每个仓库的入库和退库分别打印 + * @param sqlWhereParamMap + * @return + */ + public String loadAppropriateListPrintData(Map sqlWhereParamMap){ + List currentUserWarehouses = wareHouseManager.getWareHouseListByCurrentOrgUnit(); + String startDate = sqlWhereParamMap.get("startDate"); + String endDate = sqlWhereParamMap.get("endDate"); + + if(currentUserWarehouses != null && !currentUserWarehouses.isEmpty()){ + List jsonStrings = new ArrayList(); + for(WareHouse warehouse : currentUserWarehouses){ + String sql = getAppropriateListHql(sqlWhereParamMap, GodownEntry.SUBTYPE_MOVE_IN, warehouse.getId()); + String result = godownEntryListToJsonString(startDate, endDate, + warehouse, sql, GodownEntry.SUBTYPE_MOVE_IN); + jsonStrings.add(result); + + sql = getAppropriateListHql(sqlWhereParamMap, GodownEntry.SUBTYPE_MOVE_OUT, warehouse.getId()); + result = godownEntryListToJsonString(startDate,endDate, + warehouse,sql,GodownEntry.SUBTYPE_MOVE_OUT); + jsonStrings.add(result); + } + return JSONArray.fromObject(jsonStrings).toString(); + } + return null; + } + + private String godownEntryListToJsonString(String startDate, + String endDate, WareHouse warehouse, String sql, String subType) { + List list = godownEntryManager.getGodownEntryListByHql(sql); + Double sum = 0.0; + for(GodownEntry entry : list){ + sum += entry.getTotalPrice(); + } + Map map = new HashMap(); + map.put("success", true); + map.put("goods", list); + map.put("totalPrice", sum); + map.put("date", startDate + " 至 " + endDate); + map.put("depart", "[" + AcegiHelper.getCurrentOrgUnitName() + "]"); + map.put("warehouse", warehouse.getName()); + map.put("subType", subType); + return JSONUtil.toJSONStringEx(map, true, new String[] { "itemsList" }); + } + /** + * 获取调拨单列表界面传递的hql语句 + * @param sqlWhereParamMap + * @param 子类型,调拨入库或者调拨出库 + * @return + */ + private String getAppropriateListHql(Map sqlWhereParamMap,String subType,Long warehouseId) { + if(!DatabaseUtil.isPoIdValid(warehouseId)){ + return ""; + } + String godownEntryType = GodownEntry.TYPE_APPROPRIATE; + String code = sqlWhereParamMap.get("code"); + String batchNumber = sqlWhereParamMap.get("batchNumber"); + String sql = "where po.type='" + godownEntryType + "'"; + int codeIndex = code.lastIndexOf("["); + String specification = ""; + if (StringUtils.isNotBlank(code) && code.lastIndexOf("[") != -1) { + specification = code.substring(codeIndex + 1, code.length() - 1); + code = code.substring(0, codeIndex); + } + String startDate = sqlWhereParamMap.get("startDate"); + String endDate = sqlWhereParamMap.get("endDate"); + if (StringUtils.isNotBlank(code)) { + if (StringUtils.isNotBlank(specification)) { + sql += " and po.id in (select bo.godownEntry.id from GodownEntryItem as bo where bo.diposableGoods.name = '" + + code + + "' and bo.diposableGoods.specification = '" + + specification + "'"; + } else { + sql += " and po.id in (select bo.godownEntry.id from GodownEntryItem as bo where bo.diposableGoods.name = '" + + code + "'"; + } + if(StringUtils.isNotBlank(batchNumber)){ + sql += " and bo.batchNumber = '"+batchNumber+"')"; + }else{ + sql += ")"; + } + } + sql += " and " + dateQueryAdapter.dateAreaSql("po.time", startDate, endDate,true,true); + + if(GodownEntry.SUBTYPE_MOVE_IN.equals(subType)){ + sql += " and ( po.targetWareHouseId=" + warehouseId; + }else{ + sql += " and ( po.warehouseID=" + warehouseId; + } + + sql += " ) "; + return sql; + } + /** + * 入库单 + * + * @param parameterMap + * @return + */ + public String findGodownEntryTableList( + Map> parameterMap) { + // 申请单查看 发货单 + Map sqlWhereParamMap = gridManager + .getParamFromView(parameterMap); + + sqlWhereParamMap.put("type", GodownEntry.TYPE_IN); + String sql = getGodownEntryListHql2(sqlWhereParamMap); + return gridManager.renderGrid(parameterMap, + GodownEntry.class.getSimpleName(), sql, + new String[] { "itemsList" }); + } + /** + * 获取入库单和退库单列表打印数据,不分页 + * @param sqlWhereParamMap + * @return + */ + public String loadGodownEntryListPrintData(Map sqlWhereParamMap){ + String sql = getGodownEntryListHql(sqlWhereParamMap); + String startDate = sqlWhereParamMap.get("startDate"); + String endDate = sqlWhereParamMap.get("endDate"); + List list = godownEntryManager.getGodownEntryListByHql(sql); + Double sum = 0.0; + for(GodownEntry entry : list){ + sum += entry.getTotalPrice(); + } + Map map = new HashMap(); + map.put("success", true); + map.put("goods", list); + map.put("totalPrice", sum); + map.put("date", startDate + " 至 " + endDate); + map.put("depart", "[" + AcegiHelper.getCurrentOrgUnitName() + "]"); + return JSONUtil.toJSONStringEx(map, true, new String[] { "itemsList" }); + } + /** + * 获取入库单和退库单列表界面传递的hql语句 + * @param sqlWhereParamMap + * @return + */ + private String getGodownEntryListHql(Map sqlWhereParamMap) { + String godownEntryType = sqlWhereParamMap.get("type"); + //boolean isAppropriation = "调拨单".equals(godownEntryType); + boolean isStockTake = "盘盈盘亏".equals(godownEntryType); + String code = sqlWhereParamMap.get("code"); + String batchNumber = sqlWhereParamMap.get("batchNumber"); + String sql = "where (1=1)"; + if(isStockTake){ + sql += " and po.subType in ('" + GodownEntry.SUBTYPE_STOCKTAKE_IN + "','" + GodownEntry.SUBTYPE_STOCKTAKE_OUT + "')"; + }else{ + sql += " and po.type='" + godownEntryType + "'"; + List types = new ArrayList(); + types.add(GodownEntry.SUBTYPE_MANUAL_IN); + types.add(GodownEntry.SUBTYPE_MANUAL_OUT); + types.add(GodownEntry.SUBTYPE_SYNC_IN); + types.add(GodownEntry.SUBTYPE_SYNC_OUT); + types.add(GodownEntry.SUBTYPE_IMPORT_IN); + + sql += String.format(" and %s ", SqlUtils.getStringFieldInCollectionsPredicate("po.subType", types)); +// sql += " and po.subType in ('" + GodownEntry.SUBTYPE_MANUAL_IN + "','" + GodownEntry.SUBTYPE_MANUAL_OUT + "')"; + } + /*if(!isAppropriation){ + sql += " and (po.sourceId is null or po.sourceId = 0)"; + }*/ + String startDate = sqlWhereParamMap.get("startDate"); + String endDate = sqlWhereParamMap.get("endDate"); + if (StringUtils.isNotBlank(code)) { + int codeIndex = code.lastIndexOf("["); + String specification = ""; + if (StringUtils.isNotBlank(code) && code.lastIndexOf("[") != -1) { + specification = code.substring(codeIndex + 1, code.length() - 1); + code = code.substring(0, codeIndex); + } + if (StringUtils.isNotBlank(specification)) { + sql += " and po.id in (select bo.godownEntry.id from GodownEntryItem as bo where bo.diposableGoods.name = '" + + code + + "' and bo.diposableGoods.specification = '" + + specification + "'"; + } else { + sql += " and po.id in (select bo.godownEntry.id from GodownEntryItem as bo where bo.diposableGoods.name = '" + + code + "'"; + } + if(StringUtils.isNotBlank(batchNumber)){ + sql += " and bo.batchNumber = '"+batchNumber+"')"; + }else{ + sql += ")"; + } + } + + if (StringUtils.isNotBlank(startDate)) { + startDate += " 00:00:00"; + //sql += " and po.time >= " + dateQueryAdapter.dateAdapter(startDate); + } + + if (StringUtils.isNotBlank(endDate)) { + endDate += " 23:59:59"; + //sql += " and po.time <= " + dateQueryAdapter.dateAdapter(endDate); + } + sql += " and " + dateQueryAdapter.dateAreaSql("po.time", startDate, endDate); + Set currentUserWarehouseIds = wareHouseManager.getCurrentUserOrgUnitWarehouseIds(); + /*if(isAppropriation){ + String subType=sqlWhereParamMap.get("subType"); + if(GodownEntry.SUBTYPE_MOVE_IN.equals(subType)){ + sql += " and ( " + SqlUtils.getNonStringFieldInCollectionsPredicate("po.targetWareHouseId", currentUserWarehouseIds); + }else{ + sql += " and ( " + SqlUtils.getNonStringFieldInCollectionsPredicate("po.warehouseID", currentUserWarehouseIds); + } + }else*/{ + sql += " and ( " + SqlUtils.getNonStringFieldInCollectionsPredicate("po.warehouseID", currentUserWarehouseIds); + } + sql += " ) "; + return sql; + } + + /** + * 退库单 + * + * @param parameterMap + * @return + */ + public String findGodownEntryTableList2( + Map> parameterMap) { + Map sqlWhereParamMap = gridManager + .getParamFromView(parameterMap); + + sqlWhereParamMap.put("type", GodownEntry.TYPE_OUT); + String sql = getGodownEntryListHql2(sqlWhereParamMap); + + //String sql = "where po.type='" + GodownEntry.TYPE_OUT + "' and (po.sourceId is null or po.sourceId = 0)"; + //sql += " and " + SqlUtils.getNonStringFieldInCollectionsPredicate("po.warehouseID", wareHouseManager.getCurrentUserOrgUnitWarehouseIds()); + return gridManager.renderGrid(parameterMap, + GodownEntry.class.getSimpleName(), sql, + new String[] { "itemsList" }); + } + /** + * 调拨单 + * @param parameterMap + * @return + */ + public String findAppropriationTableList( + Map> parameterMap){ + String sql = "where po.type='" + GodownEntry.TYPE_APPROPRIATE + "'"; + + //构造时间查询条件 + Map sqlWhereParamMap = gridManager + .getParamFromView(parameterMap); + String startDate = sqlWhereParamMap.get("startDate"); + String endDate = sqlWhereParamMap.get("endDate"); + + if (StringUtils.isNotBlank(startDate)) { + startDate += " 00:00:00"; + } + + if (StringUtils.isNotBlank(endDate)) { + endDate += " 23:59:59"; + } + sql += " and " + dateQueryAdapter.dateAreaSql("po.time", startDate, endDate); + + String ors[] = new String[]{SqlUtils.getNonStringFieldInCollectionsPredicate( + "po.warehouseID", wareHouseManager.getCurrentUserOrgUnitWarehouseIds()), + SqlUtils.getNonStringFieldInCollectionsPredicate( + "po.targetWareHouseId", wareHouseManager.getCurrentUserOrgUnitWarehouseIds()) + }; + return gridManager.renderGrid(parameterMap, + GodownEntry.class.getSimpleName(), sql,ors, + new String[] { "itemsList" }); + } + + /** + * 一次性物品盘盈盘亏单 + * @param parameterMap + * @return + */ + public String findGodownStockTakeTableList( + Map> parameterMap){ + String sql = "where po.subType in ('" + GodownEntry.SUBTYPE_STOCKTAKE_IN + "','" + GodownEntry.SUBTYPE_STOCKTAKE_OUT + "')"; + + //构造时间查询条件 + Map sqlWhereParamMap = gridManager + .getParamFromView(parameterMap); + String startDate = sqlWhereParamMap.get("startDate"); + String endDate = sqlWhereParamMap.get("endDate"); + + if (StringUtils.isNotBlank(startDate)) { + startDate += " 00:00:00"; + } + + if (StringUtils.isNotBlank(endDate)) { + endDate += " 23:59:59"; + } + sql += " and " + dateQueryAdapter.dateAreaSql("po.time", startDate, endDate); + + String ors[] = new String[]{SqlUtils.getNonStringFieldInCollectionsPredicate( + "po.warehouseID", wareHouseManager.getCurrentUserOrgUnitWarehouseIds()) + }; + return gridManager.renderGrid(parameterMap, + GodownEntry.class.getSimpleName(), sql,ors, + new String[] { "itemsList" }); + } + + // 获取批次的可以退库的价格数量 + public List getDiposableGoodsPriceAmountInfoCanOutEntryByBatchID( + String batchID) { + return diposableGoodsManager + .getDiposableGoodsPriceAmountInfoCanOutEntryByBatchID(batchID); + } + + /** + * 根据一次性物品id查找最近一张该一次性物品入库单信息 + * 用于添加一次性物品入库单页面选择物品时,根据查询到的信息给页面的产地、供应商、生产厂家、灭菌批号、注册证号、类别等进行自动赋值 + * @param diposableGoodsId + * @return + */ + public String getLastDiposableGoodsFromGodownEntry(String disposableGoodsId) { + GodownEntryItem godownEntryItem = + godownEntryItemManager.getLastGodownEntryByDisposableGoodsId(disposableGoodsId); + JSONObject jsonObject = new JSONObject(); + + //查一次性物品定义的类别 + DisposableGoods disposableGoods = + diposableGoodsManager.get(disposableGoodsId); + if(disposableGoods != null && StringUtils.isNotBlank(disposableGoods.getGrade())){ + jsonObject.put("grade", disposableGoods.getGrade()); + } + + jsonObject.put("certification", ""); + jsonObject.put("producingArea", ""); + jsonObject.put("supplierName", ""); + jsonObject.put("manufacturer", ""); + jsonObject.put("sterileBatchNumber", ""); + jsonObject.put("grade", ""); + jsonObject.put("cost", ""); + if (godownEntryItem != null) { + //注册证号 + if(StringUtils.isNotBlank(godownEntryItem.getCertification())){ + jsonObject.put("certification", godownEntryItem.getCertification()); + } + //产地 + if(StringUtils.isNotBlank(godownEntryItem.getProducingArea())){ + jsonObject.put("producingArea", godownEntryItem.getProducingArea()); + } + //供应商 + if(StringUtils.isNotBlank(godownEntryItem.getSupplierName())){ + jsonObject.put("supplierName", godownEntryItem.getSupplierName()); + } + //生产厂家 + if(StringUtils.isNotBlank(godownEntryItem.getManufacturer())){ + jsonObject.put("manufacturer", godownEntryItem.getManufacturer()); + } + //灭菌批号 + if(StringUtils.isNotBlank(godownEntryItem.getSterileBatchNumber())){ + jsonObject.put("sterileBatchNumber", godownEntryItem.getSterileBatchNumber()); + } + //类别 + if(StringUtils.isBlank(jsonObject.optString("grade")) && StringUtils.isNotBlank(godownEntryItem.getGrade())){ + jsonObject.put("grade", godownEntryItem.getGrade()); + } + //单价 + if(StringUtils.isBlank(jsonObject.optString("cost")) && godownEntryItem.getCost() != null){ + jsonObject.put("cost", godownEntryItem.getCost()); + } + } + return jsonObject.toString(); + } + ///////////////////////////////////////// + /** + * 获取入库单和退库单列表界面传递的hql语句 + * (使用没有拼接过的一次性物品名字) + * @param sqlWhereParamMap + * @return + */ + private String getGodownEntryListHql2(Map sqlWhereParamMap) { + String godownEntryType = sqlWhereParamMap.get("type"); + //boolean isAppropriation = "调拨单".equals(godownEntryType); + boolean isStockTake = "盘盈盘亏".equals(godownEntryType); + String code = sqlWhereParamMap.get("code"); + String batchNumber = sqlWhereParamMap.get("batchNumber"); + String sql = "where (1=1)"; + if(isStockTake){ + sql += " and po.subType in ('" + GodownEntry.SUBTYPE_STOCKTAKE_IN + "','" + GodownEntry.SUBTYPE_STOCKTAKE_OUT + "')"; + }else{ + sql += " and po.type='" + godownEntryType + "'"; + List types = new ArrayList(); + types.add(GodownEntry.SUBTYPE_MANUAL_IN); + types.add(GodownEntry.SUBTYPE_MANUAL_OUT); + types.add(GodownEntry.SUBTYPE_SYNC_IN); + types.add(GodownEntry.SUBTYPE_SYNC_OUT); + types.add(GodownEntry.SUBTYPE_IMPORT_IN); + + sql += String.format(" and %s ", SqlUtils.getStringFieldInCollectionsPredicate("po.subType", types)); +// sql += " and po.subType in ('" + GodownEntry.SUBTYPE_MANUAL_IN + "','" + GodownEntry.SUBTYPE_MANUAL_OUT + "')"; + } + /*if(!isAppropriation){ + sql += " and (po.sourceId is null or po.sourceId = 0)"; + }*/ + String startDate = sqlWhereParamMap.get("startDate"); + String endDate = sqlWhereParamMap.get("endDate"); + String disposableGoodsName = sqlWhereParamMap.get("disposableGoodsName");//没拼接的名字 + + if(StringUtils.isNotBlank(disposableGoodsName)){ + String specification = sqlWhereParamMap.get("specification"); + if(StringUtils.isNotBlank(specification)){ + sql += " and po.id in (select bo.godownEntry.id from GodownEntryItem as bo where bo.diposableGoods.name = '" + + disposableGoodsName + + "' and bo.diposableGoods.specification = '" + + specification + "'"; + }else{ + sql += " and po.id in (select bo.godownEntry.id from GodownEntryItem as bo where bo.diposableGoods.name = '" + + disposableGoodsName + "'"; + } + if(StringUtils.isNotBlank(batchNumber)){ + sql += " and bo.batchNumber = '"+batchNumber+"')"; + }else{ + sql += ")"; + } + } + + if (StringUtils.isNotBlank(startDate)) { + startDate += " 00:00:00"; + //sql += " and po.time >= " + dateQueryAdapter.dateAdapter(startDate); + } + + if (StringUtils.isNotBlank(endDate)) { + endDate += " 23:59:59"; + //sql += " and po.time <= " + dateQueryAdapter.dateAdapter(endDate); + } + sql += " and " + dateQueryAdapter.dateAreaSql("po.time", startDate, endDate); + Set currentUserWarehouseIds = wareHouseManager.getCurrentUserOrgUnitWarehouseIds(); + /*if(isAppropriation){ + String subType=sqlWhereParamMap.get("subType"); + if(GodownEntry.SUBTYPE_MOVE_IN.equals(subType)){ + sql += " and ( " + SqlUtils.getNonStringFieldInCollectionsPredicate("po.targetWareHouseId", currentUserWarehouseIds); + }else{ + sql += " and ( " + SqlUtils.getNonStringFieldInCollectionsPredicate("po.warehouseID", currentUserWarehouseIds); + } + }else*/{ + sql += " and ( " + SqlUtils.getNonStringFieldInCollectionsPredicate("po.warehouseID", currentUserWarehouseIds); + } + sql += " ) "; + return sql; + } +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsPurchaseTableFilterManagerImpl.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsPurchaseTableFilterManagerImpl.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsPurchaseTableFilterManagerImpl.java (revision 20740) @@ -0,0 +1,39 @@ +package com.forgon.disinfectsystem.expensiveGoods.service; + +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.search.service.TBarFilterManager; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * Created by zhonghaowen on 2016/10/27. + * 采购计划dwr工具栏sql条件过滤处理类 + */ +@Service("goodPurchaseTableFilterManagerImpl") +public class ExpensiveGoodsPurchaseTableFilterManagerImpl extends TBarFilterManager { + + @Override + public void filterPara(Map sqlWhereParamMap, StringBuilder sql) { + this.createTimeFilterSql(sqlWhereParamMap, sql, "po.time"); + this.createKeyWordFilterSql(sqlWhereParamMap, sql); + } + + @Override + public void createKeyWordFilterSql(Map sqlWhereParamMap, StringBuilder sql) { + String keyWord = sqlWhereParamMap.get("keyWord"); + String goodType = sqlWhereParamMap.get("goodType"); + if (StringUtils.isNotBlank(keyWord) && StringUtils.isNotBlank(goodType)) { + sql.append(" and po.id in (select gi.goodPurchasePlan.id from GoodPurchaseItem gi where "); + //如果是一次性物品 + if (DisposableGoods.TYPE_NAME.equals(goodType)) { + sql.append(String.format(" gi.disposableGoodsId = %s)", keyWord)); + } + //不是一次性物品 + else { + sql.append(String.format(" gi.materialDefinitionId = %s)", keyWord)); + } + } + } +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/action/ExpensiveGoodsPurchaseAction.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/action/ExpensiveGoodsPurchaseAction.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/action/ExpensiveGoodsPurchaseAction.java (revision 20740) @@ -0,0 +1,388 @@ +package com.forgon.disinfectsystem.expensiveGoods.action; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; + +import javax.servlet.http.HttpServletResponse; + +import com.forgon.tools.util.PageUtil; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.apache.commons.lang.StringUtils; +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.OrgUnit; +import com.forgon.directory.service.OrgUnitManager; +import com.forgon.disinfectsystem.entity.assestmanagement.GoodPurchaseItem; +import com.forgon.disinfectsystem.entity.assestmanagement.GoodPurchasePlan; +import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; +import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsManager; +import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsPurchasePlanManager; +import com.forgon.disinfectsystem.expensiveGoods.service.IdentificationOfDiposableGoodsManager; +import com.forgon.tools.StrutsParamUtils; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.json.JSONUtil; +import com.opensymphony.xwork2.ModelDriven; + +@ParentPackage(value = "default") +@Namespace(value = "/disinfectSystem") +@Action(value = "goodPurchaseAction") +public class ExpensiveGoodsPurchaseAction implements ModelDriven { + + private OrgUnitManager orgUnitManager; + + private GoodPurchasePlan goodPurchasePlan = new GoodPurchasePlan(); + + private ExpensiveGoodsPurchasePlanManager goodPurchasePlanManager; + + private IdentificationOfDiposableGoodsManager identificationOfDiposableGoodsManager; + + private String spell; + + private ExpensiveGoodsManager diposableGoodsManager; + + public IdentificationOfDiposableGoodsManager getIdentificationOfDiposableGoodsManager() { + return identificationOfDiposableGoodsManager; + } + + public void setIdentificationOfDiposableGoodsManager( + IdentificationOfDiposableGoodsManager identificationOfDiposableGoodsManager) { + this.identificationOfDiposableGoodsManager = identificationOfDiposableGoodsManager; + } + + + public void setGoodPurchasePlan(GoodPurchasePlan goodPurchasePlan) { + this.goodPurchasePlan = goodPurchasePlan; + } + + public void setGoodPurchasePlanManager( + ExpensiveGoodsPurchasePlanManager goodPurchasePlanManager) { + this.goodPurchasePlanManager = goodPurchasePlanManager; + } + + public void setOrgUnitManager(OrgUnitManager orgUnitManager) { + this.orgUnitManager = orgUnitManager; + } + + public String getSpell() { + return spell; + } + + public void setSpell(String spell) { + this.spell = spell; + } + + public void setDiposableGoodsManager(ExpensiveGoodsManager diposableGoodsManager) { + this.diposableGoodsManager = diposableGoodsManager; + } + + /** + * @param out + * :输出流 + * @param result + * :显示的文本信息 + */ + private void printMsgToClient(boolean success, PrintWriter out, + String result, String printResult) { + String printValue = null; + if (printResult != null && printResult.length() > 0) { + String str = printResult.toString(); + printValue = str.substring(0, str.length() - 1); + } + out.print("{success:" + success + ",message:'" + result + "',barcode:'" + + printValue + "'}"); + out.close(); + } + + /** + * 根据拼音简拼,获取一次性物品及材料的数据 + * + * @return + * @throws Exception + */ + public String getDiposableGoodsAndMaterialData() { + spell = spell == null ? "" : spell; + try { + spell = java.net.URLDecoder.decode(spell, "UTF-8"); + //是否搜索全部一次性物品 + String allItems = StrutsParamUtils.getPraramValue("allItems", + null); + String handleDepartCode = AcegiHelper.getCurrentOrgUnitCode(); + //一次性物品数据 + // JSONObject disposableGoodsAndMaterialJson = diposableGoodsManager.searchDisposableGoodsAndMaterialList( + // spell, allItems,handleDepartCode,true); + List> mapList = diposableGoodsManager.searchDisposableGoodsAndMaterialList(spell, allItems, handleDepartCode, true); + PageUtil.outPutResult(PageUtil.getPagePara(), mapList); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + private void setGoodPurchasePlanPropertiesFromParams(GoodPurchasePlan entry,String formParams,String items){ + JSONObject formParamsObj = JSONObject.fromObject(formParams); + // 表单参数 + if(StringUtils.isNotBlank(formParams)){ + Long id = formParamsObj.optLong("id"); + String remark = formParamsObj.optString("remark"); + entry.setId(id); + entry.setRemark(remark); + } + // items列表 + setGoodPurchasePlanItemsFromParams(entry, items); + } + // 设置items参数 + private void setGoodPurchasePlanItemsFromParams(GoodPurchasePlan goodPurchasePlan,String items){ + // items列表 + List GoodPurchaseItems = goodPurchasePlan.getItemsList(); + JSONArray itemsArray = JSONArray.fromObject(items); + int size = itemsArray.size(); + for (int i = 0; i < size; ++i) { + JSONObject obj = itemsArray.getJSONObject(i); + if (obj != null) { + GoodPurchaseItem goodPurchaseItem = new GoodPurchaseItem(); + Long itemId = JSONUtil.optLong(obj,"id",null); + goodPurchaseItem.setId(itemId); + + int scheduleAmount = Integer.valueOf(obj.optString("scheduleAmount"));// 数量 + String departCoding = obj.optString("departCoding"); + OrgUnit orgUnit = (OrgUnit)orgUnitManager.getOrgUnitByCode(departCoding); + String name = obj.optString("name"); + String unit = obj.optString("unit"); + String specification = obj.optString("specification"); + Integer lastConsuption = null; + String lastConsuptionStr = obj.optString("lastConsuption"); + if(!StringUtils.isBlank(lastConsuptionStr) && !lastConsuptionStr.equals("null")){ + lastConsuption = Integer.valueOf(lastConsuptionStr); + } + Integer stockQuantity = null; + String stockQuantityStr = obj.optString("stockQuantity"); + if(!StringUtils.isBlank(stockQuantityStr) && !stockQuantityStr.equals("null")){ + stockQuantity = Integer.valueOf(stockQuantityStr); + } + double purchase = Double.valueOf(obj.optString("purchase"));// 价格 + String supplierName = obj.optString("supplierName");// 供应商 + String manufacturer = obj.optString("manufacturer");// 生产厂家 + + String disposableGoodsId = obj.optString("disposableGoodsId"); + String materialDefinitionId = obj.optString("materialDefinitionId"); + if(DatabaseUtil.isPoIdValid(disposableGoodsId)){ + goodPurchaseItem.setDisposableGoodsId(Long.parseLong(disposableGoodsId)); + } + if(DatabaseUtil.isPoIdValid(materialDefinitionId)){ + goodPurchaseItem.setMaterialDefinitionId(Long.parseLong(materialDefinitionId)); + } + + goodPurchaseItem.setGoodPurchasePlan(goodPurchasePlan); + goodPurchaseItem.setOrgUnit(orgUnit); + goodPurchaseItem.setName(name); + goodPurchaseItem.setUnit(unit); + goodPurchaseItem.setSpecification(specification); + goodPurchaseItem.setLastConsumption(lastConsuption); + goodPurchaseItem.setStockQuantity(stockQuantity); + goodPurchaseItem.setScheduleAmout(scheduleAmount); + goodPurchaseItem.setPurchase(purchase); + goodPurchaseItem.setTotalPrice(purchase * scheduleAmount); + goodPurchaseItem.setManufacturer(manufacturer); + goodPurchaseItem.setSupplierName(supplierName); + + GoodPurchaseItems.add(goodPurchaseItem); + goodPurchasePlan.setOrgUnit(orgUnit); + } + } + } + + private void buildGoodPurchasePlanParamsForUpdate(GoodPurchasePlan original, + GoodPurchasePlan entry) { +// String formParams = StrutsParamUtils.getPraramValue("formParams", ""); + String originalFormParams = StrutsParamUtils.getPraramValue("originalFormParams", ""); + + String items = StrutsParamUtils.getPraramValue("items", ""); + String originalItems = StrutsParamUtils.getPraramValue("originalItems", ""); + + setGoodPurchasePlanPropertiesFromParams(original,originalFormParams,originalItems); + original.setTime(entry.getTime()); + setGoodPurchasePlanPropertiesFromParams(entry,null,items); + } + + private void buildGoodPurchasePlanParamsForSave(GoodPurchasePlan goodPurchasePlan) { + String items = StrutsParamUtils.getPraramValue("items", ""); + setGoodPurchasePlanItemsFromParams(goodPurchasePlan, items); + } + + public String saveGoodPurchasePlan() { + HttpServletResponse response = StrutsParamUtils.getResponse(); + PrintWriter out = null; + String result = "保存成功"; + response.setCharacterEncoding("UTF-8"); + Map returnMsg = new HashMap(); + returnMsg.put("success", false); + returnMsg.put("errMsg", "保存失败"); + try { + out = response.getWriter(); + } catch (IOException e) { + e.printStackTrace(); + } + boolean saveResult = false; + try { + String id = StrutsParamUtils.getPraramValue("id", ""); + + GoodPurchasePlan original = new GoodPurchasePlan(); + GoodPurchasePlan entry = goodPurchasePlan; + + if (StringUtils.isNotBlank(id)) { + // + buildGoodPurchasePlanParamsForUpdate(original, entry); + + goodPurchasePlanManager.updateGoodPurchasePlan(original, entry, returnMsg); + } else { + Date time = new Date(); + entry.setTime(time); + // + entry = goodPurchasePlan; + buildGoodPurchasePlanParamsForSave(entry); + + goodPurchasePlanManager.saveGoodPurchasePlan(entry, returnMsg); + } + saveResult = true; + } catch (Exception e) { + e.printStackTrace(); + saveResult = false; + result = e.getMessage(); + } + String itemsDetails = (String)returnMsg.get("itemsDetails"); + + printMsgToClient(saveResult, out, result.toString(), itemsDetails); + return null; + } + + public String loadGoodPurchasePlan() { + String id = StrutsParamUtils.getPraramValue("id", ""); + if (StringUtils.isNotBlank(id) && StringUtils.isNumeric(id)) { + goodPurchasePlan = goodPurchasePlanManager.getGoodPurchasePlanById(id); + } + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + + JSONArray jsonArray = new JSONArray(); + for(GoodPurchaseItem item : goodPurchasePlan.getItemsList()){ + JSONObject obj = new JSONObject(); + obj.put("id", item.getId()); + obj.put("lastConsumption", item.getLastConsumption()); + obj.put("manufacturer", item.getManufacturer()); + obj.put("name", item.getName()); + obj.put("departCoding", item.getOrgUnit().getOrgUnitCoding()); + obj.put("departName", item.getOrgUnit().getName()); + obj.put("purchase", item.getPurchase()); + obj.put("scheduleAmout", item.getScheduleAmout()); + obj.put("specification", item.getSpecification()); + obj.put("stockQuantity", item.getStockQuantity()); + obj.put("supplierName", item.getSupplierName()); + obj.put("unit", item.getUnit()); + obj.put("totalPrice", item.getTotalPrice()); + obj.put("disposableGoodsId", item.getDisposableGoodsId()); + obj.put("materialDefinitionId", item.getMaterialDefinitionId()); + + jsonArray.add(obj); + } + + JSONObject dataObj = new JSONObject(); + dataObj.put("id", goodPurchasePlan.getId()); + dataObj.put("operator", goodPurchasePlan.getOperator()); + dataObj.put("remark", goodPurchasePlan.getRemark()); + dataObj.put("serialNumber",goodPurchasePlan.getSerialNumber()); + dataObj.put("time", goodPurchasePlan.getTime()); + dataObj.put("itemsList", jsonArray); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("success", true); + jsonObject.put("data", dataObj); + + + String jsonStr = jsonObject.toString(); + try { + StrutsParamUtils.getResponse().getWriter().println(jsonStr); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + public void deleteGoodPurchasePlan() { + String idStr = StrutsParamUtils.getPraramValue("ids", ""); + String message = ""; + try { + if (StringUtils.isNotBlank(idStr)) { + Map result = new HashMap(); + int deletedCount = 0; + int totalCount = 0; + result.put("deletedCount", deletedCount); + result.put("totalCount", totalCount); + result.put("failureCount", totalCount - deletedCount); + try { + String[] idsArray = idStr.split(Constants.IDS_SEPARATOR); + totalCount = idsArray.length; + for (String id : idsArray) { + // 每一个入库单作为一个单独的事务 + try { + goodPurchasePlanManager.deleteGoodPurchasePlan(id); + deletedCount++; + } catch (Exception e) { + e.printStackTrace(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + int failureCount = totalCount-deletedCount; + message = "成功删除"+deletedCount+"条采购计划单信息,失败"+failureCount+"条"; + } + } catch (Exception e) { + message = "删除失败!"; + e.printStackTrace(); + } + HttpServletResponse httpServletResponse = StrutsParamUtils + .getResponse(); + httpServletResponse.setCharacterEncoding("UTF-8"); + try { + httpServletResponse.getWriter().print( + "{success:true,message:'" + message + "'}"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + // 合并打印 + public void mergeLoadToussePrintData() { + try { + String idsStr = StrutsParamUtils.getPraramValue("ids", ""); + String[] idStrs = StringUtils.split(idsStr, ','); + + JSONObject jsonObject = new JSONObject(); + goodPurchasePlanManager.loadGoodPurchasePlanPrintData(idStrs, jsonObject); + jsonObject.put("success", true); + HttpServletResponse response = StrutsParamUtils.getResponse(); + response.setCharacterEncoding("UTF-8"); + response.getWriter() + .println(jsonObject.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public GoodPurchasePlan getModel() { + return goodPurchasePlan; + } + +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DiposableGoodBatchStockManager.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DiposableGoodBatchStockManager.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DiposableGoodBatchStockManager.java (revision 20740) @@ -0,0 +1,87 @@ +/** + * + */ +package com.forgon.disinfectsystem.expensiveGoods.service; + +import java.util.List; + +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsIdentification; +import com.forgon.disinfectsystem.exception.RecyclingRecordException; +import com.forgon.disinfectsystem.vo.DiposableGoodsStorageVo; +import com.forgon.tools.hibernate.BasePoManager; + +/** + * @author JamZhou + * + * 2012-4-27 上午10:19:24 + */ +public interface DiposableGoodBatchStockManager extends BasePoManager { + + public void saveOrUpdate(DisposableGoodsBatchStock diposableGoodBatchStock); + + public DisposableGoodsBatchStock getDiposableGoodBatchStock( + String disposableGoodsStockId, String batchNumber); + + public String getEarliestNonExpiredDisposableGoodsBatchStock(Long disposableGoodsStockId, String startDate); + + public DisposableGoodsBatchStock getDiposableGoodBatchStockById(String id); + + public DisposableGoodsBatchStock getDisposableGoodsBatchStockByNameAndBatchNumber(Long warehouseId, + String disposableGoodsName, String specification, String batchNumber); + + /** + * 根据条码获取指定仓库下的一次性物品批次库存 + * @param barcode + * @param warehouseId + * @return + */ + public DisposableGoodsBatchStock getByBarcode(String barcode,String warehouseId); + + public List getDisposableGoodsBatchStockByDisposableGoodsId( + String disposableGoodsId); + + public List getDisposableGoodsBatchStockByDisposableGoodsId( + String disposableGoodsId, boolean selectAll); + + public List getCurrentUserOrgUnitWarehouseDisposableGoodsBatchStockByDisposableGoodsId( + String disposableGoodsId, boolean selectAll); + /** + * 根据一次性物品id查找一次性物品的批次库存 + * @param id 一次性物品的id + * @param wareHouseId 仓库id + * @param selectAll 是否包含库存为0的记录 + * @return + */ + public List getDisposableGoodsBatchStockByDisposableGoodsId( + String disposableGoodsId,String wareHouseId, boolean selectAll); + + public List getDiposableGoodsStorageVos(); + + public String getIdentificationNumberByDisposableGoodsStock( + DisposableGoodsStock disposableGoodsStock); + + public Double getEarliestPrice(DisposableGoodsStock disposableGoodsStock); + /** + * 获取一次性物品库存的最近一次价格 + * @param disposableGoodsStockId + * @param referencePrice + * @return + */ + public Double getEarliestPrice(Long disposableGoodsStockId,Double referencePrice); + + public List getIdentificationsWithNoZeroStroge( + Long disposableGoodsBatchStockId); + + public List getDisposableGoodsBatchStockBySql(String sql); + /** + * 根据一次性物品id和科室编码,获取批次库存。首先获取库存数量大于0的,此时取最早入库的批次。如果没有库存数据大于0的,则取最后一次入库的批次。 + * 如果根本没有入过库,则返回null + * @param disposableGoodsId + * @param orgUnitCoding + * @return + */ + public DisposableGoodsBatchStock getDisposableGoodsBatchStock(Long disposableGoodsId,String orgUnitCoding); +} Index: ssts-expensivegoods/src/main/resources/rebel.xml =================================================================== diff -u --- ssts-expensivegoods/src/main/resources/rebel.xml (revision 0) +++ ssts-expensivegoods/src/main/resources/rebel.xml (revision 20740) @@ -0,0 +1,9 @@ + + + + + + + + + Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/dwr/table/ExpensiveGoodsTableManager.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/dwr/table/ExpensiveGoodsTableManager.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/dwr/table/ExpensiveGoodsTableManager.java (revision 20740) @@ -0,0 +1,794 @@ +package com.forgon.disinfectsystem.expensiveGoods.dwr.table; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import net.sf.json.JSONObject; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.directwebremoting.util.Logger; + +import com.alibaba.fastjson.JSONArray; +import com.forgon.component.grid.GridManager; +import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; +import com.forgon.disinfectsystem.common.CssdUtils; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatch; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; +import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; +import com.forgon.disinfectsystem.entity.basedatamanager.datasynchronization.HisMaterialDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.datasynchronization.HisMaterialType; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.disinfectsystem.entity.systemwarning.SystemWarningItemVO; +import com.forgon.disinfectsystem.expensiveGoods.service.DiposableGoodBatchStockManager; +import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsManager; +import com.forgon.disinfectsystem.expensiveGoods.service.DisposableGoodsBatchManager; +import com.forgon.disinfectsystem.expensiveGoods.util.ExpensiveGoodsUtils; +import com.forgon.systemsetting.model.HttpOption; +import com.forgon.systemsetting.service.HttpOptionManager; +import com.forgon.tools.SpringBeanManger; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.json.JSONUtil; +import com.forgon.tools.util.ForgonStringUtils; +import com.forgon.tools.util.SqlUtils; + +public class ExpensiveGoodsTableManager { + + private DiposableGoodBatchStockManager diposableGoodBatchStockManager; + + private GridManager gridManager; + + private ExpensiveGoodsManager diposableGoodsManager; + + private DateQueryAdapter dateQueryAdapter; + + private DisposableGoodsBatchManager disposableGoodsBatchManager; + + private WareHouseManager wareHouseManager; + + private ObjectDao objectDao; + + public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { + this.dateQueryAdapter = dateQueryAdapter; + } + + public void setDiposableGoodBatchStockManager( + DiposableGoodBatchStockManager diposableGoodBatchStockManager) { + this.diposableGoodBatchStockManager = diposableGoodBatchStockManager; + } + + public void setGridManager(GridManager gridManager) { + this.gridManager = gridManager; + } + + public void setDiposableGoodsManager( + ExpensiveGoodsManager diposableGoodsManager) { + this.diposableGoodsManager = diposableGoodsManager; + } + + public void setDisposableGoodsBatchManager( + DisposableGoodsBatchManager disposableGoodsBatchManager) { + this.disposableGoodsBatchManager = disposableGoodsBatchManager; + } + public void setWareHouseManager(WareHouseManager wareHouseManager) { + this.wareHouseManager = wareHouseManager; + } + + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + + /** + * 查找物品库存 + * @param parameterMap + * @return + */ + public String findDisposableGoodsStockTableList( + Map> parameterMap) { + Map sqlWhereParamMap = gridManager + .getParamFromView(parameterMap); + + // 关键字查询-》把小写字母转换成大写字母 + if (!parameterMap.get("grid_search_query").isEmpty()) { + List keyList = parameterMap.get("grid_search_query"); + List queryKey = new ArrayList(keyList.size()); + for (int i = 0; i < keyList.size(); i++) { + queryKey.add(((String) keyList.get(i)).toUpperCase()); + } + parameterMap.put("grid_search_query", queryKey); + } + + String type = sqlWhereParamMap.get("type"); + String sql = "where 1=1"; + + if (StringUtils.isNotBlank(type)) { + sql = String.format(" where po.disposableGoodsID in (select d.id from %s d where %s)", DisposableGoods.class.getSimpleName(), + SqlUtils.getStringFieldPredicate("d.type", type)); + } else { + sql += " and 1=1"; + } + sql += " and " + SqlUtils.getNonStringFieldInCollectionsPredicate("po.warehouseID", wareHouseManager.getCurrentUserOrgUnitWarehouseIds()); + return gridManager.renderGrid(parameterMap, + DisposableGoodsStock.class.getSimpleName(), sql, + new String[] { "goodsBatchs" }); + } + + public String findDisposableGoodsTableList( + Map> parameterMap) { + Map sqlWhereParamMap = gridManager + .getParamFromView(parameterMap); + + // 关键字查询-》把小写字母转换成大写字母 + if (!parameterMap.get("grid_search_query").isEmpty()) { + List keyList = parameterMap.get("grid_search_query"); + List queryKey = new ArrayList(keyList.size()); + for (int i = 0; i < keyList.size(); i++) { + queryKey.add(((String) keyList.get(i)).toUpperCase()); + } + parameterMap.put("grid_search_query", queryKey); + } + + String type = sqlWhereParamMap.get("type"); + String sql = "where 1=1"; + + if (StringUtils.isNotBlank(type)) { + sql = String.format(" where %s", SqlUtils.getStringFieldPredicate("po.type", type)); + } else { + sql += " and 1=1"; + } + return gridManager.renderGrid(parameterMap, + DisposableGoods.class.getSimpleName(), sql, + new String[] { "goodsBatchs" }); + } + + // 高值耗材使用记录 + public String findExpensiveDisposableGoodsUseRecordList( + Map> parameterMap) { + + Map sqlWhereParamMap = gridManager + .getParamFromView(parameterMap); + StringBuilder sqlBuilder = new StringBuilder(" WHERE 1=1 "); + + int start = 0; + int pageSize = 20; + String orderStr = ""; + String filterSqlStr = ""; + String searchSql = ""; + if (parameterMap != null) { + Map paramSqlMap = gridManager + .parserMapToSQL(parameterMap); + orderStr = paramSqlMap.get(GridManager.GRID_MAPPARAM_SORT_KEY); + + filterSqlStr = paramSqlMap + .get(GridManager.GRID_MAPPARAM_FILTER_KEY); + + List pageStart = parameterMap + .get(GridManager.GRID_PAGE_START); + if (pageStart != null && pageStart.size() > 0 + && StringUtils.isNotBlank(pageStart.get(0)) + && StringUtils.isNumeric(pageStart.get(0))) { + start = Integer.valueOf(pageStart.get(0)); + } + + List pageSizeStr = parameterMap + .get(GridManager.GRID_PAGE_SIZE); + if (pageSizeStr != null && pageSizeStr.size() > 0 + && StringUtils.isNotBlank(pageSizeStr.get(0)) + && StringUtils.isNumeric(pageSizeStr.get(0))) { + pageSize = Integer.valueOf(pageSizeStr.get(0)); + } + + // 处理GridSearch的参数 + searchSql = gridManager.getSearchFieldSql(parameterMap); + } + // 合并用户自定义的sql + if (StringUtils.isNotBlank(filterSqlStr)) { + sqlBuilder.append(" AND "); + sqlBuilder.append(filterSqlStr); + } + + if (StringUtils.isNotBlank(searchSql)) { + sqlBuilder.append(" AND "); + sqlBuilder.append(searchSql); + } + + String sql = sqlBuilder.toString(); + + // 替换排序字段 + if(StringUtils.isNotBlank(orderStr)){ + orderStr = orderStr.replaceAll("disposableGoodsBatchStock.diposableGoods.showName", "po.disposableGoodsBatchStock.diposableGoods.name"); + orderStr = orderStr.replaceAll("status", "po.status"); + } + if (StringUtils.isNotBlank(orderStr)) { + orderStr += ", po.id desc "; + } + int totalResults = objectDao.countObjectBySql( + ExpensiveDisposablegoods.class.getSimpleName(), sql); + String fullSql = String.format(" select po from %s po left join fetch po.useRecord useRecord %s order by %s ",ExpensiveDisposablegoods.class.getSimpleName(),sql,orderStr); + List list = objectDao.findByHql( + fullSql, start, + pageSize); + + Map map = new HashMap(); + map.put("totalResults", totalResults); + map.put("list", list); + map.put("selectSqlWhereCondition", sql); + String[] filterProperties = { "identifications","goodsBatchs","tousseInstanceList","diposableGoodsItems","materialGoodsItems"}; + String json = gridManager.converJsonString(totalResults, list, sql, + filterProperties); + return json; + } + + /** + * 一次性物品告警grid + * + * @param parameterMap + * @return + */ + public String findWarningDiposableGoodsTableList( + Map> parameterMap) { + Map sqlWhereParamMap = gridManager + .getParamFromView(parameterMap); + String type = sqlWhereParamMap.get("type"); + String sql = "where 1=1 and po.storage > 0"; + + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date()); + calendar.add(Calendar.DAY_OF_YEAR, 30);// 默认告警日期为30天 + String warningDate = new SimpleDateFormat("yyyy-MM-dd").format(calendar + .getTime()); + String currentDate = new SimpleDateFormat("yyyy-MM-dd") + .format(new Date()); + switch (type) { + case SystemWarningItemVO.WARNING_TYPE_DIPOSABLEGOODS: + sql += " and po.expDate between " + + dateQueryAdapter.dateAdapter(currentDate) + " and " + + dateQueryAdapter.dateAdapter(warningDate); + break; + case SystemWarningItemVO.WARNING_TYPE_DISABLED_DIPOSABLEGOODS: + sql += " and po.expDate < " + + dateQueryAdapter.dateAdapter(currentDate); + break; + default: + sql += " and po.expDate < " + + dateQueryAdapter.dateAdapter(warningDate); + break; + } + String json = gridManager.renderGrid(parameterMap, + DisposableGoodsBatchStock.class.getSimpleName(), sql, + new String[] { "identifications", "goodsBatchs" }); + json = adjustGridAmount(json,type);//校正一次性物品告警列表总数 + return json; + } + + //校正一次性物品告警列表总数 + private String adjustGridAmount(String json, String expdateType) { + if(StringUtils.isNotBlank(json)){ + try { + //转回json对象 + JSONObject obj = JSONObject.fromObject(json); + //获得rows的json数组 + net.sf.json.JSONArray rows = obj.optJSONArray("rows"); + for (Object object : rows) { + JSONObject jsonObj = (JSONObject) object; + //获得rows中的diposableGoods json对象 + JSONObject diposableGoods = jsonObj.optJSONObject("diposableGoods"); + String id = diposableGoods.getString("id"); + List DisposableGoodsBatchStocks = diposableGoodsManager.getExpdateDisposableGoodsBatchStocks(Long.valueOf(id), expdateType); + int expDateAmount = 0; + for (DisposableGoodsBatchStock disposableGoodsBatchStock : DisposableGoodsBatchStocks) { + expDateAmount += disposableGoodsBatchStock.getStorage(); + } + //校正总数 + diposableGoods.put("amount", expDateAmount); + } + return obj.toString(); + } catch (Exception e) { + e.printStackTrace(); + } + } + return json; + } + + public String[] getBatchNumbersByDiposableGoodsId(String id, + boolean selectAll) { + List batchStocks = diposableGoodBatchStockManager + .getDisposableGoodsBatchStockByDisposableGoodsId(id, selectAll); + String[] batchNumbers = new String[batchStocks.size()]; + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + for (int i = 0; i < batchStocks.size(); i++) { + DisposableGoodsBatchStock batchStock = batchStocks.get(i); + batchNumbers[i] = batchStock.getBatchNumber() + + ";" + + (batchStock.getCost() != null ? batchStock.getCost() : "") + + ";" + + (batchStock.getSupplierName() != null ? batchStock + .getSupplierName() : "") + + ";" + + (batchStock.getExpDate() != null ? dateFormat + .format(batchStock.getExpDate()) : ""); + } + return batchNumbers; + } + public String getBatchsByDiposableGoodsId(String id, + boolean selectAll) { + List batchStocks = diposableGoodBatchStockManager + .getDisposableGoodsBatchStockByDisposableGoodsId(id, selectAll); + String batchs = "[]"; + if(batchStocks != null){ + batchs = JSONUtil.toJSONStringEx(batchStocks,true,DisposableGoodsBatchStock.filterProperties); + } + return batchs; + } + + /** + * 根据一次性物品id及仓库查询一次性物品批次库存信息 + * @param id + * @param warehouseId + * @param selectAll + * @return + */ + public String getBatchsByDiposableGoodsIdAndWarehouseId(String disposableGoodsId,String warehouseId, + boolean selectAll) { + List batchStocks = diposableGoodBatchStockManager + .getDisposableGoodsBatchStockByDisposableGoodsId(disposableGoodsId,warehouseId, selectAll); + String batchs = "[]"; + if(batchStocks != null){ + batchs = JSONUtil.toJSONStringEx(batchStocks,true,DisposableGoodsBatchStock.filterProperties); + } + return batchs; + } + /** + * 根据一次性物品定义的id获取批次 + * @param id 一次性物品定义id + * @param wareHouseId 仓库id + * @param selectAll 是获取所有还是只获取供应室可以申请的 + * @return + */ + public String getBatchsByDisposableGoodsIDAndWareHouse(String disposableGoodsId,String wareHouseId, + boolean selectAll){ + List batchStocks = diposableGoodBatchStockManager + .getDisposableGoodsBatchStockByDisposableGoodsId(disposableGoodsId,wareHouseId, selectAll); + String batchs = "[]"; + if(batchStocks != null){ + batchs = JSONUtil.toJSONStringEx(batchStocks,true,DisposableGoodsBatchStock.filterProperties); + } + return batchs; + } + /** + * 根据一次性物品库存的id获取批次 + * @param disposableGoodsStockId 一次性物品库存id + * @param wareHouseId 仓库id + * @param selectAll 是获取所有还是只获取供应室可以申请的 + * @return + */ + public String getBatchsByDisposableGoodsStockIdAndWareHouse(String disposableGoodsStockId,String wareHouseId, + boolean selectAll){ + DisposableGoodsStock goodsStock = this.diposableGoodsManager.getDisposableGoodsStockById(disposableGoodsStockId); + String batchs = "[]"; + if(goodsStock != null && StringUtils.equals(goodsStock.getWarehouseID() + "", wareHouseId)){ + return getBatchsByDisposableGoodsIDAndWareHouse(goodsStock.getDisposableGoodsID() + "",wareHouseId,selectAll); + } + return batchs; + } + public String getExpDateByDiposableGoodsId_batcherNum(String id, + String batcherNumber) { + java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat( + "yyyy-MM-dd"); + String dateStr = ""; + List batchStocks = diposableGoodBatchStockManager + .getDisposableGoodsBatchStockByDisposableGoodsId(id, false); + if (batchStocks.size() != 0) { + for (DisposableGoodsBatchStock batchStock : batchStocks) { + if (batchStock.getBatchNumber().equals(batcherNumber)) { + dateStr = sdf.format(batchStock.getExpDate()); + } + } + } + return dateStr; + } + + /** + * + */ + public String updateOldData() { + return diposableGoodsManager.updateOldData(); + } + + /** + * 一次性物品内的供应室领用物品,分为专项物资、低值易耗品、固定资产等三大类 + */ + public void updateSupplyRoomDiposableGoodsType() { + Logger logger = Logger.getLogger(this.getClass()); + ObjectDao objectDao = (ObjectDao) SpringBeanManger.getBean("objectDao"); + + updateDiposableGoodTypeTree(objectDao); + + String diposableGoodsSql = "where po.type = '供应室领用'"; + List disposableGoodsStockList = objectDao + .findBySql(DisposableGoodsStock.class.getSimpleName(), + diposableGoodsSql); + for (DisposableGoodsStock disposableGoodsStock : disposableGoodsStockList) { + logger.error("更新一次性物品:" + + disposableGoodsStock.getName() + + (disposableGoodsStock.getSpecification() == null ? "" : "[" + + disposableGoodsStock.getSpecification() + "]")); + String hisMaterialSql = "where (po.name = '" + + disposableGoodsStock.getName() + "' and po.specification = '" + + disposableGoodsStock.getSpecification() + "')" + + " or ( (po.name||po.specification) = '" + + disposableGoodsStock.getName() + "')" + + " or (po.specification is null and po.name = '" + + disposableGoodsStock.getName() + "')"; + if (StringUtils.isBlank(disposableGoodsStock.getSpecification())) { + hisMaterialSql += " or (po.name = '" + disposableGoodsStock.getName() + + "')"; + } + HisMaterialDefinition hisMaterialDefinition = (HisMaterialDefinition) objectDao + .getBySql(HisMaterialDefinition.class.getSimpleName(), + hisMaterialSql); + if (hisMaterialDefinition == null) { + logger.error("his系统查找不到物品:sql:" + hisMaterialSql); + } else { + HisMaterialType hisMaterialType = (HisMaterialType) objectDao + .getBySql( + HisMaterialType.class.getSimpleName(), + "where po.id = " + + hisMaterialDefinition.getTypeId()); + String type = analysisDiposableGoodsType(hisMaterialType, + objectDao); + if (StringUtils.isNotBlank(type)) { + disposableGoodsStock.setType(type); + objectDao.saveOrUpdate(disposableGoodsStock); + } + } + } + } + + private void updateDiposableGoodTypeTree(ObjectDao objectDao) { + List httpOptions = objectDao.findBySql( + HttpOption.class.getSimpleName(), "where po.optionListId = '" + + HttpOption.SYSTEMSETTING_DIPOSABLEGOODS_TYPE + "'"); + List httpOptionStrList = new ArrayList(); + for (HttpOption httpOption : httpOptions) { + httpOptionStrList.add(httpOption.getOptionText()); + } + HttpOption httpOption1 = (HttpOption) objectDao.getBySql( + HttpOption.class.getSimpleName(), "where po.optionListId = '" + + HttpOption.SYSTEMSETTING_DIPOSABLEGOODS_TYPE + + "' and po.optionText = '专项物资'"); + HttpOption httpOption2 = (HttpOption) objectDao.getBySql( + HttpOption.class.getSimpleName(), "where po.optionListId = '" + + HttpOption.SYSTEMSETTING_DIPOSABLEGOODS_TYPE + + "' and po.optionText = '低值易耗品'"); + HttpOption httpOption3 = (HttpOption) objectDao.getBySql( + HttpOption.class.getSimpleName(), "where po.optionListId = '" + + HttpOption.SYSTEMSETTING_DIPOSABLEGOODS_TYPE + + "' and po.optionText = '固定资产'"); + boolean needUpdate = false; + if (httpOption1 == null) { + needUpdate = true; + httpOptionStrList.add("专项物资"); + } + if (httpOption2 == null) { + needUpdate = true; + httpOptionStrList.add("低值易耗品"); + } + if (httpOption3 == null) { + needUpdate = true; + httpOptionStrList.add("固定资产"); + } + if (needUpdate) { + HttpOptionManager httpOptionManager = (HttpOptionManager) SpringBeanManger + .getBean("httpOptionManager"); + httpOptionManager.saveOrUpdateTextByListId(httpOptionStrList, + HttpOption.SYSTEMSETTING_DIPOSABLEGOODS_TYPE); + } + } + + private String analysisDiposableGoodsType(HisMaterialType hisMaterialType, + ObjectDao objectDao) { + Logger logger = Logger.getLogger(this.getClass()); + if (!hisMaterialType.getParent().equals(0L)) { + HisMaterialType parent = (HisMaterialType) objectDao.getBySql( + HisMaterialType.class.getSimpleName(), "where po.id = " + + hisMaterialType.getParent()); + return analysisDiposableGoodsType(parent, objectDao); + } else { + if (hisMaterialType.getName().equals("专项物资") + || hisMaterialType.getName().equals("低值易耗品") + || hisMaterialType.getName().equals("固定资产")) { + logger.error("类型为:" + hisMaterialType.getName()); + return hisMaterialType.getName(); + } else { + logger.error("不匹配类型为:" + hisMaterialType.getName()); + } + } + return ""; + } + + public String getDiposableGoodsInfoForGoodPurchase(String diposableGoodsId){ + DisposableGoodsStock goods = diposableGoodsManager + .getDisposableGoodsStockById(diposableGoodsId); + if(goods != null){ + DisposableGoodsBatchStock lastBatchStock = getDiposableGoodLastBatchStock(goods); + String manufacturer = ""; + String supplierName = ""; + if (lastBatchStock != null) { + manufacturer = StringUtils.isBlank(lastBatchStock + .getManufacturer()) ? "" : lastBatchStock + .getManufacturer(); + supplierName = StringUtils.isBlank(lastBatchStock + .getSupplierName()) ? "" : lastBatchStock + .getSupplierName(); + } + Long amout = goods.getAmount(); //库存 + String specificaton = goods.getSpecification(); //规格 + String unit = goods.getUnit(); //单位 + amout = amout == null ? 0 : amout; + specificaton = StringUtils.isBlank(specificaton) ? "" : specificaton; + unit = StringUtils.isBlank(unit) ? "" : unit; + + return amout + "#;" + specificaton + "#;" + + unit + "#;" + supplierName + "#;" + manufacturer; + } + return ""; + } + public String getDiposableGoodsCertification(String diposableGoodsId) { + DisposableGoodsStock goods = diposableGoodsManager + .getDisposableGoodsStockById(diposableGoodsId); + if (goods != null) { + String certification = goods.getCertification(); + DisposableGoodsBatchStock lastBatchStock = getDiposableGoodLastBatchStock(goods); + certification = StringUtils.isBlank(certification) ? "" + : certification; + String manufacturer = ""; + String sterileBatchNumber = ""; + String supplierName = ""; + if (lastBatchStock != null) { + manufacturer = StringUtils.isBlank(lastBatchStock + .getManufacturer()) ? "" : lastBatchStock + .getManufacturer(); + sterileBatchNumber = StringUtils.isBlank(lastBatchStock + .getSterileBatchNumber()) ? "" : lastBatchStock + .getSterileBatchNumber(); + supplierName = StringUtils.isBlank(lastBatchStock + .getSupplierName()) ? "" : lastBatchStock + .getSupplierName(); + } + + return certification + "#;" + manufacturer + "#;" + + sterileBatchNumber + "#;" + supplierName; + } + return ""; + } + /** + * 获取最后一次入库的批次 + * @param goods + * @return + */ + private DisposableGoodsBatchStock getDiposableGoodLastBatchStock( + DisposableGoodsStock goods) { + + DisposableGoodsBatchStock lastBatchStock = null; + for (DisposableGoodsBatchStock batchStock : goods.getGoodsBatchs()) { + if (lastBatchStock == null) { + lastBatchStock = batchStock; + } else { + if (batchStock.getId() > lastBatchStock.getId()) { + lastBatchStock = batchStock; + } + } + } + return lastBatchStock; + } + + public String getDiposableGoodBatchProperty(String goodsId, + String batchNumber) { + DisposableGoodsStock goods = diposableGoodsManager + .getDisposableGoodsStockById(goodsId); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + if(goods != null){ + for (DisposableGoodsBatchStock batchStock : goods.getGoodsBatchs()) { + if (batchStock.getBatchNumber().equals(batchNumber)) { + String Manufacturer = batchStock.getManufacturer(); + String sterileBatchNumber = batchStock.getSterileBatchNumber(); + String expDateStr = dateFormat.format(batchStock.getExpDate()); + return (StringUtils.isBlank(Manufacturer) ? "" : Manufacturer) + + "#;" + + (StringUtils.isBlank(sterileBatchNumber) ? "" + : sterileBatchNumber) + + "#;" + + (StringUtils.isBlank(expDateStr) ? "" :expDateStr); + } + } + } + return ""; + } + /** + * 根据一次性物品定义的id,获取指定批次号的批次属性 + * @param disposableGoodsId 一次性物品定义的id + * @param batchNumber 批次号 + * @return + */ + public String getDisposableGoodsBatchPropertyByDisposableGoodsID(String disposableGoodsId,String batchNumber){ + DisposableGoodsBatch disposableGoodsBatch = disposableGoodsBatchManager.getDisposableGoodsBatchProperty(disposableGoodsId, batchNumber); + if(disposableGoodsBatch != null){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + String Manufacturer = disposableGoodsBatch.getManufacturer(); + String sterileBatchNumber = disposableGoodsBatch.getSterileBatchNumber(); + String expDateStr = dateFormat.format(disposableGoodsBatch.getExpDate()); + return (StringUtils.isBlank(Manufacturer) ? "" : Manufacturer) + + "#;" + + (StringUtils.isBlank(sterileBatchNumber) ? "" + : sterileBatchNumber) + + "#;" + + (StringUtils.isBlank(expDateStr) ? "" :expDateStr); + } + return ""; + } + // 找出下一个外部编码 + public String getNextExternalCodeOfDisposableGoods(String type) { + String code = ""; + String sql = String + .format(" where po.externalCode=(select max(d.externalCode) from %s d where %s)", + DisposableGoods.class.getSimpleName(), + SqlUtils.getStringFieldPredicate("d.type", type)); + DisposableGoods disposableGoods = (DisposableGoods) objectDao.getBySql( + DisposableGoods.class.getSimpleName(), sql); + if (disposableGoods != null) { + code = ForgonStringUtils.increaseNumericalSuffix( + disposableGoods.getExternalCode(), 1); + } + return code; + } + /** + * 转换一次性物品类型由普通物品转换为高值耗材 + * 经搜索代码发现该方法未被调用,标识为过时方法 + * @param ids + * @return + */ + @Deprecated + public String changeGoodsToExpensiveDiposablegoods(String ids) { + JSONObject obj = new JSONObject(); + if(StringUtils.isNotBlank(ids)){ + obj.put("success", false); + obj.put("msg", "要转换的id不能为空"); + return obj.toString(); + } + String[] idsArray = ids.split(","); + List msgs = new LinkedList(); + int successCount = 0; + for (String id : idsArray) { + try { + diposableGoodsManager.changeGoodsToExpensiveDiposablegoods_TRANS_NEW(id); + ++successCount; + } catch (Exception e) { + e.printStackTrace(); + msgs.add(e.getMessage()); + } + } + if(successCount > 0){ + obj.put("success", true); + }else{ + obj.put("success", false); + } + obj.put("successCount", successCount); + obj.put("msg", StringUtils.join(msgs, ",")); + return obj.toString(); + } + + /** + * 转换一次性物品类型由高值耗材转换为普通物品 + * 经搜索代码发现该方法未被调用,标识为过时方法 + * @param ids + * @return + */ + @Deprecated + public String changeExpensiveDiposablegoodsToGoods(String ids) { + JSONObject obj = new JSONObject(); + if(StringUtils.isNotBlank(ids)){ + obj.put("success", false); + obj.put("msg", "要转换的id不能为空"); + return obj.toString(); + } + String[] idsArray = ids.split(","); + List msgs = new LinkedList(); + int successCount = 0; + for (String id : idsArray) { + try { + diposableGoodsManager.changeExpensiveDiposablegoodsToGoods_TRANS_NEW(id); + ++successCount; + } catch (Exception e) { + e.printStackTrace(); + msgs.add(e.getMessage()); + } + } + if(successCount > 0){ + obj.put("success", true); + }else{ + obj.put("success", false); + } + obj.put("successCount", successCount); + obj.put("msg", StringUtils.join(msgs, ",")); + return obj.toString(); + } + + public String findBatchStockCompareList( + Map> parameterMap){ + JSONObject jsonObject = new JSONObject(); + JSONArray dataJsonArray = new JSONArray(); + String sql = "select * from ("+ + //--1.以追溯系统数据为基准,查询出与物资系统库存不一致的数据(包括追溯系统有库存但物资系统却没有的库存数据) + "select dg.idFromHisSync sourceid,dgi.batchIdFromHisSync batchid, dg.externalCode externalCode,dg.name name,dg.specification specification,dgb.batchNumber batchNumber,sum(dgi.amount) cssdStock,avg(js.quantity) inventoryStock "+ + "from DisposableGoodsIdentification dgi join DisposableGoods dg on dgi.disposableGoodsID=dg.id "+ + "join DisposableGoodsBatch dgb on dgi.disposableGoodsBatchID=dgb.id "+ + "left join JXINVENTORYSTOCK js on dgi.batchIdFromHisSync=js.batchid "+ + "where dgi.amount > 0 and convert(decimal(20,4),js.quantity) > 0 and dgi.amount <> convert(decimal(20,4),js.quantity) group by dg.idFromHisSync ,dgi.batchIdFromHisSync , dg.externalCode ,dg.name ,dg.specification ,dgb.batchNumber "+ + + "union "+ + + //2.查询追溯系统有库存但物资系统没有库存的数据 + "select dg.idFromHisSync sourceid,dgi.batchIdFromHisSync batchid,dg.externalCode externalCode,dg.name name,dg.specification specification,dgb.batchNumber batchNumber,sum(dgi.amount) cssdStock,null inventoryStock "+ + "from DisposableGoodsIdentification dgi join DisposableGoods dg on dgi.disposableGoodsID=dg.id "+ + "join DisposableGoodsBatch dgb on dgi.disposableGoodsBatchID=dgb.id "+ + "where dgi.amount > 0 and dgi.batchIdFromHisSync not in (select BatchID from JXINVENTORYSTOCK where Quantity > 0 and SourceID is not null) group by dg.idFromHisSync ,dgi.batchIdFromHisSync , dg.externalCode ,dg.name ,dg.specification ,dgb.batchNumber "+ + + "union "+ + + //3.查询物资系统有库存但追溯系统没有库存的数据 + "select js.sourceid sourceId,js.batchid batchId,js.materialno externalCode,js.MaterialName name,js.MaterialSpec specification,js.ProductNo batchNumber,null cssdStock,js.quantity inventoryStock "+ + "from JXINVENTORYSTOCK js where convert(decimal(20,4),js.quantity) > 0 and batchid not in "+ + "(select batchIdFromHisSync from DisposableGoodsIdentification where amount > 0 and batchIdFromHisSync is not null) "+ + ") alias where 1=1 "; + List sourceIdCondition = parameterMap.get("parm_s_sourceId"); + if(CollectionUtils.isNotEmpty(sourceIdCondition) && StringUtils.isNotBlank(sourceIdCondition.get(0))){ + sql += " and sourceId in ("+ StringUtils.join(sourceIdCondition, ",") +")"; + } + sql += " order by externalCode,batchid"; + ResultSet rs = null; + try{ + rs = objectDao.executeSql(sql); + while(rs.next()){ + JSONObject dataJsonObject = new JSONObject(); + dataJsonObject.put("sourceId", rs.getObject("sourceId")); + dataJsonObject.put("batchId", rs.getObject("batchId")); + dataJsonObject.put("externalCode", rs.getObject("externalCode")); + dataJsonObject.put("name", rs.getObject("name")); + dataJsonObject.put("specification", rs.getObject("specification")); + dataJsonObject.put("displayName", ExpensiveGoodsUtils.getDisposableGoodsFullName(dataJsonObject.optString("name"), dataJsonObject.optString("specification"))); + dataJsonObject.put("batchNumber", rs.getObject("batchNumber")); + dataJsonObject.put("cssdStock", rs.getObject("cssdStock")); + dataJsonObject.put("inventoryStock", rs.getObject("inventoryStock")); + dataJsonArray.add(dataJsonObject); + } + }catch(Exception e){ + e.printStackTrace(); + }finally{ + if(rs != null){ + try { + rs.close(); + } catch (SQLException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + jsonObject.put("totalResults", dataJsonArray.size()); + jsonObject.put("rows", dataJsonArray); + jsonObject.put("selectSqlWhereCondition", "where 1=1"); + return jsonObject.toString(); + } + +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/action/ExpensiveGoodsAction.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/action/ExpensiveGoodsAction.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/action/ExpensiveGoodsAction.java (revision 20740) @@ -0,0 +1,1539 @@ +package com.forgon.disinfectsystem.expensiveGoods.action; + +import java.io.IOException; + +import com.forgon.databaseadapter.service.DateQueryAdapter; + +import java.io.PrintWriter; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.servlet.http.HttpServletResponse; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import net.sf.json.JsonConfig; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.struts2.convention.annotation.Action; +import org.apache.struts2.convention.annotation.Namespace; +import org.apache.struts2.convention.annotation.ParentPackage; + +import com.beust.jcommander.ParameterException; +import com.forgon.Constants; +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.vo.LoginUserData; +import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; +import com.forgon.disinfectsystem.common.CssdUtils; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatch; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsIdentification; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; +import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; +import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; +import com.forgon.disinfectsystem.entity.systemwarning.SystemWarningItemVO; +import com.forgon.disinfectsystem.expensiveGoods.service.DiposableGoodBatchStockManager; +import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsManager; +import com.forgon.disinfectsystem.expensiveGoods.service.DisposableGoodsBatchManager; +import com.forgon.disinfectsystem.expensiveGoods.service.DisposableGoodsStorageRecordManager; +import com.forgon.disinfectsystem.inventorymanagement.model.Inventory; +import com.forgon.systemsetting.model.HttpOption; +import com.forgon.systemsetting.service.HttpOptionManager; +import com.forgon.tools.GB2Alpha; +import com.forgon.tools.GB2WB; +import com.forgon.tools.SpringBeanManger; +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.json.JsonPropertyFilter; +import com.forgon.tools.util.IntegerUtils; +import com.forgon.tools.util.PageUtil; +import com.forgon.tools.util.SqlUtils; +import com.opensymphony.xwork2.ModelDriven; +import com.opensymphony.xwork2.Preparable; +import com.forgon.log.model.Log; +import com.forgon.log.service.LogManager; + +@ParentPackage(value = "default") +@Namespace(value = "/disinfectSystem") +@Action(value = "diposableGoodsAction") +public class ExpensiveGoodsAction implements ModelDriven, + Preparable { + + private DisposableGoods diposableGoods; + + private String spell; + + private ExpensiveGoodsManager diposableGoodsManager; + + private HttpOptionManager httpOptionManager; + + private DiposableGoodBatchStockManager diposableGoodBatchStockManager; + + private DisposableGoodsBatchManager disposableGoodsBatchManager; + + private WareHouseManager wareHouseManager; + + private DisposableGoodsStorageRecordManager disposableGoodsStorageRecordManager; + + private LogManager appLogManager; + + private ObjectDao objectDao; + + private DateQueryAdapter dateQueryAdapter; + + public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { + this.dateQueryAdapter = dateQueryAdapter; + } + + public void setWareHouseManager(WareHouseManager wareHouseManager) { + this.wareHouseManager = wareHouseManager; + } + + private final Pattern pat = Pattern.compile("[\\u4E00-\\u9FA5]+"); + + public void setDiposableGoodBatchStockManager( + DiposableGoodBatchStockManager diposableGoodBatchStockManager) { + this.diposableGoodBatchStockManager = diposableGoodBatchStockManager; + } + + public void setSpell(String spell) { + this.spell = spell; + } + + public void setDiposableGoodsManager( + ExpensiveGoodsManager diposableGoodsManager) { + this.diposableGoodsManager = diposableGoodsManager; + } + + public void setHttpOptionManager(HttpOptionManager httpOptionManager) { + this.httpOptionManager = httpOptionManager; + } + + public void setDisposableGoodsBatchManager( + DisposableGoodsBatchManager disposableGoodsBatchManager) { + this.disposableGoodsBatchManager = disposableGoodsBatchManager; + } + + public void setDisposableGoodsStorageRecordManager( + DisposableGoodsStorageRecordManager disposableGoodsStorageRecordManager) { + this.disposableGoodsStorageRecordManager = disposableGoodsStorageRecordManager; + } + + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + + /** + * 保存前检查是否重复 + * + * @return + */ + public String validate() { + String id = StrutsParamUtils.getPraramValue("validateId", null); + String name = StrutsParamUtils.getPraramValue("valifateName", null); + String specification = StrutsParamUtils.getPraramValue("specification", + null); + String message = "{success:true,message:'验证成功',stauts:1}"; + boolean result = diposableGoodsManager.verifyDiposableGoods(id, name, + specification); + if (!result) { + message = "{success:false,message:'一次性物品的名称不唯一',stauts:0}"; + ; + } + HttpServletResponse httpServletResponse = StrutsParamUtils + .getResponse(); + httpServletResponse.setContentType("text/html;charset=UTF-8"); + try { + httpServletResponse.getWriter().print(message); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 校验参数: + * 1.判断申领单位和申领单位装换单位系数是否同时未空或者同时不为空 + * 2.判断申领单位装换单位系数是否为整数,且大于0 + */ + private void validatePara(){ + String middlePackageUnit = StrutsParamUtils.getPraramValue("middlePackageUnit", null); + String applicationSpecification = StrutsParamUtils.getPraramValue("applicationSpecification", null); + String transferScale = StrutsParamUtils.getPraramValue("transferScale", null); + if( !((StringUtils.isBlank(applicationSpecification) && StringUtils.isBlank(middlePackageUnit) && StringUtils.isBlank(transferScale)) + || (StringUtils.isNotBlank(applicationSpecification) && StringUtils.isNotBlank(middlePackageUnit) && StringUtils.isNotBlank(transferScale)) + )){ + throw new ParameterException("申领单位、申领规格和申领单位转换单位系数必须同时有值或者同时为空!"); + } + if (transferScale != null && !IntegerUtils.isNumeric(transferScale)){ + throw new ParameterException("申领单位转换单位系数必须是整数!"); + } + if( StringUtils.isNotBlank(applicationSpecification) && Integer.valueOf(transferScale) <= 0){ + throw new ParameterException("申领单位转换单位系数大于0!"); + } + } + + // 保存一次性物品定义 + public String saveDiposableGoods() { + JSONObject obj = new JSONObject(); + obj.put("success", true); + try { + if (diposableGoods != null) { + this.validatePara(); + // 设置拼音码 + diposableGoods.setSpelling(GB2Alpha.string2Alpha(diposableGoods + .getName())); + // 设置五笔码 + diposableGoods.setWbCode(GB2WB.getWBCode(diposableGoods.getName())); + diposableGoods.setNotInventoryGoods(StrutsParamUtils.getPraramValue("isInventoryGoods", "")); + if(DatabaseUtil.isPoIdValid(diposableGoods.getId())){ + DisposableGoods origineDG = diposableGoodsManager.getDisposableGoodsById_ForUpdate(diposableGoods.getId().toString()); + // 记录日志 + if(origineDG != null){ + appLogManager = (LogManager) SpringBeanManger.getBean("appLogManager"); + String result = "包定义id=" + origineDG.getId() + ";" + comparedisposableGoodsDefinition(origineDG , diposableGoods); + if(StringUtils.isNotBlank(result)){ + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DISPOSABLEGOODS, Log.TYPE_UPDATE, result); + } + } + diposableGoodsManager.updateDisposableGoods_TRANS_REQUIRED(diposableGoods); + }else{ + diposableGoodsManager.save(diposableGoods); + } + + } + } catch (Exception e) { + e.printStackTrace(); + obj.put("success", true); + obj.put("errorMessage", e.getMessage()); + } + try { + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + StrutsParamUtils.getResponse().getWriter().println(obj.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public String loadDiposableGoods() { + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + String id = StrutsParamUtils.getPraramValue("id", ""); + DisposableGoods diposableGoods = null; + if (DatabaseUtil.isPoIdValid(id)) { + diposableGoods = diposableGoodsManager.get(id); + } + if(diposableGoods == null){ + diposableGoods = new DisposableGoods(); + } + Map map = new HashMap(); + map.put("success", true); + map.put("data", diposableGoods); + try { + String jsonStr = JSONUtil.toJSONString(map, true); + StrutsParamUtils.getResponse().getWriter().println(jsonStr); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public String loadDisposableGoodsStock() { + String id = StrutsParamUtils.getPraramValue("id", ""); + DisposableGoodsStock disposableGoodsStock = null; + DisposableGoods disposableGoods = null; + if (StringUtils.isNotBlank(id) && !id.equals("0")) { + disposableGoodsStock = diposableGoodsManager.getDisposableGoodsStockById(id); + if(disposableGoodsStock != null){ + disposableGoods = diposableGoodsManager.get(disposableGoodsStock.getDisposableGoodsID()); + } + } + if(disposableGoods == null){ + disposableGoods = new DisposableGoods(); + } + if(disposableGoodsStock == null){ + disposableGoodsStock = new DisposableGoodsStock(); + } + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + + JSONObject jobj = new JSONObject(); + jobj.put("success", true); +// String disposableGoodsJSONStr = JSONUtil.toJSONStringEx(disposableGoods,true, DisposableGoods.filterProperties); +// JSONObject disposableGoodsJSONObject = JSONObject.fromObject(disposableGoodsJSONStr); +// disposableGoodsJSONObject.put("amount", disposableGoodsStock.getAmount()); +// jobj.put("data", disposableGoodsJSONObject); + + String disposableGoodsStockJSONStr = JSONUtil.toJSONStringEx(disposableGoodsStock,true, DisposableGoodsStock.filterProperties); + JSONObject disposableGoodsStockJSONObject = JSONObject.fromObject(disposableGoodsStockJSONStr); + disposableGoodsStockJSONObject.put("goodsType", disposableGoods.getGoodsType()); + jobj.put("data", disposableGoodsStockJSONObject); + try { + StrutsParamUtils.getResponse().getWriter().println(jobj.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public void loadGodownEntryItemByid() { + String disposableGoodsID = StrutsParamUtils.getPraramValue("id", ""); + if (StringUtils.isNotBlank(disposableGoodsID) && disposableGoodsID.equals("0") == false) {// 初始化加载的数据 + try { + List disposableGoodsBatchStocks = diposableGoodsManager.getDisposableGoodsBatchStocksByDisposableGoodsID(Long.valueOf(disposableGoodsID)); + + String jsonString = JSONUtil.toJSONString(disposableGoodsBatchStocks, true); + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + StrutsParamUtils.getResponse().getWriter() + .println(jsonString); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + public void loadDisposableGoodsBatchStocksByDisposableGoodsStockID() { + String disposableGoodsStockID = StrutsParamUtils.getPraramValue("id", ""); + if (StringUtils.isNotBlank(disposableGoodsStockID) && disposableGoodsStockID.equals("0") == false) {// 初始化加载的数据 + try { + List disposableGoodsBatchStocks = diposableGoodsManager.getDisposableGoodsBatchStocksExcludingZeroStockByDisposableGoodsStockID(Long.valueOf(disposableGoodsStockID)); + + String jsonString = JSONUtil.toJSONString(disposableGoodsBatchStocks, true); + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + StrutsParamUtils.getResponse().getWriter() + .println(jsonString); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public void loadExpensiveDisposableGoods() { + String disposableGoodsId = StrutsParamUtils.getPraramValue( + "disposableGoodsId", ""); + String disposableGoodsStockIds = StrutsParamUtils.getPraramValue( + "disposableGoodsStockIds", ""); + String disposableGoodsBatchStockIds = StrutsParamUtils.getPraramValue( + "disposableGoodsBatchStockIds", ""); + List expensiveDisposablegoodsList = diposableGoodsManager + .getCurrentUserOrgUnitWarehouseExpensivediposableGoods( + disposableGoodsId, disposableGoodsStockIds, + disposableGoodsBatchStockIds); + + if (expensiveDisposablegoodsList == null) { + expensiveDisposablegoodsList = new ArrayList(); + } + JSONArray jobjs = new JSONArray(); + for (ExpensiveDisposablegoods expensiveDisposablegoods : expensiveDisposablegoodsList) { + JSONObject jobj = JSONObject.fromObject(JSONUtil.toJSONStringEx( + expensiveDisposablegoods, true, new String[] { + "disposableGoodsBatchStock", + "ColumnNameAndPoPropertyNameMap" })); + DisposableGoodsBatchStock disposableGoodsBatchStock = expensiveDisposablegoods + .getDisposableGoodsBatchStock(); + if (disposableGoodsBatchStock != null) { + jobj.put("batchNumber", + disposableGoodsBatchStock.getBatchNumber()); + jobj.put("supplierName", + disposableGoodsBatchStock.getSupplierName()); + jobj.put("expDate", + disposableGoodsBatchStock.getExpDateStr()); + jobj.put("printTime", + expensiveDisposablegoods.getPrintTimeStr()); + + } + jobjs.add(jobj); + } + try { + String jsonString = jobjs.toString(); + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + StrutsParamUtils.getResponse().getWriter().println(jsonString); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void loadDisposableGoodsBatchesByDisposableGoodsID() { + String disposableGoodsID = StrutsParamUtils.getPraramValue("id", ""); + if (StringUtils.isNotBlank(disposableGoodsID) && disposableGoodsID.equals("0") == false) {// 初始化加载的数据 + try { + List disposableGoodsBatches = diposableGoodsManager.getDisposableGoodsBatchesByDisposableGoodsID(Long.valueOf(disposableGoodsID)); + if(disposableGoodsBatches == null){ + disposableGoodsBatches = new ArrayList(); + } + String jsonString = JSONUtil.toJSONString(disposableGoodsBatches, true); + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + StrutsParamUtils.getResponse().getWriter() + .println(jsonString); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + public void deleteDiposableGoods() { + String idStr = StrutsParamUtils.getPraramValue("ids", ""); + String message = ""; + try { + message = diposableGoodsManager.deleteDiposableGoodsAndReturnMessage(idStr); + } catch (Exception e) { + message = "删除失败!"+e.getMessage(); + e.printStackTrace(); + } + HttpServletResponse httpServletResponse = StrutsParamUtils + .getResponse(); + httpServletResponse.setCharacterEncoding("UTF-8"); + try { + httpServletResponse.getWriter().print(message); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void interfere_changeGoodsToExpensiveDiposablegoods() { + String idStr = StrutsParamUtils.getPraramValue("ids", ""); + int successCount = 0; + int totalCount = 0; + String message = ""; + try { + if(StringUtils.isBlank(idStr)){ + throw new RuntimeException("参数错误,ids不能为空!"); + } + String[] idsArr = idStr.split(","); + totalCount = idsArr.length; + for (String id : idsArr) { + try { + diposableGoodsManager.changeGoodsToExpensiveDiposablegoods_TRANS_NEW(id); + ++successCount; + } catch (Exception e) { + e.printStackTrace(); + message = "转换失败!"+e.getMessage(); + } + } + } catch (Exception e) { + message = "转换失败!"+e.getMessage(); + e.printStackTrace(); + } + if(successCount > 0){ + message = String.format("成功%s个,失败%s个!", successCount,totalCount-successCount); + } + HttpServletResponse httpServletResponse = StrutsParamUtils + .getResponse(); + httpServletResponse.setCharacterEncoding("UTF-8"); + try { + httpServletResponse.getWriter().print(message); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void interfere_changeExpensiveDiposablegoodsToGoods() { + String idStr = StrutsParamUtils.getPraramValue("ids", ""); + int successCount = 0; + int totalCount = 0; + String message = ""; + try { + if(StringUtils.isBlank(idStr)){ + throw new RuntimeException("参数错误,ids不能为空!"); + } + String[] idsArr = idStr.split(","); + totalCount = idsArr.length; + for (String id : idsArr) { + try { + diposableGoodsManager.changeExpensiveDiposablegoodsToGoods_TRANS_NEW(id); + ++successCount; + } catch (Exception e) { + e.printStackTrace(); + message = "转换失败!"+e.getMessage(); + } + } + } catch (Exception e) { + message = "转换失败!"+e.getMessage(); + e.printStackTrace(); + } + if(successCount > 0){ + message = String.format("成功%s个,失败%s个!", successCount,totalCount-successCount); + } + HttpServletResponse httpServletResponse = StrutsParamUtils + .getResponse(); + httpServletResponse.setCharacterEncoding("UTF-8"); + try { + httpServletResponse.getWriter().print(message); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void printBatchNumOfDiposableGoodsByIds() { + String idStr = StrutsParamUtils.getPraramValue("diposableIds", ""); + StringBuffer sb = new StringBuffer(); + if (StringUtils.isNotBlank(idStr)) { + String sql = String.format(" where po.id in(%s)", idStr); + List disposableGoodsList = diposableGoodsManager.getDisposableGoodsBySql(sql); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + if(disposableGoodsList != null){ + for (DisposableGoods disposableGoods : disposableGoodsList) { + if(disposableGoods.expensiveDiposablegoods()){// 高值耗材的打印 +// continue; + } + + List disposableGoodsBatchStockList = diposableGoodBatchStockManager + .getCurrentUserOrgUnitWarehouseDisposableGoodsBatchStockByDisposableGoodsId(disposableGoods.getId().toString(), false); + if (disposableGoodsBatchStockList == null) { + continue; + } + for (DisposableGoodsBatchStock disposableGoodsBatchStock : disposableGoodsBatchStockList) { + if (sb.length() > 0) { + sb.append(";"); + } + String expDate = ""; + if (disposableGoodsBatchStock.getExpDate() != null) { + expDate = sdf.format(disposableGoodsBatchStock.getExpDate()); + } + + String specification = ""; + if (disposableGoodsBatchStock.getDiposableGoods().getSpecification() != null) { + specification = disposableGoodsBatchStock.getDiposableGoods() + .getSpecification().trim(); + } + + sb.append(disposableGoodsBatchStock.getDiposableGoods().getName() + + "#&" + disposableGoodsBatchStock.getBarcode() + "#&" + + expDate + "#&" + disposableGoodsBatchStock.getSupplierName() + + "#&" + disposableGoodsBatchStock.getBatchNumber() + "#&" + + specification); + } + + + } + } + } + + HttpServletResponse response = StrutsParamUtils.getResponse(); + response.setCharacterEncoding("UTF-8"); + + try { + PrintWriter out = response.getWriter(); + out.print("{success:true,value:'" + sb.toString() + "'}"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void printDisposableGoodsBatchByDisposableGoodsIds() { + String idStr = StrutsParamUtils.getPraramValue("diposableIds", ""); + StringBuffer sb = new StringBuffer(); + if (StringUtils.isNotBlank(idStr)) { + String sql = String.format(" where po.id in(%s)", idStr); + List disposableGoodsList = diposableGoodsManager.getDisposableGoodsBySql(sql); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date date = new Date(); + if(disposableGoodsList != null){ + for (DisposableGoods disposableGoods : disposableGoodsList) { + if(disposableGoods.expensiveDiposablegoods()){// 高值耗材的打印 +// continue; + } + + List disposableGoodsBatchList = diposableGoodsManager.getDisposableGoodsBatchesByDisposableGoodsID(disposableGoods.getId()); + if (disposableGoodsBatchList == null) { + continue; + } + for (DisposableGoodsBatch disposableGoodsBatch : disposableGoodsBatchList) { + if (sb.length() > 0) { + sb.append(";"); + } + String expDate = ""; + if (disposableGoodsBatch.getExpDate() != null) { + expDate = sdf.format(disposableGoodsBatch.getExpDate()); + } + // 更新打印状态 + disposableGoodsBatch.setHasPrinted(Constants.STR_YES); + disposableGoodsBatch.setPrintTime(date); + diposableGoodsManager.saveOrUpdate(disposableGoodsBatch); + String specification = ""; + if (disposableGoodsBatch.getDiposableGoods().getSpecification() != null) { + specification = disposableGoodsBatch.getDiposableGoods() + .getSpecification().trim(); + } + + sb.append(disposableGoodsBatch.getDiposableGoods().getName() + + "#&" + disposableGoodsBatch.getBarcode() + "#&" + + expDate + "#&" + disposableGoodsBatch.getSupplierName() + + "#&" + disposableGoodsBatch.getBatchNumber() + "#&" + + specification); + } + + + } + } + } + + HttpServletResponse response = StrutsParamUtils.getResponse(); + response.setCharacterEncoding("UTF-8"); + + try { + PrintWriter out = response.getWriter(); + out.print("{success:true,value:'" + sb.toString() + "'}"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void printExpensiveDisposableGoodsByDisposableGoodsIds() { + String idStr = StrutsParamUtils.getPraramValue("diposableIds", ""); + StringBuffer sb = new StringBuffer(); + if (StringUtils.isNotBlank(idStr)) { + String sql = String.format(" where po.id in(%s)", idStr); + List disposableGoodsList = diposableGoodsManager.getDisposableGoodsBySql(sql); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + if(disposableGoodsList != null){ + for (DisposableGoods disposableGoods : disposableGoodsList) { + if(disposableGoods.expensiveDiposablegoods()){// 高值耗材的打印 + List expensiveDisposablegoodsList = diposableGoodsManager.getCurrentUserOrgUnitWarehouseExpensivediposablegoodsByDisposableGoodsId(disposableGoods.getId()); + if(expensiveDisposablegoodsList == null){ + continue; + } + for (ExpensiveDisposablegoods expensiveDisposablegoods : expensiveDisposablegoodsList) { + DisposableGoodsBatchStock disposableGoodsBatchStock = expensiveDisposablegoods.getDisposableGoodsBatchStock(); + if (sb.length() > 0) { + sb.append(";"); + } + String expDate = ""; + if (disposableGoodsBatchStock.getExpDate() != null) { + expDate = sdf.format(disposableGoodsBatchStock.getExpDate()); + } + + String specification = ""; + if (disposableGoods.getSpecification() != null) { + specification = disposableGoods.getSpecification().trim(); + } + + sb.append(disposableGoods.getName() + + "#&" + expensiveDisposablegoods.getBarcode() + "#&" + + expDate + "#&" + disposableGoodsBatchStock.getSupplierName() + + "#&" + disposableGoodsBatchStock.getBatchNumber() + "#&" + + specification); + } + } + } + } + } + + HttpServletResponse response = StrutsParamUtils.getResponse(); + response.setCharacterEncoding("UTF-8"); + + try { + PrintWriter out = response.getWriter(); + out.print("{success:true,value:'" + sb.toString() + "'}"); + } catch (IOException e) { + e.printStackTrace(); + } + } + public void printExpensiveDisposableGoodsByIds() { + String ids = StrutsParamUtils.getPraramValue("ids", ""); + JSONObject retObj = new JSONObject(); + retObj.put("success", false); + try { + if(StringUtils.isBlank(ids)){ + throw new RuntimeException("id不能为空"); + } + JSONArray jobjs = new JSONArray(); + List expensiveDisposablegoodsList = diposableGoodsManager.getExpensiveDisposablegoodsByIds(ids); + if(expensiveDisposablegoodsList == null || expensiveDisposablegoodsList.isEmpty()){ + throw new RuntimeException("高值耗材已被删除"); + } + + Set diposableGoodsIdSet = new HashSet(); + for (ExpensiveDisposablegoods expensiveDisposablegoods : expensiveDisposablegoodsList) { + Long disposableGoodsId = expensiveDisposablegoods.getDisposableGoodsID(); + if(disposableGoodsId != null){ + diposableGoodsIdSet.add(disposableGoodsId); + } + } + String sql = String.format(" where %s ", SqlUtils.getNonStringFieldInCollectionsPredicate("po.id", diposableGoodsIdSet)); + Map idsToDisposableGoodsMap = diposableGoodsManager.getIdsToDisposableGoodsMapBySql(sql); + diposableGoodsManager.updateExpensiveDisposablegoodsPrintTime(expensiveDisposablegoodsList); + for (ExpensiveDisposablegoods expensiveDisposablegoods : expensiveDisposablegoodsList) { + JSONObject jobj = new JSONObject(); + Long disposableGoodsId = expensiveDisposablegoods.getDisposableGoodsID(); + DisposableGoods disposableGoods = idsToDisposableGoodsMap.get(disposableGoodsId); + DisposableGoodsBatchStock disposableGoodsBatchStock = expensiveDisposablegoods.getDisposableGoodsBatchStock(); + String showName = ""; + String name = ""; + String specification = ""; + if(disposableGoods != null){ + if(disposableGoods.getName() != null){ + name = disposableGoods.getName(); + } + if(disposableGoods.getSpecification() != null){ + specification = disposableGoods.getSpecification(); + } + showName = disposableGoods.getShowName(); + } + String expDate = ""; + if (disposableGoodsBatchStock.getExpDate() != null) { + expDate = Constants.SIMPLEDATEFORMAT_YYYYMMDD.format(disposableGoodsBatchStock.getExpDate()); + } + jobj.put("expDate", expDate); + jobj.put("showName", showName); + jobj.put("name", name); + jobj.put("specification", specification); + jobj.put("barcode", expensiveDisposablegoods.getBarcode()); + jobj.put("supplierName", disposableGoodsBatchStock.getSupplierName()); + jobj.put("batchNumber", disposableGoodsBatchStock.getBatchNumber()); + jobjs.add(jobj); + } + + retObj.put("success", true); + retObj.put("data", jobjs); + } catch (Exception e) { + e.printStackTrace(); + retObj.put("errMsg", e.getMessage()); + } + + HttpServletResponse response = StrutsParamUtils.getResponse(); + response.setCharacterEncoding("UTF-8"); + + try { + PrintWriter out = response.getWriter(); + out.print(retObj.toString()); + } catch (IOException e) { + e.printStackTrace(); + } + } + public void printDiposableGoods() { + String items = StrutsParamUtils.getPraramValue("items", ""); + StringBuffer buffer = new StringBuffer(); + if (StringUtils.isNotBlank(items)) { + Date date = new Date(); + for (String id : items.split(",")) { + if (StringUtils.isNotBlank(id)) { + DisposableGoodsBatch disposableGoodsBatch = diposableGoodsManager.getDisposableGoodsBatchById(Long.valueOf(id)); + if(disposableGoodsBatch == null){ + continue; + } + DisposableGoods diposableGoods = disposableGoodsBatch.getDiposableGoods(); + if(diposableGoods == null){ + continue; + } + String expDate = disposableGoodsBatch.getExpDateStr(); + // 更新打印状态 + disposableGoodsBatch.setHasPrinted(Constants.STR_YES); + disposableGoodsBatch.setPrintTime(date); + diposableGoodsManager.saveOrUpdate(disposableGoodsBatch); + buffer.append(diposableGoods.getShowName() + "#&" + disposableGoodsBatch.getBarcode() + "#&" + expDate + + "#&" + disposableGoodsBatch.getSupplierName() + "#&" + disposableGoodsBatch.getBatchNumber() + ";"); + } + } + String printValue = ""; + if (buffer.length() > 0) { + String str = buffer.toString(); + printValue = str.substring(0, str.length() - 1); + } + + HttpServletResponse response = StrutsParamUtils.getResponse(); + response.setCharacterEncoding("UTF-8"); + + try { + PrintWriter out = response.getWriter(); + out.print("{success:true,barcode:'" + printValue + "'}"); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public void getAllDiposableGoods() { + List goodsList = diposableGoodsManager + .getAllDiposableGoods(); + StringBuffer buff = new StringBuffer(); + for (int i = 0; i < goodsList.size(); i++) { + Long id = goodsList.get(i).getId(); + String name = goodsList.get(i).getName(); + String specification = goodsList.get(i).getSpecification(); + if (StringUtils.isNotBlank(specification)) { + name += "[" + specification + "]"; + } + String code = goodsList.get(i).getExternalCode(); + buff.append("{id:'").append(id).append("',code:'") + .append(code == null ? "" : code).append("',name:'") + .append(name).append("'}"); + if (i != goodsList.size() - 1) { + buff.append(","); + } + } + HttpServletResponse response = StrutsParamUtils.getResponse(); + try { + response.setCharacterEncoding("utf-8"); + response.getWriter().print("[" + buff.toString() + "]"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public String treeLoad() { + HttpServletResponse response = StrutsParamUtils.getResponse(); + try { + response.setCharacterEncoding("utf-8"); + response.getWriter().print( + diposableGoodsManager.getDiposableGoodsTypeTreeJson()); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 取得所有的一次性物品类型,包括全部选项 + */ + public void getDiposableGoodsTypeIncludeAllOption() { + List list = httpOptionManager + .getHttpOptionTextById(HttpOption.SYSTEMSETTING_DIPOSABLEGOODS_TYPE); + String str = "['全部',''],"; + if (list != null && list.size() > 0) { + for (int i = 0; i < list.size(); i++) { + str = str + "[ '" + list.get(i) + "','" + list.get(i) + "'],"; + + } + } + StringBuffer buff = new StringBuffer(); + if (str.length() > 0) { + buff.append("["); + buff.append(str.substring(0, str.length() - 1)); + buff.append("]"); + } + HttpServletResponse response = StrutsParamUtils.getResponse(); + try { + response.setCharacterEncoding("utf-8"); + response.getWriter().print(buff.toString()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void getDiposableGoodsType() { + List list = httpOptionManager + .getHttpOptionTextById(HttpOption.SYSTEMSETTING_DIPOSABLEGOODS_TYPE); + String str = ""; + if (list != null && list.size() > 0) { + for (int i = 0; i < list.size(); i++) { + str = str + "[ '" + list.get(i) + "'],"; + + } + } + StringBuffer buff = new StringBuffer(); + if (str.length() > 0) { + buff.append("["); + buff.append(str.substring(0, str.length() - 1)); + buff.append("]"); + } + HttpServletResponse response = StrutsParamUtils.getResponse(); + try { + response.setCharacterEncoding("utf-8"); + response.getWriter().print(buff.toString()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void getDisposableGoodsTypeForFilter() { + List list = httpOptionManager + .getHttpOptionTextById(HttpOption.SYSTEMSETTING_DIPOSABLEGOODS_TYPE); + JSONArray jarr = new JSONArray(); + JSONObject jobjAll = new JSONObject(); + jobjAll.put("typeName", "全部"); + jobjAll.put("typeValue", ""); + jarr.add(jobjAll); + if (list != null) { + for (String type : list) { + JSONObject jobj = new JSONObject(); + jobj.put("typeName", type); + jobj.put("typeValue", type); + jarr.add(jobj); + } + } + HttpServletResponse response = StrutsParamUtils.getResponse(); + try { + response.setCharacterEncoding("utf-8"); + response.getWriter().print(jarr.toString()); + } catch (IOException e) { + e.printStackTrace(); + } + } + /** + * 根据拼音简拼,获取一次性物品NAME和ID + * + * @return + * @throws Exception + */ + public String getDiposableGoodsData() { + spell = spell == null ? "" : spell; + if (spell != null) { + try { + spell = java.net.URLDecoder.decode(spell, "UTF-8"); + + Matcher m = pat.matcher(spell); + if (!m.find()) { + spell = spell.toUpperCase(); + } + String allItems = StrutsParamUtils.getPraramValue("allItems", + null); + //是否盘点 + String canInventory = StrutsParamUtils.getPraramValue("canInventory", + null); + Long warehouseId = StrutsParamUtils.getPraramLongValue("wareHouseId", + null); + WareHouse warehouse = wareHouseManager.getWareHouseById(warehouseId); + String handleDepartCode = null; + if(warehouse != null){ + handleDepartCode = warehouse.getOrgUnitCode(); + } + // JSONObject json = diposableGoodsManager.searchDisposableGoodsList( + // spell, allItems,handleDepartCode,true); + List> reList = diposableGoodsManager.findDisposableGoodsList(spell, allItems, handleDepartCode, canInventory, true); + PageUtil.outPutResult(PageUtil.getPagePara(), reList); + // HttpServletResponse response = StrutsParamUtils.getResponse(); + // response.setCharacterEncoding("UTF-8"); + // PrintWriter out = response.getWriter(); + // out.print(json); + // out.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + return null; + } + + /** + * 根据拼音简拼,获取一次性物品和器械的NAME和ID + * + * @return + * @throws Exception + */ + public String getMaterialAndDiposableGoodsData() { + if (spell == null) { + return null; + } + try { + spell = java.net.URLDecoder.decode(spell, "UTF-8"); + Pattern pat = Pattern.compile("[\\u4E00-\\u9FA5]+"); + Matcher m = pat.matcher(spell); + if (!m.find()) { + spell = spell.toUpperCase(); + } + String goodsType = StrutsParamUtils.getPraramValue("goodsType", null); + // JSONObject json = diposableGoodsManager + // .searchMaterialAndDiposableGoods(spell,goodsType); + List> reList = diposableGoodsManager.findMaterialAndDisposableGoods(spell, goodsType); + PageUtil.outPutResult(PageUtil.getPagePara(), reList); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + public String getDiposableGoodBatchStockByBarcode() { + String barcode = StrutsParamUtils.getPraramValue("barcode", ""); + String warehouseId = StrutsParamUtils.getPraramValue("warehouseId", ""); + String diposableGoodsStr = ""; + DisposableGoodsBatchStock disposableGoodsBatchStock = diposableGoodBatchStockManager + .getByBarcode(barcode,warehouseId); + if (disposableGoodsBatchStock != null + && disposableGoodsBatchStock.getDiposableGoods() != null) { +// Map obj = new HashMap(); +// +// obj.put("id", diposableGoodBatchStock.getDiposableGoods().getId()); +// obj.put("showName", diposableGoodBatchStock.getDiposableGoods().getShowName()); +// obj.put("batchNumber", diposableGoodBatchStock.getBatchNumber()); +// obj.put("storage", diposableGoodBatchStock.getStorage()); + + diposableGoodsStr = JSONUtil.toJSONStringEx(disposableGoodsBatchStock,true,DisposableGoodsBatchStock.filterProperties); + } + try { + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + StrutsParamUtils.getResponse().getWriter().print(diposableGoodsStr); + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } + + public String getDiposableGoodBatchStockByNameAndBatchNumber() { + String diposableGoodsName = StrutsParamUtils.getPraramValue( + "diposableGoodsName", ""); + String warehouseId = StrutsParamUtils.getPraramValue( + "warehouseId", ""); + String batchNumber = StrutsParamUtils.getPraramValue("batchNumber", ""); + String diposableGoodsStr = null; + String specification = null; + if (StringUtils.isNotBlank(diposableGoodsName) + && diposableGoodsName.lastIndexOf("[") != -1) { + specification = diposableGoodsName.substring( + diposableGoodsName.lastIndexOf("[") + 1, + diposableGoodsName.length() - 1); + diposableGoodsName = diposableGoodsName.substring(0, + diposableGoodsName.lastIndexOf("[")).trim(); + } + + DisposableGoodsBatchStock disposableGoodsBatchStock = diposableGoodBatchStockManager + .getDisposableGoodsBatchStockByNameAndBatchNumber(Long.valueOf(warehouseId), + diposableGoodsName, specification, batchNumber); + if (disposableGoodsBatchStock != null) { + diposableGoodsStr = "{id:" + disposableGoodsBatchStock.getId() + + ",name:'" + diposableGoodsName + "',batchNumber:'" + + batchNumber + "',storage:" + + disposableGoodsBatchStock.getStorage() + "}"; + } + try { + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + StrutsParamUtils.getResponse().getWriter().print(diposableGoodsStr); + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } + + /** + * 获取一次性物品的批次信息 + * + * @return + */ + public String getBatchNumbersByDiposableGood() { + String diposableGoodsId = StrutsParamUtils.getPraramValue( + "diposableGoodsId", ""); + List stockList = diposableGoodBatchStockManager + .getDisposableGoodsBatchStockByDisposableGoodsId(diposableGoodsId); + JsonConfig jsonConfig = new JsonConfig(); + JsonPropertyFilter filter = new JsonPropertyFilter(new String[] { + "diposableGoods", "barcode", "type" }); + jsonConfig.setJsonPropertyFilter(filter); + JSONArray jsonArray = JSONArray.fromObject(stockList, jsonConfig); + try { + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + StrutsParamUtils.getResponse().getWriter() + .print(jsonArray.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + // 获取一次性物品批次 + public String getBatchesByDiposableGoodsID() { + String diposableGoodsID = StrutsParamUtils.getPraramValue( + "diposableGoodsID", ""); + + List batchStocks = diposableGoodBatchStockManager + .getDisposableGoodsBatchStockByDisposableGoodsId(diposableGoodsID, false); + String batchs = "[]"; + if(batchStocks != null){ + batchs = JSONUtil.toJSONStringEx(batchStocks,true,DisposableGoodsBatchStock.filterProperties); + } + + try { + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + StrutsParamUtils.getResponse().getWriter() + .print(batchs); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 获取一次性物品的批次定义 + * @return + */ + public String getDisposableGoodsBatchList(){ + String diposableGoodsID = StrutsParamUtils.getPraramValue("disposableGoodsID", ""); + String spelling = StrutsParamUtils.getPraramValue("spell", null); + if (StringUtils.isBlank(diposableGoodsID)) + return null; + try { + List disposableGoodsBatchList = disposableGoodsBatchManager + .getDisposableGoodsBatch(diposableGoodsID,spelling); + + JsonConfig jsonConfig = new JsonConfig(); + JsonPropertyFilter filter = new JsonPropertyFilter(new String[] { + "diposableGoods", "barcode", "type", "identifications" }); + jsonConfig.setJsonPropertyFilter(filter); + JSONArray jsonArray = JSONArray.fromObject(disposableGoodsBatchList, jsonConfig); + HttpServletResponse response = StrutsParamUtils.getResponse(); + response.setCharacterEncoding("UTF-8"); + PrintWriter out; + try { + out = response.getWriter(); + out.print(jsonArray.toString()); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + /** + * 根据一次性物品Id返回该物品的所有入库批次号列表 + * + * @return + */ + public String getBatchNumData() { + String diposableGoodsID = StrutsParamUtils.getPraramValue( + "disposableGoodsID", ""); + String spelling = StrutsParamUtils.getPraramValue("spell", null); + if (StringUtils.isBlank(diposableGoodsID)) + return null; + try { + List stockList = diposableGoodBatchStockManager + .getDisposableGoodsBatchStockByDisposableGoodsId( + diposableGoodsID, false); + List temList = null; + if (spelling != null) { + temList = new ArrayList(); + if (stockList != null && stockList.size() > 0) { + for (DisposableGoodsBatchStock stock : stockList) { + if (stock.getBatchNumber().contains(spelling)) { + temList.add(stock); + } + } + } + } else { + temList = stockList; + } + JsonConfig jsonConfig = new JsonConfig(); + JsonPropertyFilter filter = new JsonPropertyFilter(new String[] { + "diposableGoods", "barcode", "type", "identifications" }); + jsonConfig.setJsonPropertyFilter(filter); + JSONArray jsonArray = JSONArray.fromObject(temList, jsonConfig); + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject jsonObject = jsonArray.getJSONObject(i); + String displayName = jsonObject.getString("batchNumber") + + "(库存量:" + jsonObject.getString("storage") + ")"; + jsonObject.element("displayName", displayName); + } + HttpServletResponse response = StrutsParamUtils.getResponse(); + response.setCharacterEncoding("UTF-8"); + PrintWriter out; + try { + out = response.getWriter(); + out.print(jsonArray.toString()); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 根据一次性物品批次id,返回该物品批次的标识号表的物资系统batchId列表 + * [{batchIdFromHisSync:1234,amount:100}] + * @return disposableGoodsBatchID + */ + public void getDisposableGoodsBatchIdFromHisSyncList() { + JSONArray jsonArray = new JSONArray(); + String disposableGoodsBatchID = StrutsParamUtils.getPraramValue( + "disposableGoodsBatchID", ""); + if(!DatabaseUtil.isPoIdValid(disposableGoodsBatchID)){ + StrutsResponseUtils.output(jsonArray); + return; + } + try { + + DisposableGoodsBatch disposableGoodsBatch = + (DisposableGoodsBatch)objectDao.getBySql(DisposableGoodsBatch.class.getSimpleName(), " where id=" + disposableGoodsBatchID); + String goodsType = disposableGoodsBatch.getDiposableGoods().getGoodsType(); + if(DisposableGoods.TYPE_DIPOSABLEGOODS.equals(goodsType)){ + List identificationList = + objectDao.findBySql(DisposableGoodsIdentification.class.getSimpleName(), "where disposableGoodsBatchID=" + disposableGoodsBatchID); + if(CollectionUtils.isNotEmpty(identificationList)){ + Map batchIdFromHisSyncAndAmountMap = new HashMap(); + //相同批次的一次生物品需要按batchIdFromHisSync进行合并 + for (DisposableGoodsIdentification disposableGoodsIdentification : identificationList) { + Long batchIdFromHisSync = disposableGoodsIdentification.getBatchIdFromHisSync(); + if(batchIdFromHisSyncAndAmountMap.containsKey(batchIdFromHisSync)){ + batchIdFromHisSyncAndAmountMap.put(batchIdFromHisSync, + batchIdFromHisSyncAndAmountMap.get(batchIdFromHisSync) + disposableGoodsIdentification.getAmount()); + }else{ + batchIdFromHisSyncAndAmountMap.put(batchIdFromHisSync, disposableGoodsIdentification.getAmount()); + } + } + + if(batchIdFromHisSyncAndAmountMap.size() > 0){ + for (Long batchIdFromHisSyncKey : batchIdFromHisSyncAndAmountMap.keySet()) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("batchIdFromHisSync", batchIdFromHisSyncKey); + jsonObject.put("amount", batchIdFromHisSyncAndAmountMap.get(batchIdFromHisSyncKey)); + jsonArray.add(jsonObject); + } + } + } + }else if(DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS.equals(goodsType)){ + List expensiveDisposablegoodsList = + objectDao.findBySql(ExpensiveDisposablegoods.class.getSimpleName(), "where disposableGoodsBatchID=" + disposableGoodsBatchID); + if(CollectionUtils.isNotEmpty(expensiveDisposablegoodsList)){ + Map batchIdFromHisSyncAndAmountMap = new HashMap(); + //相同批次的一次生物品需要按batchIdFromHisSync进行合并 + for (ExpensiveDisposablegoods expensiveDisposablegoods : expensiveDisposablegoodsList) { + Long batchIdFromHisSync = expensiveDisposablegoods.getBatchIdFromHisSync(); + if(batchIdFromHisSyncAndAmountMap.containsKey(batchIdFromHisSync)){ + batchIdFromHisSyncAndAmountMap.put(batchIdFromHisSync, + batchIdFromHisSyncAndAmountMap.get(batchIdFromHisSync) + 1); + }else{ + batchIdFromHisSyncAndAmountMap.put(batchIdFromHisSync, 1L); + } + } + + if(batchIdFromHisSyncAndAmountMap.size() > 0){ + for (Long batchIdFromHisSyncKey : batchIdFromHisSyncAndAmountMap.keySet()) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("batchIdFromHisSync", batchIdFromHisSyncKey); + jsonObject.put("amount", batchIdFromHisSyncAndAmountMap.get(batchIdFromHisSyncKey)); + jsonArray.add(jsonObject); + } + } + } + } + StrutsResponseUtils.output(jsonArray); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void prepare() { + diposableGoods = new DisposableGoods(); + } + + @Override + public DisposableGoods getModel() { + return diposableGoods; + } + + public void updateDiposableGoodsPrice(){ + diposableGoodsManager.updateDiposableGoodsPriceFromExcelFile(); + } + + public void loadDiposablegoods(){ + StringBuffer buff = new StringBuffer(); + List list = diposableGoodsManager.getAllDiposableGoods(); + if(list != null){ + for (DisposableGoodsStock goods : list) { + if(buff.length() > 0){ + buff.append(","); + } + buff.append("{id:").append(goods.getId()).append(","); + String goodName = goods.getName(); + if(StringUtils.isNotBlank(goods.getSpecification())){ + goodName += "[" + goods.getSpecification() + "]"; + } + buff.append("tousseName:'").append(goodName).append("'}"); + } + } + HttpServletResponse response = StrutsParamUtils.getResponse(); + response.setCharacterEncoding("UTF-8"); + PrintWriter out; + try { + out = response.getWriter(); + out.print("[" + buff.toString() + "]"); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + // 根据名字获取库存 + public void getStorageByDisposableGoodsIds(){ + JSONArray storages = new JSONArray(); + try { + String disposableGoodsIds = StrutsParamUtils.getPraramValue( + "disposableGoodsIds", ""); + String warehouseId = StrutsParamUtils.getPraramValue( + "warehouseId", ""); + if(StringUtils.isNotBlank(disposableGoodsIds) && StringUtils.isNotBlank(warehouseId)){ + Set disposableGoodsIdSet = new HashSet(); + String[] disposableGoodsIdsArr = disposableGoodsIds.split(","); + for (String disposableGoodsId : disposableGoodsIdsArr) { + disposableGoodsIdSet.add(Long.valueOf(disposableGoodsId)); + } + Map disposableGoodsMap = diposableGoodsManager.getIdsToDisposableGoodsMapByDisposableGoodsIds(disposableGoodsIdSet); + List disposableGoodsStocks = diposableGoodsManager.getDisposableGoodsStockByDisposableGoodsIDs(warehouseId, disposableGoodsIdSet); + if(disposableGoodsStocks != null){ + for (DisposableGoodsStock disposableGoodsStock : disposableGoodsStocks) { + JSONObject storage = new JSONObject(); + String name = disposableGoodsStock.getShowNameForSmallestUnit(); + Long amount = disposableGoodsStock.getAmount(); + storage.put("name", name); + storage.put("disposableGoodsStockId", disposableGoodsStock.getId()); + storage.put("disposableGoodsId", disposableGoodsStock.getDisposableGoodsID()); + DisposableGoods disposableGoods = disposableGoodsMap.get(disposableGoodsStock.getDisposableGoodsID()); + Integer transferScale = disposableGoods.getTransferScale(); + + storage.put("storageErrorMsg", ""); + if(disposableGoods != null){ + if(disposableGoods.isMiddlePackageUnitEnabled()){ + storage.put("storage", amount/transferScale); + if(amount % transferScale != 0){ + storage.put("storageErrorMsg", String.format("%s的中包装数量不为整数!", name)); + } + }else{ + storage.put("storage", amount); + } + }else{ + storage.put("storageErrorMsg", String.format("%s的物品定义为空!", name)); + storage.put("storage", 0); + } + + storages.add(storage); + } + } + } + } catch (NumberFormatException e) { + e.printStackTrace(); + } + StrutsResponseUtils.output(storages); + } + + public void loadDisposableGoodsStorageRecord(){ + String disposableGoodsId = StrutsParamUtils.getPraramValue("disposableGoodsId", null); + String startDate = StrutsParamUtils.getPraramValue("startDate", null); + String endDate = StrutsParamUtils.getPraramValue("endData", null); + JSONObject jsonObject = disposableGoodsStorageRecordManager.getStorageRecord( + disposableGoodsId,startDate,endDate); + + StrutsResponseUtils.output(jsonObject); + } + + /** + * 根据关键字搜索一次性物品. + * @param spell 搜索关键字 + * return 返回给前台的字符串格式如下: + * { + * totalCount:器械包总数 + * data:[{ + * id:一次性物品的id, + * name:一次性物品名称+[规格] + * },{}......] + * } + * + */ + public void searchDisposableGoods(){ + String spell =StrutsParamUtils.getPraramValue("spell", ""); + List disposableGoodsList = diposableGoodsManager + .getDisposableGoodsByKeyword(spell); + if (CollectionUtils.isNotEmpty(disposableGoodsList)) { + JSONArray jSONArray = new JSONArray(); + for (DisposableGoods disposableGoods : disposableGoodsList) { + JSONObject jSONObject = new JSONObject(); + jSONObject.put("id", disposableGoods.getId()); + jSONObject.put("name", CssdUtils.getDiposableGoodsName(disposableGoods)); + jSONArray.add(jSONObject); + } + JSONObject jSONObject = new JSONObject(); + jSONObject.put("totalCount", jSONArray.size()); + jSONObject.put("data", jSONArray); + StrutsResponseUtils.output(jSONObject); + } + } + + /** + * 根据物资编码获得hrp一次性物品对应的物品基础信息 + * @return + */ + public void getHrpDefinition() { + String InventorySerialNumber = StrutsParamUtils.getPraramValue("inventorySerialNumber", null); + JSONObject json = JSONUtil.buildJsonObject(true); + Inventory inventory = null; + if (StringUtils.isNotEmpty(InventorySerialNumber)) { + try { + inventory = diposableGoodsManager.getHrpDisposableGoodsByInventorySerialNumber(InventorySerialNumber); + } catch (Exception e) { + json = JSONUtil.buildJsonObject(false); + e.printStackTrace(); + } + } + + json.put("data", inventory); + StrutsResponseUtils.output(json); + } + + /** + * 根据警告类型和一次性物品id获得批次库存信息 + */ + public void loadExpiredGodownEntryItemByid() { + String expdateType = StrutsParamUtils.getPraramValue("type","");//警告类型 + String disposableGoodsID = StrutsParamUtils.getPraramValue("id", ""); + if (StringUtils.isNotBlank(disposableGoodsID) && disposableGoodsID.equals("0") == false) {// 初始化加载的数据 + try { + List DisposableGoodsBatchStocks = diposableGoodsManager.getExpdateDisposableGoodsBatchStocks(Long.valueOf(disposableGoodsID), expdateType); + String jsonString = JSONUtil.toJSONString(DisposableGoodsBatchStocks, true); + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + StrutsParamUtils.getResponse().getWriter().println(jsonString); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + /** + * 根据警告类型和一次性物品id获得已过期的一次性物品信息 + */ + public String loadExpiredDiposableGoods() { + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + String id = StrutsParamUtils.getPraramValue("id", "");//一次性物品id + String expdateType = StrutsParamUtils.getPraramValue("type", "");//警告类型 + DisposableGoods diposableGoods = null; + if (DatabaseUtil.isPoIdValid(id)) { + diposableGoods = diposableGoodsManager.get(id); + } + if(diposableGoods == null){ + diposableGoods = new DisposableGoods(); + } + List DisposableGoodsBatchStocks = diposableGoodsManager.getExpdateDisposableGoodsBatchStocks(Long.valueOf(id), expdateType); + int expDateAmount = 0; + for (DisposableGoodsBatchStock disposableGoodsBatchStock : DisposableGoodsBatchStocks) { + expDateAmount += disposableGoodsBatchStock.getStorage(); + } + Map data = new HashMap(); + data.put("id", diposableGoods.getId()); + data.put("name", diposableGoods.getName()); + data.put("specification", diposableGoods.getSpecification()); + data.put("type", diposableGoods.getType()); + data.put("isPartOfTousseMaterial", diposableGoods.getIsPartOfTousseMaterial()); + data.put("isApplicationMaterial", diposableGoods.getIsApplicationMaterial()); + data.put("minStorage", diposableGoods.getMinStorage()); + data.put("maxStorage", diposableGoods.getMaxStorage()); + data.put("spelling", diposableGoods.getSpelling()); + data.put("wbCode", diposableGoods.getWbCode()); + data.put("referencePrice", diposableGoods.getReferencePrice()); + data.put("externalCode", diposableGoods.getExternalCode()); + data.put("minApplyAmount", diposableGoods.getMinApplyAmount()); + data.put("unit", diposableGoods.getUnit()); + data.put("expDateAmount", expDateAmount);//各过期批次库存之和 + + Map map = new HashMap(); + map.put("success", true); + map.put("data", data); + //map.put("data", diposableGoods); + try { + String jsonStr = JSONUtil.toJSONString(map, true); + StrutsParamUtils.getResponse().getWriter().println(jsonStr); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + + + + + + + /** + * 比较一次性物品包定义的修改,用于记录日志 + * @param origineDG 修改前的包定义 + * @param disposableGoods 修改后的包定义 + * @return + */ + public String comparedisposableGoodsDefinition(DisposableGoods origineDG , DisposableGoods disposableGoods){ + StringBuffer modifyContent = new StringBuffer(""); + if(!StringUtils.equals(origineDG.getName(), disposableGoods.getName())){ + modifyContent.append("name属性修改前=").append(origineDG.getName()).append(",修改后=").append(disposableGoods.getName()).append(";"); + } + if(!StringUtils.equals(origineDG.getInventorySerialNumber(), disposableGoods.getInventorySerialNumber())){ + modifyContent.append("InventorySerialNumber属性修改前=").append(origineDG.getInventorySerialNumber()).append(",修改后=").append(disposableGoods.getInventorySerialNumber()).append(";"); + } + if(!StringUtils.equals(origineDG.getCertification(), disposableGoods.getCertification())){ + modifyContent.append("Certification属性修改前=").append(origineDG.getCertification()).append(",修改后=").append(disposableGoods.getCertification()).append(";"); + } + if(!StringUtils.equals(origineDG.getExternalCode(), disposableGoods.getExternalCode())){ + modifyContent.append("ExternalCode属性修改前=").append(origineDG.getExternalCode()).append(",修改后=").append(disposableGoods.getExternalCode()).append(";"); + } + if(!StringUtils.equals(origineDG.getGrade(), disposableGoods.getGrade())){ + modifyContent.append("Grade属性修改前=").append(origineDG.getGrade()).append(",修改后=").append(disposableGoods.getGrade()).append(";"); + } + if(!StringUtils.equals(origineDG.getGuid(), disposableGoods.getGuid())){ + modifyContent.append("Guid属性修改前=").append(origineDG.getGuid()).append(",修改后=").append(disposableGoods.getGuid()).append(";"); + } + if(!StringUtils.equals(origineDG.getIsApplicationMaterial(), disposableGoods.getIsApplicationMaterial())){ + modifyContent.append("IsApplicationMaterial属性修改前=").append(origineDG.getIsApplicationMaterial()).append(",修改后=").append(disposableGoods.getIsApplicationMaterial()).append(";"); + } + if(!StringUtils.equals(origineDG.getIsPartOfTousseMaterial(), disposableGoods.getIsPartOfTousseMaterial())){ + modifyContent.append("IsPartOfTousseMaterial属性修改前=").append(origineDG.getIsPartOfTousseMaterial()).append(",修改后=").append(disposableGoods.getIsPartOfTousseMaterial()).append(";"); + } + if(!StringUtils.equals(origineDG.getIsSupplyRoomGoods(), disposableGoods.getIsSupplyRoomGoods())){ + modifyContent.append("IsSupplyRoomGoods属性修改前=").append(origineDG.getIsSupplyRoomGoods()).append(",修改后=").append(disposableGoods.getIsSupplyRoomGoods()).append(";"); + } + if((origineDG.getMaxStorage() == null ? 0 : origineDG.getMaxStorage().intValue()) != (disposableGoods.getMaxStorage() == null ? 0 : disposableGoods.getMaxStorage().intValue())){ + modifyContent.append("MaxStorage属性修改前=").append(origineDG.getMaxStorage()).append(",修改后=").append(disposableGoods.getMaxStorage()).append(";"); + } + if((origineDG.getMinApplyAmount() == null ? 0 : origineDG.getMinApplyAmount().intValue()) != (disposableGoods.getMinApplyAmount() == null ? 0 : disposableGoods.getMinApplyAmount().intValue())){ + modifyContent.append("MinApplyAmount属性修改前=").append(origineDG.getMinApplyAmount()).append(",修改后=").append(disposableGoods.getMinApplyAmount()).append(";"); + } + if((origineDG.getMinStorage() == null ? 0 : origineDG.getMinStorage().intValue()) != (disposableGoods.getMinStorage() == null ? 0 : disposableGoods.getMinStorage().intValue())){ + modifyContent.append("MinStorage属性修改前=").append(origineDG.getMinStorage()).append(",修改后=").append(disposableGoods.getMinStorage()).append(";"); + } + if(!StringUtils.equals(origineDG.getPackageSpec(), disposableGoods.getPackageSpec())){ + modifyContent.append("PackageSpec属性修改前=").append(origineDG.getPackageSpec()).append(",修改后=").append(disposableGoods.getPackageSpec()).append(";"); + } + if(!StringUtils.equals(origineDG.getPrintInLabel(), disposableGoods.getPrintInLabel())){ + modifyContent.append("PrintInLabel属性修改前=").append(origineDG.getPrintInLabel()).append(",修改后=").append(disposableGoods.getPrintInLabel()).append(";"); + } + if(!StringUtils.equals(origineDG.getSpecification(), disposableGoods.getSpecification())){ + modifyContent.append("Specification属性修改前=").append(origineDG.getSpecification()).append(",修改后=").append(disposableGoods.getSpecification()).append(";"); + } + if(!StringUtils.equals(origineDG.getApplicationSpecification(), disposableGoods.getApplicationSpecification())){ + modifyContent.append("ApplicationSpecification属性修改前=").append(origineDG.getApplicationSpecification()).append(",修改后=").append(disposableGoods.getApplicationSpecification()).append(";"); + } + if(!StringUtils.equals(origineDG.getType(), disposableGoods.getType())){ + modifyContent.append("Type属性修改前=").append(origineDG.getType()).append(",修改后=").append(disposableGoods.getType()).append(";"); + } + if(!StringUtils.equals(origineDG.getUnit(), disposableGoods.getUnit())){ + modifyContent.append("Unit属性修改前=").append(origineDG.getUnit()).append(",修改后=").append(disposableGoods.getUnit()).append(";"); + } + if(!StringUtils.equals(origineDG.getMiddlePackageUnit(), disposableGoods.getMiddlePackageUnit())){ + modifyContent.append("MiddlePackageUnit属性修改前=").append(origineDG.getMiddlePackageUnit()).append(",修改后=").append(disposableGoods.getMiddlePackageUnit()).append(";"); + } + if(!StringUtils.equals(origineDG.getNotInventoryDeptCode(), disposableGoods.getNotInventoryDeptCode())){ + modifyContent.append("NotInventoryDeptCode属性修改前=").append(origineDG.getNotInventoryDeptCode()).append(",修改后=").append(disposableGoods.getNotInventoryDeptCode()).append(";"); + } + if((origineDG.getReferencePrice() == null ? 0 : origineDG.getReferencePrice().doubleValue()) != (disposableGoods.getReferencePrice() == null ? 0 : disposableGoods.getReferencePrice().doubleValue())){ + modifyContent.append("ReferencePrice属性修改前=").append(origineDG.getReferencePrice()).append(",修改后=").append(disposableGoods.getReferencePrice()).append(";"); + } + if((origineDG.getUnitConvertCoefficient() == null ? 0 : origineDG.getUnitConvertCoefficient().doubleValue()) != (disposableGoods.getUnitConvertCoefficient() == null ? 0 : disposableGoods.getUnitConvertCoefficient().doubleValue())){ + modifyContent.append("UnitConvertCoefficient属性修改前=").append(origineDG.getUnitConvertCoefficient()).append(",修改后=").append(disposableGoods.getUnitConvertCoefficient()).append(";"); + } + if((origineDG.getMaxApplyAmount() == null ? 0 : origineDG.getMaxApplyAmount().doubleValue()) != (disposableGoods.getMaxApplyAmount() == null ? 0 : disposableGoods.getMaxApplyAmount().doubleValue())){ + modifyContent.append("MaxApplyAmount属性修改前=").append(origineDG.getMaxApplyAmount()).append(",修改后=").append(disposableGoods.getMaxApplyAmount()).append(";"); + } + if((origineDG.getTransferScale() == null ? 0 : origineDG.getTransferScale().doubleValue()) != (disposableGoods.getTransferScale() == null ? 0 : disposableGoods.getTransferScale().doubleValue())){ + modifyContent.append("TransferScale属性修改前=").append(origineDG.getTransferScale()).append(",修改后=").append(disposableGoods.getTransferScale()).append(";"); + } + if((origineDG.getSequence() == null ? 0 : origineDG.getSequence().intValue()) != (disposableGoods.getSequence() == null ? 0 : disposableGoods.getSequence().intValue())){ + modifyContent.append("Sequence属性修改前=").append(origineDG.getSequence()).append(",修改后=").append(disposableGoods.getSequence()).append(";"); + } + + return modifyContent.toString(); + } + +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/action/ExpensiveGoodsGodownEntryAction.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/action/ExpensiveGoodsGodownEntryAction.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/action/ExpensiveGoodsGodownEntryAction.java (revision 20740) @@ -0,0 +1,799 @@ +package com.forgon.disinfectsystem.expensiveGoods.action; + +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Date; +import java.util.HashMap; +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 net.sf.json.JsonConfig; + +import org.apache.commons.lang.StringUtils; +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.component.grid.GridManager; +import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.model.BarcodeDevice; +import com.forgon.disinfectsystem.barcode.service.BarcodeManager; +import com.forgon.disinfectsystem.common.CssdUtils; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatch; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; +import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntry; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryItem; +import com.forgon.disinfectsystem.entity.basedatamanager.barcodeinformation.BarcodeInformation; +import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; +import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsManager; +import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsGodownEntryManager; +import com.forgon.disinfectsystem.expensiveGoods.service.IdentificationOfDiposableGoodsManager; +import com.forgon.tools.MapTools; +import com.forgon.tools.StrutsParamUtils; +import com.forgon.tools.StrutsResponseUtils; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.json.JSONUtil; +import com.forgon.tools.json.JsonPropertyFilter; +import com.opensymphony.xwork2.ModelDriven; + +@ParentPackage(value = "default") +@Namespace(value = "/disinfectSystem") +@Action(value = "godownEntryAction") +public class ExpensiveGoodsGodownEntryAction implements ModelDriven { + + private GridManager gridManager; + + private GodownEntry godownEntry = new GodownEntry(); + + private ExpensiveGoodsGodownEntryManager godownEntryManager; + + private ExpensiveGoodsManager diposableGoodsManager; + + private DateQueryAdapter dateQueryAdapter; + + private IdentificationOfDiposableGoodsManager identificationOfDiposableGoodsManager; + + private BarcodeManager barcodeManager; + + public IdentificationOfDiposableGoodsManager getIdentificationOfDiposableGoodsManager() { + return identificationOfDiposableGoodsManager; + } + + public void setIdentificationOfDiposableGoodsManager( + IdentificationOfDiposableGoodsManager identificationOfDiposableGoodsManager) { + this.identificationOfDiposableGoodsManager = identificationOfDiposableGoodsManager; + } + + public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { + this.dateQueryAdapter = dateQueryAdapter; + } + + + public void setGodownEntryManager(ExpensiveGoodsGodownEntryManager godownEntryManager) { + this.godownEntryManager = godownEntryManager; + } + + public void setDiposableGoodsManager(ExpensiveGoodsManager diposableGoodsManager) { + this.diposableGoodsManager = diposableGoodsManager; + } + + public void setGridManager(GridManager gridManager) { + this.gridManager = gridManager; + } + + public void setBarcodeManager(BarcodeManager barcodeManager) { + this.barcodeManager = barcodeManager; + } + + @SuppressWarnings("unchecked") + public String viewGodownEntryList() { + HttpServletRequest request = StrutsParamUtils.getRequest(); + Map map = MapTools.convertRequestParamMap(request + .getParameterMap()); + + String sql = "where 1=1"; + + String json = gridManager.renderGrid2(map, + GodownEntry.class.getSimpleName(), sql, null); + + HttpServletResponse response = StrutsParamUtils.getResponse(); + response.setCharacterEncoding("UTF-8"); + PrintWriter out; + try { + out = response.getWriter(); + out.print(json); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } + + /** + * 保存退库单 页面上的item只会记批次和价格,但是后台会记对应的标识号对象。这样方便以后的价格同步与删除出库单等操作 + */ + public void saveGodownOutEntry() { + + HttpServletResponse response = StrutsParamUtils.getResponse(); + PrintWriter out = null; + String result = "保存成功"; + response.setCharacterEncoding("UTF-8"); + Map returnMsg = new HashMap(); + returnMsg.put("success", false); + returnMsg.put("errMsg", "保存失败"); + try { + out = response.getWriter(); + } catch (IOException e) { + e.printStackTrace(); + } + boolean saveResult = false; + try { + String id = StrutsParamUtils.getPraramValue("id", ""); + + GodownEntry original = new GodownEntry(); + GodownEntry entry = godownEntry; + + if (DatabaseUtil.isPoIdValid(id)) { + // 更新入库单,里面的item有可能会更新,新建,删除标识号。 + buildGodownEntryParamsForUpdate(original, entry); + + godownEntryManager.updateGodownOutEntry_TRANS_REQUIRED(original, entry, returnMsg); + } else { + // 保存入库单,里面的item一定都是新建标识号对象,并且需要更新批次属性。 + entry = godownEntry; + buildGodownEntryParamsForSave(entry); + entry.setTime(new Date()); + entry.setSubType(GodownEntry.SUBTYPE_MANUAL_OUT); + entry.setOrgUnitCode(AcegiHelper.getCurrentOrgUnitCode()); + entry.setOrgUnitName(AcegiHelper.getCurrentOrgUnitName()); + //是否需要回写 + boolean needWriteBack = true; + godownEntryManager.saveGodownOutEntry_TRANS_REQUIRED(entry, returnMsg , needWriteBack); + } + saveResult = true; + } catch (Exception e) { + e.printStackTrace(); + saveResult = false; + result = e.getMessage(); + } + printMsgToClient(saveResult, out, result.toString(), null); + } + + /** + * 扫描高值耗材条码加载一次性物品定义及库存 + */ + public void loadScanedGoods(){ + String barcode = StrutsParamUtils.getPraramValue("barcode", null); + String warehouseID = StrutsParamUtils.getPraramValue("warehouseID", null); + 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 && bd instanceof ExpensiveDisposablegoods) { + // 高值耗材 + ExpensiveDisposablegoods expensiveDisposablegoods = (ExpensiveDisposablegoods) bd; + + //判断该高值耗材关联的一次性物品定义的物品类型是否为高值耗材(防止入库时定义为高值耗材,后来修改定义为非高值耗材) + if(expensiveDisposablegoods.getDisposableGoodsID() == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材未找到一次性物品定义", barcode)); + return; + } + DisposableGoods disposableGoods = + diposableGoodsManager.get(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; + } + + //判断高值耗材状态是否为已入库 + if(!ExpensiveDisposablegoods.STATUS_IN_WAREHOUSE.equals(expensiveDisposablegoods.getStatus())){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材状态为%s", barcode,expensiveDisposablegoods.getStatus())); + return; + } + + //判断高值耗材是否属于所选仓库 + if(!StringUtils.equals(warehouseID, String.valueOf(expensiveDisposablegoods.getWarehouseID()))){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材不属于所选仓库", barcode)); + return; + } + + if(!ExpensiveDisposablegoods.STATUS_IN_WAREHOUSE.equals(expensiveDisposablegoods.getStatus())){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材的状态为%s,不能进行调拨", barcode,expensiveDisposablegoods.getStatus())); + return; + } + + if(!StringUtils.equals(warehouseID, String.valueOf(expensiveDisposablegoods.getWarehouseID()))){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材不属于所选仓库", 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; + } + + DisposableGoodsBatchStock disposableGoodsBatchStock = expensiveDisposablegoods.getDisposableGoodsBatchStock(); + if(disposableGoodsBatchStock == null){ + obj.put("success", false); + obj.put("error", String.format("条码为[%s]的高值耗材批次库存已被删除", barcode)); + return; + } + + obj.put("name", CssdUtils.getDiposableGoodsName(disposableGoods)); + obj.put("disposableGoodsID", expensiveDisposablegoods.getDisposableGoodsID()); + obj.put("disposableGoodsStockID", expensiveDisposablegoods.getDisposableGoodsStockID()); + obj.put("disposableGoodsBatchID", disposableGoodsBatchId); + obj.put("disposableGoodsBatchStockID", disposableGoodsBatchStock.getId()); + obj.put("batchNumber", disposableGoodsBatchStock.getBatchNumber()); + obj.put("cost", disposableGoodsBatchStock.getCost()); + obj.put("externalCode", disposableGoods.getExternalCode()); + obj.put("minApplyAmount", disposableGoods.getMinApplyAmount()); + obj.put("unit", disposableGoods.getUnit()); + obj.put("tousseType", TousseItem.TYPE_DIPOSABLE_GOODS); + obj.put("goodsType", DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS); + obj.put("packageSpec", disposableGoods.getPackageSpec()); + obj.put("spelling", disposableGoods.getSpelling()); + + obj.put("supplierName", disposableGoodsBatchStock.getSupplierName()); + obj.put("expDate", disposableGoodsBatchStock.getExpDateStr()); + obj.put("sterileBatchNumber", disposableGoodsBatchStock.getSterileBatchNumber()); + obj.put("manufacturer", disposableGoodsBatchStock.getManufacturer()); + obj.put("producingArea", disposableGoodsBatchStock.getProducingArea()); + }else{ + obj.put("success", false); + obj.put("error", "只能扫描高值耗材的条码。"); + } + }else{ + obj.put("success", false); + obj.put("error", "条码不能为空"); + } + } catch (IOException e) { + e.printStackTrace(); + }finally{ + out.print(obj.toString()); + out.close(); + } + } + + /** + * 保存调拨单 + */ + public void saveAppropriateEntry(){ + HttpServletResponse response = StrutsParamUtils.getResponse(); + PrintWriter out = null; + String result = "保存成功"; + response.setCharacterEncoding("UTF-8"); + Map returnMsg = new HashMap(); + returnMsg.put("success", false); + returnMsg.put("errMsg", "保存失败"); + try { + out = response.getWriter(); + } catch (IOException e) { + e.printStackTrace(); + } + boolean saveResult = false; + try { + String id = StrutsParamUtils.getPraramValue("id", ""); + + //GodownEntry original = new GodownEntry(); + GodownEntry entry = godownEntry; + + if (StringUtils.isNotBlank(id)) { + // 调拨单没有更新操作 + // 更新入库单,里面的item有可能会更新,新建,删除标识号。 + //buildGodownEntryParamsForUpdate(original, entry); + + //godownEntryManager.updateGodownOutEntry_TRANS_REQUIRED(original, entry, returnMsg); + } else { + // 保存入库单,里面的item一定都是新建标识号对象,并且需要更新批次属性。 + entry = godownEntry; + buildGodownEntryParamsForSave(entry); + entry.setTime(new Date()); + godownEntryManager.saveAppropriateEntry_TRANS_REQUIRED(entry, returnMsg); + } + saveResult = true; + } catch (Exception e) { + e.printStackTrace(); + saveResult = false; + result = e.getMessage(); + } + printMsgToClient(saveResult, out, result.toString(), null); + } + + /** + * @param out + * :输出流 + * @param result + * :显示的文本信息 + */ + private void printMsgToClient(boolean success, PrintWriter out, + String result, JSONArray jsonArray) { + JSONObject jsonObj = new JSONObject(); + jsonObj.put("success", success); + jsonObj.put("message", result); + if(jsonArray != null){ + jsonObj.put("items", jsonArray); + } + out.print(jsonObj.toString()); + out.close(); + } + + private void setGodownEntryPropertiesFromParams(GodownEntry entry,String formParams,String items){ + + // 表单参数 + if(StringUtils.isNotBlank(formParams)){ + JSONObject formParamsObj = JSONObject.fromObject(formParams); + godownEntryManager.updateGodownEntryInfo(entry, formParamsObj); + } + + // items列表 + setGodownEntryItemsFromParams(entry, items); + } + // 设置items参数 + private void setGodownEntryItemsFromParams(GodownEntry entry,String items){ + JSONArray itemsArray = JSONArray.fromObject(items); + int size = itemsArray.size(); + for (int i = 0; i < size; ++i) { + JSONObject obj = itemsArray.getJSONObject(i); + if (obj != null) { + godownEntryManager.addItemToGodownEntry(entry, obj); + } + } + } + + private void buildGodownEntryParamsForUpdate(GodownEntry original, + GodownEntry entry) { +// String formParams = StrutsParamUtils.getPraramValue("formParams", ""); + String originalFormParams = StrutsParamUtils.getPraramValue("originalFormParams", ""); + + String items = StrutsParamUtils.getPraramValue("items", ""); + String originalItems = StrutsParamUtils.getPraramValue("originalItems", ""); + + setGodownEntryPropertiesFromParams(original,originalFormParams,originalItems); + setGodownEntryPropertiesFromParams(entry,null,items); + } + + private void buildGodownEntryParamsForSave(GodownEntry entry) { + String items = StrutsParamUtils.getPraramValue("items", ""); + String formParams = StrutsParamUtils.getPraramValue("formParams", ""); + + setGodownEntryPropertiesFromParams(entry,formParams,items); + //setGodownEntryItemsFromParams(entry, items); + } + + /* 增加一次性物品的并发控制,可以多个人同时入库同一个物品 + * 增加入库单本身的并发修改,可以合并多人修改,互不影响。 + * */ + public String saveGodownEntry() { + HttpServletResponse response = StrutsParamUtils.getResponse(); + PrintWriter out = null; + String result = "保存成功"; + response.setCharacterEncoding("UTF-8"); + Map returnMsg = new HashMap(); + returnMsg.put("success", false); + returnMsg.put("errMsg", "保存失败"); + try { + out = response.getWriter(); + } catch (IOException e) { + e.printStackTrace(); + } + boolean saveResult = false; + try { + String id = StrutsParamUtils.getPraramValue("id", ""); + String print = StrutsParamUtils.getPraramValue("print", ""); + + GodownEntry entry = godownEntry; + + if (StringUtils.isNotBlank(id)) { + // 常规功能不能修改入库单了 + throw new RuntimeException("请在干预模块修改入库单!"); + } else { + // 保存入库单,里面的item一定都是新建标识号对象,并且需要更新批次属性。 + //entry = godownEntry; + buildGodownEntryParamsForSave(entry); + entry.setTime(new Date()); + entry.setSubType(GodownEntry.SUBTYPE_MANUAL_IN); + entry.setOrgUnitCode(AcegiHelper.getCurrentOrgUnitCode()); + entry.setOrgUnitName(AcegiHelper.getCurrentOrgUnitName()); + returnMsg.put(print, print); + godownEntryManager.saveGodownEntry_TRANS_REQUIRED(entry, returnMsg); + } + saveResult = true; + } catch (Exception e) { + e.printStackTrace(); + saveResult = false; + result = e.getMessage(); + } + JSONArray itemsDetails = (JSONArray)returnMsg.get("itemsDetails"); + + printMsgToClient(saveResult, out, result.toString(), itemsDetails); + return null; + } + // 干预功能,修改入库单 + public String interfere_updateGodownEntry() { + HttpServletResponse response = StrutsParamUtils.getResponse(); + PrintWriter out = null; + String result = "更新成功"; + response.setCharacterEncoding("UTF-8"); + Map returnMsg = new HashMap(); + returnMsg.put("success", false); + returnMsg.put("errMsg", "更新失败"); + try { + out = response.getWriter(); + } catch (IOException e) { + e.printStackTrace(); + } + boolean saveResult = false; + try { + String id = StrutsParamUtils.getPraramValue("id", ""); + + GodownEntry entry = godownEntry; + + if (StringUtils.isNotBlank(id)) { + GodownEntry original = new GodownEntry(); + // 更新入库单,里面的item有可能会更新,新建,删除标识号。 + buildGodownEntryParamsForUpdate(original, entry); + + godownEntryManager.updateGodownEntry_TRANS_REQUIRED(original, + entry, returnMsg); + } else { + throw new RuntimeException("请在一次性物品模块新建入库单!"); + } + saveResult = true; + } catch (Exception e) { + e.printStackTrace(); + saveResult = false; + result = e.getMessage(); + } + JSONArray itemsDetails = (JSONArray) returnMsg.get("itemsDetails"); + + printMsgToClient(saveResult, out, result.toString(), itemsDetails); + return null; + } + public String loadGodownEntryItemByid() { + String id = StrutsParamUtils.getPraramValue("id", ""); + if (StringUtils.isNotBlank(id) && id.equals("0") == false) {// 初始化加载的数据 + godownEntry = godownEntryManager.getGodownEntryById(id); + List items = godownEntry.getItemsList(); + Map map = new HashMap(); + map.put("success", true); + map.put("data", items); + JSONObject jsonObject = JSONObject.fromObject(map); + try { + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + StrutsParamUtils.getResponse().getWriter() + .println("[" + jsonObject.toString() + "]"); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + + public void printSomeGodownEntryItem() { + String items = StrutsParamUtils.getPraramValue("items", ""); + JSONObject jsonObj = new JSONObject(); + + godownEntryManager.printSomeGodownEntryItem(items, jsonObj); + StrutsResponseUtils.output(jsonObj); + } + + /** + * 仅修改入库明细的物品及批次相关的基础数据,不涉及单价、金额及修改 + */ + public void modifyGodownEntryItemBaseData(){ + String items = StrutsParamUtils.getPraramValue("items", ""); + JSONObject jsonObj = new JSONObject(); + if(StringUtils.isNotBlank(items)){ + godownEntryManager.modifyGodownEntryItemBaseData(items , jsonObj); + } + StrutsResponseUtils.output(jsonObj); + } + + public String loadGodownEntry() { + String id = StrutsParamUtils.getPraramValue("id", ""); + if (StringUtils.isNotBlank(id) && StringUtils.isNumeric(id)) { + godownEntry = godownEntryManager.getGodownEntryById(id); + } + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + Map map = new HashMap(); + map.put("success", true); + map.put("data", godownEntry); + JsonConfig config = new JsonConfig(); + config.setJsonPropertyFilter(new JsonPropertyFilter(new String[] { + "godownEntry", "goodsBatchs" })); + JSONObject jsonObject = JSONObject.fromObject(map, config); + String jsonStr = jsonObject.toString(); + try { + StrutsParamUtils.getResponse().getWriter().println(jsonStr); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + public void deleteGodownEntry() { + String idStr = StrutsParamUtils.getPraramValue("ids", ""); + String message = ""; + try { + if (StringUtils.isNotBlank(idStr)) { + Map result = new HashMap(); + int deletedCount = 0; + int totalCount = 0; + result.put("deletedCount", deletedCount); + result.put("totalCount", totalCount); + result.put("failureCount", totalCount - deletedCount); + try { + String[] idsArray = idStr.split(Constants.IDS_SEPARATOR); + totalCount = idsArray.length; + for (String id : idsArray) { + // 每一个入库单作为一个单独的事务 + try { + godownEntryManager.deleteGodownEntryById_TRANS_NEW(id); + deletedCount++; + } catch (Exception e) { + e.printStackTrace(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + int failureCount = totalCount-deletedCount; + message = "成功删除"+deletedCount+"条入库单信息,失败"+failureCount+"条"; + } + } catch (Exception e) { + message = "删除失败!"; + e.printStackTrace(); + } + HttpServletResponse httpServletResponse = StrutsParamUtils + .getResponse(); + httpServletResponse.setCharacterEncoding("UTF-8"); + try { + httpServletResponse.getWriter().print( + "{success:true,message:'" + message + "'}"); + } catch (IOException e) { + e.printStackTrace(); + } + } + + // 删除退库单 + public void interfere_deleteGodownEntryOut() { + String idStr = StrutsParamUtils.getPraramValue("ids", ""); + String message = ""; + try { +// if (StringUtils.isNotBlank(idStr)) { +// message = godownEntryManager +// .deleteGodownEntryOutAndReturnMessage(idStr); +// } + if (StringUtils.isNotBlank(idStr)) { + Map result = new HashMap(); + int deletedCount = 0; + int totalCount = 0; + result.put("deletedCount", deletedCount); + result.put("totalCount", totalCount); + result.put("failureCount", totalCount - deletedCount); + try { + String[] idsArray = idStr.split(Constants.IDS_SEPARATOR); + totalCount = idsArray.length; + for (String id : idsArray) { + // 每一个入库单作为一个单独的事务 + try { + godownEntryManager.deleteGodownOutEntryById_TRANS_NEW(id); + deletedCount++; + } catch (Exception e) { + e.printStackTrace(); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + int failureCount = totalCount-deletedCount; + message = "成功删除"+deletedCount+"条入库单信息,失败"+failureCount+"条"; + } + } catch (Exception e) { + message = "删除失败!"; + e.printStackTrace(); + } + HttpServletResponse httpServletResponse = StrutsParamUtils + .getResponse(); + httpServletResponse.setCharacterEncoding("UTF-8"); + String input = "{success:true,message:'" + message + "'}"; + try { + httpServletResponse.getWriter().print(input); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @SuppressWarnings("unchecked") + public String viewGodownEntryItemList() { + HttpServletRequest request = StrutsParamUtils.getRequest(); + Map map = MapTools.convertRequestParamMap(request + .getParameterMap()); + map.put("sort", "godownEntry.time;asc"); + String batchNumber = map.get("batchNumber"), name = map.get("name") + .trim(), startDate = map.get("startDate"), endDate = map + .get("endDate"); + String specification = null, diposableGoodsName = name; + if (StringUtils.isNotBlank(diposableGoodsName) + && diposableGoodsName.lastIndexOf("[") != -1) { + specification = diposableGoodsName.substring( + diposableGoodsName.lastIndexOf("[") + 1, + diposableGoodsName.length() - 1); + diposableGoodsName = diposableGoodsName.substring(0, + diposableGoodsName.lastIndexOf("[")).trim(); + } + if (StringUtils.isNotBlank(startDate)) { + startDate = dateQueryAdapter.dateAdapter(startDate.substring(0, 10) + + " 00:00:00"); + } + if (StringUtils.isNotBlank(endDate)) { + endDate = dateQueryAdapter.dateAdapter(endDate.substring(0, 10) + + " 23:59:59"); + } + String sql = "where po.batchNumber = '" + batchNumber + + "' and po.diposableGoods.name = '" + diposableGoodsName + "'"; + if (StringUtils.isNotBlank(specification)) { + sql += " and po.diposableGoods.specification = '" + specification + + "'"; + } else { + sql += " and po.diposableGoods.specification is null"; + } + + sql += " and po.godownEntry.time between " + startDate + " and " + + endDate; + String json = gridManager.renderGrid2(map, + GodownEntryItem.class.getSimpleName(), sql, + new String[] { "itemsList" }); + + HttpServletResponse response = StrutsParamUtils.getResponse(); + response.setCharacterEncoding("UTF-8"); + PrintWriter out; + try { + out = response.getWriter(); + out.print(json); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } + + // 合并打印 + public void mergeLoadToussePrintData() { + try { + String idsStr = StrutsParamUtils.getPraramValue("ids", ""); + String[] idStrs = StringUtils.split(idsStr, ','); + + JSONObject jsonObject = new JSONObject(); + godownEntryManager.loadGodownEntryPrintData(idStrs, jsonObject); + jsonObject.put("success", true); + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + StrutsParamUtils.getResponse().getWriter() + .println(jsonObject.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void loadGodownEntryListPrintData(){ + try{ + String idsStr = StrutsParamUtils.getPraramValue("ids", ""); + String[] idStrs = StringUtils.split(idsStr, ','); + + JSONObject jsonObject = new JSONObject(); + godownEntryManager.loadGodownEntryPrintData(idStrs, jsonObject); + jsonObject.put("success", true); + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + StrutsParamUtils.getResponse().getWriter() + .println(jsonObject.toString()); + }catch(Exception e){ + e.printStackTrace(); + } + } + public String loadBarcodeDeviceInfo() { + String barcode = StrutsParamUtils.getPraramValue("barcode", ""); + Map returnMsg = new HashMap(); + returnMsg.put("success", false); + returnMsg.put("errMsg", "加载失败"); + + try { + if (StringUtils.isBlank(barcode)) { + throw new RuntimeException("条码不能为空!"); + } + BarcodeDevice barcodeDevice = barcodeManager + .getBarcodeByBarcode(barcode); + if (barcodeDevice == null){ + throw new RuntimeException("查无此物品"); + } + if(barcodeDevice instanceof BarcodeInformation){// 高值耗材处理 + returnMsg.put("barcodeType", BarcodeDevice.BARCODE_TYPE_BARCODEINFORMATION); + returnMsg.put("barcodeInformation", barcodeDevice); + }else{ + throw new RuntimeException("不支持的条码类型!"); + } + + returnMsg.put("success", true); + } catch (Exception e) { + e.printStackTrace(); + returnMsg.put("errMsg", e.getMessage()); + } + try { + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + String jsonStr = JSONUtil.toJSONString(returnMsg,true); + StrutsParamUtils.getResponse().getWriter().print(jsonStr); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + @Override + public GodownEntry getModel() { + return godownEntry; + } + + /** + * 根据ID获取GodownEntryItem表数据 + */ + public String getGodownEntryItemById() { + String id = StrutsParamUtils.getPraramValue("id", ""); + if (StringUtils.isNotBlank(id) && StringUtils.isNumeric(id)) { + godownEntry = godownEntryManager.getGodownEntryById(id); + } + List itemList = godownEntry.getItemsList(); + if(itemList!=null){ + StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); + Map map = new HashMap(); + map.put("data", itemList); + JsonConfig config = new JsonConfig(); + config.setJsonPropertyFilter(new JsonPropertyFilter(new String[] { + "godownEntry", "goodsBatchs" })); + JSONObject jsonObject = JSONObject.fromObject(map, config); + String jsonStr = jsonObject.toString(); + try { + StrutsParamUtils.getResponse().getWriter().println(jsonStr); + } catch (IOException e) { + e.printStackTrace(); + } + } + return null; + } + +} + Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/util/ExpensiveGoodsGodownEntryUtil.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/util/ExpensiveGoodsGodownEntryUtil.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/util/ExpensiveGoodsGodownEntryUtil.java (revision 20740) @@ -0,0 +1,47 @@ +package com.forgon.disinfectsystem.expensiveGoods.util; + +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntry; +import com.forgon.tools.string.StringTools; + +/** + * GodownEntry实体类的工具方法 + * @author kzh + * + */ +public final class ExpensiveGoodsGodownEntryUtil { + /** + * 生成筛选入/退库单类型的where条件子句,并且入库单和退库单会过滤掉调拨单产生的入库单和退库单 + * @param poName po名称 + * @param type 单类型,可选值为{@link com.forgon.disinfectsystem.entity.assestmanagement.GodownEntry.TYPE_IN}、{@link com.forgon.disinfectsystem.entity.assestmanagement.GodownEntry.TYPE_OUT} + *
如果为空,返回值为 (1=1) + * @return + */ + public static String getGodownEntryTypeSqlWhere(String poName,String type){ + if("全部".equals(type)){ + return getGodownEntryInAndOutTypeSqlWhere(poName); + } + String sql = " ( 1=1 ) "; + if(!StringTools.isBlank(type)){ + sql += " and " + poName + ".type='" + type + "'"; + if(GodownEntry.TYPE_IN.equals(type) || GodownEntry.TYPE_OUT.equals(type)){ + sql += " and ( " + poName + ".sourceId is null"; + sql += " or " + poName + ".sourceId=0 )"; + } + } + return sql; + } + /** + * 生成入/退库单类型的where条件子句,查询入库单或者退库单,并且过滤掉调拨单产生的入库单和退库单 + * @param poName + * @return + */ + public static String getGodownEntryInAndOutTypeSqlWhere(String poName){ + String sql = " ( 1=0 ) "; + if(StringTools.isNotBlank(poName)){ + sql = " (" + poName + ".type='" + GodownEntry.TYPE_IN + "' or " + poName + ".type='" + GodownEntry.TYPE_OUT + "')"; + sql += " and ( " + poName + ".sourceId is null"; + sql += " or " + poName + ".sourceId=0 )"; + } + return sql; + } +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsGodownEntryManagerImpl.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsGodownEntryManagerImpl.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsGodownEntryManagerImpl.java (revision 20740) @@ -0,0 +1,2811 @@ +package com.forgon.disinfectsystem.expensiveGoods.service; + +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +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.ArrayUtils; +import org.apache.log4j.Logger; + +import com.forgon.Constants; +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.model.BarcodeDevice; +import com.forgon.directory.model.OrgUnit; +import com.forgon.directory.service.OrgUnitManager; +import com.forgon.disinfectsystem.barcode.service.BarcodeManager; +import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; +import com.forgon.disinfectsystem.common.CssdUtils; +import com.forgon.disinfectsystem.disposablegoods.service.DisposableGoodsServiceContext; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatch; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsIdentification; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; +import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntry; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryDiposableGoodsItem; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryItem; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryItemWB; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryWB; +import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; +import com.forgon.disinfectsystem.entity.invoicemanager.DiposableGoodsItem; +import com.forgon.disinfectsystem.entity.receiverecord.ReceiveRecordDiposableGoodsItem; +import com.forgon.disinfectsystem.expensiveGoods.util.ExpensiveGoodsUtils; +import com.forgon.disinfectsystem.inventorymanagement.constant.gdsy.ConstantDefinition; +import com.forgon.disinfectsystem.inventorymanagement.dao.WriteBackInventoryDao; +import com.forgon.disinfectsystem.inventorymanagement.service.WriteBackInventoryHelper; +import com.forgon.disinfectsystem.vo.DisposableGoodsStorageAdjustVo; +import com.forgon.disinfectsystem.vo.GodownEntryItemPrintVO; +import com.forgon.log.model.Log; +import com.forgon.log.service.LogManager; +import com.forgon.serialnumber.model.SerialNum; +import com.forgon.serialnumber.service.SerialNumManager; +import com.forgon.tools.MathTools; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.json.JSONUtil; +import com.forgon.tools.util.ForgonDateUtils; +import com.forgon.tools.util.SqlUtils; + +public class ExpensiveGoodsGodownEntryManagerImpl implements ExpensiveGoodsGodownEntryManager { + + private Logger logger = Logger.getLogger(ExpensiveGoodsGodownEntryManagerImpl.class); + + private ObjectDao objectDao; + + private ExpensiveGoodsManager diposableGoodsManager; + + private DiposableGoodBatchStockManager diposableGoodBatchStockManager; + + private DisposableGoodsStockManager disposableGoodsStockManager; + + private WriteBackInventoryHelper writeBackInventoryHelper; + + private LogManager appLogManager; + + /** + * 回写dao + * 仅省医使用 + */ + private WriteBackInventoryDao writeBackInventoryDao; + + private SerialNumManager serialNumManager; + + private OrgUnitManager orgUnitManager; + + private ExpensiveGoodsGodownEntryItemManager godownEntryItemManager; + + private WareHouseManager wareHouseManager; + + private BarcodeManager barcodeManager; + + public void setWriteBackInventoryHelper( + WriteBackInventoryHelper writeBackInventoryHelper) { + this.writeBackInventoryHelper = writeBackInventoryHelper; + } + + public void setWriteBackInventoryDao(WriteBackInventoryDao writeBackInventoryDao) { + this.writeBackInventoryDao = writeBackInventoryDao; + } + + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + + public void setDiposableGoodsManager( + ExpensiveGoodsManager diposableGoodsManager) { + this.diposableGoodsManager = diposableGoodsManager; + } + + public void setDiposableGoodBatchStockManager( + DiposableGoodBatchStockManager diposableGoodBatchStockManager) { + this.diposableGoodBatchStockManager = diposableGoodBatchStockManager; + } + + public void setDisposableGoodsStockManager( + DisposableGoodsStockManager disposableGoodsStockManager) { + this.disposableGoodsStockManager = disposableGoodsStockManager; + } + + public void setSerialNumManager(SerialNumManager serialNumManager) { + this.serialNumManager = serialNumManager; + } + + public void setOrgUnitManager(OrgUnitManager orgUnitManager) { + this.orgUnitManager = orgUnitManager; + } + + public void setGodownEntryItemManager( + ExpensiveGoodsGodownEntryItemManager godownEntryItemManager) { + this.godownEntryItemManager = godownEntryItemManager; + } + + public void setWareHouseManager(WareHouseManager wareHouseManager) { + this.wareHouseManager = wareHouseManager; + } + + private void saveOrUpdate(GodownEntry godownEntry) { + objectDao.saveOrUpdate(godownEntry); + } + + public void setBarcodeManager(BarcodeManager barcodeManager) { + this.barcodeManager = barcodeManager; + } + + public void setAppLogManager(LogManager appLogManager) { + this.appLogManager = appLogManager; + } + + @Override + public GodownEntry getGodownEntryById(String id) { + return (GodownEntry) objectDao.getByProperty( + GodownEntry.class.getSimpleName(), "id", Long.valueOf(id)); + } + private GodownEntry getGodownEntryById_ForUpdate(String id){ + return (GodownEntry) objectDao.getByProperty_ForUpdate( + GodownEntry.class.getSimpleName(), "id", Long.valueOf(id)); + } + + private void deleteWriteBackForDiposableGoodsStorageOut(GodownEntryWB godownEntryWB){ + // 回写物资系统 + if (writeBackInventoryHelper != null) { + writeBackInventoryHelper + .deleteWriteBackForDiposableGoodsStorageOut(Collections + .singleton(godownEntryWB.getId()),false); + } + } + private void delete(GodownEntry godownEntry) { + objectDao.delete(godownEntry); + } + + @Override + public Map deleteGodownEntryById_TRANS_NEW(String id) { + return deleteGodownEntryById_internal(id); + } + @Override + public Map deleteGodownOutEntryById_TRANS_NEW(String id) { + return deleteGodownEntryOutById_internal(id); + } + // 删除入库单 + private Map deleteGodownEntryById_internal(String id) { + Map result = new HashMap(); + result.put("success", false); + try { + // 锁定并获取入库单 + GodownEntry godownEntry = getGodownEntryById_ForUpdate(id); + if (godownEntry == null) { + // 入库单已被删除 + throw new RuntimeException("入库单已被删除!"); + } + Set disposableGoodsIDsSet = new HashSet();// 一次性物品id集合 + Set disposableGoodsStockIDsSet = new HashSet();// 一次性物品库存id集合 + Set disposableGoodsBatchIDsSet = new HashSet();// 批次id集合 + Set disposableGoodsBatchStockIDsSet = new HashSet();// 批次库存id集合 + Set disposableGoodsBatchNumberSet = new HashSet();// 批次号集合 + Set identificationIDsSet = new HashSet();// 标识号id集合 + Map idToDisposableGoodsMap = new HashMap(); + Map disposableGoodsIDToDisposableGoodsStockMap = new HashMap(); + Map idToDisposableGoodsStockMap = new HashMap(); + Map idToDisposableGoodsBatchMap = new HashMap(); + Map idToDisposableGoodsBatchStockMap = new HashMap(); + Map idToIdentificationMap = new HashMap(); + // 汇总信息 + summaryDiposableGoodsInfo(godownEntry, disposableGoodsIDsSet,disposableGoodsStockIDsSet,disposableGoodsBatchIDsSet, + disposableGoodsBatchStockIDsSet, disposableGoodsBatchNumberSet, identificationIDsSet); + // 获取并锁定一次性物品相关资源 + lockAndGetDiposableGoodsResources(GodownEntry.TYPE_IN,godownEntry.getWarehouseID(),godownEntry.getWarehouseName(),disposableGoodsIDsSet,disposableGoodsStockIDsSet,disposableGoodsBatchIDsSet, disposableGoodsBatchStockIDsSet, + disposableGoodsBatchNumberSet, identificationIDsSet, idToDisposableGoodsMap,disposableGoodsIDToDisposableGoodsStockMap,idToDisposableGoodsStockMap,idToDisposableGoodsBatchMap, + idToDisposableGoodsBatchStockMap, idToIdentificationMap , null); + + List itemList = new ArrayList(godownEntry.getItemsList()); + for (GodownEntryItem godownEntryItem : itemList) { + deleteGodownEntryItem(godownEntryItem, idToDisposableGoodsMap, disposableGoodsIDToDisposableGoodsStockMap, idToDisposableGoodsStockMap, idToDisposableGoodsBatchMap, idToDisposableGoodsBatchStockMap, idToIdentificationMap); + } + // 构造出库参数 + delete(godownEntry);// 删除入库单 + result.put("success", true); + } catch (Exception e) { + e.printStackTrace(); + result.put("errMsg", e.getMessage()); + throw e; + } + + return result; + } + private GodownEntryWB saveWriteBackRecord(GodownEntry godownEntry) { + // 保存回写记录 + List items = godownEntry.getItemsList(); + List itemsWB = new LinkedList(); + GodownEntryWB godownEntryWB = new GodownEntryWB(); + godownEntryWB.setDeleteTime(new Date()); + godownEntryWB.setItemsList(itemsWB); + godownEntryWB.setOperator(godownEntry.getOperator()); + godownEntryWB.setRemark(godownEntry.getRemark()); + godownEntryWB.setSerialNumber(godownEntry.getSerialNumber()); + godownEntryWB.setSupplierName(godownEntry.getSupplierName()); + godownEntryWB.setTime(godownEntry.getTime()); + godownEntryWB.setTotalPrice(godownEntry.getTotalPrice()); + godownEntryWB.setType(godownEntry.getType()); + + objectDao.save(godownEntryWB); + if (items != null) { + for (GodownEntryItem item : items) { + GodownEntryItemWB itemWB = new GodownEntryItemWB(); + itemWB.setAmount(item.getAmount()); + itemWB.setBatchID(item.getDisposableGoodsBatchStockID()); + itemWB.setBatchNumber(item.getBatchNumber()); + itemWB.setCertification(item.getCertification()); + itemWB.setConclusion(item.getConclusion()); + itemWB.setCost(item.getCost()); + itemWB.setDiposableGoods(item.getDiposableGoods()); + itemWB.setDiposableGoodsID(item.getDisposableGoodsID()); + itemWB.setExpDate(item.getExpDate()); + itemWB.setGodownEntry(godownEntryWB); + itemWB.setIdentification(item.getIdentification()); + itemWB.setIdentificationID(item.getIdentificationID()); + itemWB.setManufacturer(item.getManufacturer()); + itemWB.setNewBatch(item.getNewBatch()); + itemWB.setProducingArea(item.getProducingArea()); + itemWB.setSterileBatchNumber(item.getSterileBatchNumber()); + itemWB.setSupplierName(item.getSupplierName()); + itemsWB.add(itemWB); + objectDao.save(itemWB); + } + } + return godownEntryWB; + } + // 删除出库单 + private Map deleteGodownEntryOutById_internal(String id) { + Map result = new HashMap(); + result.put("success", false); + try { + // 锁定获取出库单 + GodownEntry godownEntry = getGodownEntryById_ForUpdate(id); + if(godownEntry == null){ + throw new RuntimeException("出库单已被删除!"); + } + DisposableGoodsServiceContext disposableGoodsServiceContext = new DisposableGoodsServiceContext(); + // 汇总信息 + summaryDiposableGoodsInfoForGodownOutEntry2(godownEntry, disposableGoodsServiceContext); + // 获取并锁定一次性物品相关资源 + lockAndGetDiposableGoodsResourcesForCancellingStocks(GodownEntry.TYPE_OUT,godownEntry.getWarehouseID(),godownEntry.getWarehouseName(),disposableGoodsServiceContext); + ////////// + // 保存回写记录 + GodownEntryWB godownEntryWB = saveWriteBackRecord(godownEntry); + // 删除各个item + List itemList = new ArrayList(godownEntry.getItemsList()); + for (GodownEntryItem godownEntryItem : itemList) { + deleteGodownOutEntryItem(godownEntryItem, disposableGoodsServiceContext); + } + // 删除退库单 + delete(godownEntry); + deleteWriteBackForDiposableGoodsStorageOut(godownEntryWB); + result.put("success", true); + } catch (Exception e) { + e.printStackTrace(); + result.put("errMsg", e.getMessage()); + throw e; + } + + return result; + } + + @SuppressWarnings("unchecked") + @Override + public List getGodownEntryListByHql(String hql) { + if (StringUtils.isNotBlank(hql)) { + return objectDao.findBySql(GodownEntry.class.getSimpleName(), hql); + } + return null; + } + + @Override + public void saveGodownEntry_TRANS_REQUIRED(GodownEntry entry, + Map result) { + saveGodownEntry_internal(entry, result); + } + // 保存入库单,只修改库存,不改其他属性,用于盘点与调拨 + @Override + public List saveGodownEntryModifyOnlyAmount_TRANS_REQUIRED(GodownEntry entry,Map result){ + return saveGodownEntryModifyOnlyAmount_internal(entry, result , null); + } + + @Override + public void saveGodownEntry_TRANS_MANDATORY(Collection entrys, + Map result) { + saveGodownEntry_internal(entrys, result); + } + + private void saveGodownEntry_internal(Collection entrys, + Map result) { + if (entrys == null || entrys.isEmpty()) { + return; + } + Set disposableGoodsIDsSet = new HashSet();// 一次性物品id集合 + Set disposableGoodsStockIDsSet = new HashSet();// 一次性物品库存id集合 + Set disposableGoodsBatchIDsSet = new HashSet();// 批次id集合 + Set disposableGoodsBatchStockIDsSet = new HashSet();// 批次库存id集合 + Set disposableGoodsBatchNumberSet = new HashSet();// 批次号集合 + Set identificationIDsSet = new HashSet();// 标识号id集合 + Map idToDisposableGoodsMap = new HashMap(); + Map disposableGoodsIDToDisposableGoodsStockMap = new HashMap(); + Map idToDisposableGoodsStockMap = new HashMap(); + Map idToDisposableGoodsBatchMap = new HashMap(); + Map idToDisposableGoodsBatchStockMap = new HashMap(); + Map idToIdentificationMap = new HashMap(); + Long warehouseID = null; + String warehouseName = null; + for (GodownEntry godownEntry : entrys) { + warehouseID = godownEntry.getWarehouseID(); + warehouseName = godownEntry.getWarehouseName(); + // 汇总信息 + summaryDiposableGoodsInfo(godownEntry, disposableGoodsIDsSet,disposableGoodsStockIDsSet,disposableGoodsBatchIDsSet, + disposableGoodsBatchStockIDsSet, disposableGoodsBatchNumberSet, identificationIDsSet); + } + + // 获取并锁定一次性物品相关资源 + lockAndGetDiposableGoodsResources(GodownEntry.TYPE_IN,warehouseID,warehouseName,disposableGoodsIDsSet,disposableGoodsStockIDsSet,disposableGoodsBatchIDsSet, disposableGoodsBatchStockIDsSet, + disposableGoodsBatchNumberSet, identificationIDsSet, idToDisposableGoodsMap,disposableGoodsIDToDisposableGoodsStockMap,idToDisposableGoodsStockMap,idToDisposableGoodsBatchMap, + idToDisposableGoodsBatchStockMap, idToIdentificationMap , null); + for (GodownEntry godownEntry : entrys) { + saveGodownEntry_internal(godownEntry, warehouseID, warehouseName,idToDisposableGoodsMap, disposableGoodsIDToDisposableGoodsStockMap, idToDisposableGoodsStockMap, idToDisposableGoodsBatchMap, idToDisposableGoodsBatchStockMap, idToIdentificationMap); + // 设置GodownEntryItem详细列表 + if(godownEntry.manualIn()){ + setReturnDetails(godownEntry,idToDisposableGoodsBatchMap, idToDisposableGoodsBatchStockMap,result); + } + } + } + + private List saveGodownEntryModifyOnlyAmount_internal(GodownEntry entry, + Long warehouseID,String warehouseName, + Map idToDisposableGoodsMap,Map disposableGoodsIDToDisposableGoodsStockMap, + Map idToDisposableGoodsStockMap,Map idToDisposableGoodsBatchMap , + Map idToBatchStockMap, Map idToIdentificationMap , + List disposableGoodsStorageAdjustVoList) { + save(entry); + List newDisposableGoodsStorageAdjustVoList = new ArrayList(); + List itemList = entry.getItemsList(); + for (int i = 0; i < itemList.size(); ++i) { + GodownEntryItem godownEntryItem = itemList.get(i); + List list = warehousingByGodownEntryItemModifyOnlyAmount(entry, warehouseID, warehouseName, + idToDisposableGoodsMap, idToDisposableGoodsStockMap, + idToBatchStockMap, godownEntryItem , disposableGoodsStorageAdjustVoList); + if(CollectionUtils.isNotEmpty(list)){ + newDisposableGoodsStorageAdjustVoList.addAll(list); + } + objectDao.update(godownEntryItem);// 更新item + } + return newDisposableGoodsStorageAdjustVoList; + } + + /** + * 保存入/退库(仅更新库存数量) + * @param entrys 入/退库单实体信息集 + * @param result 消息结果 + * @param disposableGoodsStorageAdjustVoList 传入的一次性物品库存调整记录(当调拨的业务场景时,传入的为库存扣减的记录集体,其它业务场景传null) + * @return List 最终返回的一次性物品库存调整记录 + */ + private List saveGodownEntryModifyOnlyAmount_internal(Collection entrys, + Map result , List disposableGoodsStorageAdjustVoList) { + if (entrys == null || entrys.isEmpty()) { + return null; + } + List newDisposableGoodsStorageAdjustVoList = new ArrayList(); + Set disposableGoodsIDsSet = new HashSet();// 一次性物品id集合 + Set disposableGoodsStockIDsSet = new HashSet();// 一次性物品库存id集合 + Set disposableGoodsBatchIDsSet = new HashSet();// 批次id集合 + Set disposableGoodsBatchStockIDsSet = new HashSet();// 批次库存id集合 + Set disposableGoodsBatchNumberSet = new HashSet();// 批次号集合 + Set identificationIDsSet = new HashSet();// 标识号id集合 + Map idToDisposableGoodsMap = new HashMap(); + Map disposableGoodsIDToDisposableGoodsStockMap = new HashMap(); + Map idToDisposableGoodsStockMap = new HashMap(); + Map idToDisposableGoodsBatchMap = new HashMap(); + Map idToDisposableGoodsBatchStockMap = new HashMap(); + Map idToIdentificationMap = new HashMap(); + Long warehouseID = null; + String warehouseName = null; + for (GodownEntry godownEntry : entrys) { + warehouseID = godownEntry.getWarehouseID(); + warehouseName = godownEntry.getWarehouseName(); + // 汇总信息 + summaryDiposableGoodsInfo(godownEntry, disposableGoodsIDsSet,disposableGoodsStockIDsSet,disposableGoodsBatchIDsSet, + disposableGoodsBatchStockIDsSet, disposableGoodsBatchNumberSet, identificationIDsSet); + } + + // 获取并锁定一次性物品相关资源 + lockAndGetDiposableGoodsResources(GodownEntry.TYPE_IN,warehouseID,warehouseName,disposableGoodsIDsSet,disposableGoodsStockIDsSet,disposableGoodsBatchIDsSet, disposableGoodsBatchStockIDsSet, + disposableGoodsBatchNumberSet, identificationIDsSet, idToDisposableGoodsMap,disposableGoodsIDToDisposableGoodsStockMap,idToDisposableGoodsStockMap,idToDisposableGoodsBatchMap, + idToDisposableGoodsBatchStockMap, idToIdentificationMap , disposableGoodsStorageAdjustVoList); + for (GodownEntry godownEntry : entrys) { + List list = + saveGodownEntryModifyOnlyAmount_internal(godownEntry, warehouseID, warehouseName,idToDisposableGoodsMap, disposableGoodsIDToDisposableGoodsStockMap, idToDisposableGoodsStockMap, idToDisposableGoodsBatchMap, idToDisposableGoodsBatchStockMap, idToIdentificationMap , disposableGoodsStorageAdjustVoList); + if(CollectionUtils.isNotEmpty(list)){ + newDisposableGoodsStorageAdjustVoList.addAll(list); + } + } + return newDisposableGoodsStorageAdjustVoList; + } + + + private DisposableGoodsBatchStock getDiposableGoodBatchStockByBatchNumber( + Long diposableGoodsID, String batchNumber) { + String sql = String.format( + " where po.diposableGoods.id=%s and po.batchNumber='%s' ", + diposableGoodsID.toString(), batchNumber); + return (DisposableGoodsBatchStock) objectDao.getBySql( + DisposableGoodsBatchStock.class.getSimpleName(), sql); + } + // 保存入库单 + private void saveGodownEntry_internal(GodownEntry godownEntry, Map result) { + List entrys = new ArrayList(1); + entrys.add(godownEntry); + saveGodownEntry_internal(entrys, result); + } + + /** + * 修改入库单明细的数量 + * @param godownEntry + * @param result + * @param disposableGoodsStorageAdjustVoList 传入的一次性物品库存调整记录(当调拨的业务场景时,传入的为库存扣减的记录集体,其它业务场景传null) + * @return List 最终返回的一次性物品库存调整记录 + */ + private List saveGodownEntryModifyOnlyAmount_internal(GodownEntry godownEntry, Map result , List disposableGoodsStorageAdjustVoList) { + List entrys = new ArrayList(1); + entrys.add(godownEntry); + return saveGodownEntryModifyOnlyAmount_internal(entrys, result , disposableGoodsStorageAdjustVoList); + } + + + private DisposableGoodsBatch newDisposableGoodsBatch(DisposableGoods diposableGoods,Long warehouseID,String warehouseName,GodownEntryItem godownEntryItem){ + DisposableGoodsBatch disposableGoodsBatch = new DisposableGoodsBatch(); + disposableGoodsBatch.setDiposableGoods(diposableGoods); + disposableGoodsBatch.setBatchNumber(godownEntryItem.getBatchNumber()); + + //设置灭菌批次(灭菌日期/生产日期) + disposableGoodsBatch.setSterileBatchNumber(godownEntryItem.getSterileBatchNumber()); + //供货商 + disposableGoodsBatch.setSupplierName(godownEntryItem.getSupplierName()); + //生产厂家 + disposableGoodsBatch.setManufacturer(godownEntryItem.getManufacturer()); + //产地 + disposableGoodsBatch.setProducingArea(godownEntryItem.getProducingArea()); + //设置为his系统的批次id + disposableGoodsBatch.setBatchIdFromHisSync(godownEntryItem.getBatchIdFromHisSync()); + //深圳南山同步入库时传递的批次batchId + disposableGoodsBatch.setIdentification(godownEntryItem.getIdentification()); + diposableGoodsManager.saveOrUpdate(disposableGoodsBatch); + return disposableGoodsBatch; + } + + private DisposableGoodsBatchStock newDisposableGoodsBatchStock( + DisposableGoods disposableGoods, + DisposableGoodsStock disposableGoodsStock, + DisposableGoodsBatch disposableGoodsBatch, Long warehouseID, + String warehouseName, GodownEntryItem godownEntryItem) { + DisposableGoodsBatchStock disposableGoodsBatchStock = new DisposableGoodsBatchStock(); + disposableGoodsBatchStock.setDiposableGoods(disposableGoodsStock); + disposableGoodsStock.getGoodsBatchs().add(disposableGoodsBatchStock); + disposableGoodsBatchStock.setBarcode(disposableGoodsBatch.getBarcode()); + disposableGoodsBatchStock.setDisposableGoodsId(disposableGoods.getId()); + disposableGoodsBatchStock + .setDisposableGoodsBatchId(disposableGoodsBatch.getId()); + disposableGoodsBatchStock.setBatchNumber(godownEntryItem + .getBatchNumber()); + disposableGoodsBatchStock.setCost(godownEntryItem.getCost()); + disposableGoodsBatchStock.setExpDate(godownEntryItem.getExpDate()); + disposableGoodsBatchStock.setManufacturer(godownEntryItem + .getManufacturer()); + disposableGoodsBatchStock.setSterileBatchNumber(godownEntryItem + .getSterileBatchNumber()); + disposableGoodsBatchStock.setSupplierName(godownEntryItem + .getSupplierName()); + disposableGoodsBatchStock.setProducingArea(godownEntryItem + .getProducingArea()); + disposableGoodsBatchStock.setWarehouseID(warehouseID); + disposableGoodsBatchStock.setWarehouseName(warehouseName); + diposableGoodBatchStockManager.saveOrUpdate(disposableGoodsBatchStock); + return disposableGoodsBatchStock; + } + + + /** + * @param entry + * @param idToDiposableGoodsMap + * @param idToBatchStockMap + */ + private void saveGodownEntry_internal(GodownEntry entry, + Long warehouseID,String warehouseName, + Map idToDisposableGoodsMap,Map disposableGoodsIDToDisposableGoodsStockMap,Map idToDisposableGoodsStockMap, + Map idToDisposableGoodsBatchMap ,Map idToBatchStockMap, + Map idToIdentificationMap) { + save(entry); + List itemList = entry.getItemsList(); + for (int i = 0; i < itemList.size(); ++i) { + GodownEntryItem godownEntryItem = itemList.get(i); + warehousingByGodownEntryItem(entry, warehouseID, warehouseName, + idToDisposableGoodsMap, idToDisposableGoodsStockMap, + idToBatchStockMap, godownEntryItem); + //根据入库单所选一次性物品类型所选更新一次性物品类型 + if(godownEntryItem.getDisposableGoodsID() != null && StringUtils.isNotBlank(godownEntryItem.getGrade())){ + DisposableGoods disposableGoods = + (DisposableGoods)objectDao.getByProperty(DisposableGoods.class.getSimpleName(), "id", godownEntryItem.getDisposableGoodsID()); + if(disposableGoods != null){ + disposableGoods.setGrade(godownEntryItem.getGrade()); + objectDao.saveOrUpdate(disposableGoods); + } + } + objectDao.update(godownEntryItem);// 更新item + } + } + + /** + * 根据条码设置高值耗所属仓库及一次性物品定义、批次定义、库存、批次库存id + * @param barcode + * @param warehouseID + * @param warehouseName + * @param disposableGoodsStockID + * @param disposableGoodsBatchID + * @param disposableGoodsBatchStock + */ + private List setExpensiveGoodsWarehouse(GodownEntry entry,GodownEntryItem godownEntryItem , Long warehouseID,String warehouseName,Long disposableGoodsStockID,Long disposableGoodsBatchID,DisposableGoodsBatchStock disposableGoodsBatchStock){ + String barcode = godownEntryItem.getBarcode(); + if(StringUtils.isNotBlank(barcode)){ + BarcodeDevice bd = barcodeManager.getBarcodeByBarcode(barcode); + if (bd != null && bd instanceof ExpensiveDisposablegoods) { + // 高值耗材 + ExpensiveDisposablegoods expensiveDisposablegoods = (ExpensiveDisposablegoods) bd; + expensiveDisposablegoods.setWarehouseID(warehouseID); + expensiveDisposablegoods.setWarehouseName(warehouseName); + expensiveDisposablegoods.setDisposableGoodsStockID(disposableGoodsStockID); + expensiveDisposablegoods.setDisposableGoodsBatchID(disposableGoodsBatchID); + expensiveDisposablegoods.setDisposableGoodsBatchStock(disposableGoodsBatchStock); + expensiveDisposablegoods.setGodownEntryId(godownEntryItem.getGodownEntry().getId()); + expensiveDisposablegoods.setGodownEntryItemId(godownEntryItem.getId()); + expensiveDisposablegoods.setStatus(ExpensiveDisposablegoods.STATUS_IN_WAREHOUSE); + expensiveDisposablegoods.setEntryDate(new Date()); + expensiveDisposablegoods.setBatchIdFromHisSync(godownEntryItem.getBatchIdFromHisSync()); + expensiveDisposablegoods.setIdentification(godownEntryItem.getIdentification()); + objectDao.saveOrUpdate(expensiveDisposablegoods); + return Collections.singletonList(expensiveDisposablegoods); + } + return null; + }else{ + disposableGoodsBatchStock.setCost(godownEntryItem.getCost()); + //盘盈入库处理 + return diposableGoodsManager.newExpensivediposablegoods(disposableGoodsBatchStock, godownEntryItem.getAmount(),null,godownEntryItem.getConclusion(), + godownEntryItem.getGodownEntry().getTime(), godownEntryItem.getIdentification(),entry.getId(),godownEntryItem.getId() ,godownEntryItem.getBatchIdFromHisSync()); + } + } + + private List warehousingByGodownEntryItem(GodownEntry entry, Long warehouseID, + String warehouseName, + Map idToDisposableGoodsMap, + Map idToDisposableGoodsStockMap, + Map idToDisposableGoodsBatchStockMap, + GodownEntryItem godownEntryItem) { + List disposableGoodsStorageAdjustVoList = new ArrayList(); + boolean newBatch = false; + Long disposableGoodsID = godownEntryItem.getDisposableGoodsID(); + Long disposableGoodsStockID = godownEntryItem.getDisposableGoodsStockID(); + DisposableGoods disposableGoods = idToDisposableGoodsMap.get(disposableGoodsID); + DisposableGoodsStock disposableGoodsStock = null; + + String batchNumber = godownEntryItem.getBatchNumber(); + + if(disposableGoods == null){ + throw new RuntimeException("物品未定义!"); + } + if(StringUtils.isBlank(batchNumber)){ + throw new RuntimeException("批次号不能为空!"); + } + if(disposableGoodsStockID != null){ + disposableGoodsStock = idToDisposableGoodsStockMap.get(disposableGoodsStockID); + } + // 查找一次性物品库存 + if(disposableGoodsStock == null){ + disposableGoodsStock = disposableGoodsStockManager.getDisposableGoodsStockByDisposableGoodsId(disposableGoodsID.toString(), warehouseID.toString()); + } + if(disposableGoodsStock == null){ + throw new RuntimeException("物品库存对象未找到!"); + } + // 校验仓库是否是当前仓库 + if(!warehouseID.equals(disposableGoodsStock.getWarehouseID())){ + throw new RuntimeException("物品库存不是当前仓库的!"); + } + // 查找批次定义 + DisposableGoodsBatch disposableGoodsBatch = diposableGoodsManager.getDisposableGoodsBatchByBatchNumber(disposableGoodsID, batchNumber); + if(disposableGoodsBatch == null){ + disposableGoodsBatch = newDisposableGoodsBatch(disposableGoods,warehouseID, warehouseName, godownEntryItem); + } + // 查找批次库存 + DisposableGoodsBatchStock disposableGoodsBatchStock = diposableGoodsManager.getDisposableGoodsStockByBatchNumber(warehouseID, disposableGoodsID, batchNumber); + + if(disposableGoodsBatchStock == null){ + // 新建 批次 + disposableGoodsBatchStock = newDisposableGoodsBatchStock(disposableGoods, disposableGoodsStock, disposableGoodsBatch, warehouseID, warehouseName, godownEntryItem); + + newBatch = true; + idToDisposableGoodsBatchStockMap.put(disposableGoodsBatchStock.getId(), disposableGoodsBatchStock); + } + // 更新一次性物品定义 + disposableGoods.setReferencePrice(godownEntryItem.getCost()); + // 更新批次定义 + disposableGoodsBatch.setCost(godownEntryItem.getCost()); + disposableGoodsBatch.setExpDate(godownEntryItem.getExpDate()); + disposableGoodsBatch.setManufacturer(godownEntryItem.getManufacturer()); + disposableGoodsBatch.setSterileBatchNumber(godownEntryItem.getSterileBatchNumber()); + disposableGoodsBatch.setSupplierName(godownEntryItem.getSupplierName()); + disposableGoodsBatch.setProducingArea(godownEntryItem.getProducingArea()); + // 更新批次库存相关信息 +// disposableGoodsBatchStock.setDisposableGoodsID(disposableGoodsID); +// disposableGoodsBatchStock.setDisposableGoodsBatchID(disposableGoodsBatch.getId()); +// disposableGoodsBatchStock.setBatchNumber(godownEntryItem.getBatchNumber()); + disposableGoodsBatchStock.setCost(godownEntryItem.getCost()); + disposableGoodsBatchStock.setExpDate(godownEntryItem.getExpDate()); + disposableGoodsBatchStock.setManufacturer(godownEntryItem.getManufacturer()); + disposableGoodsBatchStock.setSterileBatchNumber(godownEntryItem.getSterileBatchNumber()); + disposableGoodsBatchStock.setSupplierName(godownEntryItem.getSupplierName()); + disposableGoodsBatchStock.setProducingArea(godownEntryItem.getProducingArea()); + + if(disposableGoods.expensiveDiposablegoods()){ + Long amount = godownEntryItem.getAmount(); + // 高值耗材的处理 + diposableGoodsManager.newExpensivediposablegoods(disposableGoodsBatchStock, amount,null,godownEntryItem.getConclusion(), entry.getTime(), + godownEntryItem.getIdentification(),entry.getId(),godownEntryItem.getId() , godownEntryItem.getBatchIdFromHisSync()); + }else{ + DisposableGoodsIdentification identification = newIdentificationOfDisposableGoods( + entry, godownEntryItem, disposableGoodsID, + disposableGoodsStock, disposableGoodsBatch, + disposableGoodsBatchStock); + objectDao.save(identification); + godownEntryItem.setIdentificationID(identification.getId()); + } + + godownEntryItem.setNewBatch(newBatch); + // 设置godownEntryItem和批次,标识号关联的信息 + godownEntryItem.setDisposableGoodsID(disposableGoodsID); + godownEntryItem.setDisposableGoodsStockID(disposableGoodsStock.getId()); + godownEntryItem.setDisposableGoodsBatchID(disposableGoodsBatch.getId()); + godownEntryItem.setDisposableGoodsBatchStockID(disposableGoodsBatchStock.getId()); + godownEntryItem.setDiposableGoods(disposableGoodsStock); + if(disposableGoods.expensiveDiposablegoods()){ + if(!godownEntryItem.isAssociatedInfoValidForExpensiveDisposablegoodsInEntry()){ + throw new RuntimeException("关联信息不正确!"); + } + }else{ + if(!godownEntryItem.isAssociatedInfoValidForInEntry()){ + throw new RuntimeException("关联信息不正确!"); + } + } + + // 新建项需要修改一次性物品价格 + disposableGoodsStock.setReferencePrice(godownEntryItem.getCost()); + objectDao.update(disposableGoods); + objectDao.update(disposableGoodsStock); + objectDao.update(disposableGoodsBatch); + objectDao.update(disposableGoodsBatchStock); + objectDao.saveOrUpdate(godownEntryItem); + + return disposableGoodsStorageAdjustVoList; + } + + /** + * 根据入/退库单明细调整库存,并返回最后的调整记录 + * @param entry + * @param warehouseID + * @param warehouseName + * @param idToDisposableGoodsMap + * @param idToDisposableGoodsStockMap + * @param idToDisposableGoodsBatchStockMap + * @param godownEntryItem + * @param disposableGoodsStorageAdjustVoList + * @return + */ + private List warehousingByGodownEntryItemModifyOnlyAmount(GodownEntry entry, Long warehouseID, + String warehouseName, + Map idToDisposableGoodsMap, + Map idToDisposableGoodsStockMap, + Map idToDisposableGoodsBatchStockMap, + GodownEntryItem godownEntryItem , List disposableGoodsStorageAdjustVoList) { + boolean newBatch = false; + Long disposableGoodsID = godownEntryItem.getDisposableGoodsID(); + Long disposableGoodsStockID = godownEntryItem.getDisposableGoodsStockID(); + //物资系统的batchId + Long batchIdFromHisSync = godownEntryItem.getBatchIdFromHisSync(); + DisposableGoods disposableGoods = idToDisposableGoodsMap.get(disposableGoodsID); + DisposableGoodsStock disposableGoodsStock = null; + + String batchNumber = godownEntryItem.getBatchNumber(); + + if(disposableGoods == null){ + throw new RuntimeException("物品未定义!"); + } + if(StringUtils.isBlank(batchNumber)){ + throw new RuntimeException("批次号不能为空!"); + } + if(disposableGoodsStockID != null){ + disposableGoodsStock = idToDisposableGoodsStockMap.get(disposableGoodsStockID); + } + // 查找一次性物品库存 + if(disposableGoodsStock == null){ + disposableGoodsStock = disposableGoodsStockManager.getDisposableGoodsStockByDisposableGoodsId(disposableGoodsID.toString(), warehouseID.toString()); + } + if(disposableGoodsStock == null){ + throw new RuntimeException("物品库存对象未找到!"); + } + // 校验仓库是否是当前仓库 + if(!warehouseID.equals(disposableGoodsStock.getWarehouseID())){ + throw new RuntimeException("物品库存不是当前仓库的!"); + } + + List result = new ArrayList(); + // 查找批次定义 + DisposableGoodsBatch disposableGoodsBatch = diposableGoodsManager.getDisposableGoodsBatchByBatchNumber(disposableGoodsID, batchNumber); + if(disposableGoodsBatch == null){ + disposableGoodsBatch = newDisposableGoodsBatch(disposableGoods,warehouseID, warehouseName, godownEntryItem); + } + // 查找批次库存 + DisposableGoodsBatchStock disposableGoodsBatchStock = diposableGoodsManager.getDisposableGoodsStockByBatchNumber(warehouseID, disposableGoodsID, batchNumber); + + if(disposableGoodsBatchStock == null){ + // 新建 批次 + disposableGoodsBatchStock = newDisposableGoodsBatchStock(disposableGoods, disposableGoodsStock, disposableGoodsBatch, warehouseID, warehouseName, godownEntryItem); + newBatch = true; + idToDisposableGoodsBatchStockMap.put(disposableGoodsBatchStock.getId(), disposableGoodsBatchStock); + } + + if(DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS.equals(disposableGoods.getGoodsType())){ + //根据条码设置高值耗所属仓库及一次性物品定义、批次定义、库存、批次库存id + List expensiveGoodsList = setExpensiveGoodsWarehouse(entry,godownEntryItem , warehouseID, warehouseName , disposableGoodsStock.getId(),disposableGoodsBatch.getId(),disposableGoodsBatchStock); + if(StringUtils.isNotBlank(godownEntryItem.getBarcode())){ + disposableGoodsBatchStock.adjustAmount(1);//数量加1 + + if(CollectionUtils.isNotEmpty(expensiveGoodsList)){ + ExpensiveDisposablegoods expensiveDisposablegoods = expensiveGoodsList.get(0); + //记录各标识库存数量调整变动结果 + DisposableGoodsStorageAdjustVo disposableGoodsStorageAdjustVo = new DisposableGoodsStorageAdjustVo(); + disposableGoodsStorageAdjustVo.setExpensiveDisposablegoodsId(expensiveDisposablegoods.getId()); + disposableGoodsStorageAdjustVo.setAdjustAmount(1L); + result.add(disposableGoodsStorageAdjustVo); + } + }else{ + if(CollectionUtils.isNotEmpty(expensiveGoodsList)){ + for (ExpensiveDisposablegoods expensiveDisposablegoods : expensiveGoodsList) { + //记录各标识库存数量调整变动结果 + DisposableGoodsStorageAdjustVo disposableGoodsStorageAdjustVo = new DisposableGoodsStorageAdjustVo(); + disposableGoodsStorageAdjustVo.setExpensiveDisposablegoodsId(expensiveDisposablegoods.getId()); + disposableGoodsStorageAdjustVo.setAdjustAmount(1L); + result.add(disposableGoodsStorageAdjustVo); + } + } + } + }else{ + //是否已完成标识符数据创建 + boolean finished = false; + //如果存在先前扣减的标识符数据 + if(CollectionUtils.isNotEmpty(disposableGoodsStorageAdjustVoList)){ + for (DisposableGoodsStorageAdjustVo disposableGoodsStorageAdjustVo : disposableGoodsStorageAdjustVoList) { + if(DatabaseUtil.isPoIdValid(disposableGoodsStorageAdjustVo.getDisposableGoodsIdentificationId())){ + DisposableGoodsIdentification disposableGoodsIdentification = + (DisposableGoodsIdentification)objectDao.getByProperty(DisposableGoodsIdentification.class.getSimpleName(), "id", disposableGoodsStorageAdjustVo.getDisposableGoodsIdentificationId()); + //如果标识数据集合里的一次性物品批次id与需新生成标识的批次id不相同时,则跳过 + if(!MathTools.valueEquals(disposableGoodsIdentification.getDisposableGoodsBatchID(), disposableGoodsBatch.getId())){ + continue; + } + godownEntryItem.setAmount(Math.abs(disposableGoodsStorageAdjustVo.getAdjustAmount())); + godownEntryItem.setBatchIdFromHisSync(disposableGoodsIdentification.getBatchIdFromHisSync()); + godownEntryItem.setIdentification(disposableGoodsIdentification.getIdentification()); + // 新建标识号对象 + DisposableGoodsIdentification identification = newIdentificationOfDisposableGoods( + entry, godownEntryItem, disposableGoodsID, + disposableGoodsStock, disposableGoodsBatch, + disposableGoodsBatchStock); + objectDao.save(identification); + godownEntryItem.setIdentificationID(identification.getId()); + //记录各标识库存数量调整变动结果 + DisposableGoodsStorageAdjustVo newDisposableGoodsStorageAdjustVo = new DisposableGoodsStorageAdjustVo(); + disposableGoodsStorageAdjustVo.setDisposableGoodsIdentificationId(identification.getId()); + disposableGoodsStorageAdjustVo.setAdjustAmount(godownEntryItem.getAmount()); + result.add(newDisposableGoodsStorageAdjustVo); + + finished = true; + } + } + }else{ + // 新建标识号对象 + DisposableGoodsIdentification identification = newIdentificationOfDisposableGoods( + entry, godownEntryItem, disposableGoodsID, + disposableGoodsStock, disposableGoodsBatch, + disposableGoodsBatchStock); + objectDao.save(identification); + godownEntryItem.setIdentificationID(identification.getId()); + //记录各标识库存数量调整变动结果 + DisposableGoodsStorageAdjustVo disposableGoodsStorageAdjustVo = new DisposableGoodsStorageAdjustVo(); + disposableGoodsStorageAdjustVo.setDisposableGoodsIdentificationId(identification.getId()); + disposableGoodsStorageAdjustVo.setAdjustAmount(godownEntryItem.getAmount()); + result.add(disposableGoodsStorageAdjustVo); + finished = true; + } + + if(finished == false){ + // 新建标识号对象 + DisposableGoodsIdentification identification = newIdentificationOfDisposableGoods( + entry, godownEntryItem, disposableGoodsID, + disposableGoodsStock, disposableGoodsBatch, + disposableGoodsBatchStock); + objectDao.save(identification); + godownEntryItem.setIdentificationID(identification.getId()); + //记录各标识库存数量调整变动结果 + DisposableGoodsStorageAdjustVo disposableGoodsStorageAdjustVo = new DisposableGoodsStorageAdjustVo(); + disposableGoodsStorageAdjustVo.setDisposableGoodsIdentificationId(identification.getId()); + disposableGoodsStorageAdjustVo.setAdjustAmount(godownEntryItem.getAmount()); + result.add(disposableGoodsStorageAdjustVo); + } + } + godownEntryItem.setNewBatch(newBatch); + // 设置godownEntryItem和批次,标识号关联的信息 + godownEntryItem.setDisposableGoodsID(disposableGoodsID); + godownEntryItem.setDisposableGoodsStockID(disposableGoodsStock.getId()); + godownEntryItem.setDisposableGoodsBatchID(disposableGoodsBatch.getId()); + godownEntryItem.setDisposableGoodsBatchStockID(disposableGoodsBatchStock.getId()); + godownEntryItem.setDiposableGoods(disposableGoodsStock); + if(!DatabaseUtil.isPoIdValid(disposableGoodsID) + || !DatabaseUtil.isPoIdValid(disposableGoodsStock.getId()) + || !DatabaseUtil.isPoIdValid(disposableGoodsBatch.getId()) + || !DatabaseUtil.isPoIdValid(disposableGoodsBatchStock.getId()) + || godownEntryItem.getGodownEntry() == null + || godownEntryItem.getGodownEntry().getId() == null + || disposableGoods == null + || !DatabaseUtil.isPoIdValid(disposableGoods.getId())){ + throw new RuntimeException("关联信息不正确!"); + } + objectDao.update(disposableGoods); + objectDao.update(disposableGoodsStock); + objectDao.update(disposableGoodsBatch); + objectDao.update(disposableGoodsBatchStock); + return result; + } + + /** + * 新增一次性物品标识数据(手工入库、导入excel入库、同步接口或接口推送入库单入库、盘盈入库、调拨入库等业务最终会调用此方法) + * @param entry + * @param godownEntryItem + * @param disposableGoodsID + * @param disposableGoodsStock + * @param disposableGoodsBatch + * @param disposableGoodsBatchStock + * @return + */ + private DisposableGoodsIdentification newIdentificationOfDisposableGoods( + GodownEntry entry, GodownEntryItem godownEntryItem, + Long disposableGoodsID, DisposableGoodsStock disposableGoodsStock, + DisposableGoodsBatch disposableGoodsBatch, + DisposableGoodsBatchStock disposableGoodsBatchStock) { + DisposableGoodsIdentification identification = new DisposableGoodsIdentification(); + + identification.setDisposableGoodsID(disposableGoodsID); + identification.setDisposableGoodsBatchID(disposableGoodsBatch.getId()); + identification.setDisposableGoodsStockID(disposableGoodsStock.getId()); + identification.setBatchStock(disposableGoodsBatchStock); + disposableGoodsBatchStock.getIdentifications().add(identification); + identification.adjustAmount(godownEntryItem.getAmount()); + identification.setBatchStock(disposableGoodsBatchStock); + identification.setConclusion(godownEntryItem.getConclusion()); + identification.setEntryDate(entry.getTime()); + identification.setIdentification(godownEntryItem.getIdentification()); + identification.setPrice(godownEntryItem.getCost()); + identification.setWarehouseID(entry.getWarehouseID()); + identification.setWarehouseName(entry.getWarehouseName()); + identification.setBatchIdFromHisSync(godownEntryItem.getBatchIdFromHisSync()); + return identification; + } + /** + * 保存对象到数据库 + * @param entry + * @return + */ + private void save(GodownEntry entry) { + // 计算总价 + entry.calculateTotalPrice(); + // 先保存入库单对象,后面需要入库单ID + if(StringUtils.isBlank(entry.getSerialNumber())){// 有可能在其他地方设置了,比如同步入库单/导入入库单 + entry.setSerialNumber(serialNumManager + .getSerialNumberStr(SerialNum.TYPE_INSERT_GODOWN)); + } + + List itemList = entry.getItemsList(); + if(itemList.size() > 0){ + entry.setSupplierName(itemList.get(0).getSupplierName()); + } + syncGodownEntryWareHouse(entry); + objectDao.save(entry); + } + + @Override + public void updateGodownEntry_TRANS_REQUIRED(GodownEntry original, GodownEntry entry, + Map result) { + updateGodownEntry_internal(original, entry, result); + } + private void deleteGodownEntryItem(GodownEntryItem godownEntryItem, + Map idToDisposableGoodsMap , + Map disposableGoodsIDToDisposableGoodsStockMap, + Map idToDisposableGoodsStockMap, + Map idToDisposableGoodsBatchMap, + Map idToDisposableGoodsBatchStockMap, + Map idToIdentificationMap) { + + // 修改时,每一项都应该有ID + Long disposableGoodsID = godownEntryItem.getDisposableGoodsID(); + Long disposableGoodsStockID = godownEntryItem.getDisposableGoodsStockID(); + Long disposableGoodsBatchID = godownEntryItem.getDisposableGoodsBatchID(); + Long disposableGoodsBatchStockID = godownEntryItem.getDisposableGoodsBatchStockID(); + Long identificationID = godownEntryItem.getIdentificationID(); + if(disposableGoodsID == null){ + throw new RuntimeException("物品定义id不能为空,请升级数据!"); + } + if(disposableGoodsStockID == null){ + throw new RuntimeException("物品库存id不能为空,请升级数据!"); + } + if(disposableGoodsBatchID == null){ + throw new RuntimeException("物品批次id不能为空,请升级数据!"); + } + if(disposableGoodsBatchStockID == null){ + throw new RuntimeException("物品批次库存id不能为空,请升级数据!"); + } + if(identificationID == null){ + throw new RuntimeException("标识号不能为空,请升级数据!"); + } + DisposableGoods disposableGoods = idToDisposableGoodsMap.get(disposableGoodsID); + DisposableGoodsStock disposableGoodsStock = idToDisposableGoodsStockMap.get(disposableGoodsStockID); + // 查找批次定义 + DisposableGoodsBatch disposableGoodsBatch = idToDisposableGoodsBatchMap.get(disposableGoodsBatchID); + DisposableGoodsBatchStock disposableGoodsBatchStock = idToDisposableGoodsBatchStockMap.get(disposableGoodsBatchStockID); + DisposableGoodsIdentification identification = idToIdentificationMap.get(identificationID); + if(disposableGoods == null){ + throw new RuntimeException("物品定义不存在!"); + } + if(disposableGoodsStock == null){ + throw new RuntimeException("物品库存不存在!"); + } + if(disposableGoodsBatch == null){ + throw new RuntimeException("物品批次不存在!"); + } + if(disposableGoodsBatchStock == null){ + throw new RuntimeException("物品批次库存不存在!"); + } + if(identification == null){ + throw new RuntimeException("标识号已被删除!"); + } + Long amount = godownEntryItem.getAmount(); + Long amountChange = -amount; + identification.adjustAmount(amountChange);// 调整库存 + + objectDao.update(identification); + objectDao.update(disposableGoodsBatchStock); + objectDao.update(disposableGoodsStock); + objectDao.update(disposableGoodsBatch); + objectDao.update(disposableGoods); + // 删除godownEntryItem + // 删除godownEntryItem + godownEntryItem.getGodownEntry().getItemsList().remove(godownEntryItem); + objectDao.delete(godownEntryItem); + + } + // 更新入库单,TODO 代码待重构 + private void updateGodownEntry_internal(GodownEntry original, GodownEntry entry, + Map result){ + Set disposableGoodsIDsSet = new HashSet();// 一次性物品id集合 + Set disposableGoodsStockIDsSet = new HashSet();// 一次性物品库存id集合 + Set disposableGoodsBatchIDsSet = new HashSet();// 批次id集合 + Set disposableGoodsBatchStockIDsSet = new HashSet();// 批次库存id集合 + Set disposableGoodsBatchNumberSet = new HashSet();// 批次号集合 + Set identificationIDsSet = new HashSet();// 标识号id集合 + Map idToDisposableGoodsMap = new HashMap(); + Map disposableGoodsIDToDisposableGoodsStockMap = new HashMap(); + Map idToDisposableGoodsStockMap = new HashMap(); + Map idToDisposableGoodsBatchMap = new HashMap(); + Map idToDisposableGoodsBatchStockMap = new HashMap(); + Map idToIdentificationMap = new HashMap(); + // 汇总信息 + summaryDiposableGoodsInfo(original, disposableGoodsIDsSet,disposableGoodsStockIDsSet,disposableGoodsBatchIDsSet, + disposableGoodsBatchStockIDsSet, disposableGoodsBatchNumberSet, identificationIDsSet); + summaryDiposableGoodsInfo(entry, disposableGoodsIDsSet,disposableGoodsStockIDsSet,disposableGoodsBatchIDsSet, + disposableGoodsBatchStockIDsSet, disposableGoodsBatchNumberSet, identificationIDsSet); + // 锁定并获取入库单 + GodownEntry curGodownEntry = getGodownEntryById_ForUpdate(original.getId().toString()); + if(curGodownEntry == null){ + // 入库单已被删除 + throw new RuntimeException("入库单已被删除!"); + } + // 获取并锁定一次性物品相关资源 + lockAndGetDiposableGoodsResources(GodownEntry.TYPE_IN,original.getWarehouseID(),original.getWarehouseName(),disposableGoodsIDsSet,disposableGoodsStockIDsSet,disposableGoodsBatchIDsSet, disposableGoodsBatchStockIDsSet, + disposableGoodsBatchNumberSet, identificationIDsSet, idToDisposableGoodsMap,disposableGoodsIDToDisposableGoodsStockMap,idToDisposableGoodsStockMap,idToDisposableGoodsBatchMap, + idToDisposableGoodsBatchStockMap, idToIdentificationMap , null); + + List originalItemList = original.getItemsList(); + List itemList = entry.getItemsList(); + List curItemList = curGodownEntry.getItemsList(); + + if(itemList.size() > 0){ + curGodownEntry.setSupplierName(itemList.get(0).getSupplierName()); + } + Long warehouseID = original.getWarehouseID(); + String warehouseName = original.getWarehouseName(); + // 处理修改 + for (int i = 0; i < itemList.size(); ++i) { + GodownEntryItem godownEntryItem = itemList.get(i); + Long itemID = godownEntryItem.getId(); + if(itemID == null){ + continue; + } + GodownEntryItem originalGodownEntryItem = ExpensiveGoodsUtils.getGodownEntryItemsByItemId(originalItemList, itemID); + if(originalGodownEntryItem == null){ + // 在页面上被删除了。 + //continue; + throw new RuntimeException("参数错误!"); + } + GodownEntryItem curGodownEntryItem = ExpensiveGoodsUtils.getGodownEntryItemsByItemId(curItemList, itemID); + if(curGodownEntryItem == null){ + // 被并发删除了,也不需要处理 + continue; + } + // 修改时,每一项都应该有ID + Long disposableGoodsID = godownEntryItem.getDisposableGoodsID(); + Long disposableGoodsStockID = godownEntryItem.getDisposableGoodsStockID(); + Long disposableGoodsBatchID = godownEntryItem.getDisposableGoodsBatchID(); + Long disposableGoodsBatchStockID = godownEntryItem.getDisposableGoodsBatchStockID(); + Long identificationID = godownEntryItem.getIdentificationID(); + if(disposableGoodsID == null){ + throw new RuntimeException("物品定义id不能为空,请升级数据!"); + } + if(disposableGoodsStockID == null){ + throw new RuntimeException("物品库存id不能为空,请升级数据!"); + } + if(disposableGoodsBatchID == null){ + throw new RuntimeException("物品批次id不能为空,请升级数据!"); + } + if(disposableGoodsBatchStockID == null){ + throw new RuntimeException("物品批次库存id不能为空,请升级数据!"); + } + if(identificationID == null){ + throw new RuntimeException("标识号不能为空,请升级数据!"); + } + DisposableGoods disposableGoods = idToDisposableGoodsMap.get(disposableGoodsID); + DisposableGoodsStock disposableGoodsStock = idToDisposableGoodsStockMap.get(disposableGoodsStockID); + // 查找批次定义 + DisposableGoodsBatch disposableGoodsBatch = idToDisposableGoodsBatchMap.get(disposableGoodsBatchID); + DisposableGoodsBatchStock disposableGoodsBatchStock = idToDisposableGoodsBatchStockMap.get(disposableGoodsBatchStockID); + DisposableGoodsIdentification identification = idToIdentificationMap.get(identificationID); + if(disposableGoods == null){ + throw new RuntimeException("物品定义不存在!"); + } + if(disposableGoodsStock == null){ + throw new RuntimeException("物品库存不存在!"); + } + if(disposableGoodsBatch == null){ + throw new RuntimeException("物品批次不存在!"); + } + if(disposableGoodsBatchStock == null){ + throw new RuntimeException("物品批次库存不存在!"); + } + if(!disposableGoods.expensiveDiposablegoods()){ + if(identification == null){ + throw new RuntimeException("标识号已被删除!"); + } + } + + // 修改普通属性 + // 注册证号 + String originalCertification = originalGodownEntryItem.getCertification(); + String certification = godownEntryItem.getCertification(); + if(!StringUtils.equals(originalCertification, certification)){ + curGodownEntryItem.setCertification(certification); + } + // 失效期 + Date originalExpDate = originalGodownEntryItem.getExpDate(); + Date expDate = godownEntryItem.getExpDate(); + if(!originalExpDate.equals(expDate)){ + curGodownEntryItem.setExpDate(expDate); + disposableGoodsBatchStock.setExpDate(expDate); + disposableGoodsBatch.setExpDate(expDate); + } + // 供应商 + String originalSupplierName = originalGodownEntryItem.getSupplierName(); + String supplierName = godownEntryItem.getSupplierName(); + if(!StringUtils.equals(originalSupplierName, supplierName)){ + curGodownEntryItem.setSupplierName(supplierName); + disposableGoodsBatchStock.setSupplierName(supplierName); + disposableGoodsBatch.setSupplierName(supplierName); + } + // 灭菌批次 + String originalSterileBatchNumber = originalGodownEntryItem.getSterileBatchNumber(); + String sterileBatchNumber = godownEntryItem.getSterileBatchNumber(); + if(!StringUtils.equals(originalSterileBatchNumber, sterileBatchNumber)){ + curGodownEntryItem.setSterileBatchNumber(sterileBatchNumber); + disposableGoodsBatchStock.setSterileBatchNumber(sterileBatchNumber); + disposableGoodsBatch.setSterileBatchNumber(sterileBatchNumber); + } + // 生产厂家 + String originalManufacturer = originalGodownEntryItem.getManufacturer(); + String manufacturer = godownEntryItem.getManufacturer(); + if(!StringUtils.equals(originalManufacturer, manufacturer)){ + curGodownEntryItem.setManufacturer(manufacturer); + disposableGoodsBatchStock.setManufacturer(manufacturer); + disposableGoodsBatch.setManufacturer(manufacturer); + } + // 修改库存 + Long originalAmount = originalGodownEntryItem.getAmount(); + Long amount = godownEntryItem.getAmount(); + Long curAmount = curGodownEntryItem.getAmount(); + if(!originalAmount.equals(amount)){ + if(!originalAmount.equals(curAmount)){// 有可能被并发修改了库存 + throw new RuntimeException("库存已被修改!"); + } + Long amountChange = amount - originalAmount; + if(disposableGoods.expensiveDiposablegoods()){ +// diposableGoodsManager.newExpensivediposablegoods(disposableGoodsBatchStock, amountChange, godownEntryItem.getConclusion(), entry.getTime(), godownEntryItem.getIdentification()); + throw new RuntimeException("暂不支持修改高值耗材库存!"); + }else{ + identification.adjustAmount(amountChange); + } + + curGodownEntryItem.setAmount(amount); + } + // 修改价格 + Double originalPrice = originalGodownEntryItem.getCost(); + Double price = godownEntryItem.getCost(); + Double curPrice = curGodownEntryItem.getCost(); + if(!originalPrice.equals(price)){ + if(!price.equals(curPrice)){// 这个判断是有必要的,有可能价格已经被并发修改过了。所以就不需要再修改。 + disposableGoodsBatchStock.setCost(price); + disposableGoodsBatch.setCost(price); + disposableGoods.setReferencePrice(price); + curGodownEntryItem.setCost(price); + + if(disposableGoods.expensiveDiposablegoods()){ + throw new RuntimeException("暂不支持修改高值耗材价格!"); + }else{ + identification.setPrice(price); + // 同步修改发货和退货记录 + synchronizePriceFromIdentificationToInvoiceAndReturnRecord(disposableGoods,identification,originalPrice,price); + } + } + } + // 有无生物检测报告 + String originalHasBiologicalTestReport = originalGodownEntryItem.getHasBiologicalTestReport(); + String hasBiologicalTestReport = godownEntryItem.getHasBiologicalTestReport(); + if(!StringUtils.equals(originalHasBiologicalTestReport, hasBiologicalTestReport)){ + curGodownEntryItem.setHasBiologicalTestReport(hasBiologicalTestReport); + } + // 有无发票 + String originalHasInvoice = originalGodownEntryItem.getHasInvoice(); + String hasInvoice = godownEntryItem.getHasInvoice(); + if(!StringUtils.equals(originalHasInvoice, hasInvoice)){ + curGodownEntryItem.setHasInvoice(hasInvoice); + } + // 类别 + String originalGrade = originalGodownEntryItem.getGrade(); + String grade = godownEntryItem.getGrade(); + if(!StringUtils.equals(originalGrade, grade)){ + curGodownEntryItem.setGrade(grade); + disposableGoods.setGrade(godownEntryItem.getGrade()); + } + if(identification != null){ + objectDao.update(identification); + } + objectDao.update(disposableGoodsBatchStock); + objectDao.update(disposableGoodsStock); + objectDao.update(disposableGoodsBatch); + objectDao.update(disposableGoods); + } + // 处理新增 + for (int i = 0; i < itemList.size(); ++i) { + GodownEntryItem godownEntryItem = itemList.get(i); + Long itemID = godownEntryItem.getId(); + if(itemID != null){// 有id就不是新增项 + continue; + } + // 保存godownEntryItem + godownEntryItem.setGodownEntry(curGodownEntry); + curItemList.add(godownEntryItem); + objectDao.save(godownEntryItem); + warehousingByGodownEntryItem(curGodownEntry, warehouseID, warehouseName, idToDisposableGoodsMap, idToDisposableGoodsStockMap, idToDisposableGoodsBatchStockMap, godownEntryItem); + + } + // 处理删除项 + for (int i = 0; i < originalItemList.size(); ++i) { + GodownEntryItem originalGodownEntryItem = originalItemList.get(i); + Long itemID = originalGodownEntryItem.getId(); + if(itemID == null){ + continue; + } + GodownEntryItem godownEntryItem = ExpensiveGoodsUtils.getGodownEntryItemsByItemId(itemList, itemID); + if(godownEntryItem != null){// 现在还存在,就不是删除项 + // 在页面上被删除了。 + continue; + } + GodownEntryItem curGodownEntryItem = ExpensiveGoodsUtils.getGodownEntryItemsByItemId(curItemList, itemID); + if(curGodownEntryItem == null){ + // 被并发删除了。也不需要处理 + continue; + } + // 修改时,每一项都应该有ID + Long disposableGoodsID = originalGodownEntryItem.getDisposableGoodsID(); + Long disposableGoodsStockID = originalGodownEntryItem.getDisposableGoodsStockID(); + Long disposableGoodsBatchID = originalGodownEntryItem.getDisposableGoodsBatchID(); + Long disposableGoodsBatchStockID = originalGodownEntryItem.getDisposableGoodsBatchStockID(); + Long identificationID = originalGodownEntryItem.getIdentificationID(); + if(disposableGoodsID == null){ + throw new RuntimeException("物品定义id不能为空,请升级数据!"); + } + if(disposableGoodsStockID == null){ + throw new RuntimeException("物品库存id不能为空,请升级数据!"); + } + if(disposableGoodsBatchID == null){ + throw new RuntimeException("物品批次id不能为空,请升级数据!"); + } + if(disposableGoodsBatchStockID == null){ + throw new RuntimeException("物品批次库存id不能为空,请升级数据!"); + } + if(identificationID == null){ + throw new RuntimeException("标识号不能为空,请升级数据!"); + } + DisposableGoods disposableGoods = idToDisposableGoodsMap.get(disposableGoodsID); + DisposableGoodsStock disposableGoodsStock = idToDisposableGoodsStockMap.get(disposableGoodsStockID); + // 查找批次定义 + DisposableGoodsBatch disposableGoodsBatch = idToDisposableGoodsBatchMap.get(disposableGoodsBatchID); + DisposableGoodsBatchStock disposableGoodsBatchStock = idToDisposableGoodsBatchStockMap.get(disposableGoodsBatchStockID); + DisposableGoodsIdentification identification = idToIdentificationMap.get(identificationID); + if(disposableGoods == null){ + throw new RuntimeException("物品定义不存在!"); + } + if(disposableGoodsStock == null){ + throw new RuntimeException("物品库存不存在!"); + } + if(disposableGoodsBatch == null){ + throw new RuntimeException("物品批次不存在!"); + } + if(disposableGoodsBatchStock == null){ + throw new RuntimeException("物品批次库存不存在!"); + } + if(identification == null){ + throw new RuntimeException("标识号已被删除!"); + } + Long originalAmount = originalGodownEntryItem.getAmount(); + Long amountChange = -originalAmount; + identification.adjustAmount(amountChange); + + objectDao.update(identification); + objectDao.update(disposableGoodsBatchStock); + objectDao.update(disposableGoodsStock); + objectDao.update(disposableGoodsBatch); + objectDao.update(disposableGoods); + + // TODO 如果标识号库存为0了,并且没有入库单引用它,那么可以删除标识号 +// if(false){ +// batchStock.getIdentifications().remove(identification); +// objectDao.delete(identification); +// } + // 删除godownEntryItem + curItemList.remove(curGodownEntryItem); + objectDao.delete(curGodownEntryItem); + } + // 更新入库单属性 + updateGodownEntryProperties(original, entry, curGodownEntry); + //setGodownEntryDefaultWareHouse(curGodownEntry); + setGodownEntrySubType(curGodownEntry, GodownEntry.SUBTYPE_MANUAL_IN); + syncGodownEntryWareHouse(curGodownEntry); + curGodownEntry.calculateTotalPrice(); + // 更新入库单对象 + saveOrUpdate(curGodownEntry); + // 设置GodownEntryItem详细列表 + setReturnDetails(curGodownEntry,idToDisposableGoodsBatchMap, idToDisposableGoodsBatchStockMap,result); + } + /** + * 同步入库单、出库单、调拨单的物品的仓库,使之与单的对应属性一致 + * @param original + */ + private void syncGodownEntryWareHouse(GodownEntry entry){ + if(entry != null){ + Long wareHouseId = entry.getWarehouseID(); + String wareHouseName = entry.getWarehouseName(); + for(GodownEntryItem item : entry.getItemsList()){ + godownEntryItemManager.setWareHouse(item, wareHouseId,wareHouseName); + } + } + } + // 根据库存操作类型来新建相关的批次和库存对象。 + private void createDisposableGoodsBatchAndStockByEntryType(String entryType,Long warehouseID,String warehouseName, + Map idToDiposableGoodsMap,Map disposableGoodsIDToDisposableGoodsStockMap, + Map idToDisposableGoodsStockMap){ + if(!StringUtils.equals(entryType, GodownEntry.TYPE_IN)){ + return;// 目前只有入库才会新加批次和库存对象 + } + // 首先增加物品库存对象 + for (Map.Entry entry : idToDiposableGoodsMap.entrySet()) { + Long disposableGoodsID = entry.getKey(); + DisposableGoods disposableGoods = entry.getValue(); + if(!disposableGoodsIDToDisposableGoodsStockMap.containsKey(disposableGoodsID)){ + // 根据仓库id和一次性物品定义id查找库存对象 + DisposableGoodsStock disposableGoodsStock = diposableGoodsManager.getDisposableGoodsStockByDisposableGoodsID(warehouseID, disposableGoodsID); + // 新增物品库存 + if(disposableGoodsStock == null){ + disposableGoodsStock = diposableGoodsManager.createDisposableGoodsStock(warehouseID, warehouseName, disposableGoods); + } + if(disposableGoodsStock == null){ + throw new RuntimeException("创建物品库存失败!"); + } + idToDisposableGoodsStockMap.put(disposableGoodsStock.getId(), disposableGoodsStock); + disposableGoodsIDToDisposableGoodsStockMap.put(disposableGoodsStock.getDisposableGoodsID(), disposableGoodsStock); + } + } + } + // 获取并锁定一次性物品相关资源,TODO 加载物品批次待优化 + @SuppressWarnings("unchecked") + private void lockAndGetDiposableGoodsResources(String entryType,Long warehouseID,String warehouseName,Set diposableGoodsIDsSet,Set diposableGoodsStockIDsSet,Set disposableGoodsBatchIDsSet, + Set disposableGoodsBatchStockIDsSet, Set batchNumbersSet, + Set identificationIdsSet, + Map idToDiposableGoodsMap,Map disposableGoodsIDToDisposableGoodsStockMap,Map idToDisposableGoodsStockMap, + Map idToDisposableGoodsBatchMap ,Map idToBatchStockMap, + Map idToIdentificationMap , List disposableGoodsStorageAdjustVoList) { + if(!DatabaseUtil.isPoIdValid(warehouseID)){ + throw new RuntimeException("仓库信息不能为空!"); + } + // 锁定一次性物品 + List disposableGoodsList = diposableGoodsManager.getDisposableGoodsByDisposableGoodsIDs_ForUpdate(diposableGoodsIDsSet); + if (disposableGoodsList == null + || disposableGoodsList.size() != diposableGoodsIDsSet.size()) { + throw new RuntimeException("某些物品已被删除!"); + } + for (DisposableGoods disposableGoods : disposableGoodsList) { + idToDiposableGoodsMap.put(disposableGoods.getId(), disposableGoods); + } + // 可以直接根据物品定义和仓库获取仓库下面对应的所有物品库存对象 + List disposableGoodsStocks = diposableGoodsManager.getDisposableGoodsStockByDisposableGoodsIDs(warehouseID.toString(),diposableGoodsIDsSet); + if(disposableGoodsStocks != null){ + for (DisposableGoodsStock disposableGoodsStock : disposableGoodsStocks) { + idToDisposableGoodsStockMap.put(disposableGoodsStock.getId(), disposableGoodsStock); + disposableGoodsIDToDisposableGoodsStockMap.put(disposableGoodsStock.getDisposableGoodsID(), disposableGoodsStock); + } + } +// List disposableGoodsStockList = diposableGoodsManager.getDisposableGoodsStockByDisposableGoodsStockIDs(diposableGoodsStockIDsSet); +// if(diposableGoodsStockIDsSet.size() > 0){ +// if (disposableGoodsStockList == null +// || disposableGoodsStockList.size() != diposableGoodsStockIDsSet.size()) { +// throw new RuntimeException("某些物品已被删除!"); +// } +// } + + // 加载所有的批次定义 + String getDisposableGoodsBatchSql = String.format(" where %s ", + SqlUtils.getNonStringFieldInCollectionsPredicate("po.diposableGoods.id", diposableGoodsIDsSet)); + List disposableGoodsBatchs = objectDao.findBySql(DisposableGoodsBatch.class.getSimpleName(),getDisposableGoodsBatchSql); + if(disposableGoodsBatchs != null){ + for (DisposableGoodsBatch disposableGoodsBatch : disposableGoodsBatchs) { + idToDisposableGoodsBatchMap.put(disposableGoodsBatch.getId(), disposableGoodsBatch); + } + } + + // 获取相关批次和标识号 + List batchStocks = null; + String batchStockIDsStr = SqlUtils + .joinToWhereInConditionForNonStringProperties(disposableGoodsBatchStockIDsSet); + if (StringUtils.isNotBlank(batchStockIDsStr)) { + String batchStockSql = String.format(" where %s ", + SqlUtils.getStringFieldInCollectionsPredicate("po.id", disposableGoodsBatchStockIDsSet)); + batchStocks = objectDao.findBySql( + DisposableGoodsBatchStock.class.getSimpleName(), + batchStockSql); + } + +// if (batchStocks == null || batchStocks.size() != batchIdsSet.size()) { +// throw new RuntimeException("某些批次已被删除!"); +// } + if (batchStocks != null){ + for (DisposableGoodsBatchStock diposableGoodBatchStock : batchStocks) { + idToBatchStockMap.put(diposableGoodBatchStock.getId(), + diposableGoodBatchStock); + } + } + String getIdentificationSql = String.format(" where %s ", + SqlUtils.getNonStringFieldInCollectionsPredicate("po.id", identificationIdsSet)); + List identifications = objectDao + .findBySql(DisposableGoodsIdentification.class.getSimpleName(), + getIdentificationSql); + +// if (identifications == null +// || identifications.size() != identificationIdsSet.size()) { +// throw new RuntimeException("某些标识号已被删除!"); +// } + if(identifications != null){ + for (DisposableGoodsIdentification identificationOfDiposableGoods : identifications) { + idToIdentificationMap.put(identificationOfDiposableGoods.getId(), + identificationOfDiposableGoods); + } + } + createDisposableGoodsBatchAndStockByEntryType(entryType, warehouseID, warehouseName, idToDiposableGoodsMap, disposableGoodsIDToDisposableGoodsStockMap, idToDisposableGoodsStockMap); + } + + // 获取并锁定一次性物品相关资源,TODO 加载物品批次待优化 + private void lockAndGetDiposableGoodsResourcesForCancellingStocks( + String entryType, Long warehouseID, String warehouseName, + DisposableGoodsServiceContext disposableGoodsServiceContext) { + if (!DatabaseUtil.isPoIdValid(warehouseID)) { + throw new RuntimeException("仓库信息不能为空!"); + } + // 获取并锁定一次性物品相关资源 + diposableGoodsManager + .lockAndGetDisposableGoodsResources(disposableGoodsServiceContext); + } + + private void summaryDiposableGoodsInfo(GodownEntry entry,Set disposableGoodsIDsSet, + Set disposableGoodsStockIDsSet, Set disposableGoodsBatchIDsSet,Set disposableGoodsBatchStockIDsSet, + Set batchNumbersSet, Set identificationIdsSet) { + if(entry == null){ + return; + } + List itemList = entry.getItemsList(); + for (GodownEntryItem godownEntryItem : itemList) { + Long disposableGoodsID = godownEntryItem.getDisposableGoodsID(); + Long disposableGoodsStockID = godownEntryItem.getDisposableGoodsStockID(); + if(disposableGoodsID == null){ + throw new RuntimeException("物品定义的id不能为空!"); + } + disposableGoodsIDsSet.add(disposableGoodsID); + if(disposableGoodsStockID != null){ + disposableGoodsStockIDsSet.add(disposableGoodsStockID); + } + + Long disposableGoodsBatchID = godownEntryItem.getDisposableGoodsBatchID(); + Long disposableGoodsBatchStockID = godownEntryItem.getDisposableGoodsBatchStockID(); + if(disposableGoodsBatchID != null){ + disposableGoodsBatchIDsSet.add(disposableGoodsBatchID); + } + if(disposableGoodsBatchStockID != null){ + disposableGoodsBatchStockIDsSet.add(disposableGoodsBatchStockID); + } + + Long identificationID = godownEntryItem.getIdentificationID(); + if(identificationID != null){ + identificationIdsSet.add(identificationID); + } + + String batchNumber = godownEntryItem.getBatchNumber(); + if(batchNumber != null){ + batchNumbersSet.add(batchNumber); + } + } + } + // 设置GodownEntryItem详细列表 TODO 改为json格式 + private void setReturnDetails(GodownEntry entry,Map idToDisposableGoodsBatchMap,Map idToBatchStockMap,Map result){ + JSONArray jsonArray = new JSONArray(); + List items = entry.getItemsList(); + Date date = new Date(); + for (GodownEntryItem godownEntryItem : items) { + String expDateStr = ""; + Boolean newBatch = godownEntryItem.getNewBatch(); + DisposableGoodsStock diposableGoods = godownEntryItem.getDiposableGoods(); + Date expDate = godownEntryItem.getExpDate(); + if(expDate != null){ + expDateStr = Constants.SIMPLEDATEFORMAT_YYYYMMDD.format(expDate); + } + String specification = ""; + if(diposableGoods != null){ + specification = diposableGoods.getSpecification(); + if (StringUtils.isBlank(specification)){ + specification = ""; + } + } + String barcode = ""; + DisposableGoodsBatchStock batchStock = idToBatchStockMap.get(godownEntryItem.getDisposableGoodsBatchStockID()); + if(batchStock == null){ + Long diposableGoodsID = godownEntryItem.getDisposableGoodsStockID(); + String batchNumber = godownEntryItem.getBatchNumber(); + if(!DatabaseUtil.isPoIdValid(diposableGoodsID)){ + if(diposableGoods != null){ + diposableGoodsID = diposableGoods.getId();// 旧数据 + } + } + if(DatabaseUtil.isPoIdValid(diposableGoodsID) && StringUtils.isNotBlank(batchNumber)){ + batchStock = diposableGoodBatchStockManager.getDiposableGoodBatchStock(diposableGoods.getId().toString(), godownEntryItem.getBatchNumber()); + } + } + if(batchStock != null){ + barcode = batchStock.getBarcode(); + } + // 更新打印状态 + if(newBatch != null && newBatch){ + Long disposableGoodsBatchId = godownEntryItem.getDisposableGoodsBatchID(); + if(disposableGoodsBatchId != null){ + DisposableGoodsBatch disposableGoodsBatch = diposableGoodsManager.getDisposableGoodsBatchById(disposableGoodsBatchId); + if(disposableGoodsBatch != null){ + disposableGoodsBatch.setHasPrinted(Constants.STR_YES); + disposableGoodsBatch.setPrintTime(date); + objectDao.update(disposableGoodsBatch); + } + } + + } + List expensiveDisposablegoodsList = diposableGoodsManager.getExpensivediposablegoodsByGodownEntryItemId(godownEntryItem.getId()); + if(!CollectionUtils.isEmpty(expensiveDisposablegoodsList)){ + for (ExpensiveDisposablegoods expensiveDisposablegoods : expensiveDisposablegoodsList) { + JSONObject printItemObj = new JSONObject(); + printItemObj.put("fullName", godownEntryItem.getDiposableGoods().getName()); + printItemObj.put("newBatch", godownEntryItem.getNewBatch()); + printItemObj.put("barcode", expensiveDisposablegoods.getBarcode()); + printItemObj.put("expDate", expDateStr); + printItemObj.put("supplierName", godownEntryItem.getSupplierName()); + printItemObj.put("batchNumber", godownEntryItem.getBatchNumber()); + printItemObj.put("specification", specification); + printItemObj.put("type", "高值耗材"); + jsonArray.add(printItemObj); + } + }else{ + JSONObject printItemObj = new JSONObject(); + printItemObj.put("fullName", godownEntryItem.getDiposableGoods().getName()); + printItemObj.put("newBatch", godownEntryItem.getNewBatch()); + printItemObj.put("barcode", barcode); + printItemObj.put("expDate", expDateStr); + printItemObj.put("supplierName", godownEntryItem.getSupplierName()); + printItemObj.put("batchNumber", godownEntryItem.getBatchNumber()); + printItemObj.put("specification", specification); + printItemObj.put("type", "批次"); + jsonArray.add(printItemObj); + } + + } + result.put("itemsDetails", jsonArray); + } + // 同步修改发货和退货记录 ,为了不依赖发货和退货两个模块,代码就写在这。 + private void synchronizePriceFromIdentificationToInvoiceAndReturnRecord( + DisposableGoods diposableGoods, + DisposableGoodsIdentification identification, Double oldPrice, + Double newPrice) { + // 如果存在发货或者退货记录,不允许修改价格。 + String diposableGoodsItemSql = String.format( + " where po.identificationID=%s ", identification.getId()); + int diposableGoodsItemCount = objectDao + .countObjectBySql(DiposableGoodsItem.class.getSimpleName(), + diposableGoodsItemSql); + if (diposableGoodsItemCount > 0) { + throw new RuntimeException(String.format("物品[%s]已发货,不允许修改价格!", + diposableGoods.getShowName())); + } + // 如果存在领用记录,不允许修改价格。 + String receiveRecordDiposableGoodsItemSql = String.format( + " where po.identificationID=%s ", identification.getId()); + int receiveRecordDiposableGoodsItemCount = objectDao.countObjectBySql( + ReceiveRecordDiposableGoodsItem.class.getSimpleName(), + receiveRecordDiposableGoodsItemSql); + if (receiveRecordDiposableGoodsItemCount > 0) { + throw new RuntimeException(String.format("物品[%s]已领用,不允许修改价格!", + diposableGoods.getShowName())); + } + // 如果存在出库记录,不允许修改价格 + String godownEntryDiposableGoodsItemSql = String.format( + " where po.identificationID=%s ", identification.getId()); + int godownEntryDiposableGoodsItemCount = objectDao.countObjectBySql( + GodownEntryDiposableGoodsItem.class.getSimpleName(), + godownEntryDiposableGoodsItemSql); + if (godownEntryDiposableGoodsItemCount > 0) { + throw new RuntimeException(String.format("物品[%s]已出库,不允许修改价格!", + diposableGoods.getShowName())); + } + } + + // 保存退库单 + @Override + public List saveGodownOutEntry_TRANS_REQUIRED(GodownEntry entry, + Map result , boolean needWriteBack) { + return saveGodownOutEntry_internal(entry, result , needWriteBack); + } + /** + * + */ + @Override + public void saveAppropriateEntry_TRANS_REQUIRED(GodownEntry entry,Map result){ + if(entry != null){ + entry.setId(null); + entry.setType(GodownEntry.TYPE_APPROPRIATE); + entry.setOrgUnitCode(AcegiHelper.getCurrentOrgUnitCode()); + entry.setOrgUnitName(AcegiHelper.getCurrentOrgUnitName()); + WareHouse wareHouse = wareHouseManager.getWareHouseById(entry.getTargetWareHouseId()); + if(wareHouse != null){ + entry.setTargetOrgUnitCode(wareHouse.getOrgUnitCode()); + entry.setTargetOrgUnitName(wareHouse.getOrgUnitName()); + } + save(entry); + + GodownEntry inEntry = clone(entry); + inEntry.setId(null); + inEntry.setType(GodownEntry.TYPE_IN); + inEntry.setSubType(GodownEntry.SUBTYPE_MOVE_IN); + inEntry.setTargetWareHouseId(null); + inEntry.setTargetWareHouseName(null); + inEntry.setWarehouseID(entry.getTargetWareHouseId()); + inEntry.setWarehouseName(entry.getTargetWareHouseName()); + + for(GodownEntryItem item : inEntry.getItemsList()){ + item.setDisposableGoodsStockID(null); + item.setDisposableGoodsBatchStockID(null); + } + + GodownEntry outEntry = clone(entry); + outEntry.setId(null); + outEntry.setType(GodownEntry.TYPE_OUT); + outEntry.setSubType(GodownEntry.SUBTYPE_MOVE_OUT); + //outEntry.setTargetWareHouseId(null); + //outEntry.setTargetWareHouseName(null); + outEntry.setWarehouseID(entry.getWarehouseID()); + outEntry.setWarehouseName(entry.getWarehouseName()); + + Map outResult = new HashMap(); + //设置单的关系 + inEntry.setSourceId(entry.getId()); + outEntry.setSourceId(entry.getId()); + + //生成调拨出库和调拨入库业务方法 + //生成调拨出库记录 + List disposableGoodsStorageAdjustVoList = saveGodownOutEntry_internal(outEntry, outResult , false); + + //生成调拨入库记录 + saveGodownEntryModifyOnlyAmount_internal(inEntry, result , disposableGoodsStorageAdjustVoList); + + //省医回写接口调用 + if(CssdUtils.isProject("gdsy") && writeBackInventoryDao != null){ + if(CollectionUtils.isNotEmpty(disposableGoodsStorageAdjustVoList)){ + //调拨由于调入与调出方式的库存都发生了变化,所以需要实时回写。 + /*4 + */ + //退库单的二级科室-供应室 + OrgUnit sendDepartmentOrgUnit = (OrgUnit)objectDao.getByProperty(OrgUnit.class.getSimpleName(), "orgUnitCoding", entry.getOrgUnitCode()); + //退库单的一级科室-设备仓库(健迅系统的一级科室推入库单数据过来只会有一个一级科室,且id不会变) + OrgUnit receiveDepartmentOrgUnit = (OrgUnit)objectDao.getByProperty(OrgUnit.class.getSimpleName(), "orgUnitCoding", entry.getTargetOrgUnitCode()); + String xmlParam = "4" + sendDepartmentOrgUnit.getIdFromHisSync() + "" + + "" + receiveDepartmentOrgUnit.getIdFromHisSync() + "" + + "APPR_" + entry.getSerialNumber() + ""; + + xmlParam += writeBackInventoryDao.getXmlStringOfWriteBackDataDetailList(disposableGoodsStorageAdjustVoList); + logger.debug("调拨回写参数xmlParam="+xmlParam); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DISPOSABLEGOODS_WRITEBACK, Log.TYPE_ADD, "调拨回写参数xmlParam="+xmlParam); + String writeBackResult = writeBackInventoryDao.insertWriteBackForCommon(xmlParam); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DISPOSABLEGOODS_WRITEBACK, Log.TYPE_ADD, "调拨回写参数xmlParam="+xmlParam+",对应的回写结果=" + writeBackResult); + JSONObject jsonReturn = JSONObject.fromObject(writeBackResult); + if(!jsonReturn.optBoolean("success")){ + throw new RuntimeException(ConstantDefinition.WRITEBACK_RESULTMESSAGE_PREFIX + jsonReturn.optString("message")); + } + } + } + + //设置库存关系,但是调拨单本身不影响库存 + for(GodownEntryItem item : entry.getItemsList()){ + item.setDiposableGoods(diposableGoodsManager.getDisposableGoodsStockById(item.getDisposableGoodsStockID() + "")); + } + } + } + /** + * 从源对象中复制一个信息一样的副本,但是修改了引用关系,同时里面的item也是副本 + * @param source + * @return + */ + private GodownEntry clone(GodownEntry source){ + if(source == null){ + return null; + } + GodownEntry newEntry = new GodownEntry(); + newEntry.setInventoryWriteBackEntryId(source.getInventoryWriteBackEntryId()); + newEntry.setOperator(source.getOperator()); + newEntry.setRemark(source.getRemark()); + newEntry.setSerialNumber(serialNumManager.getSerialNumberStr(SerialNum.TYPE_INSERT_GODOWN)); + newEntry.setSourceId(source.getSourceId()); + newEntry.setSupplierName(source.getSupplierName()); + newEntry.setTime(source.getTime()); + newEntry.setTotalPrice(source.getTotalPrice()); + newEntry.setId(null); + newEntry.setSubType(source.getSubType()); + newEntry.setTargetWareHouseId(source.getTargetWareHouseId()); + newEntry.setTargetWareHouseName(source.getTargetWareHouseName()); + newEntry.setTargetOrgUnitCode(source.getTargetOrgUnitCode()); + newEntry.setTargetOrgUnitName(source.getTargetOrgUnitName()); + newEntry.setType(source.getType()); + newEntry.setWarehouseID(source.getWarehouseID()); + newEntry.setWarehouseName(source.getWarehouseName()); + newEntry.setOrgUnitCode(source.getOrgUnitCode()); + newEntry.setOrgUnitName(source.getOrgUnitName()); + + //设置item项 + for(GodownEntryItem item : source.getItemsList()){ + GodownEntryItem newItem = godownEntryItemManager.clone(item); + newItem.setGodownEntry(newEntry); + newItem.setId(null); + newItem.setNewBatch(false); + newEntry.addItem(newItem); + } + this.syncGodownEntryWareHouse(newEntry); + return newEntry; + } + + @Override + public void saveGodownOutEntry_TRANS_MANDATORY( + Collection entrys, Map result) { + //手工添加退库单,暂定需要回写 + boolean needWriteBack = true; + saveGodownOutEntry_internal(entrys, result ,needWriteBack); + + } + + /** + * 保存退库单(并根据所传参数决定是否需要调用回写) + * @param entrys + * @param result + * @param needWriteBack 是否需要回写,为true时需要 + */ + private List saveGodownOutEntry_internal(Iterable entrys, + Map result , boolean needWriteBack) { + if(entrys == null){ + return null; + } + List disposableGoodsStorageAdjustVoList = new ArrayList(); + DisposableGoodsServiceContext disposableGoodsServiceContext = new DisposableGoodsServiceContext(); + Long warehouseID = null; + String warehouseName = null; + for (GodownEntry godownEntry : entrys) { + warehouseID = godownEntry.getWarehouseID(); + warehouseName = godownEntry.getWarehouseName(); + // 汇总信息 + summaryDiposableGoodsInfoForGodownOutEntry2(godownEntry, disposableGoodsServiceContext); + } + + // 获取并锁定一次性物品相关资源 + lockAndGetDiposableGoodsResourcesForCancellingStocks(GodownEntry.TYPE_OUT,warehouseID,warehouseName,disposableGoodsServiceContext); + for (GodownEntry godownEntry : entrys) { + List list = saveGodownOutEntry_internal(godownEntry, disposableGoodsServiceContext,needWriteBack); + if(CollectionUtils.isNotEmpty(list)){ + disposableGoodsStorageAdjustVoList.addAll(list); + } + } + return disposableGoodsStorageAdjustVoList; + } + private List saveGodownOutEntry_internal(GodownEntry godownEntry, + Map result , boolean needWriteBack) { + DisposableGoodsServiceContext disposableGoodsServiceContext = new DisposableGoodsServiceContext(); + // 汇总信息 + summaryDiposableGoodsInfoForGodownOutEntry2(godownEntry, disposableGoodsServiceContext); + + lockAndGetDiposableGoodsResourcesForCancellingStocks(GodownEntry.TYPE_OUT,godownEntry.getWarehouseID(),godownEntry.getWarehouseName(),disposableGoodsServiceContext); + + return saveGodownOutEntry_internal(godownEntry, disposableGoodsServiceContext , needWriteBack); + } + + /** + * @param entry + * @param idToDisposableGoodsStockMap + * @param idToBatchStockMap + */ + private List saveGodownOutEntry_internal(GodownEntry entry, + DisposableGoodsServiceContext disposableGoodsServiceContext, boolean needWriteBack) { + List disposableGoodsStorageAdjustVoList = new ArrayList(); + Map idToDisposableGoodsMap = disposableGoodsServiceContext + .getIdToDisposableGoodsMap(); + Map idToDisposableGoodsStockMap = disposableGoodsServiceContext + .getIdToDisposableGoodsStockMap(); + Map idToDisposableGoodsBatchStockMap = disposableGoodsServiceContext + .getIdToDisposableGoodsBatchStockMap(); + // 保存入库单对象,后面需要绑定入库单和itemID + /*if(StringUtils.isBlank(entry.getSerialNumber())){// 有可能在其他地方设置了,比如同步入库单/导入入库单 + entry.setSerialNumber(serialNumManager + .getSerialNumberStr(SerialNum.TYPE_INSERT_GODOWN)); + }*/ + this.save(entry); + //objectDao.save(entry); + List itemList = entry.getItemsList(); + for (int i = 0; i < itemList.size(); ++i) { + GodownEntryItem godownEntryItem = itemList.get(i); + Long disposableGoodsId = godownEntryItem.getDisposableGoodsID(); + if (disposableGoodsId == null) { + throw new RuntimeException("一次性物品定义id不能为空!"); + } + DisposableGoods disposableGoods = idToDisposableGoodsMap + .get(disposableGoodsId); + if (disposableGoods == null) { + throw new RuntimeException("物品定义已被删除!"); + } + Long disposableGoodsStockID = godownEntryItem.getDisposableGoodsStockID(); + if (disposableGoodsStockID == null) { + throw new RuntimeException("一次性物品库存为空!"); + } + DisposableGoodsStock disposableGoodsStock = idToDisposableGoodsStockMap + .get(disposableGoodsStockID); + if (disposableGoodsStock == null) { + throw new RuntimeException("物品已被删除!"); + } + if(disposableGoods.expensiveDiposablegoods()){ + List list = newGodownEntryDisposableGoodsItemForExpensiveDisposablegoods(entry, disposableGoodsServiceContext, godownEntryItem); + if(CollectionUtils.isNotEmpty(list)){ + disposableGoodsStorageAdjustVoList.addAll(list); + } + }else{ + List list = newGodownEntryDiposableGoodsItem(entry, idToDisposableGoodsStockMap, + idToDisposableGoodsBatchStockMap, godownEntryItem); + if(CollectionUtils.isNotEmpty(list)){ + disposableGoodsStorageAdjustVoList.addAll(list); + } + } + godownEntryItem.setDiposableGoods(disposableGoodsStock);// 和一次性物品库存关联 + objectDao.update(godownEntryItem); + } + + //如果需要回写为true,这时才回写 + if(needWriteBack){ + // 回写物资系统 + writeBackForDiposableGoodsStorageOut(entry , disposableGoodsStorageAdjustVoList); + } + return disposableGoodsStorageAdjustVoList; + } + + /** + * 构造新的一次性物品入库明细,返回各标识数据及库存调整数量 + * @param entry + * @param idToDiposableGoodsMap + * @param idToBatchStockMap + * @param godownEntryItem + * @return List + */ + private List newGodownEntryDiposableGoodsItem(GodownEntry entry, + Map idToDiposableGoodsMap, + Map idToBatchStockMap, + GodownEntryItem godownEntryItem) { + List result = new ArrayList(); + Long disposableGoodsID = godownEntryItem.getDisposableGoodsID(); + Long disposableGoodsStockID = godownEntryItem.getDisposableGoodsStockID(); + DisposableGoodsStock diposableGoods = idToDiposableGoodsMap + .get(disposableGoodsStockID); + Long disposableGoodsBatchID = godownEntryItem.getDisposableGoodsBatchID(); + Long disposableGoodsBatchStockID = godownEntryItem.getDisposableGoodsBatchStockID(); + //物资系统的batchId + Long batchIdFromHisSync = godownEntryItem.getBatchIdFromHisSync(); + //深圳南山同步入库时传递的批次batchId + String identificationSync = godownEntryItem.getIdentification(); + String batchNumber = godownEntryItem.getBatchNumber(); + DisposableGoodsBatchStock disposableGoodsBatchStock = null; + if(!DatabaseUtil.isPoIdValid(disposableGoodsID)){ + throw new RuntimeException("disposableGoodsID不能为空!"); + } + if(!DatabaseUtil.isPoIdValid(disposableGoodsStockID)){ + throw new RuntimeException("disposableGoodsStockID不能为空!"); + } + if(!DatabaseUtil.isPoIdValid(disposableGoodsBatchID)){ + throw new RuntimeException("disposableGoodsBatchID不能为空!"); + } + if(!DatabaseUtil.isPoIdValid(disposableGoodsBatchStockID)){ + throw new RuntimeException("disposableGoodsBatchStockID不能为空!"); + } + // 因为批次必须选择,所以batchID不为null + if (disposableGoodsBatchStockID == null) { + // 有可能该批次已经存在,尝试根据批次获取 + disposableGoodsBatchStock = getDiposableGoodBatchStockByBatchNumber(disposableGoodsStockID,batchNumber); +// throw new RuntimeException("批次ID为空!"); + }else{ + disposableGoodsBatchStock = idToBatchStockMap.get(disposableGoodsBatchStockID); + } + if (disposableGoodsBatchStock == null) { + // 批次已经不存在 + throw new RuntimeException("批次已被删除!"); + } + if(disposableGoodsBatchStockID == null){ + disposableGoodsBatchStockID = disposableGoodsBatchStock.getId(); + godownEntryItem.setDisposableGoodsBatchStockID(disposableGoodsBatchStockID); + } + + // 退库不需要更新批次相关信息 + long outAmount = godownEntryItem.getAmount(); + if(outAmount <= 0){ + throw new RuntimeException("退库数量必须大于0!"); + } + // 这是用户在页面看到的退库价格,必须从这些价格的标识号里面退库 + Double outPrice = godownEntryItem.getCost(); + + List identifications = null; + if(DatabaseUtil.isPoIdValid(batchIdFromHisSync)){ + identifications = objectDao.findBySql(DisposableGoodsIdentification.class.getSimpleName(), + " where batchStock.id="+ disposableGoodsBatchStockID +" and batchIdFromHisSync=" + batchIdFromHisSync); + }else{ + identifications = disposableGoodsBatchStock.getIdentifications(); + } + // 开始退库 + for (DisposableGoodsIdentification identification : identifications) { + Long restAmount = identification.getAmount(); + Double price = identification.getPrice(); + if(restAmount <= 0){ + continue; + } + //出库单的成功不为空时才比较价格,否则忽略 + if(outPrice != null && !outPrice.equals(price)){ + continue; + } + Long curOutAmount = Math.min(outAmount, restAmount); + GodownEntryDiposableGoodsItem diposableGoodsItem = new GodownEntryDiposableGoodsItem(); + diposableGoodsItem.setAmount(curOutAmount); + diposableGoodsItem.setPrice(price); + diposableGoodsItem.setGoodsName(diposableGoods.getShowNameForSmallestUnit()); + diposableGoodsItem.setDisposableGoodsID(disposableGoodsID); + diposableGoodsItem.setDisposableGoodsStockID(disposableGoodsStockID); + diposableGoodsItem.setDisposableGoodsBatchID(disposableGoodsBatchID); + diposableGoodsItem.setDisposableGoodsBatchStockID(disposableGoodsBatchStockID); + diposableGoodsItem.setGodownEntryID(entry.getId());// 关联退库单ID + diposableGoodsItem.setGodownEntryItemID(godownEntryItem.getId());// 关联退库itemID + diposableGoodsItem.setIdentificationID(identification.getId());// 关联标识号ID + + diposableGoodsItem.setSourceIdFromHisSync(godownEntryItem.getSourceIdFromHisSync()); + diposableGoodsItem.setBatchIdFromHisSync(batchIdFromHisSync); + + diposableGoodsItem.setIdentification(identificationSync); + if(!diposableGoodsItem.isAssociatedInfoValid()){ + throw new RuntimeException("关联信息不正确!"); + } + // 库存调整 + identification.adjustAmount(-curOutAmount); + objectDao.update(identification); + objectDao.update(disposableGoodsBatchStock); + objectDao.update(diposableGoods); + objectDao.save(diposableGoodsItem);// 保存diposableGoodsItem + + //记录各标识库存数量调整变动结果 + DisposableGoodsStorageAdjustVo disposableGoodsStorageAdjustVo = new DisposableGoodsStorageAdjustVo(); + disposableGoodsStorageAdjustVo.setDisposableGoodsIdentificationId(identification.getId()); + disposableGoodsStorageAdjustVo.setAdjustAmount(curOutAmount); + result.add(disposableGoodsStorageAdjustVo); + + outAmount -= curOutAmount; + if(outAmount == 0){ + break; + } + } + if(outAmount > 0){ + throw new RuntimeException("库存不够!"); + } + return result; + // 从批次设置信息,因为有可能是同步过来的 +// godownEntryItem.setExpDate(batchStock.getExpDate()); +// godownEntryItem.setManufacturer(batchStock.getManufacturer()); +// godownEntryItem.setSterileBatchNumber(batchStock.getSterileBatchNumber()); +// godownEntryItem.setSupplierName(batchStock.getSupplierName()); +// objectDao.saveOrUpdate(godownEntryItem); + } + + private List newGodownEntryDisposableGoodsItemForExpensiveDisposablegoods(GodownEntry entry, + DisposableGoodsServiceContext disposableGoodsServiceContext, + GodownEntryItem godownEntryItem) { + List result = new ArrayList(); + Map idToDisposableGoodsStockMap = disposableGoodsServiceContext + .getIdToDisposableGoodsStockMap(); + Map idToExpensiveDisposablegoodsMap = disposableGoodsServiceContext + .getIdToExpensiveDisposableGoodsMap(); + Map idToDisposableGoodsBatchStockMap = disposableGoodsServiceContext + .getIdToDisposableGoodsBatchStockMap(); + + Long disposableGoodsID = godownEntryItem.getDisposableGoodsID(); + Long disposableGoodsStockID = godownEntryItem.getDisposableGoodsStockID(); + DisposableGoodsStock diposableGoods = idToDisposableGoodsStockMap + .get(disposableGoodsStockID); + Long disposableGoodsBatchID = godownEntryItem.getDisposableGoodsBatchID(); + Long disposableGoodsBatchStockID = godownEntryItem.getDisposableGoodsBatchStockID(); + Long expensiveDisposableGoodsId = godownEntryItem.getExpensiveDisposableGoodsId(); + DisposableGoodsBatchStock disposableGoodsBatchStock = null; + if(!DatabaseUtil.isPoIdValid(disposableGoodsID)){ + throw new RuntimeException("disposableGoodsID不能为空!"); + } + if(!DatabaseUtil.isPoIdValid(disposableGoodsStockID)){ + throw new RuntimeException("disposableGoodsStockID不能为空!"); + } + if(!DatabaseUtil.isPoIdValid(disposableGoodsBatchID)){ + throw new RuntimeException("disposableGoodsBatchID不能为空!"); + } + if(!DatabaseUtil.isPoIdValid(disposableGoodsBatchStockID)){ + throw new RuntimeException("disposableGoodsBatchStockID不能为空!"); + } + if(!DatabaseUtil.isPoIdValid(expensiveDisposableGoodsId)){ + throw new RuntimeException("高值耗材id不能为空!"); + } + // 因为批次必须选择,所以batchID不为null + disposableGoodsBatchStock = idToDisposableGoodsBatchStockMap.get(disposableGoodsBatchStockID); + if (disposableGoodsBatchStock == null) { + // 批次已经不存在 + throw new RuntimeException("批次已被删除!"); + } + ExpensiveDisposablegoods expensiveDisposableGoods = idToExpensiveDisposablegoodsMap.get(expensiveDisposableGoodsId); + if (expensiveDisposableGoods == null) { + // 批次已经不存在 + throw new RuntimeException("高值耗材已被删除!"); + } + // 状态校验 + if(!expensiveDisposableGoods.inWarehouse()){ + throw new RuntimeException(String.format("%s 为[%s]状态,不能退库!", expensiveDisposableGoods.getBarcode(),expensiveDisposableGoods.getStatus())); + } + // 更改状态 + expensiveDisposableGoods.setStatus(ExpensiveDisposablegoods.STATUS_OUT_WAREHOUSE); + // 调整库存 + expensiveDisposableGoods.adjustAmount(-1); + expensiveDisposableGoods.setGodownEntryId(entry.getId()); + expensiveDisposableGoods.setGodownEntryItemId(godownEntryItem.getId()); + objectDao.update(expensiveDisposableGoods); + + DisposableGoodsStorageAdjustVo disposableGoodsStorageAdjustVo = new DisposableGoodsStorageAdjustVo(); + disposableGoodsStorageAdjustVo.setExpensiveDisposablegoodsId(expensiveDisposableGoods.getId()); + disposableGoodsStorageAdjustVo.setAdjustAmount(1L); + result.add(disposableGoodsStorageAdjustVo); + + if(!expensiveDisposableGoods.isAssociatedInfoValidForGodownOutEntry()){ + throw new RuntimeException("关联信息不正确!"); + } + // 退库不需要更新批次相关信息 + long outAmount = godownEntryItem.getAmount(); + if(outAmount <= 0){ + throw new RuntimeException("退库数量必须大于0!"); + } + GodownEntryDiposableGoodsItem diposableGoodsItem = new GodownEntryDiposableGoodsItem(); + diposableGoodsItem.setAmount(outAmount); + diposableGoodsItem.setPrice(expensiveDisposableGoods.getPrice()); + diposableGoodsItem.setGoodsName(diposableGoods.getShowNameForSmallestUnit()); + diposableGoodsItem.setDisposableGoodsID(disposableGoodsID); + diposableGoodsItem.setDisposableGoodsStockID(disposableGoodsStockID); + diposableGoodsItem.setDisposableGoodsBatchID(disposableGoodsBatchID); + diposableGoodsItem.setDisposableGoodsBatchStockID(disposableGoodsBatchStockID); + diposableGoodsItem.setExpensiveDisposableGoodsId(expensiveDisposableGoodsId); + diposableGoodsItem.setGodownEntryID(entry.getId());// 关联退库单ID + diposableGoodsItem.setGodownEntryItemID(godownEntryItem.getId());// 关联退库itemID + if(!diposableGoodsItem.isAssociatedInfoValidForOutExpensiveDisposableGoodsId()){ + throw new RuntimeException("关联信息不正确!"); + } + objectDao.update(disposableGoodsBatchStock); + objectDao.update(diposableGoods); + objectDao.save(diposableGoodsItem);// 保存diposableGoodsItem + return result; + } + private void deleteGodownOutEntryItem(GodownEntryItem godownEntryItem, + DisposableGoodsServiceContext disposableGoodsServiceContext) { + Map idToDisposableGoodsMap = disposableGoodsServiceContext + .getIdToDisposableGoodsMap(); + Map idToDisposableGoodsStockMap = disposableGoodsServiceContext + .getIdToDisposableGoodsStockMap(); + Map idToExpensiveDisposablegoodsMap = disposableGoodsServiceContext + .getIdToExpensiveDisposableGoodsMap(); + Map idToDisposableGoodsBatchMap = disposableGoodsServiceContext + .getIdToDisposableGoodsBatchMap(); + Map idToDisposableGoodsBatchStockMap = disposableGoodsServiceContext + .getIdToDisposableGoodsBatchStockMap(); + Map idToIdentificationMap = disposableGoodsServiceContext + .getIdToIdentificationMap(); + Long itemID = godownEntryItem.getId(); + // 删除该项 + String sql = String.format(" where po.godownEntryItemID=%s", itemID); + + @SuppressWarnings("unchecked") + List diposableGoodsItems = objectDao + .findBySql(GodownEntryDiposableGoodsItem.class.getSimpleName(), + sql); + if(diposableGoodsItems == null || diposableGoodsItems.isEmpty()){ + throw new RuntimeException("数据异常,退库单一次性物品明细数据已不存在!"); + } + // 修改时,每一项都应该有ID + Long disposableGoodsID = godownEntryItem.getDisposableGoodsID(); + Long disposableGoodsStockID = godownEntryItem.getDisposableGoodsStockID(); + Long disposableGoodsBatchID = godownEntryItem.getDisposableGoodsBatchID(); + Long disposableGoodsBatchStockID = godownEntryItem.getDisposableGoodsBatchStockID(); + if(disposableGoodsID == null){ + throw new RuntimeException("物品定义id不能为空,请升级数据!"); + } + if(disposableGoodsStockID == null){ + throw new RuntimeException("物品库存id不能为空,请升级数据!"); + } + if(disposableGoodsBatchID == null){ + throw new RuntimeException("物品批次id不能为空,请升级数据!"); + } + if(disposableGoodsBatchStockID == null){ + throw new RuntimeException("物品批次库存id不能为空,请升级数据!"); + } + DisposableGoods disposableGoods = idToDisposableGoodsMap.get(disposableGoodsID); + DisposableGoodsStock disposableGoodsStock = idToDisposableGoodsStockMap.get(disposableGoodsStockID); + // 查找批次定义 + DisposableGoodsBatch disposableGoodsBatch = idToDisposableGoodsBatchMap.get(disposableGoodsBatchID); + DisposableGoodsBatchStock disposableGoodsBatchStock = idToDisposableGoodsBatchStockMap.get(disposableGoodsBatchStockID); + if(disposableGoods == null){ + throw new RuntimeException("物品定义不存在!"); + } + if(disposableGoodsStock == null){ + throw new RuntimeException("物品库存不存在!"); + } + if(disposableGoodsBatch == null){ + throw new RuntimeException("物品批次不存在!"); + } + if(disposableGoodsBatchStock == null){ + throw new RuntimeException("物品批次库存不存在!"); + } + if(disposableGoods.expensiveDiposablegoods()){ + for (GodownEntryDiposableGoodsItem diposableGoodsItem : diposableGoodsItems) { + Long identificationID = diposableGoodsItem.getIdentificationID(); + if (identificationID != null) { + throw new RuntimeException("物品当前类型为高值耗材,和当时的退库类型不一致,无法删除!"); + } + Long expensiveDisposableGoodsId = diposableGoodsItem.getExpensiveDisposableGoodsId(); + if(expensiveDisposableGoodsId == null){ + throw new RuntimeException("高值耗材id不能为空!"); + } + ExpensiveDisposablegoods expensiveDisposableGoods = idToExpensiveDisposablegoodsMap.get(expensiveDisposableGoodsId); + if (expensiveDisposableGoods == null) { + // 批次已经不存在 + throw new RuntimeException("高值耗材已被删除!"); + } + // 状态校验 + if(!expensiveDisposableGoods.outWarehouse()){ + throw new RuntimeException(String.format("%s 为[%s]状态,不能删除退库单!", expensiveDisposableGoods.getBarcode(),expensiveDisposableGoods.getStatus())); + } + // 更改状态 + expensiveDisposableGoods.setStatus(ExpensiveDisposablegoods.STATUS_IN_WAREHOUSE); + // 调整库存 + expensiveDisposableGoods.adjustAmount(1); + expensiveDisposableGoods.setGodownEntryId(null); + expensiveDisposableGoods.setGodownEntryItemId(null); + objectDao.update(expensiveDisposableGoods); + + objectDao.update(disposableGoodsBatchStock); + objectDao.update(disposableGoodsStock); + objectDao.update(disposableGoodsBatch); + objectDao.update(disposableGoods); + objectDao.delete(diposableGoodsItem);// 删除明细项 + } + }else{ + for (GodownEntryDiposableGoodsItem diposableGoodsItem : diposableGoodsItems) { + Long identificationID = diposableGoodsItem.getIdentificationID(); + if (identificationID == null) { + throw new RuntimeException("标识号不能为空!"); + } + + DisposableGoodsIdentification identification = idToIdentificationMap + .get(identificationID); + if (identification == null) { + throw new RuntimeException("标识号已被删除!"); + } + Long amount = diposableGoodsItem.getAmount(); + identification.adjustAmount(amount);// 增加库存 + objectDao.update(identification); + objectDao.update(disposableGoodsBatchStock); + objectDao.update(disposableGoodsStock); + objectDao.update(disposableGoodsBatch); + objectDao.update(disposableGoods); + + objectDao.delete(diposableGoodsItem);// 删除明细项 + } + } + + // 删除godownEntryItem + godownEntryItem.getGodownEntry().getItemsList().remove(godownEntryItem); + objectDao.delete(godownEntryItem); + } + + private void summaryDiposableGoodsInfoForGodownOutEntry2(GodownEntry entry, + DisposableGoodsServiceContext disposableGoodsServiceContext) { + Set disposableGoodsIDsSet = disposableGoodsServiceContext + .getDisposableGoodsIdsSet(); + Set disposableGoodsStockIDsSet = disposableGoodsServiceContext + .getDisposableGoodsStockIdsSet(); + Set expensiveDisposablegoodsIdsSet = disposableGoodsServiceContext + .getExpensiveDisposableGoodsIdsSet(); + Set disposableGoodsBatchIDsSet = disposableGoodsServiceContext + .getDisposableGoodsBatchIdsSet(); + Set disposableGoodsBatchStockIDsSet = disposableGoodsServiceContext + .getDisposableGoodsBatchStockIdsSet(); + Set batchNumbersSet = disposableGoodsServiceContext + .getDisposableGoodsBatchNumberSet(); + Set identificationIdsSet = disposableGoodsServiceContext + .getIdentificationIdsSet(); + Set batchIdFromHisSyncSet = disposableGoodsServiceContext + .getBatchIdFromHisSyncSet(); + Set identificationSyncSet = disposableGoodsServiceContext + .getIdentificationSet(); + List itemList = entry.getItemsList(); + for (GodownEntryItem godownEntryItem : itemList) { + Long disposableGoodsID = godownEntryItem.getDisposableGoodsID(); + Long disposableGoodsStockID = godownEntryItem + .getDisposableGoodsStockID(); + if (disposableGoodsID == null) { + throw new RuntimeException("物品定义的id不能为空!"); + } + disposableGoodsIDsSet.add(disposableGoodsID); + if (DatabaseUtil.isPoIdValid(disposableGoodsStockID)) { + disposableGoodsStockIDsSet.add(disposableGoodsStockID); + } + Long disposableGoodsBatchID = godownEntryItem + .getDisposableGoodsBatchID(); + Long disposableGoodsBatchStockID = godownEntryItem + .getDisposableGoodsBatchStockID(); + if (DatabaseUtil.isPoIdValid(disposableGoodsBatchID)) { + disposableGoodsBatchIDsSet.add(disposableGoodsBatchID); + } + if (DatabaseUtil.isPoIdValid(disposableGoodsBatchStockID)) { + disposableGoodsBatchStockIDsSet + .add(disposableGoodsBatchStockID); + } + + Long identificationID = godownEntryItem.getIdentificationID(); + if (DatabaseUtil.isPoIdValid(identificationID)) { + identificationIdsSet.add(identificationID); + } + Long expensiveDisposablegoodsId = godownEntryItem + .getExpensiveDisposableGoodsId(); + if (DatabaseUtil.isPoIdValid(expensiveDisposablegoodsId)) { + expensiveDisposablegoodsIdsSet.add(expensiveDisposablegoodsId); + } + Long batchIdFromHisSyncId = godownEntryItem.getBatchIdFromHisSync(); + if (DatabaseUtil.isPoIdValid(batchIdFromHisSyncId)) { + batchIdFromHisSyncSet.add(batchIdFromHisSyncId); + } + String identificationSetSync = godownEntryItem.getIdentification(); + if (StringUtils.isNotBlank(identificationSetSync)){ + identificationSyncSet.add(identificationSetSync); + } + String batchNumber = godownEntryItem.getBatchNumber(); + batchNumbersSet.add(batchNumber); + } + Long entryID = entry.getId(); + if (entryID != null) { + String sql = String.format(" where po.godownEntryID=%s", entryID); + List identificationIDs = objectDao.getLongProperties( + GodownEntryDiposableGoodsItem.class.getSimpleName(), + "identificationID", sql); + if (identificationIDs != null) { + for (Long identificationID : identificationIDs) { + identificationIdsSet.add(identificationID); + } + } + } + } + // 回写物资系统 + private void writeBackForDiposableGoodsStorageOut(GodownEntry godownEntry , List disposableGoodsStorageAdjustVoList) { + //省医回写接口调用 + if(CssdUtils.isProject("gdsy") && writeBackInventoryDao != null){ + if(CollectionUtils.isNotEmpty(disposableGoodsStorageAdjustVoList)){ + try{ + /*4 + */ + //退库单的二级科室-供应室 + OrgUnit godownOutEntryCssdOrgUnit = (OrgUnit)objectDao.getByProperty(OrgUnit.class.getSimpleName(), "orgUnitCoding", godownEntry.getOrgUnitCode()); + //退库单的一级科室-设备仓库(健迅系统的一级科室推入库单数据过来只会有一个一级科室,且id不会变) + String firstGradeOrgUnit = "144"; + String xmlParam = "4" + godownOutEntryCssdOrgUnit.getIdFromHisSync() + "" + + "" + firstGradeOrgUnit + "" + + "OUT_" + godownEntry.getSerialNumber() + ""; + + xmlParam += writeBackInventoryDao.getXmlStringOfWriteBackDataDetailList(disposableGoodsStorageAdjustVoList); + logger.debug("退库回写参数xmlParam="+xmlParam); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DISPOSABLEGOODS_WRITEBACK, Log.TYPE_ADD, "退库回写参数xmlParam="+xmlParam); + String writeBackResult = writeBackInventoryDao.insertWriteBackForCommon(xmlParam); + appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_DISPOSABLEGOODS_WRITEBACK, Log.TYPE_ADD, "退库回写参数xmlParam="+xmlParam+",对应的回写结果=" + writeBackResult); + JSONObject jsonReturn = JSONObject.fromObject(writeBackResult); + if(!jsonReturn.optBoolean("success")){ + throw new RuntimeException(ConstantDefinition.WRITEBACK_RESULTMESSAGE_PREFIX + jsonReturn.optString("message")); + } + }catch(Exception e){ + e.printStackTrace(); + throw new RuntimeException(e); + } + } + }else if (writeBackInventoryHelper != null) { + // 回写物资系统 + writeBackInventoryHelper.writeBackForDiposableGoodsStorageOut( + Collections.singleton(godownEntry.getId()), true); + } + } + // 更新退库单 + @Override + public void updateGodownOutEntry_TRANS_REQUIRED(GodownEntry original, + GodownEntry entry, Map result) { + updateGodownOutEntry_internal(original, entry, result); + } + + private void updateGodownOutEntry_internal(GodownEntry original, + GodownEntry entry, Map result) { + if(true){ + throw new RuntimeException("退库单不允许修改!"); + } +// Set disposableGoodsIDsSet = new HashSet();// 一次性物品id集合 +// Set disposableGoodsStockIDsSet = new HashSet();// 一次性物品库存id集合 +// Set disposableGoodsBatchIDsSet = new HashSet();// 批次id集合 +// Set disposableGoodsBatchStockIDsSet = new HashSet();// 批次库存id集合 +// Set disposableGoodsBatchNumberSet = new HashSet();// 批次号集合 +// Set identificationIDsSet = new HashSet();// 标识号id集合 +// Map idToDisposableGoodsMap = new HashMap(); +// Map disposableGoodsIDToDisposableGoodsStockMap = new HashMap(); +// Map idToDisposableGoodsStockMap = new HashMap(); +// Map idToDisposableGoodsBatchMap = new HashMap(); +// Map idToDisposableGoodsBatchStockMap = new HashMap(); +// Map idToIdentificationMap = new HashMap(); +// // 汇总信息 +// summaryDiposableGoodsInfoForGodownOutEntry(original, disposableGoodsIDsSet,disposableGoodsStockIDsSet,disposableGoodsBatchIDsSet, +// disposableGoodsBatchStockIDsSet, disposableGoodsBatchNumberSet, identificationIDsSet); +// summaryDiposableGoodsInfoForGodownOutEntry(entry, disposableGoodsIDsSet,disposableGoodsStockIDsSet,disposableGoodsBatchIDsSet, +// disposableGoodsBatchStockIDsSet, disposableGoodsBatchNumberSet, identificationIDsSet); +// // 锁定并获取退库单 +// GodownEntry curGodownEntry = getGodownEntryById_ForUpdate(original.getId().toString()); +// if(curGodownEntry == null){ +// // 退库单已被删除 +// throw new RuntimeException("退库单已被删除!"); +// } +// // 获取并锁定一次性物品相关资源 +// lockAndGetDiposableGoodsResources(GodownEntry.TYPE_OUT,original.getWarehouseID(),original.getWarehouseName(),disposableGoodsIDsSet,disposableGoodsStockIDsSet,disposableGoodsBatchIDsSet, disposableGoodsBatchStockIDsSet, +// disposableGoodsBatchNumberSet, identificationIDsSet, idToDisposableGoodsMap,disposableGoodsIDToDisposableGoodsStockMap,idToDisposableGoodsStockMap,idToDisposableGoodsBatchMap, +// idToDisposableGoodsBatchStockMap, idToIdentificationMap); +// +// List originalItemList = original.getItemsList(); +// List itemList = entry.getItemsList(); +// List curItemList = curGodownEntry.getItemsList(); +// +// // 处理修改,退库单ite暂时不能修改 +// // 处理新增 +// for (int i = 0; i < itemList.size(); ++i) { +// GodownEntryItem godownEntryItem = itemList.get(i); +// Long itemID = godownEntryItem.getId(); +// if(itemID != null){// 有id就不是新增项 +// continue; +// } +// Long diposableGoodsID = godownEntryItem.getDisposableGoodsStockID(); +// if (diposableGoodsID == null) { +// throw new RuntimeException("一次性物品ID为空!"); +// } +// DisposableGoodsStock diposableGoods = idToDisposableGoodsStockMap +// .get(diposableGoodsID); +// if (diposableGoods == null) { +// throw new RuntimeException("物品已被删除!"); +// } +// // 保存godownEntryItem +// godownEntryItem.setGodownEntry(curGodownEntry); +// godownEntryItem.setDiposableGoods(diposableGoods); +// curItemList.add(godownEntryItem); +// objectDao.save(godownEntryItem); +// +// newGodownEntryDiposableGoodsItem(curGodownEntry, idToDisposableGoodsStockMap, idToDisposableGoodsBatchStockMap, godownEntryItem); +// } +// // 处理删除项 +// for (int i = 0; i < originalItemList.size(); ++i) { +// GodownEntryItem originalGodownEntryItem = originalItemList.get(i); +// Long itemID = originalGodownEntryItem.getId(); +// if(itemID == null){ +// continue; +// } +// GodownEntryItem godownEntryItem = DisposableGoodsUtils.getGodownEntryItemsByItemId(itemList, itemID); +// if(godownEntryItem != null){// 现在还存在,就不是删除项 +// // 在页面上被删除了。 +// continue; +// } +// GodownEntryItem curGodownEntryItem = DisposableGoodsUtils.getGodownEntryItemsByItemId(curItemList, itemID); +// if(curGodownEntryItem == null){ +// // 被并发删除了。也不需要处理 +// continue; +// } +// // 删除该项 +// deleteGodownOutEntryItem(curGodownEntryItem, idToDisposableGoodsMap, disposableGoodsIDToDisposableGoodsStockMap, idToDisposableGoodsStockMap, idToDisposableGoodsBatchMap, idToDisposableGoodsBatchStockMap, idToIdentificationMap); +// } +// // 更新入库单属性 +// updateGodownEntryProperties(original, entry, curGodownEntry); +// curGodownEntry.calculateTotalPrice(); +// // 更新入库单对象 +// saveOrUpdate(curGodownEntry); + } + + private static boolean ObjectEaqual(Object obj1,Object obj2){ + if(obj1 == null && obj2 != null){ + return false; + } + if(obj1 != null && obj2 == null){ + return false; + } + if(obj1 == null && obj2 == null){ + return true; + } + return obj1.equals(obj2); + } + /** + * @param original + * @param entry + * @param curGodownEntry + */ + private void updateGodownEntryProperties(GodownEntry original, + GodownEntry entry, GodownEntry curGodownEntry) { + // 备注 + String originalRemark = original.getRemark(); + String remark = entry.getRemark(); + if(!StringUtils.equals(originalRemark, remark)){ + curGodownEntry.setRemark(remark); + } + // 时间 + Date originalTime = original.getTime(); + Date time = entry.getTime(); + if(!originalTime.equals(time)){ + curGodownEntry.setTime(time); + } + // 仓库id和名称 + Long originalId = original.getWarehouseID(); + Long id = entry.getWarehouseID(); + if(!ObjectEaqual(originalId,id)){ + curGodownEntry.setWarehouseID(id); + } + + String originalName = original.getWarehouseName(); + String wareHouseName = entry.getWarehouseName(); + if(!ObjectEaqual(originalName,wareHouseName)){ + curGodownEntry.setWarehouseName(wareHouseName); + } + } + // 找出已经存在项 + private Collection loadToussePrintData( + Collection godownEntrys) { + if (CollectionUtils.isEmpty(godownEntrys)) { + return CollectionUtils.emptyCollection(); + } + + List voList = new ArrayList(); + for (GodownEntry godownEntry : godownEntrys) { + List tousseList = godownEntry.getItemsList(); + for (GodownEntryItem godownEntryItem : tousseList) { + DisposableGoodsStock diposableGoods = godownEntryItem + .getDiposableGoods(); + DisposableGoodsBatchStock diposableGoodBatchStock = godownEntryItem.getDiposableGoodBatchStock(objectDao); + GodownEntryItemPrintVO tempVo = new GodownEntryItemPrintVO(); + tempVo.setCode(diposableGoods.getExternalCode()); + tempVo.setAmount(godownEntryItem.getAmount()); + tempVo.setName(diposableGoods.getName()); + tempVo.setSpecification(diposableGoods.getSpecification()); + tempVo.setInventorySerialNumber(diposableGoods.getInventorySerialNumber()); + if(diposableGoodBatchStock != null){ + tempVo.setProducingArea(diposableGoodBatchStock.getProducingArea()); + tempVo.setSupplierName(diposableGoodBatchStock.getSupplierName()); + } + tempVo.setUnit(diposableGoods.getUnit()); + tempVo.setAmount(godownEntryItem.getAmount()); + tempVo.setPrice(godownEntryItem.getCost()); + tempVo.setRowPrice(godownEntryItem.getCost() + * godownEntryItem.getAmount()); + tempVo.setTotalPrice(tempVo.getRowPrice()); + tempVo.setBatchNumber(godownEntryItem.getBatchNumber()); + tempVo.setCertification(godownEntryItem.getCertification()); + tempVo.setProducingArea(godownEntryItem.getProducingArea()); + voList.add(tempVo); + } + } + + return voList; + } + // 获取入库单打印信息 + @Override + public void loadGodownEntryPrintData( + String[] invoiceIds,JSONObject jsonObject) { + Collection tousseList = CollectionUtils.emptyCollection(); + jsonObject.put("goods", tousseList); + if (ArrayUtils.isEmpty(invoiceIds)){ + return ; + } + + String idsStr = StringUtils.join(invoiceIds, ","); + String sql = String.format(" where po.id in (%s)", idsStr); + @SuppressWarnings("unchecked") + List list = objectDao.findBySql( + GodownEntry.class.getSimpleName(), sql); + if (list == null || list.size() == 0){ + return ; + } + String serialNumber = ""; + String applicant = ""; + String time = ""; + String supplierName = "";//供应商 + String warehouseName = ""; + String targetWarehouseName = ""; + String subType = ""; + String remark = ""; + if(list.size() == 1){ + GodownEntry godownEntry = list.get(0); + serialNumber = godownEntry.getSerialNumber(); + time = ForgonDateUtils.safelyFormatDate(godownEntry.getTime(), Constants.DATEFORMAT_YYYYMMDD, ""); + supplierName = godownEntry.getSupplierName(); + warehouseName = godownEntry.getWarehouseName(); + targetWarehouseName = godownEntry.getTargetWareHouseName(); + subType = godownEntry.getSubType(); + remark = godownEntry.getRemark(); + } + jsonObject.put("serialNumber", serialNumber); + jsonObject.put("applicant", applicant); + jsonObject.put("godownEntryTime", time); + jsonObject.put("supplierName", supplierName); + jsonObject.put("warehouseName", warehouseName); + jsonObject.put("targetWarehouseName", targetWarehouseName); + jsonObject.put("subType", subType); + jsonObject.put("remark", remark); + + tousseList = loadToussePrintData(list); + jsonObject.put("goods", tousseList); + } + + @Override + public void addItemToGodownEntry(GodownEntry entry, JSONObject itemObject) { + if(entry == null || itemObject == null){ + throw new IllegalArgumentException("entry和itemObject都不能为空"); + } + + GodownEntryItem godownEntryItem = godownEntryItemManager.parseGodownEntryItem(itemObject); + godownEntryItem.setGodownEntry(entry); + entry.getItemsList().add(godownEntryItem); + } + + @Override + public void updateGodownEntryInfo(GodownEntry entry, + JSONObject godownEntryInfo) { + if(entry == null || godownEntryInfo == null){ + return; + } + Long id = godownEntryInfo.optLong("id"); + String remark = godownEntryInfo.optString("remark"); + String timeStr = godownEntryInfo.optString("time"); + Long wareHouseId = JSONUtil.optLong(godownEntryInfo, "warehouseID", null); + String wareHouseName = JSONUtil.optString(godownEntryInfo, "warehouseName", ""); + + Long targetWareHouseId = JSONUtil.optLong(godownEntryInfo, "targetWareHouseId", null); + String targetWareHouseName = JSONUtil.optString(godownEntryInfo, "targetWareHouseName", ""); + + entry.setId(id); + entry.setRemark(remark); + entry.setWarehouseID(wareHouseId); + entry.setWarehouseName(wareHouseName); + entry.setTargetWareHouseId(targetWareHouseId); + entry.setTargetWareHouseName(targetWareHouseName); + Date time; + try { + time = GodownEntryItem.DATE_FORMAT.parse(timeStr); + } catch (ParseException e) { + e.printStackTrace(); + throw new RuntimeException("日期格式错误!"); + } + entry.setTime(time); + } + + private void setWareHouse(GodownEntry entry,WareHouse wareHouse){ + if(entry == null){ + throw new IllegalArgumentException("entry不能为空"); + } + if(wareHouse != null){ + entry.setWarehouseID(wareHouse.getId()); + entry.setWarehouseName(wareHouse.getName()); + } + } + @Override + public void setGodownEntryDefaultWareHouse(GodownEntry entry,OrgUnit orgUnit) { + if(entry != null){ + WareHouse wh = wareHouseManager.getWareHouseById(entry.getWarehouseID()); + if(wh == null){ + List list = wareHouseManager.getWareHouseListByOrgUnit(orgUnit); + if(list != null && !list.isEmpty()){ + setWareHouse(entry,list.get(0)); + } + } + } + } + @Override + public void setGodownEntryDefaultWareHouse(GodownEntry entry,String orgUnitCoding){ + setGodownEntryDefaultWareHouse(entry,orgUnitManager.getByCode(orgUnitCoding)); + } + + /** + * 设置入库单的子类型 + * @param entry + * @param subType + */ + private void setGodownEntrySubType(GodownEntry entry,String subType){ + if(entry != null){ + entry.setSubType(subType); + } + } + + @Override + public void printSomeGodownEntryItem(String items,JSONObject jsonObj){ + JSONArray jsonArray = new JSONArray(); + jsonObj.put("success", true); + + try { + if (StringUtils.isBlank(items)) { + throw new RuntimeException("参数非法,items不能为空!"); + } + Date date = new Date(); + JSONArray itemsObj = JSONArray.fromObject(items); + for(int i=0;i expensiveDisposablegoodsList = diposableGoodsManager.getExpensivediposablegoodsByGodownEntryItemId(godownEntryItem.getId()); + if(!CollectionUtils.isEmpty(expensiveDisposablegoodsList)){ + for (ExpensiveDisposablegoods expensiveDisposablegoods : expensiveDisposablegoodsList) { + JSONObject printItemObj = new JSONObject(); + printItemObj.put("fullName", godownEntryItem.getDiposableGoods().getName()); + printItemObj.put("newBatch", godownEntryItem.getNewBatch()); + printItemObj.put("barcode", expensiveDisposablegoods.getBarcode()); + printItemObj.put("expDate", expDateStr); + printItemObj.put("supplierName", supplierName); + printItemObj.put("batchNumber", batchNumber); + printItemObj.put("specification", specification); + printItemObj.put("type", "高值耗材"); + jsonArray.add(printItemObj); + } + }else{ + JSONObject printItemObj = new JSONObject(); + printItemObj.put("fullName", godownEntryItem.getDiposableGoods().getName()); + printItemObj.put("newBatch", godownEntryItem.getNewBatch()); + printItemObj.put("barcode", barcode); + printItemObj.put("expDate", expDateStr); + printItemObj.put("supplierName", supplierName); + printItemObj.put("batchNumber", batchNumber); + printItemObj.put("specification", specification); + printItemObj.put("type", "批次"); + jsonArray.add(printItemObj); + } + } + } catch (Exception e) { + e.printStackTrace(); + jsonObj.put("errorMessage", e.getMessage()); + } + jsonObj.put("items", jsonArray); + } + + @Override + public void modifyGodownEntryItemBaseData(String items, JSONObject jsonObj) { + jsonObj.put(JSONUtil.JSON_KEY_SUCCESS, false); + + try { + if (StringUtils.isBlank(items)) { + throw new RuntimeException("参数非法,items不能为空!"); + } + GodownEntry godownEntry = null; + Date now = new Date(); + JSONArray itemsObj = JSONArray.fromObject(items); + for(int i=0;i Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DisposableGoodsBatchManager.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DisposableGoodsBatchManager.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DisposableGoodsBatchManager.java (revision 20740) @@ -0,0 +1,24 @@ +package com.forgon.disinfectsystem.expensiveGoods.service; + +import java.util.List; + +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatch; +import com.forgon.tools.hibernate.BasePoManager; + +public interface DisposableGoodsBatchManager extends BasePoManager { + /** + * 根据一次性物品定义的id获取一次性物品批次定义 + * @param disposableGoodsId 一次性物品定义的id + * @param spell 包含的批次号分段 + * @return 一次性物品定义下的所有批次定义 + */ + public List getDisposableGoodsBatch(String disposableGoodsId,String spell); + /** + * 根据一次性物品定义的id获取一次性物品批次的属性 + * @param disposableGoodsId 一次性物品定义的id + * @param batchNumber 批次号 + * @return 一次性物品定义下的某个批次号的批次 + */ + public DisposableGoodsBatch getDisposableGoodsBatchProperty(String disposableGoodsId,String batchNumber); + +} Index: settings.gradle =================================================================== diff -u -r18375 -r20740 --- settings.gradle (.../settings.gradle) (revision 18375) +++ settings.gradle (.../settings.gradle) (revision 20740) @@ -1,5 +1,5 @@ -include "ssts-web", "forgon-tools", "forgon-core", "forgon-knowledge", "ssts-utils", "ssts-basedata", "ssts-diposablegoods", +include "ssts-web", "forgon-tools", "forgon-core", "forgon-knowledge", "ssts-utils", "ssts-basedata", "ssts-diposablegoods","ssts-expensivegoods", "ssts-tousse", "ssts-print", "ssts-recyclingapplication", "ssts-recyclingrecord", "ssts-packing", "ssts-wash", "ssts-idcard", "ssts-expiration", "ssts-sterile", "ssts-invoice", "ssts-userecord", "ssts-qualitymon","ssts-customform", "ssts-reports", "ssts-webservice", "ssts-datasync","ssts-stockmanage","ssts-operationmonitor","ssts-maintain", Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/IdentificationOfDiposableGoodsManagerImpl.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/IdentificationOfDiposableGoodsManagerImpl.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/IdentificationOfDiposableGoodsManagerImpl.java (revision 20740) @@ -0,0 +1,63 @@ +/** + * + */ +package com.forgon.disinfectsystem.expensiveGoods.service; + +import org.apache.commons.lang.StringUtils; + +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsIdentification; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.util.SqlUtils; + +/** + * @author Jam + * 2013-8-1 下午3:01:56 + */ +public class IdentificationOfDiposableGoodsManagerImpl implements + IdentificationOfDiposableGoodsManager { + + private ObjectDao objectDao; + + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + + @Override + public DisposableGoodsIdentification getIdentificationOfDiposableGoodsByIdentification( + Long warehouseId, String name, String specification, + String batchNumber, String identification) { + String sql = String.format(" where %s and %s and %s and %s and %s ", + SqlUtils.getLongFieldPredicate("po.warehouseID", warehouseId), + SqlUtils.getStringFieldPredicate( + "po.batchStock.diposableGoods.name", name), SqlUtils + .getStringFieldPredicate( + "po.batchStock.diposableGoods.specification", + specification), SqlUtils + .getStringFieldPredicate("po.batchStock.batchNumber", + batchNumber), SqlUtils.getStringFieldPredicate( + "po.identification", identification)); + + DisposableGoodsIdentification identificationOfDiposableGoods = (DisposableGoodsIdentification) objectDao + .getBySql( + DisposableGoodsIdentification.class.getSimpleName(), + sql); + return identificationOfDiposableGoods; + } + + public DisposableGoodsIdentification getIdentificationOfDiposableGoodsByIdentification(Long warehouseId, + String diposableGoodsId, String batchNumber, + String identification) { + String sql = String.format(" where %s and %s and %s and %s ", SqlUtils + .getLongFieldPredicate("po.warehouseID", warehouseId), SqlUtils + .getNonStringFieldPredicate("po.batchStock.diposableGoods.id", + diposableGoodsId), SqlUtils.getStringFieldPredicate( + "po.batchStock.batchNumber", batchNumber), SqlUtils + .getStringFieldPredicate("po.identification", identification)); + + DisposableGoodsIdentification identificationOfDiposableGoods = (DisposableGoodsIdentification) objectDao + .getBySql( + DisposableGoodsIdentification.class.getSimpleName(), + sql); + return identificationOfDiposableGoods; + } +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DisposableGoodsStorageRecordManager.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DisposableGoodsStorageRecordManager.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DisposableGoodsStorageRecordManager.java (revision 20740) @@ -0,0 +1,19 @@ +package com.forgon.disinfectsystem.expensiveGoods.service; + +import net.sf.json.JSONObject; + +/** + * 一次性物品出入库记录操作类 + * @author kzh + * + */ +public interface DisposableGoodsStorageRecordManager { + /** + * 获取一次性物品出入库记录 + * @param disposableGoodsId 一次性物品定义id + * @param startDate 开时日期,可以为空或null,表示开始日期无限制 + * @param endDate 结束日期,可以为空或null,表示结束日期无限制 + * @return + */ + public JSONObject getStorageRecord(String disposableGoodsId,String startDate,String endDate); +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsGodownEntryItemManagerImpl.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsGodownEntryItemManagerImpl.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsGodownEntryItemManagerImpl.java (revision 20740) @@ -0,0 +1,234 @@ +package com.forgon.disinfectsystem.expensiveGoods.service; + +import java.text.ParseException; +import java.util.Date; +import java.util.List; + +import net.sf.json.JSONObject; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; + +import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.directory.model.BarcodeDevice; +import com.forgon.directory.model.OrgUnit; +import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; +import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntry; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryItem; +import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; +import com.forgon.disinfectsystem.expensiveGoods.util.ExpensiveGoodsGodownEntryUtil; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.json.JSONUtil; +import com.forgon.tools.string.StringTools; + +public class ExpensiveGoodsGodownEntryItemManagerImpl implements ExpensiveGoodsGodownEntryItemManager { + private ObjectDao objectDao; + private DateQueryAdapter dateQueryAdapter; + private WareHouseManager wareHouseManager; + + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + + public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { + this.dateQueryAdapter = dateQueryAdapter; + } + + public void setWareHouseManager(WareHouseManager wareHouseManager) { + this.wareHouseManager = wareHouseManager; + } + + @SuppressWarnings("unchecked") + @Override + public List getGodownEntryItemList(String startDateTime, + String endDateTime, String supplier,String orderField,String warehouseId, + String type,String hasInvoice,String disposableGoodsType) { + String sql = " where " + dateQueryAdapter.dateAreaSql("po.godownEntry.time", startDateTime, endDateTime); + sql += " and " + ExpensiveGoodsGodownEntryUtil.getGodownEntryTypeSqlWhere("po.godownEntry", type); + if(StringUtils.isNotBlank(supplier)){ + sql += " and po.supplierName = '" + supplier + "'"; + } + if(StringUtils.isNotBlank(warehouseId)){ + sql += " and po.godownEntry.warehouseID = " + warehouseId; + } + if(StringUtils.isNotBlank(hasInvoice)){ + sql += " and po.hasInvoice = '" + hasInvoice + "'"; + } + if(StringTools.isNotBlank(disposableGoodsType)){ + sql += " and po.diposableGoods.disposableGoodsID in (select id from " + + DisposableGoods.class.getSimpleName() + " where type='" + disposableGoodsType + "')"; + } + return objectDao.findBySql(GodownEntryItem.class.getSimpleName(), sql, orderField); + } + + @Override + public GodownEntryItem getGodownEntryItemById(String id) { + return (GodownEntryItem) objectDao.getByProperty( + GodownEntryItem.class.getSimpleName(), "id", Long.valueOf(id)); + } + + @Override + public void setDefaultWareHouse(GodownEntryItem item, OrgUnit orgUnit) { + if(item == null){ + throw new IllegalArgumentException("item不能为空"); + } + List list = wareHouseManager.getWareHouseListByOrgUnit(orgUnit); + if(list != null && !list.isEmpty()){ + WareHouse wareHouse = list.get(0); + if(wareHouse != null){ + setWareHouse(item,wareHouse); + } + } + } + + @Override + public void setWareHouse(GodownEntryItem item, WareHouse wareHouse) { + if(wareHouse == null){ + throw new IllegalArgumentException("wareHouse不能为空"); + } + setWareHouse(item,wareHouse.getId(),wareHouse.getName()); + } + + @Override + public void setWareHouse(GodownEntryItem item, Long wareHouseId, + String wareHouseName) { + if(item == null){ + throw new IllegalArgumentException("item不能为空"); + } + item.setWarehouseID(wareHouseId); + item.setWarehouseName(wareHouseName); + } + + @Override + public GodownEntryItem parseGodownEntryItem(JSONObject itemObject) { + if(itemObject == null){ + return null; + } + + Long itemId = JSONUtil.optLong(itemObject,"id",null); + Long disposableGoodsID = JSONUtil.optLong(itemObject,"disposableGoodsID",null);// 一次性物品id + Long disposableGoodsStockID = JSONUtil.optLong(itemObject,"disposableGoodsStockID",null); + Long disposableGoodsBatchID = JSONUtil.optLong(itemObject,"disposableGoodsBatchID",null); + Long disposableGoodsBatchStockID = JSONUtil.optLong(itemObject,"disposableGoodsBatchStockID",null); + Long expensiveDisposableGoodsId = JSONUtil.optLong(itemObject,"expensiveDisposableGoodsId",null); + Long identificationID = JSONUtil.optLong(itemObject,"identificationID",null);// 一次性物品id + String identification = itemObject.optString("identification");// 标识号id + String batchNumber = itemObject.optString("batchNumber");// 批次号 + int amount = Integer.valueOf(itemObject.optString("amount"));// 数量 + String barcode = itemObject.optString("barcode");// 条码(一般用于高值耗材),可以为空 + Date expDate; + try { + expDate = GodownEntryItem.DATE_FORMAT.parse(itemObject.optString("expDate")); + } catch (ParseException e) { + e.printStackTrace(); + throw new RuntimeException("日期格式错误!"); + } + + double cost = Double.valueOf(itemObject.optString("cost"));// 价格 + String certification = itemObject.optString("certification");// 注册证号 + String supplierName = itemObject.optString("supplierName");// 供应商 + + String sterileBatchNumber = itemObject.optString("sterileBatchNumber");// 灭菌批次 + String manufacturer = itemObject.optString("manufacturer");// 生产厂家 + String producingArea = itemObject.optString("producingArea");// 产地 + String hasBiologicalTestReport = itemObject.optString("hasBiologicalTestReport", null);//是否有生物检测报告 + hasBiologicalTestReport = GodownEntryItem.hasTypeOrDefault(hasBiologicalTestReport); + + String hasInvoice = itemObject.optString("hasInvoice", null);//是否有发票 + hasInvoice = GodownEntryItem.hasTypeOrDefault(hasInvoice); + + String grade = itemObject.optString("grade", null);//类别 + + GodownEntryItem godownEntryItem = new GodownEntryItem(); + godownEntryItem.setId(itemId); + godownEntryItem.setDisposableGoodsID(disposableGoodsID); + godownEntryItem.setDisposableGoodsStockID(disposableGoodsStockID); + godownEntryItem.setDisposableGoodsBatchID(disposableGoodsBatchID); + godownEntryItem.setDisposableGoodsBatchStockID(disposableGoodsBatchStockID); + godownEntryItem.setExpensiveDisposableGoodsId(expensiveDisposableGoodsId); + godownEntryItem.setIdentificationID(identificationID); + godownEntryItem.setIdentification(identification); +// DisposableGoodsStock disposableGoodsStock = new DisposableGoodsStock(); +// disposableGoodsStock.setId(diposableGoodsID); +// godownEntryItem.setDiposableGoods(disposableGoodsStock); + godownEntryItem.setAmount(new Long(amount)); + godownEntryItem.setCost(cost); + godownEntryItem.setBatchNumber(batchNumber); + godownEntryItem.setExpDate(expDate); + godownEntryItem.setCertification(certification); + godownEntryItem.setSupplierName(supplierName); + godownEntryItem.setSterileBatchNumber(sterileBatchNumber); + godownEntryItem.setManufacturer(manufacturer); + godownEntryItem.setProducingArea(producingArea); + godownEntryItem.setHasBiologicalTestReport(hasBiologicalTestReport); + godownEntryItem.setHasInvoice(hasInvoice); + godownEntryItem.setGrade(grade); + godownEntryItem.setBarcode(barcode); + + //如果高值耗材id为空,则根据条码判断是否为高值耗材 + if(godownEntryItem.getExpensiveDisposableGoodsId() == null && StringUtils.isNotBlank(barcode)){ + BarcodeDevice bd = + (BarcodeDevice)objectDao.getBySql(BarcodeDevice.class.getSimpleName(), + "where barcode='" + barcode + "'"); + if(bd != null && bd instanceof ExpensiveDisposablegoods){ + godownEntryItem.setExpensiveDisposableGoodsId(bd.getId()); + } + } + + return godownEntryItem; + } + + @Override + public GodownEntryItem clone(GodownEntryItem source) { + if(source == null){ + return null; + } + + GodownEntryItem newItem = new GodownEntryItem(); + + newItem.setAmount(source.getAmount()); + newItem.setBatchNumber(source.getBatchNumber()); + newItem.setCertification(source.getCertification()); + newItem.setConclusion(source.getConclusion()); + newItem.setCost(source.getCost()); + newItem.setDiposableGoods(source.getDiposableGoods()); + newItem.setDisposableGoodsBatchID(source.getDisposableGoodsBatchID()); + newItem.setDisposableGoodsBatchStockID(source.getDisposableGoodsBatchStockID()); + newItem.setDisposableGoodsID(source.getDisposableGoodsID()); + newItem.setDisposableGoodsStockID(source.getDisposableGoodsStockID()); + newItem.setExpDate(source.getExpDate()); + newItem.setGodownEntry(source.getGodownEntry()); + newItem.setId(source.getId()); + newItem.setIdentification(source.getIdentification()); + newItem.setIdentificationID(source.getIdentificationID()); + newItem.setManufacturer(source.getManufacturer()); + newItem.setNewBatch(source.getNewBatch()); + newItem.setProducingArea(source.getProducingArea()); + newItem.setSterileBatchNumber(source.getSterileBatchNumber()); + newItem.setSupplierName(source.getSupplierName()); + newItem.setWarehouseID(source.getWarehouseID()); + newItem.setWarehouseName(source.getWarehouseName()); + newItem.setHasBiologicalTestReport(source.getHasBiologicalTestReport()); + newItem.setHasInvoice(source.getHasInvoice()); + newItem.setBarcode(source.getBarcode()); + newItem.setExpensiveDisposableGoodsId(source.getExpensiveDisposableGoodsId()); + return newItem; + } + + /** + * 根据一次性物品id查询出该一次性物品最近一条入库单明细数据 + * @param disposableGoodsId + * @return + */ + public GodownEntryItem getLastGodownEntryByDisposableGoodsId(String disposableGoodsId){ + GodownEntryItem godownEntryItem = null; + String sql = "from GodownEntryItem po where 1=1 and disposableGoodsID= " + disposableGoodsId + + " and godownEntry_id in (select id from GodownEntry where type='"+GodownEntry.TYPE_IN+"') order by id desc"; + List list = objectDao.findByHql(sql,0,1); + godownEntryItem = CollectionUtils.isNotEmpty(list) ? list.get(0) : null; + return godownEntryItem; + } +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DisposableGoodsStorageRecordManagerImpl.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DisposableGoodsStorageRecordManagerImpl.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DisposableGoodsStorageRecordManagerImpl.java (revision 20740) @@ -0,0 +1,239 @@ +package com.forgon.disinfectsystem.expensiveGoods.service; + +import java.math.BigDecimal; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Date; +import java.util.Set; + +import com.forgon.Constants; +import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsIdentification; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntry; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryItem; +import com.forgon.disinfectsystem.entity.invoicemanager.DiposableGoodsItem; +import com.forgon.disinfectsystem.entity.invoicemanager.InvoiceItem; +import com.forgon.disinfectsystem.entity.packing.PackingRecord; +import com.forgon.disinfectsystem.entity.receiverecord.ReceiveRecord; +import com.forgon.disinfectsystem.entity.receiverecord.ReceiveRecordItem; +import com.forgon.disinfectsystem.entity.returngoodsrecord.ReturnGoodsItem; +import com.forgon.disinfectsystem.entity.returngoodsrecord.ReturnGoodsRecord; +import com.forgon.tools.SqlBuilder; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.string.StringTools; +import com.forgon.tools.util.BaseUtils; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +public class DisposableGoodsStorageRecordManagerImpl implements + DisposableGoodsStorageRecordManager { + private ObjectDao objectDao; + private DateQueryAdapter dateQueryAdapter; + private WareHouseManager wareHouseManager; + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { + this.dateQueryAdapter = dateQueryAdapter; + } + public void setWareHouseManager(WareHouseManager wareHouseManager) { + this.wareHouseManager = wareHouseManager; + } + @Override + public JSONObject getStorageRecord(String disposableGoodsId,String startDate,String endDate) { + JSONObject jsonObject = new JSONObject(); + JSONArray jsonArray = new JSONArray(); + boolean success = false; + //汇总信息 + long sumTotalAmount = 0; + long sumOutTotalAmount = 0; + double sumTotalPrice = 0.0; + double sumOutTotalPrice = 0.0; + if(DatabaseUtil.isPoIdValid(disposableGoodsId)){ + StringBuilder sb = new StringBuilder(); + Set warehosueIds = wareHouseManager.getCurrentUserOrgUnitWarehouseIds(); + sb.append("select * from ( "); + //单号与单类型及单id的修正关系(对于调拨单产生的入库单和退库单,由于用户不知道自动产生的单,所以需要把单号和单类型改为调拨单的单号和单类型) + String godownEntryIdSerialNumber = " (select ge.id,mge.type,mge.serialNumber from GodownEntry ge inner join (select id,type,serialNumber from GodownEntry) mge on ge.sourceId = mge.id union all select id,type,serialNumber from GodownEntry where sourceId is null or sourceId = 0) "; + //入库单 + String godownEntryItemSummarySql = "select dgbs.batchNumber, ge.id as entryId,gei.disposableGoodsID, gei.cost as price, sum(gei.amount) as amount,sum(gei.amount*gei.cost) as totalPrice " + +"from "+GodownEntry.class.getSimpleName()+" ge inner join " + + GodownEntryItem.class.getSimpleName()+" gei on gei.godownEntry_id = ge.id " + + " inner join " + DisposableGoodsBatchStock.class.getSimpleName() + " dgbs on dgbs.id=gei.disposableGoodsBatchStockID" + +" group by gei.disposableGoodsID,gei.cost,ge.id,dgbs.batchNumber"; + sb.append("select atp.batchNumber as batchNumber, ge.operator,isn.serialNumber,ge.time,isn.type,ge.subType,ge.warehouseName"); + sb.append(",atp.amount,atp.price,atp.totalPrice as totalPrice,dg.name,dg.specification"); + sb.append(" from GodownEntry ge inner join " + godownEntryIdSerialNumber + " isn on ge.id = isn.id inner join DisposableGoods dg on dg.id=" + disposableGoodsId); + sb.append(" inner join ("+godownEntryItemSummarySql+") atp"); + sb.append(" on atp.entryId = ge.id and atp.disposableGoodsID = "); + sb.append(disposableGoodsId); + sb.append(" and ge.type <> '" + GodownEntry.TYPE_APPROPRIATE + "'"); + sb.append(" and "); + sb.append(SqlBuilder.build_number_IN_Statement("ge.warehouseID", SqlBuilder.IN, warehosueIds)); + + sb.append(" union all "); + + //发货记录 + sb.append(" select idtp.batchNumber as batchNumber, i.sender as operator,i.serialNumber,i.sendTime as time,'发货单' as type,'发货出库' as subType,i.sourceWarehouseName as warehouseName," ); + sb.append("idtp.amount, null as price,idtp.totalPrice,dg.name,dg.specification"); + sb.append(" from Invoice i "); + sb.append(" inner join ( "); + sb.append(" select dgbs.batchNumber, ii.invoice_id,sum(dgi.amount) as amount,sum(dgi.amount*dgi.price) as totalPrice from " + + InvoiceItem.class.getSimpleName() + " ii inner join " + + DiposableGoodsItem.class.getSimpleName()+ " dgi on ii.id = dgi.invoiceItemID " + + " inner join " + DisposableGoodsBatchStock.class.getSimpleName() + " dgbs on dgbs.id = dgi.disposableGoodsBatchStockID"); + sb.append(" where ii.id in (select invoiceItemID from DiposableGoodsItem where disposableGoodsID = "); + sb.append(disposableGoodsId); + sb.append(") group by dgbs.batchNumber, ii.invoice_id) idtp"); + sb.append(" on i.id = idtp.invoice_id"); + sb.append(" inner join DisposableGoods dg on dg.id = "); + sb.append(disposableGoodsId); + sb.append(" where i.id in (select invoice_id from InvoiceItem where id in (select invoiceItemID from DiposableGoodsItem where disposableGoodsID = " + disposableGoodsId + "))"); + sb.append(" and "); + sb.append(SqlBuilder.build_number_IN_Statement("i.sourceWarehouseId", SqlBuilder.IN, warehosueIds)); + + sb.append(" union all "); + + //退货记录 + sb.append(" select mt.batchNumber as batchNumber, rgr.operator,'' as serialNumber,rgr.returnTime as time,'退货单' as type,'退货入库' as subType,rgr.warehouseName as warehouseName,"); + sb.append(" mt.amount,null as price,mt.totalPrice as totalPrice,dg.name,dg.specification "); + sb.append(" from ReturnGoodsRecord rgr inner join DisposableGoods dg on dg.id = " + disposableGoodsId); + sb.append(" inner join "); + sb.append(" (select dgbs.batchNumber, rgr.id as recordId,rgi.disposableGoodsID as disposableGoodsId, sum(rgi.amount) as amount,sum(rgi.amount*rgi.price) as totalPrice from " + + ReturnGoodsRecord.class.getSimpleName()+ " rgr inner join " + + ReturnGoodsItem.class.getSimpleName() + " rgi on rgi.returnGoodsRecord_ID = rgr.id" + + " inner join " + DisposableGoodsBatchStock.class.getSimpleName() + + " dgbs on dgbs.id=rgi.disposableGoodsBatchStockID" +" group by dgbs.batchNumber,rgi.disposableGoodsID,rgr.id) mt "); + sb.append(" on mt.recordId = rgr.id and mt.disposableGoodsId = "); + sb.append(disposableGoodsId); + sb.append(" where "); + sb.append(SqlBuilder.build_number_IN_Statement("rgr.warehouseID", SqlBuilder.IN, warehosueIds)); + + sb.append(" union all "); + + //装配扣减 + sb.append(" select dgbs.batchNumber as batchNumber, pr.packer as operator,'' as serialNumber,pr.packTime as time,'装配扣减' as type,'装配出库' as subType,dgbs.warehouseName as warehouseName," ); + sb.append(" dgi.amount, dgi.price as price,(dgi.amount*dgi.price) as totalPrice,dg.name,dg.specification"); + sb.append(" from " + PackingRecord.class.getSimpleName() + " pr "); + sb.append(" inner join " + DiposableGoodsItem.class.getSimpleName() + " dgi on pr.id=dgi.packingRecordId"); + sb.append(" inner join " + DisposableGoodsBatchStock.class.getSimpleName() + " dgbs on dgi.disposableGoodsBatchStockID=dgbs.id"); + sb.append(" inner join " + DisposableGoods.class.getSimpleName() + " dg on dg.id=dgi.disposableGoodsID"); + sb.append(" where dg.id=").append(disposableGoodsId).append(" and "); + sb.append(SqlBuilder.build_number_IN_Statement("dgbs.warehouseID", SqlBuilder.IN, warehosueIds)); + + sb.append(" union all "); + + //供应室领用 + sb.append(" select dgbs.batchNumber as batchNumber,rr.operator as operator,'' as serialNumber,rr.time as time,'供应室领用' as type,'' as subType,dgbs.warehouseName as warehouseName,"); + sb.append(" rri.amount,rri.price as price,(rri.amount*rri.price) as totalPrice,dg.name,dg.specification"); + sb.append(" from " + ReceiveRecordItem.class.getSimpleName() + " rri "); + sb.append(" inner join " + ReceiveRecord.class.getSimpleName() + " rr on rr.id = rri.receiveRecord_id"); + sb.append(" inner join " + DisposableGoods.class.getSimpleName() + " dg on dg.id = rri.disposableGoodsId"); + sb.append(" inner join " + DisposableGoodsBatchStock.class.getSimpleName() + " dgbs on rri.disposableGoodsBatchStockId=dgbs.id"); + sb.append(" where dg.id=").append(disposableGoodsId).append(" and "); + sb.append(SqlBuilder.build_number_IN_Statement("dgbs.warehouseID", SqlBuilder.IN, warehosueIds)); +// sb.append(" 1=1 "); + + sb.append(" ) md "); + sb.append(" where "); + sb.append(dateQueryAdapter.dateAreaSql("time", startDate, endDate, true, true)); + sb.append(" order by time "); + System.out.println(sb.toString()); + ResultSet resultSet = objectDao.executeSql(sb.toString()); + try { + while (resultSet.next()) { + JSONObject item = new JSONObject(); + Date time = resultSet.getTimestamp("time"); + String timeStr = ""; + if(time != null){ + timeStr = Constants.SIMPLEDATEFORMAT_YYYYMMDDHHMM.format(time); + } + + String name = resultSet.getString("name"); + String specification = resultSet.getString("specification"); + String displayName = name; + if(StringTools.isNotBlank(specification)){ + displayName = name + "[" + specification + "]"; + } + + long amout = resultSet.getLong("amount"); + BigDecimal price = resultSet.getBigDecimal("price"); + String priceStr = ""; + if(price != null){ + priceStr = String.format("%.2f",price.doubleValue()); + } + double dTotalPrice = resultSet.getDouble("totalPrice"); + String totalPrice = String.format("%.2f",dTotalPrice); + String subType = resultSet.getString("subType"); + + item.put("operator", resultSet.getString("operator")); + item.put("serialNumber", resultSet.getString("serialNumber")); + item.put("batchNumber", resultSet.getString("batchNumber")); + item.put("time", timeStr); + item.put("type", resultSet.getString("type")); + item.put("subType", subType); + item.put("warehouseName", resultSet.getString("warehouseName")); + if(isInOperator(subType)){ + item.put("amount", amout); + item.put("price", priceStr); + item.put("totalPrice", totalPrice); + item.put("outAmout", ""); + item.put("outTotalPrice", ""); + sumTotalAmount += amout; + sumTotalPrice += dTotalPrice; + }else{ + item.put("amount", ""); + item.put("price", ""); + item.put("totalPrice", ""); + item.put("outAmout", amout); + item.put("outTotalPrice", totalPrice); + sumOutTotalAmount += amout; + sumOutTotalPrice += dTotalPrice; + } + item.put("name", name); + item.put("specification", specification); + item.put("displayName", displayName); + + jsonArray.add(item); + } + success = true; + } catch (SQLException e) { + e.printStackTrace(); + success = false; + }finally { + DatabaseUtil.closeResultSetAndStatement(resultSet); + } + } + JSONObject item = new JSONObject(); + item.put("name", "汇总"); + item.put("displayName", "汇总"); + item.put("amount", sumTotalAmount); + item.put("totalPrice", String.format("%.2f",sumTotalPrice)); + item.put("outAmout", sumOutTotalAmount); + item.put("outTotalPrice", String.format("%.2f",sumOutTotalPrice)); + jsonArray.add(item); + + jsonObject.put("data", jsonArray); + jsonObject.put("success", success); + return jsonObject; + } + /** + * 判断是不是入库操作 + * @param type 单的子类型 + * @return true表示是入库操作,false表示是出库操作 + */ + private boolean isInOperator(String subType){ + String[] ins = new String[]{GodownEntry.SUBTYPE_IMPORT_IN,GodownEntry.SUBTYPE_MANUAL_IN, + GodownEntry.SUBTYPE_MOVE_IN,GodownEntry.SUBTYPE_STOCKTAKE_IN,GodownEntry.SUBTYPE_SYNC_IN,"退货入库"}; + if(BaseUtils.contains(ins, subType)){ + return true; + } + return false; + } + +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/util/MaterialEntryUtil.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/util/MaterialEntryUtil.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/util/MaterialEntryUtil.java (revision 20740) @@ -0,0 +1,46 @@ +package com.forgon.disinfectsystem.expensiveGoods.util; + +import com.forgon.disinfectsystem.entity.materialmanager.MaterialEntry; +import com.forgon.tools.string.StringTools; + +public final class MaterialEntryUtil { + + /** + * 生成筛选入/退库单类型的where条件子句,并且入库单和退库单会过滤掉调拨单产生的入库单和退库单,跟GodownEntryUtil的getGodownEntryTypeSqlWhere的实现一样,只是从概念上加以区分 + * @param poName po名称 + * @param type 单类型,可选值为{@link com.forgon.disinfectsystem.entity.materialmanager.MaterialEntry.TYPE_IN}、{@link com.forgon.disinfectsystem.entity.materialmanager.MaterialEntry.TYPE_OUT} + *
如果为空,返回值为 (1=1) + * @see ExpensiveGoodsGodownEntryUtil + * @return + */ + public static String getMaterialEntryTypeSqlWhere(String poName,String type){ + if("全部".equals(type)){ + return getMaterialEntryInAndOutTypeSqlWhere(poName); + } + String sql = " ( 1=1 ) "; + if(!StringTools.isBlank(type)){ + sql += " and " + poName + ".type='" + type + "'"; + if(MaterialEntry.TYPE_IN.equals(type) || MaterialEntry.TYPE_OUT.equals(type)){ + sql += " and ( " + poName + ".sourceId is null"; + sql += " or " + poName + ".sourceId=0 )"; + } + } + return sql; + } + + /** + * 生成入/退库单类型的where条件子句,查询入库单或者退库单,并且过滤掉调拨单产生的入库单和退库单 + * @param poName + * @return + */ + public static String getMaterialEntryInAndOutTypeSqlWhere(String poName){ + String sql = " ( 1=0 ) "; + if(StringTools.isNotBlank(poName)){ + sql = " (" + poName + ".type='" + MaterialEntry.TYPE_IN + "' or " + poName + ".type='" + MaterialEntry.TYPE_OUT + "')"; + sql += " and ( " + poName + ".sourceId is null"; + sql += " or " + poName + ".sourceId=0 )"; + } + return sql; + } + +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/dwr/table/ExpensiveGoodsPurchaseTableManager.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/dwr/table/ExpensiveGoodsPurchaseTableManager.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/dwr/table/ExpensiveGoodsPurchaseTableManager.java (revision 20740) @@ -0,0 +1,208 @@ +package com.forgon.disinfectsystem.expensiveGoods.dwr.table; + +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; + +import net.sf.json.JSONObject; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; + +import com.forgon.component.grid.GridManager; +import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; +import com.forgon.disinfectsystem.entity.assestmanagement.GoodPurchaseItem; +import com.forgon.disinfectsystem.entity.assestmanagement.GoodPurchasePlan; +import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; +import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; +import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsManager; +import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsPurchasePlanManager; +import com.forgon.search.service.TBarFilterManager; +import com.forgon.tools.hibernate.ObjectDao; + +/** + * 采购计划的表格处理 + * @author kzh + * + */ +public class ExpensiveGoodsPurchaseTableManager { + + private GridManager gridManager; + private DateQueryAdapter dateQueryAdapter; + private ExpensiveGoodsManager diposableGoodsManager; + private ExpensiveGoodsPurchasePlanManager goodPurchasePlanManager; + private WareHouseManager wareHouseManager; + private ObjectDao objectDao; + + @Resource(name = "goodPurchaseTableFilterManagerImpl") + private TBarFilterManager goodPurchaseTableFilterManagerImpl; + + public void setGridManager(GridManager gridManager) { + this.gridManager = gridManager; + } + + public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { + this.dateQueryAdapter = dateQueryAdapter; + } + + public void setDiposableGoodsManager(ExpensiveGoodsManager diposableGoodsManager) { + this.diposableGoodsManager = diposableGoodsManager; + } + + public void setGoodPurchasePlanManager( + ExpensiveGoodsPurchasePlanManager goodPurchasePlanManager) { + this.goodPurchasePlanManager = goodPurchasePlanManager; + } + + public void setWareHouseManager(WareHouseManager wareHouseManager) { + this.wareHouseManager = wareHouseManager; + } + + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + + public String findGoodPurchaseTableList(Map> parameterMap) { + // 申请单查看 发货单 + Map sqlWhereParamMap = gridManager.getParamFromView(parameterMap); + StringBuilder sql = new StringBuilder(" where 1=1 "); + sql.append("and (po.orgUnit.orgUnitCoding = '").append(AcegiHelper.getCurrentOrgUnitCode()).append("'"); + //根据关键字和时间来过滤 + goodPurchaseTableFilterManagerImpl.filterPara(sqlWhereParamMap,sql); + sql.append(")"); + return gridManager.renderGrid(parameterMap, GoodPurchasePlan.class.getSimpleName(), sql.toString(), new String[] { "itemsList","orgUnit" }); + } + + /** + * 根据一次性物品定义id查询该物品的库存数及最近一次的采购计划明细 + * @param disposableGoodsId + * @return + */ + public String getLastGoodPurchaseItemByDisposableGoodsId(String disposableGoodsId){ + JSONObject jsonObject = new JSONObject(); + jsonObject.put("stockQuantity", ""); + jsonObject.put("specification1", ""); + jsonObject.put("purchase", ""); + jsonObject.put("unit1", ""); + jsonObject.put("supplier1", ""); + jsonObject.put("manufacturer", ""); + DisposableGoods disposableGoods = + diposableGoodsManager.get(disposableGoodsId); + + if(disposableGoods != null && StringUtils.isNotBlank(disposableGoods.getName())){ + //一次性物品库存 + DisposableGoodsStock disposableGoodsStock = null; + List warehouseList = + wareHouseManager.getWareHouseListByCurrentOrgUnit(); + if(CollectionUtils.isNotEmpty(warehouseList)){ + int stockQuantity = 0; + for(WareHouse wareHouse : warehouseList){ + disposableGoodsStock = + diposableGoodsManager.getDisposableGoodsStockByDisposableGoodsID(wareHouse.getId(), disposableGoods.getId()); + if(disposableGoodsStock != null){ + stockQuantity += disposableGoodsStock.getAmount(); + } + } + //库存数 + jsonObject.put("stockQuantity", stockQuantity); + } + + GoodPurchaseItem goodPurchaseItem = + goodPurchasePlanManager.getLastGoodPurchaseItemByNameAndSpecification(disposableGoods.getName(), disposableGoods.getSpecification()); + if(goodPurchaseItem != null){ + //规格 + if(StringUtils.isNotBlank(disposableGoods.getSpecification())){ + jsonObject.put("specification1", disposableGoods.getSpecification()); + } + //进价 + if(goodPurchaseItem.getPurchase() != null){ + jsonObject.put("purchase", goodPurchaseItem.getPurchase()); + } + //单位 + if(StringUtils.isNotBlank(goodPurchaseItem.getUnit())){ + jsonObject.put("unit1", goodPurchaseItem.getUnit()); + } + //供应商 + if(StringUtils.isNotBlank(goodPurchaseItem.getSupplierName())){ + jsonObject.put("supplier1", goodPurchaseItem.getSupplierName()); + } + //生产厂家 + if(StringUtils.isNotBlank(goodPurchaseItem.getManufacturer())){ + jsonObject.put("manufacturer", goodPurchaseItem.getManufacturer()); + } + } + } + return jsonObject.toString(); + } + + /** + * 根据材料定义id查询该物品的库存数及最近一次的采购计划明细 + * @param materialDefinitionId + * @return + */ + public String getLastGoodPurchaseItemByMaterialDefinitionId(String materialDefinitionId){ + JSONObject jsonObject = new JSONObject(); + jsonObject.put("stockQuantity", ""); + jsonObject.put("specification1", ""); + jsonObject.put("purchase", ""); + jsonObject.put("unit1", ""); + jsonObject.put("supplier1", ""); + jsonObject.put("manufacturer", ""); + MaterialDefinition materialDefinition = + (MaterialDefinition)objectDao.getBySql(MaterialDefinition.class.getSimpleName(), "where id=" + materialDefinitionId); + + if(materialDefinition != null && StringUtils.isNotBlank(materialDefinition.getName())){ + //材料库存 + List materialGoodsStockList = null; + List warehouseList = + wareHouseManager.getWareHouseListByCurrentOrgUnit(); + if(CollectionUtils.isNotEmpty(warehouseList)){ + int stockQuantity = 0; + for(WareHouse wareHouse : warehouseList){ + materialGoodsStockList = + objectDao.findBySql(GoodsStock.class.getSimpleName(), "where wareHouseId=" + + wareHouse.getId() + " and materialDefinitionId=" + materialDefinitionId); + if(CollectionUtils.isNotEmpty(materialGoodsStockList)){ + for(GoodsStock gs : materialGoodsStockList){ + stockQuantity += gs.getAmount(); + } + } + } + //库存数 + jsonObject.put("stockQuantity", stockQuantity); + } + + GoodPurchaseItem goodPurchaseItem = + goodPurchasePlanManager.getLastGoodPurchaseItemByNameAndSpecification(materialDefinition.getName(), materialDefinition.getSpecification()); + if(goodPurchaseItem != null){ + //规格 + if(StringUtils.isNotBlank(materialDefinition.getSpecification())){ + jsonObject.put("specification1", materialDefinition.getSpecification()); + } + //进价 + if(goodPurchaseItem.getPurchase() != null){ + jsonObject.put("purchase", goodPurchaseItem.getPurchase()); + } + //单位 + if(StringUtils.isNotBlank(goodPurchaseItem.getUnit())){ + jsonObject.put("unit1", goodPurchaseItem.getUnit()); + } + //供应商 + if(StringUtils.isNotBlank(goodPurchaseItem.getSupplierName())){ + jsonObject.put("supplier1", goodPurchaseItem.getSupplierName()); + } + //生产厂家 + if(StringUtils.isNotBlank(goodPurchaseItem.getManufacturer())){ + jsonObject.put("manufacturer", goodPurchaseItem.getManufacturer()); + } + } + } + return jsonObject.toString(); + } +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsManagerImpl.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsManagerImpl.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsManagerImpl.java (revision 20740) @@ -0,0 +1,2820 @@ +package com.forgon.disinfectsystem.expensiveGoods.service; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.servlet.http.HttpServletRequest; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.log4j.Logger; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; +import org.hibernate.LockMode; +import org.hibernate.Query; +import org.hibernate.Session; +import org.springframework.beans.factory.annotation.Autowired; + +import com.forgon.attachfile.service.AttachFileManager; +import com.forgon.databaseadapter.service.DateQueryAdapter; +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.directory.model.BarcodeDevice; +import com.forgon.directory.model.OrgUnit; +import com.forgon.directory.vo.LoginUserData; +import com.forgon.disinfectsystem.basedatamanager.supplyroomconfig.service.SupplyRoomConfigManager; +import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; +import com.forgon.disinfectsystem.common.CssdUtils; +import com.forgon.disinfectsystem.disposablegoods.service.DisposableGoodsServiceContext; +import com.forgon.disinfectsystem.entity.assestmanagement.DiposableGoodsInstance; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatch; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsIdentification; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; +import com.forgon.disinfectsystem.entity.assestmanagement.ExpensiveDisposablegoods; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryDiposableGoodsItem; +import com.forgon.disinfectsystem.entity.basedatamanager.materialdefinition.MaterialDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.materialinstance.MaterialInstance; +import com.forgon.disinfectsystem.entity.basedatamanager.reportoption.GoodsOption; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseInstance; +import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; +import com.forgon.disinfectsystem.entity.departmentstock.DepartmentStock; +import com.forgon.disinfectsystem.entity.disposablegoods.DisposableGoodsInventory; +import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; +import com.forgon.disinfectsystem.entity.invoicemanager.DiposableGoodsItem; +import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; +import com.forgon.disinfectsystem.entity.invoicemanager.InvoiceItem; +import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; +import com.forgon.disinfectsystem.entity.receiverecord.ReceiveRecordItem; +import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; +import com.forgon.disinfectsystem.entity.returngoodsrecord.ReturnGoodsItem; +import com.forgon.disinfectsystem.entity.stocktakemanager.InventoryItem; +import com.forgon.disinfectsystem.entity.stocktakerecordmanager.StockDiposableGoods; +import com.forgon.disinfectsystem.entity.systemwarning.SystemWarningItemVO; +import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; +import com.forgon.disinfectsystem.expensiveGoods.util.ExpensiveGoodsUtils; +import com.forgon.disinfectsystem.inventorymanagement.dao.InventoryDao; +import com.forgon.disinfectsystem.inventorymanagement.model.Inventory; +import com.forgon.disinfectsystem.inventorymanagement.service.InventoryManager; +import com.forgon.disinfectsystem.vo.PriceAmount; +import com.forgon.log.service.LogManager; +import com.forgon.security.tools.Util; +import com.forgon.serialnumber.model.SerialNum; +import com.forgon.serialnumber.service.SerialNumManager; +import com.forgon.systemsetting.model.HttpOption; +import com.forgon.systemsetting.service.HttpOptionManager; +import com.forgon.tools.Constants; +import com.forgon.tools.GB2Alpha; +import com.forgon.tools.GB2WB; +import com.forgon.tools.MathTools; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.db.InitDbConnection; +import com.forgon.tools.excel.ParerUtils; +import com.forgon.tools.format.FormatString; +import com.forgon.tools.hibernate.BasePoManagerImpl; +import com.forgon.tools.string.StringTools; +import com.forgon.tools.util.SqlUtils; + +public class ExpensiveGoodsManagerImpl extends BasePoManagerImpl implements ExpensiveGoodsManager { + + protected Logger logger = Logger.getLogger(this.getClass()); + + private HttpOptionManager httpOptionManager; + + private AttachFileManager attachFileManager; + + private DiposableGoodBatchStockManager diposableGoodBatchStockManager; + + private SupplyRoomConfigManager supplyRoomConfigManager; + + private IdentificationOfDiposableGoodsManager identificationOfDiposableGoodsManager; + + private InitDbConnection dbConnection; + + private SerialNumManager serialNumManager; + + private DisposableGoodsStockManager disposableGoodsStockManager; + + private WareHouseManager wareHouseManager; + + private LogManager appLogManager; + + private DateQueryAdapter dateQueryAdapter; + + private InventoryDao inventoryDao; + + public void setInventoryDao(InventoryDao inventoryDao) { + this.inventoryDao = inventoryDao; + } + + public void setWareHouseManager(WareHouseManager wareHouseManager) { + this.wareHouseManager = wareHouseManager; + } + + public void setAppLogManager(LogManager appLogManager) { + this.appLogManager = appLogManager; + } + + public void setAttachFileManager(AttachFileManager attachFileManager) { + this.attachFileManager = attachFileManager; + } + + public void setHttpOptionManager(HttpOptionManager httpOptionManager) { + this.httpOptionManager = httpOptionManager; + } + + public void setDiposableGoodBatchStockManager( + DiposableGoodBatchStockManager diposableGoodBatchStockManager) { + this.diposableGoodBatchStockManager = diposableGoodBatchStockManager; + } + + public void setSupplyRoomConfigManager( + SupplyRoomConfigManager supplyRoomConfigManager) { + this.supplyRoomConfigManager = supplyRoomConfigManager; + } + + public void setIdentificationOfDiposableGoodsManager( + IdentificationOfDiposableGoodsManager identificationOfDiposableGoodsManager) { + this.identificationOfDiposableGoodsManager = identificationOfDiposableGoodsManager; + } + + public void setDbConnection(InitDbConnection dbConnection) { + this.dbConnection = dbConnection; + } + + public void setSerialNumManager(SerialNumManager serialNumManager) { + this.serialNumManager = serialNumManager; + } + + public void setDisposableGoodsStockManager( + DisposableGoodsStockManager disposableGoodsStockManager) { + this.disposableGoodsStockManager = disposableGoodsStockManager; + } + + public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { + this.dateQueryAdapter = dateQueryAdapter; + } + + @Override + public void saveOrUpdate(DisposableGoodsStock disposableGoodsStock) { + // 重新计算库存 + disposableGoodsStock.recalculateAmount(); + objectDao.saveOrUpdate(disposableGoodsStock); + } + /** + * 保存一次性物品定义 + */ + @Override + public void save(DisposableGoods disposableGoods) { + disposableGoods.setSpelling(GB2Alpha.string2Alpha(disposableGoods.getName())); + disposableGoods.setWbCode(GB2WB.getWBCode(disposableGoods.getName())); + // 处理“” + if (StringUtils.isBlank(disposableGoods.getSpecification())) { + disposableGoods.setSpecification(null); + } + + //查出对应的一次性物品库存数据,并将最小申请数量等属性更新为与一次性物品的一致 + if(DatabaseUtil.isPoIdValid(disposableGoods.getId())){ + List list = + objectDao.findBySql(DisposableGoodsStock.class.getSimpleName(), " where disposableGoodsID=" + disposableGoods.getId()); + if(CollectionUtils.isNotEmpty(list)){ + for(DisposableGoodsStock disposableGoodsStock : list){ + disposableGoodsStock.setCertification(disposableGoods.getCertification()); + disposableGoodsStock.setExternalCode(disposableGoods.getExternalCode()); + disposableGoodsStock.setInventorySerialNumber(disposableGoods.getInventorySerialNumber()); + disposableGoodsStock.setIsApplicationMaterial(disposableGoods.getIsApplicationMaterial()); + disposableGoodsStock.setIsPartOfTousseMaterial(disposableGoods.getIsPartOfTousseMaterial()); + disposableGoodsStock.setIsSupplyRoomGoods(disposableGoods.getIsSupplyRoomGoods()); + disposableGoodsStock.setPackageSpec(disposableGoods.getPackageSpec()); + disposableGoodsStock.setType(disposableGoods.getType()); + disposableGoodsStock.setUnit(disposableGoods.getUnit()); + disposableGoodsStock.setUnitConvertCoefficient(disposableGoods.getUnitConvertCoefficient()); + disposableGoodsStock.setWbCode(disposableGoods.getWbCode()); + disposableGoodsStock.setSpelling(disposableGoods.getSpelling()); + disposableGoodsStock.setMinApplyAmount(disposableGoods.getMinApplyAmount()); + disposableGoodsStock.setMinStorage(disposableGoods.getMinStorage()); + disposableGoodsStock.setMaxStorage(disposableGoods.getMaxStorage()); + disposableGoodsStock.setReferencePrice(disposableGoods.getReferencePrice()); + disposableGoodsStock.setName(disposableGoods.getName()); //同步更新一次性物品的中名字(陈家儒改) + disposableGoodsStock.setSpecification(disposableGoods.getSpecification()); //同步更新一次性物品的中规格(陈家儒改) + objectDao.saveOrUpdate(disposableGoodsStock); + } + } + } + + objectDao.saveOrUpdate(disposableGoods); + } + + /** + * 更新持久化的对象. + * @param curDisposableGoods 持久化的对象 + * @param disposableGoods 脱离的对象 + */ + private void updateDisposableGoodsProperties(DisposableGoods curDisposableGoods,DisposableGoods disposableGoods){ + curDisposableGoods.setInventorySerialNumber(disposableGoods.getInventorySerialNumber());//物资编码 + curDisposableGoods.setCertification(disposableGoods.getCertification()); + curDisposableGoods.setExternalCode(disposableGoods.getExternalCode()); + curDisposableGoods.setGrade(disposableGoods.getGrade()); + curDisposableGoods.setGuid(disposableGoods.getGuid()); + curDisposableGoods.setIsApplicationMaterial(disposableGoods.getIsApplicationMaterial()); + curDisposableGoods.setIsPartOfTousseMaterial(disposableGoods.getIsPartOfTousseMaterial()); + curDisposableGoods.setIsSupplyRoomGoods(disposableGoods.getIsSupplyRoomGoods()); + curDisposableGoods.setMaxStorage(disposableGoods.getMaxStorage()); + curDisposableGoods.setMinApplyAmount(disposableGoods.getMinApplyAmount()); + curDisposableGoods.setMinStorage(disposableGoods.getMinStorage()); + curDisposableGoods.setName(disposableGoods.getName()); + curDisposableGoods.setTtsName(disposableGoods.getTtsName()); + curDisposableGoods.setPackageSpec(disposableGoods.getPackageSpec()); + curDisposableGoods.setPrintInLabel(disposableGoods.getPrintInLabel()); + curDisposableGoods.setReferencePrice(disposableGoods.getReferencePrice()); + curDisposableGoods.setSpecification(disposableGoods.getSpecification()); + curDisposableGoods.setApplicationSpecification(disposableGoods.getApplicationSpecification()); + curDisposableGoods.setType(disposableGoods.getType()); + curDisposableGoods.setUnit(disposableGoods.getUnit()); + curDisposableGoods.setUnitConvertCoefficient(disposableGoods.getUnitConvertCoefficient()); + curDisposableGoods.setMaxApplyAmount(disposableGoods.getMaxApplyAmount()); + curDisposableGoods.setMiddlePackageUnit(disposableGoods.getMiddlePackageUnit()); + curDisposableGoods.setTransferScale(disposableGoods.getTransferScale()); + curDisposableGoods.setSequence(disposableGoods.getSequence()); + curDisposableGoods.setNotInventoryDeptCode(disposableGoods.getNotInventoryDeptCode()); + } + + /** + * 更新一次性物品批次库存的属性. + * @param curDisposableGoods + * @param disposableGoods + */ + private void updateDisposableGoodsStockProperties(DisposableGoodsStock curDisposableGoods,DisposableGoods disposableGoods){ + curDisposableGoods.setInventorySerialNumber(disposableGoods.getInventorySerialNumber());//物资编码 + curDisposableGoods.setCertification(disposableGoods.getCertification()); + curDisposableGoods.setExternalCode(disposableGoods.getExternalCode()); + curDisposableGoods.setGuid(disposableGoods.getGuid()); + curDisposableGoods.setIsApplicationMaterial(disposableGoods.getIsApplicationMaterial()); + curDisposableGoods.setIsPartOfTousseMaterial(disposableGoods.getIsPartOfTousseMaterial()); + curDisposableGoods.setIsSupplyRoomGoods(disposableGoods.getIsSupplyRoomGoods()); + curDisposableGoods.setMaxStorage(disposableGoods.getMaxStorage()); + curDisposableGoods.setMinApplyAmount(disposableGoods.getMinApplyAmount()); + curDisposableGoods.setMinStorage(disposableGoods.getMinStorage()); + curDisposableGoods.setName(disposableGoods.getName()); + curDisposableGoods.setPackageSpec(disposableGoods.getPackageSpec()); + curDisposableGoods.setReferencePrice(disposableGoods.getReferencePrice()); + curDisposableGoods.setSpecification(disposableGoods.getSpecification()); + curDisposableGoods.setApplicationSpecification(disposableGoods.getApplicationSpecification()); + curDisposableGoods.setType(disposableGoods.getType()); + curDisposableGoods.setUnit(disposableGoods.getUnit()); + curDisposableGoods.setUnitConvertCoefficient(disposableGoods.getUnitConvertCoefficient()); + curDisposableGoods.setInventoryGoods(disposableGoods.getIsInventoryGoods()); + } + + /** + * 更新一次性物品定义 + */ + @Override + public void updateDisposableGoods_TRANS_REQUIRED( + DisposableGoods disposableGoods) { + // 如果修改了名称或者规则,同步修改其他关联的表 + String oldName = disposableGoods.getOrginalName(); + String oldSpecification = disposableGoods.getOrginalSpecification(); + String oldApplicationSpecification = disposableGoods.getOrginalApplicationSpecification(); + String newName = disposableGoods.getName(); + String newSpecification = disposableGoods.getSpecification(); + String newApplicationSpecification = disposableGoods.getApplicationSpecification(); + boolean nameChanged = false; + + DisposableGoods curDisposableGoods = getDisposableGoodsById_ForUpdate(disposableGoods.getId().toString()); + if(curDisposableGoods == null){ + throw new RuntimeException("物品已被删除!"); + } + updateDisposableGoodsProperties(curDisposableGoods, disposableGoods); + save(curDisposableGoods); + // 更新DisposableGoodsStock的属性 + List disposableGoodsStockList = getDisposableGoodsStockByDisposableGoodsId(disposableGoods.getId()); + if(disposableGoodsStockList != null){ + for (DisposableGoodsStock disposableGoodsStock : disposableGoodsStockList) { + updateDisposableGoodsStockProperties(disposableGoodsStock, disposableGoods); + } + } + + if(!StringUtils.isBlank(oldName) || !StringUtils.isBlank(newName)){ + nameChanged = !StringUtils.equals(oldName, newName); + } + boolean specificationChanged = false; + boolean applicationSpecificationChanged = false; + if(!StringUtils.isBlank(oldSpecification) || !StringUtils.isBlank(newSpecification)){ + specificationChanged = !StringUtils.equals(oldSpecification, newSpecification); + } + if(!StringUtils.isBlank(oldApplicationSpecification) || !StringUtils.isBlank(newApplicationSpecification)){ + applicationSpecificationChanged = !StringUtils.equals(oldApplicationSpecification, newApplicationSpecification); + } + if(nameChanged || specificationChanged || applicationSpecificationChanged){ + updateNameAndSpecification(oldName, oldSpecification, newName, newSpecification,oldApplicationSpecification, newApplicationSpecification); + } + } + @Override + public void updateExpensiveDisposablegoodsPrintTime(List expensiveDisposablegoodsList){ + Date printTime = new Date(); + if(expensiveDisposablegoodsList != null){ + for (ExpensiveDisposablegoods expensiveDisposablegoods : expensiveDisposablegoodsList) { + expensiveDisposablegoods.setPrintTime(printTime); + objectDao.update(expensiveDisposablegoods); + } + } + } + // 出库的最终方法,优先从批次里面出库,即使限定了价格。一个批次里面优先从指定的价格出库 +// public void outStorage(DiposableGoods diposableGoods, String batchNumber, +// boolean limitBatchNumber, double cost, boolean limitCost, +// long outNumber){ +// +// boolean foundBatchNumber = false;// 是否找到了传入进来的批次 +// // 出库方法不能用于入库,所以outNumber必须大于等于0 +// if (outNumber < 0) { +// throw new RuntimeException("出库数量为负!"); +// } +// // 有2个单独的限定条件,所以有4种可能的限定情况,limitBatchNumber和limitCost的组合 +// List batches = new ArrayList(); +// List identifications = new ArrayList(); +// +// if (limitBatchNumber) { +// // 限定了批次,那么只能取对应的批次 +// if (StringUtils.isBlank(batchNumber)) { +// throw new RuntimeException("批次号为空!"); +// } +// DiposableGoodBatchStock diposableGoodBatchStock = diposableGoodBatchStockManager +// .getDiposableGoodBatchStock(diposableGoods.getId() +// .toString(), batchNumber); +// if (diposableGoodBatchStock != null) { +// batches.add(diposableGoodBatchStock); +// foundBatchNumber = true; +// } +// } else { +// // 未限定批次 +// List allBatches = diposableGoodBatchStockManager +// .getDiposableGoodBatchStockByDiposableGoodsId(diposableGoods +// .getId().toString()); +// // 找到其他的批次 +// if (allBatches != null) { +// if (StringUtils.isNotBlank(batchNumber)) { +// // 就算不限定批次号,如果有批次号,优先添加指定的批次 +// for (int i = allBatches.size() - 1; i >= 0; --i) { +// DiposableGoodBatchStock batch = allBatches.get(i); +// if (batchNumber.equals(batch.getBatchNumber())) { +// batches.add(batch); +// allBatches.remove(i); +// foundBatchNumber = true; +// break; +// } +// } +// } +// batches.addAll(allBatches); +// } +// } +// // 现在已经获取到满足条件的批次list,并且是按照批次优先级的顺序 +// // 再一次调整循序,以价格匹配的优先 +// +// // 构造一个按照优先级排列的Identification List +// long amount = 0; +// +// if (!foundBatchNumber) { +// // 没有找到参数里的批次时,以价格匹配优先 +// // 第一次循环,优先获取价格匹配的。 +// for (int di = 0; di < batches.size(); ++di) { +// DiposableGoodBatchStock diposableGoodBatchStock = batches +// .get(di); +// List identes = diposableGoodBatchStock +// .getIdentifications(); +// if (identes != null) { +// for (int ii = identes.size() - 1; ii >= 0; --ii) { +// IdentificationOfDiposableGoods ident = identes +// .get(ii); +// // 判断数量是否大于0 +// if (ident.getAmount() < 0) { +// continue; +// } +// // 此处开始判断价格,首先是限定的价格,也就是价格相同的优先 +// if (ident.getPrice().equals(cost)) { +// identifications.add(ident); +// amount += ident.getAmount(); +// if (amount >= outNumber) { +// // 数量已经够了,跳出循环 +// break; +// } +// } +// } +// // 跳出外层for循环 +// if (amount >= outNumber) { +// // 数量已经够了,跳出循环 +// break; +// } +// } +// } +// if ((amount < outNumber) && !limitCost) { +// // 如果数量不够出库的,并且没有限定价格,开始第二次循环,获取不匹配的价格的ident +// for (int di = 0; di < batches.size(); ++di) { +// DiposableGoodBatchStock diposableGoodBatchStock = batches +// .get(di); +// List identes = diposableGoodBatchStock +// .getIdentifications(); +// if (identes != null) { +// for (int ii = identes.size() - 1; ii >= 0; --ii) { +// IdentificationOfDiposableGoods ident = identes +// .get(ii); +// // 判断数量是否大于0 +// if (ident.getAmount() < 0) { +// continue; +// } +// // 如果已经在list里面了,跳过 +// if (identifications.contains(ident)) { +// continue; +// } +// identifications.add(ident); +// amount += ident.getAmount(); +// if (amount >= outNumber) { +// // 数量已经够了,跳出循环 +// break; +// } +// } +// // 跳出外层for循环 +// if (amount >= outNumber) { +// // 数量已经够了,跳出循环 +// break; +// } +// } +// } +// } +// } else { +// // 找到了参数里面的批次,以批次优先 +// for (int di = 0; di < batches.size(); ++di) { +// DiposableGoodBatchStock diposableGoodBatchStock = batches +// .get(di); +// List identes = diposableGoodBatchStock +// .getIdentifications(); +// if (identes != null) { +// for (int ii = identes.size() - 1; ii >= 0; --ii) { +// IdentificationOfDiposableGoods ident = identes +// .get(ii); +// // 判断数量是否大于0 +// if (ident.getAmount() < 0) { +// continue; +// } +// // 此处开始判断价格,首先是限定的价格,也就是价格相同的优先 +// if (ident.getPrice().equals(cost)) { +// identifications.add(ident); +// amount += ident.getAmount(); +// if (amount >= outNumber) { +// // 数量已经够了,跳出循环 +// break; +// } +// } +// } +// // 跳出外层for循环 +// if (amount >= outNumber) { +// // 数量已经够了,跳出循环 +// break; +// } +// // 如果没有限定价格,那么在一次循环剩下的价格不同的identity +// if (!limitCost) { +// for (int ii = 0; ii < identes.size(); ++ii) { +// IdentificationOfDiposableGoods ident = identes +// .get(ii); +// // 判断数量是否大于0 +// if (ident.getAmount() < 0) { +// continue; +// } +// // 如果已经在list里面了,跳过 +// if (identifications.contains(ident)) { +// continue; +// } +// identifications.add(ident); +// amount += ident.getAmount(); +// if (amount >= outNumber) { +// // 数量已经够了,跳出循环 +// break; +// } +// } +// } +// // 跳出外层for循环 +// if (amount >= outNumber) { +// // 数量已经够了,跳出循环 +// break; +// } +// } +// } +// } +// +// if (amount < outNumber) { +// // 数量不够 +// throw new RuntimeException("数量不够!"); +// } +// // 根据最终生成的Identification List,开始出库 +// long outNumberRest = outNumber;// 初始化剩余出库数量 +// for (int ii = 0; ii < identifications.size(); ++ii) { +// IdentificationOfDiposableGoods ident = identifications.get(ii); +// long curIdentificationAmount = ident.getAmount().longValue(); +// +// long curOutNumber = 0; +// if (curIdentificationAmount >= outNumberRest) { +// // 剩余出库数量小于当前物品标识对象的数量,那么当前标识出库的数量就为outNumberRest +// curOutNumber = outNumberRest; +// } else { +// // 剩余出库数量大于当前物品标识的剩余库存,那么当前标识出库的数量就为当前物品标识的剩余库存 +// curOutNumber = curIdentificationAmount; +// } +// // 修改Identification剩余库存 +// ident.setAmount(curIdentificationAmount - curOutNumber); +// // 修改BatchStock剩余库存 +// long batchStock = ident.getBatchStock().getStorage(); +// if (batchStock < curOutNumber) { +// // 这种情况是冗余数量已经出现问题 +// // 数量不够 +// throw new RuntimeException(diposableGoods.getName() + "冗余数量不一致!"); +// } +// ident.getBatchStock().setStorage(batchStock - curOutNumber); +// // 修改DiposableGoods库存 +// long goodsAmount = diposableGoods.getAmount(); +// if (goodsAmount < curOutNumber) { +// // 这种情况是冗余数量已经出现问题 +// // 数量不够 +// throw new RuntimeException(diposableGoods.getName() + "冗余数量不一致!"); +// } +// // diposableGoods.setAmount(goodsAmount - curOutNumber); +// // 待出库库存减少 +// outNumberRest -= curOutNumber; +// } +// // 数据库保存 +// // 保存identification +// for (IdentificationOfDiposableGoods identification : identifications) { +// // 暂时不需要保存,DiposableGoodBatchStock会级联保存IdentificationOfDiposableGoods +// } +// // 保存BatchStock, 更新一次性物品对应批次的库存 +// for (DiposableGoodBatchStock batchStock : batches) { +// diposableGoodBatchStockManager.saveOrUpdate(batchStock); +// } +// // 保存diposableGoods +// saveOrUpdate(diposableGoods); +// +// } + + + // 出库,限定批次和价格 + public void outStorage_TRANS_NEW(String diposableGoodsID, + String batchNumber, double cost, long outNumber) { + outStorage_inner(diposableGoodsID, batchNumber, cost, outNumber); + } + + public void outStorage_TRANS_MANDATORY(String diposableGoodsID, + String batchNumber, double cost, long outNumber) { + outStorage_inner(diposableGoodsID, batchNumber, cost, outNumber); + } + private void outStorage_inner(String diposableGoodsID, + String batchNumber, double cost, long outNumber) { + if (outNumber <= 0) { + throw new RuntimeException("出库数量必须大于0!"); + } + // 锁定一次性物品 + DisposableGoodsStock disposableGoodsStock = (DisposableGoodsStock) objectDao + .getByProperty_ForUpdate(DisposableGoodsStock.class.getSimpleName(), + "id", Long.valueOf(Long.valueOf(diposableGoodsID))); + if (disposableGoodsStock == null) { + throw new RuntimeException("一次性物品已不存在(id=" + diposableGoodsID + ")"); + } + // 获取批次对象 +// DiposableGoodBatchStock batchStock = (DiposableGoodBatchStock) objectDao +// .getByProperty(DiposableGoodBatchStock.class.getSimpleName(), +// "id", Long.valueOf(Long.valueOf(batchID))); + } + + // 更新标识号和相应的批次,一次性物品库存 + @Override + public void updateStorage_TRANS_MANDATORY( + Iterable identifications) { + updateStorage_internal(identifications); + } + + private void updateStorage_internal( + Iterable identifications) { + if (identifications == null) { + return; + } + Set disposableGoodsStocks = new HashSet(); + Set disposableGoodsBatchStocks = new HashSet(); + for (DisposableGoodsIdentification identification : identifications) { + objectDao.update(identification); + DisposableGoodsBatchStock batchStock = identification.getBatchStock(); + if (batchStock == null) { + throw new RuntimeException("批次为空!"); + } + disposableGoodsBatchStocks.add(batchStock); + DisposableGoodsStock disposableGoodsStock = batchStock.getDiposableGoods(); + if (disposableGoodsStock == null) { + throw new RuntimeException("一次性物品为空!"); + } + disposableGoodsStocks.add(disposableGoodsStock); + } + for (DisposableGoodsBatchStock disposableGoodsBatchStock : disposableGoodsBatchStocks) { + objectDao.update(disposableGoodsBatchStock); + } + for (DisposableGoodsStock disposableGoodsStock : disposableGoodsStocks) { + objectDao.update(disposableGoodsStock); + } + } + + @Override + public DisposableGoodsStock getDisposableGoodsStockById(String id){ + return (DisposableGoodsStock) objectDao.getByProperty( + DisposableGoodsStock.class.getSimpleName(), "id", Long.valueOf(id)); + } + + @Override + public boolean verifyDiposableGoods(String id, String name, + String specification) { + String sql = "where po.name = '" + name + "'"; + if (StringUtils.isNotEmpty(id)) { + sql += " and po.id != " + id; + } + sql += String.format(" and %s", SqlUtils.getStringFieldPredicateWithBlankHandling("po.specification", specification)); + + if (objectDao.getBySql(DisposableGoods.class.getSimpleName(), sql) != null) { + return false; + } else { + return true; + } + } + + @Override + public String getDiposableGoodsTypeTreeJson() { + JSONArray jsonArray = new JSONArray(); + List types = httpOptionManager + .getHttpOptionTextById(HttpOption.SYSTEMSETTING_DIPOSABLEGOODS_TYPE); + for (String type : types) { + JSONObject json = new JSONObject(); + json.put("expanded", false); + json.put("href", "javascript:reloadGrid('"+type+"');"); + json.put("hrefTarget", "_self"); + json.put("isManager", false); + json.put("keyId", ""); + json.put("leaf", true); + json.put("singleClickExpand", true); + json.put("text", type); + jsonArray.add(json); + } + return jsonArray.toString(); + } + + /** + * 获取一次性物品定义及材料定义的列表 + * @param simpleSpell 拼音或五笔码,或者是物品名称 + * @param allItems 是否能被科室申请的标志,值yes表示能 + * @param wareHouseId 科室的id,可以为null + * @return + */ + @Override + public List> searchDisposableGoodsAndMaterialList(String simpleSpell, String allItems,String handleDepartCode,boolean showExternalCodeOfDisposableGoods){ + //一次性物品sql + String sql = buildGetDisposableGoodsSql(simpleSpell, allItems); + //一次性物品结果 + List> disposableGoodsMapList = getDisposableGoodsListInternal( + handleDepartCode, sql,false, null ,showExternalCodeOfDisposableGoods); + + //材料结果 + List> materialDefinitionMapList = getMaterialDefinitionListInternal( + handleDepartCode, buildGetMaterialDefinitionSql(simpleSpell),false,false); + + List> mapList = new ArrayList>(); + if(CollectionUtils.isNotEmpty(disposableGoodsMapList)){ + for(Map map : disposableGoodsMapList){ + mapList.add(map); + } + } + + if(CollectionUtils.isNotEmpty(materialDefinitionMapList)){ + for(Map map : materialDefinitionMapList){ + mapList.add(map); + } + } + return mapList; + } +/* + public JSONObject searchDisposableGoodsAndMaterialList(String simpleSpell, String allItems,String handleDepartCode,boolean showExternalCodeOfDisposableGoods){ + //一次性物品sql + String sql = buildGetDisposableGoodsSql(simpleSpell, allItems); + //一次性物品结果 + List> disposableGoodsMapList = getDisposableGoodsListInternal( + handleDepartCode, sql,false,showExternalCodeOfDisposableGoods); + + //材料结果 + List> materialDefinitionMapList = getMaterialDefinitionListInternal( + handleDepartCode, buildGetMaterialDefinitionSql(simpleSpell),false,false); + + List> mapList = new ArrayList>(); + if(CollectionUtils.isNotEmpty(disposableGoodsMapList)){ + for(Map map : disposableGoodsMapList){ + mapList.add(map); + } + } + + if(CollectionUtils.isNotEmpty(materialDefinitionMapList)){ + for(Map map : materialDefinitionMapList){ + mapList.add(map); + } + } + + Map map = new HashMap(); + map.put("totalCount", mapList.size()); + + map.put("data", mapList); + System.out.println("JSONObject.fromObject(map)=\n"+JSONObject.fromObject(map)); + return JSONObject.fromObject(map); + } +*/ + + /** + * 获取一次性物品NAME和ID + */ + @Override + @SuppressWarnings("unchecked") + public JSONObject searchDisposableGoodsList(String simpleSpell, String allItems, + String handleDepartCode,boolean showExternalCodeOfDisposableGoods) { + String sql = buildGetDisposableGoodsSql(simpleSpell, allItems); + + /*if(DatabaseUtil.isPoIdValid(wareHouseId)){ + sql += " and po.wareHouseID = " + wareHouseId; + }*/ + List> mapList = getDisposableGoodsListInternal( + handleDepartCode, sql,false, null ,showExternalCodeOfDisposableGoods); + + Map map = new HashMap(); + map.put("totalCount", mapList.size()); + + map.put("data", mapList); + return JSONObject.fromObject(map); + } + + @Override + public List> findDisposableGoodsList(String simpleSpell, String allItems, String handleDepartCode , String canInventory, boolean showExternalCodeOfDisposableGoods) { + String sql = this.buildGetDisposableGoodsSql(simpleSpell, allItems); + List> mapList = this.getDisposableGoodsListInternal(handleDepartCode, sql,false , canInventory,showExternalCodeOfDisposableGoods); + return mapList; + } + + /** + * 查询材料 + * @param handleDepartCode + * @param sql + * @param showReferencePrice + * @param showExternalCodeOfDisposableGoods + * @return + */ + private List> getMaterialDefinitionListInternal( + String handleDepartCode, String sql,boolean showReferencePrice,boolean showExternalCodeOfDisposableGoods) { + List materialDefinitionList = objectDao.findBySql( + MaterialDefinition.class.getSimpleName(), sql); + List> mapList = new ArrayList>(); + if(CollectionUtils.isNotEmpty(materialDefinitionList)){ + for(MaterialDefinition md : materialDefinitionList){ + Map temp = new HashMap(); + temp.put("id", md.getId()); + temp.put("materialDefinitionId", md.getId()); + temp.put("type", GoodsStock.TYPE_MATERIAL); + temp.put("name", CssdUtils.getMaterialName(md)); + temp.put("displayName", CssdUtils.getMaterialName(md)); + temp.put("spelling", md.getSpelling()); + temp.put("externalCode", md.getExternalCode()); + temp.put("unit", StringTools.getDefaultString(md.getUnit())); + temp.put("tousseType", GoodsStock.TYPE_MATERIAL); + temp.put("amount", 0); + temp.put("price", 0.00); + mapList.add(temp); + } + } + return mapList; + } + + /** + * 查询某个供应室处理的一次性物品数据. + * @param handleDepartCode 处理科室的科室编码 + * @param sql sql + * @param showReferencePrice 是否显示参考价 + * @param canInventory 是否盘点 + * @param showExternalCodeOfDisposableGoods 是否显示外部编码 + * @return + */ + private List> getDisposableGoodsListInternal( + String handleDepartCode, String sql,boolean showReferencePrice , String canInventory,boolean showExternalCodeOfDisposableGoods) { + //当前登录用户 + LoginUserData currentLoginUser = AcegiHelper.getLoginUser(); + //所属科室 + String orgUnitCoding = currentLoginUser.getCurrentOrgUnitCode(); + if(StringUtils.isNotBlank(orgUnitCoding)){ + //如果是否盘点为yes时 + if(StringUtils.equalsIgnoreCase("yes", canInventory)){ + if(DatabaseUtil.isSqlServer(dbConnection.getDatabase())){ + sql += " and (notInventoryDeptCode is null or ',' + notInventoryDeptCode not like '%," + orgUnitCoding + ",%') "; + }else if(DatabaseUtil.isOracle(dbConnection.getDatabase())){ + sql += " and (notInventoryDeptCode is null or ',' || notInventoryDeptCode not like '%," + orgUnitCoding + ",%') "; + } + } + //否则如果是否盘点为no时 + else if(StringUtils.equalsIgnoreCase("no", canInventory)){ + if(DatabaseUtil.isSqlServer(dbConnection.getDatabase())){ + sql += " and (',' + notInventoryDeptCode like '%," + orgUnitCoding + ",%') "; + }else if(DatabaseUtil.isOracle(dbConnection.getDatabase())){ + sql += " and (',' || notInventoryDeptCode like '%," + orgUnitCoding + ",%') "; + } + } + } + + List disposableGoodsList = objectDao.findBySql(DisposableGoods.class.getSimpleName(), sql); + double floatPercent = supplyRoomConfigManager.getDisposableGoodsFluctuationPercent();// 一次性物品浮动价格系数/ + List> mapList = new ArrayList>(); + OrgUnit org = new OrgUnit(); + org.setOrgUnitCoding(handleDepartCode); + List list = wareHouseManager.getWareHouseListByOrgUnit(org); + + Set disposableGoodsIds = null; + Set warehouseIds = null; + if(StringUtils.isNotBlank(handleDepartCode)){ + if(disposableGoodsList != null){ + disposableGoodsIds = disposableGoodsList.stream().map((disposableGoods)->disposableGoods.getId() + "").collect(Collectors.toSet()); + } + if(list != null){ + warehouseIds = list.stream().map((warehouse)->warehouse.getId() + "").collect(Collectors.toSet()); + } + } + + List goodsStocks = disposableGoodsStockManager.getDisposableGoodsStockList(disposableGoodsIds, warehouseIds); + + for (DisposableGoods disposableGoods : disposableGoodsList) { + Map item = buildDisposableGoodsPropertyMap(disposableGoods,goodsStocks,floatPercent,showReferencePrice,showExternalCodeOfDisposableGoods); + if(item != null){ + mapList.add(item); + } + } + + // 省医需求库存依据:一次性物品的库存数量 = 现有库存数量-待发货的物品数量 + if (ObjectUtils.equals("true", CssdUtils.getSystemSetConfigByName("storageUseStorageSubtractWaitDeliver"))){ + this.reCalculateStorageAmountByLists(mapList); + } + if (showExternalCodeOfDisposableGoods){ + Collections.sort(mapList, new Comparator>() { + @Override + public int compare(Map o1, + Map o2) { + // 根据外部编码排序 + int result = ObjectUtils.compare(o1.get("externalCode").toString(), o2.get("externalCode").toString()); + return result; + } + }); + } + return mapList; + } + + /** + * 重新计算库存(库存数量-待发货的物品数量). + * @param mapList 一次性物品相关数据 + */ + private void reCalculateStorageAmountByLists(List> mapList) { + //找出有needToReCount标识的一次性物品id + Set ids = mapList.stream().filter(map -> map.get("needToReCount") != null).flatMap(map -> Stream.of(MapUtils.getLong(map, "disposableGoodsId"))).collect(Collectors.toSet()); + if (ids.size() > 0){ + String countStorageSql = " select ti2.disposableGoodsId as \"disposableGoodsId\",ti2.waitDeliverAmount as \"waitDeliverAmount\" from (" + + "select ti.disposableGoodsId ,sum(ti.amount - ti.sendOutAmount)waitDeliverAmount from TousseItem ti " + + "where ti.isTerminated is null and " + + SqlUtils.getNonStringFieldInCollectionsPredicate(" ti.disposableGoodsId ", ids) + + "group by ti.disposableGoodsId ) ti2 "; + //找出每个物品的待发货数量 + List> byParam = objectDao.findSqlByParam(countStorageSql, new Object[]{}); + for (Map map : byParam) { + Long disposableGoodsId = MapUtils.getLong(map, "disposableGoodsId"); + Integer waitDeliverAmount = MapUtils.getInteger(map, "waitDeliverAmount", 0); + mapList.stream().filter(objectMap -> disposableGoodsId.equals(MapUtils.getLong(objectMap, "disposableGoodsId"))).findFirst().ifPresent(objectMap -> { + Integer storageAmount = MapUtils.getInteger(objectMap, "amount", 0); + int storage = Math.subtractExact(storageAmount, waitDeliverAmount); + if (storage < 0){ + logger.warn(String.format("物品[%s]库存为[%s]少于0", disposableGoodsId, storage)); + storage = 0; + } + //计算后重新设置amount + objectMap.put("amount", storage); + if (storageAmount > 0 && waitDeliverAmount > 0){ + logger.debug(String.format("物品:[%s]待发货的数量是:%d,总库存是:%s,剩余库存是:%s", disposableGoodsId, waitDeliverAmount, storageAmount, storage)); + } + }); + } + } + } + + /** + * 构建一次物品的一些属性,供前台的combo使用. + * @param disposableGoods 当前一次性物品对象 + * @param goodsStocks 库存集合,如果disposableGoods的库存,则跳过(有点浪费效率) + * @param floatPercent 浮动系数 + * @param showReferencePrice 是否需要显示参考价 + * @param showExternalCodeOfDisposableGoods 是否需要显示外部编码 + * @return + */ + private Map buildDisposableGoodsPropertyMap(DisposableGoods disposableGoods, + List goodsStocks,double floatPercent,boolean showReferencePrice, + boolean showExternalCodeOfDisposableGoods) { + if(disposableGoods == null) + return null; + Map temp = new HashMap(); + + String goodsName = disposableGoods.getShowName() ; + String externalCode = disposableGoods.getExternalCode(); + if (externalCode == null){ + externalCode = ""; + } + + temp.put("id", disposableGoods.getId()); + temp.put("disposableGoodsId", disposableGoods.getId()); + //物资系统的物资定义id + temp.put("sourceIdFromHisSync", disposableGoods.getIdFromHisSync()); + temp.put("type", "一次性物品"); + temp.put("disposableGoodsName", disposableGoods.getName());//没有拼接的名字 + temp.put("specification", disposableGoods.getSpecification());//规格 + temp.put("name", goodsName); + temp.put("unitForDisplay", disposableGoods.getUnitForDisplay()); + temp.put("spelling", disposableGoods.getSpelling()); + temp.put("externalCode", externalCode); + temp.put("sourceId", disposableGoods.getIdFromHisSync()); + temp.put("goodsType", disposableGoods.getGoodsType()); + temp.put("minApplyAmount", disposableGoods.getMinApplyAmount()); + temp.put("unit", StringTools.getDefaultString(disposableGoods.getUnit())); + temp.put("tousseType", "一次性物品"); + temp.put("packageSpec", disposableGoods.getPackageSpec()); + temp.put("amount", 0); + temp.put("price", 0.00); + temp.put("maxApplyAmount",disposableGoods.getMaxApplyAmount()); + temp.put("middlePackageUnit",disposableGoods.getMiddlePackageUnit()); + temp.put("transferScale",disposableGoods.getTransferScale()); + temp.put("sequence",disposableGoods.getSequence() == null ? 0 : disposableGoods.getSequence()); + String displayName = goodsName; + temp.put("displayName", displayName + "(库存:0)"); + if(goodsStocks != null && goodsStocks.size() > 0){ + for (DisposableGoodsStock goodsStock : goodsStocks) { + //如果不是当前一次性物品定义的库存,则跳过 + if(!disposableGoods.getId().equals(goodsStock.getDisposableGoodsID())){ + continue; + } + Object obj = temp.get("amount"); + int storage = (int) (Integer.parseInt(obj.toString()) + goodsStock.getAmount()); + + temp.put("amount", storage); + // 省医需求:一次性物品的库存数量 = 库存数量-待发货的物品数量,不能在这里算库存!!!!因为这样要逐个物品遍历,效率非常低甚至会超时,needToReCount只是作为一个标识使用, + // 说明这个物品需要重新计算库存,在这个方法的外面把含有这个属性的物品id读出来,然后一次把这些物品的待发货数量全部从数据库查出来再来计算对应库存 + temp.put("needToReCount", storage); + + if (showReferencePrice) { + temp.put("referencePrice", disposableGoods.getReferencePrice()); + + // 价格修改为浮动价格 + Double price = getRecentPrice(disposableGoods); + price = MathTools.mul(price, floatPercent).doubleValue(); + temp.put("price", price); + displayName = getDisposableGoodsDisplayName(disposableGoods,temp,price); + temp.put("displayName", displayName); + }else{ + displayName = getDisposableGoodsDisplayName(disposableGoods,temp); + temp.put("displayName", displayName); + } + } + } + if (showExternalCodeOfDisposableGoods){ + if (StringUtils.isNotBlank(externalCode)){ + displayName = "" + externalCode + ":" + displayName; + temp.put("displayName", displayName); + } + } + return temp; + } + + private String getDisposableGoodsDisplayName(DisposableGoods disposableGoods, Map map){ + if(disposableGoods == null){ + return StringTools.EMPTY; + } + String displayName = disposableGoods.getShowName(); + Integer amount = MapUtils.getInteger(map, "amount", null); + if(amount != null){ + displayName += "(库存:"; + displayName += amount; + displayName += ")"; + } + return displayName; + } + private String getDisposableGoodsDisplayName(DisposableGoods disposableGoods, Map map, Double price){ + if(disposableGoods == null){ + return StringTools.EMPTY; + } + String displayName = disposableGoods.getShowName(); + if(price != null){ + String packageSpec = disposableGoods.getPackageSpec(); + if (StringUtils.isBlank(packageSpec)) { + packageSpec = ""; + } else { + packageSpec = "(" + packageSpec + ")"; + } + + Integer amount = MapUtils.getInteger(map, "amount", null); + if(amount != null){ + displayName = displayName + packageSpec + "(参考价:" + price + ")(库存:" + amount + ")"; + } + } + return displayName; + } + + private String buildGetDisposableGoodsSql(String simpleSpell, + String allItems) { + String sql; + if (StringUtils.equals(allItems, "yes")) { + sql = "where 1=1"; + } else { + sql = " where po.isApplicationMaterial = '" + + DisposableGoods.CONSTANT_YES + "'"; + } + + Matcher m = Constants.ChineseCharPattern.matcher(simpleSpell); + String searchMode = AcegiHelper.getLoginUser().getSearchMode(); + if (StringUtils.isNotBlank(simpleSpell)) { + simpleSpell = simpleSpell.toUpperCase(); + if (m.find()) { + sql += " and po.name like '%" + simpleSpell + "%'"; + } else { + sql += Util.getSearchSQLByUserSetting(searchMode, + simpleSpell); + } + } + return sql; + } + + private String buildGetMaterialDefinitionSql(String simpleSpell) { + String sql = " where 1=1 "; + + Matcher m = Constants.ChineseCharPattern.matcher(simpleSpell); + String searchMode = AcegiHelper.getLoginUser().getSearchMode(); + if (StringUtils.isNotBlank(simpleSpell)) { + simpleSpell = simpleSpell.toUpperCase(); + if (m.find()) { + sql += " and po.name like '%" + simpleSpell + "%'"; + } else { + sql += Util.getSearchSQLByUserSetting(searchMode, + simpleSpell); + } + } + return sql; + } + + @Override + public Double getRecentPrice(DisposableGoods disposableGoods){ + String sql = ""; + if (dbConnection.isSqlServer()) { + sql = "select * from (select top 1 d.cost from DisposableGoodsBatchStock d where d.disposableGoodsId = " + + disposableGoods.getId() + + " and storage > 0 order by d.id asc) as temp"; + } else if (dbConnection.isOracle()) { + sql = "select * from (select d.cost from DisposableGoodsBatchStock d where d.disposableGoodsId = " + + disposableGoods.getId() + + " and storage > 0 order by d.id asc) where rownum =1"; + } + ResultSet rs = objectDao.executeSql(sql); + Double returnValue = null; + try { + while (rs.next()) { + returnValue = rs.getDouble("cost"); + } + } catch (SQLException e) { + e.printStackTrace(); + }finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + // 如果无价格,使用一次性物品指导价 + if (returnValue == null) { + returnValue = disposableGoods.getReferencePrice(); + if (returnValue == null) { + returnValue = 0d; + } + } + return returnValue; + } + + @Override + public List> getDisposableGoodsList(String sql, + boolean showReferencePrice,boolean showExternalCodeOfDisposableGoods, String handleDepartCode) { + return this.getDisposableGoodsListInternal(handleDepartCode, sql, + showReferencePrice, null ,showExternalCodeOfDisposableGoods); + } + + @Override + @SuppressWarnings("unchecked") + @Deprecated + public List> getDiposableGoodsList(String sql,boolean showReferencePrice, + boolean showExternalCodeOfDisposableGoods) { + List disposableGoodsStockList = objectDao.findBySql( + DisposableGoodsStock.class.getSimpleName(), sql); + List> mapList = new ArrayList>(); + + if (showExternalCodeOfDisposableGoods){ + Collections.sort(disposableGoodsStockList, new Comparator() { + @Override + public int compare(DisposableGoodsStock o1, + DisposableGoodsStock o2) { + // 根据外部编码排序 + int result = ObjectUtils.compare(o1.getExternalCode(), o2.getExternalCode()); + return result; + } + }); + } + for (DisposableGoodsStock disposableGoodsStock : disposableGoodsStockList) { + Map temp = new HashMap(); + temp.put("id", disposableGoodsStock.getId()); + String goodsName = disposableGoodsStock.getName(); + if (StringUtils.isNotBlank(disposableGoodsStock.getSpecification())) { + goodsName += "[" + disposableGoodsStock.getSpecification() + "]"; + } + // TousseDefintionManagerImpl中的查询加上了type,需确认是否可以去掉 + temp.put("type", "一次性物品"); + + temp.put("name", goodsName); + temp.put("spelling", disposableGoodsStock.getSpelling()); + temp.put("amount", disposableGoodsStock.getAmount()); + temp.put("externalCode", disposableGoodsStock.getExternalCode()); + temp.put("minApplyAmount", disposableGoodsStock.getMinApplyAmount()); + String unit = disposableGoodsStock.getUnit(); + if (unit == null){ + unit = ""; + } + temp.put("unit", unit); + temp.put("tousseType", "一次性物品"); + temp.put("packageSpec", disposableGoodsStock.getPackageSpec()); + + String displayName = goodsName + "(库存:" + + disposableGoodsStock.getAmount() + ")"; + + + if (showReferencePrice) { + temp.put("referencePrice", disposableGoodsStock.getReferencePrice()); + + // 价格修改为浮动价格 + Double price = diposableGoodBatchStockManager.getEarliestPrice(disposableGoodsStock); + price = supplyRoomConfigManager.getDisposableGoodsFluctuationPrice(price); + temp.put("price", price); + + String packageSpec = disposableGoodsStock.getPackageSpec(); + if (StringUtils.isBlank(packageSpec)) { + packageSpec = ""; + } else { + packageSpec = "(" + packageSpec + + ")"; + } + + displayName = goodsName + packageSpec + + "(参考价:" + price + ")(库存:" + + disposableGoodsStock.getAmount() + ")"; + } + + if (showExternalCodeOfDisposableGoods){ + String externalCode = disposableGoodsStock.getExternalCode(); + if (StringUtils.isNotBlank(externalCode)){ + displayName = "" + externalCode + ":" + displayName; + } + + } + + temp.put("displayName", displayName); + + mapList.add(temp); + } + return mapList; + } + + @Override + @SuppressWarnings("unchecked") + public JSONObject searchMaterialAndDiposableGoods(String searchString,String goodsType) { + JSONObject json = null; + String sql = "where 1=1"; + + /* Matcher m = Constants.ChineseCharPattern.matcher(searchString); + String searchMode = AcegiHelper.getLoginUser().getSearchMode(); + searchString = searchString.trim(); + if (searchString.length() > 0) { + searchString = searchString.toUpperCase(); + if (m.find()) { + sql += " and po.name like '%" + searchString + "%'"; + } else { + sql += Util.getSearchSQLByUserSetting(searchMode, + searchString); + } + }*/ + sql = com.forgon.util.SqlUtils.getSQLByKeyWord(searchString, sql); + + List> mapList = this.searchGoodByType(goodsType, sql); + /*if("disposableGoods".equals(goodsType)){ + searchDisposableGoods(sql,mapList); + }else if("material".equals(goodsType)){ + searchMaterialGoods(sql, mapList); + }else{ + searchDisposableGoods(sql,mapList); + searchMaterialGoods(sql, mapList); + }*/ + Map map = new HashMap(); + map.put("totalCount", mapList.size()); + map.put("data", mapList); + json = JSONObject.fromObject(map); + return json; + } + + @Override + public List> findMaterialAndDisposableGoods(String searchString,String goodsType){ + String sql = "where 1=1"; + sql = com.forgon.util.SqlUtils.getSQLByKeyWord(searchString, sql); + return this.searchGoodByType(goodsType, sql); + } + + /** + * 根据物品类型来查找对应的物品 + * @param goodsType 物品的类型 + * @param sql 查询的sql + */ + private List> searchGoodByType(String goodsType, String sql){ + List> mapList = new ArrayList<>(); + if("disposableGoods".equals(goodsType)){ + searchDisposableGoods(sql, mapList); + } + else if("material".equals(goodsType)){ + searchMaterialGoods(sql, mapList); + } + else{ + searchDisposableGoods(sql, mapList); + searchMaterialGoods(sql, mapList); + } + return mapList; + } + + @SuppressWarnings("unchecked") + private void searchDisposableGoods(String sql,List> mapList) { + if(mapList != null){ + List disposableGoodsList = objectDao.findBySql( + DisposableGoods.class.getSimpleName(), sql); + for (DisposableGoods disposableGoods : disposableGoodsList) { + Map temp = new HashMap(); + temp.put("id", disposableGoods.getId()); + String goodsName = disposableGoods.getName(); + if (StringUtils.isNotBlank(disposableGoods.getSpecification())) { + goodsName += "[" + disposableGoods.getSpecification() + "]"; + } + temp.put("name", goodsName); + temp.put("type", DisposableGoods.TYPE_NAME); + mapList.add(temp); + } + } + } + + @SuppressWarnings("unchecked") + private void searchMaterialGoods(String sql, + List> mapList) { + if(mapList != null){ + List materials = objectDao.findBySql( + MaterialDefinition.class.getSimpleName(), sql); + for (MaterialDefinition materialDefinition : materials) { + Map temp = new HashMap(); + temp.put("id", materialDefinition.getId()); + String goodsName = materialDefinition.getName(); + if (StringUtils.isNotBlank(materialDefinition.getSpecification())) { + goodsName += "[" + materialDefinition.getSpecification() + "]"; + } + temp.put("name", goodsName); + temp.put("type", MaterialDefinition.TYPE_NAME); + mapList.add(temp); + } + } + } + + /** + * 删除一次性物品并且返回不能被删除的一次性物品的名称 + * + * @param ids + * @return + */ + @Override + public String deleteDiposableGoodsAndReturnMessage(String ids) { + int deletedSucceed = 0; + Set idsSet = new HashSet(); + if(StringUtils.isBlank(ids)){ + throw new RuntimeException("要删除的一次性物品定义id不能为空!"); + } + for (String id : ids.split(";")) { + idsSet.add(Long.valueOf(id)); + } + // 锁定一次性物品 + List disposableGoodsList = getDisposableGoodsByDisposableGoodsIDs_ForUpdate(idsSet); + if (disposableGoodsList == null + || disposableGoodsList.isEmpty()) { + throw new RuntimeException("物品定义已被删除!"); + } + // 校验是否能删除,如果有任何关联的数据,则不允许删除。 + // 入库单/退库单/调拨单 +// String sql = String.format(" where %s", SqlUtils.getStringFieldInCollectionsPredicate("po.disposableGoodsID", idsSet)); +// if(objectDao.countObjectBySql(GodownEntryItem.class.getSimpleName(), sql) > 0){ +// throw new RuntimeException("物品定义有关联的入库单/退库单/调拨单记录,不能被删除!"); +// } + // 库存对象,因为目前所有的相关记录都是关联库存对象,所以只需要库存对象为空,就允许删除。 + String sql = String.format(" where %s", SqlUtils.getStringFieldInCollectionsPredicate("po.disposableGoodsID", idsSet)); + if(objectDao.countObjectBySql(DisposableGoodsIdentification.class.getSimpleName(), sql) > 0){ + throw new RuntimeException("物品定义有关联的库存对象,不能被删除!"); + } + sql = String.format(" where %s", SqlUtils.getStringFieldInCollectionsPredicate("po.disposableGoodsID", idsSet)); + if(objectDao.countObjectBySql(ExpensiveDisposablegoods.class.getSimpleName(), sql) > 0){ + throw new RuntimeException("物品定义有关联的高值耗材对象,不能被删除!"); + } + String deleteSql = String.format("delete from %s where %s",DisposableGoods.class.getSimpleName(), SqlUtils.getStringFieldInCollectionsPredicate("id", idsSet)); + objectDao.executeUpdate(deleteSql); +// for (String id : ids.split(";")) { +// if (StringUtils.isNotBlank(id)) { +// GodownEntryItem item = (GodownEntryItem) objectDao.getBySql( +// GodownEntryItem.class.getSimpleName(), +// "where po.diposableGoods.id = " + id); +// if (item != null) { +// DisposableGoods disposableGoodsStock = getDiposableGoodsById(id); +// if (returnValue == null) { +// returnValue = disposableGoodsStock.getName(); +// } else { +// returnValue += "," + disposableGoodsStock.getName(); +// } +// } else { +// deleteDiposableGoodsById(id); +// deletedSucceed++; +// } +// } +// +// } +// if (StringUtils.isNotBlank(returnValue)) { +// returnValue += "在入库单中有记录,不能删除。"; +// } else { +// returnValue = ""; +// } + return "删除成功!"; + } + + + @Override + public DisposableGoodsStock getDisposableGoodsStockByName(Long warehouseId,String name, + String specification) { + if (StringUtils.isBlank(name)) { + return null; + } + String sql = String.format(" where po.warehouseID=%s ",warehouseId); + sql += "and po.name = '" + name + "'"; + sql += String.format(" and (%s) ", SqlUtils.getStringFieldPredicateWithBlankHandling("po.specification", specification)); + + return (DisposableGoodsStock) objectDao.getBySql( + DisposableGoodsStock.class.getSimpleName(), sql); + } + + /** + * 根据名字和规格获取一次性物品 + * @param name 名字 + * @param specification 规格 + * @return + */ + @Override + public DisposableGoods get(String name, + String specification) { + if (StringUtils.isBlank(name)) { + return null; + } + if(StringUtils.isBlank(specification)){ + specification = null; + } + String sql = String.format(" where %s and %s", SqlUtils + .getStringFieldPredicate("po.name", name), SqlUtils + .getStringFieldPredicate("po.specification", specification)); + return (DisposableGoods) objectDao.getBySql( + DisposableGoods.class.getSimpleName(), sql); + } + @Override + public DisposableGoodsBatchStock getDisposableGoodsStockByBatchNumber(Long warehouseID,Long disposableGoodsID, String batchNumber){ + if (!DatabaseUtil.isPoIdValid(warehouseID) + || !DatabaseUtil.isPoIdValid(disposableGoodsID)) { + return null; + } + if(StringUtils.isBlank(batchNumber)){ + return null; + } + String sql = String.format( + " where po.warehouseID=%s and po.disposableGoodsId=%s and po.batchNumber='%s' ",warehouseID, + disposableGoodsID, batchNumber); + return (DisposableGoodsBatchStock) objectDao.getBySql( + DisposableGoodsBatchStock.class.getSimpleName(), sql); + } + + @Override + public DisposableGoodsBatch getDisposableGoodsBatchByBatchNumber( + Long disposableGoodsID, String batchNumber) { + String sql = String.format( + " where po.diposableGoods.id=%s and po.batchNumber='%s' ", + disposableGoodsID, batchNumber); + return (DisposableGoodsBatch) objectDao.getBySql( + DisposableGoodsBatch.class.getSimpleName(), sql); + } + + @Override + public DisposableGoodsBatch getDisposableGoodsBatchById(Long disposableGoodsBatchId){ + return (DisposableGoodsBatch) objectDao.getByProperty( + DisposableGoodsBatch.class.getSimpleName(),"id", disposableGoodsBatchId); + } + + @Override + public DisposableGoodsStock getDisposableGoodsStockByDisposableGoodsID( + Long warehouseID, Long disposableGoodsID) { + if (!DatabaseUtil.isPoIdValid(warehouseID) + || !DatabaseUtil.isPoIdValid(disposableGoodsID)) { + return null; + } + String sql = String.format(" where %s and %s", SqlUtils + .getLongFieldPredicate("po.disposableGoodsID", + disposableGoodsID), SqlUtils.getLongFieldPredicate( + "po.warehouseID", warehouseID)); + return (DisposableGoodsStock) objectDao.getBySql( + DisposableGoodsStock.class.getSimpleName(), sql); + } + @Override + public DisposableGoodsBatchStock getByWarehouseIDAndBarcode(Long warehouseID,String barcode){ + String sql = String.format( + " where %s and %s", + SqlUtils.getLongFieldPredicate("po.warehouseID", warehouseID), + SqlUtils.getStringFieldPredicate("po.barcode", barcode)); + return (DisposableGoodsBatchStock) objectDao.getBySql( + DisposableGoodsBatchStock.class.getSimpleName(), sql); + } + /** + * 从excel文档导入一次性物品信息 add by panhaowen + * + * @param request + */ + @Override + public String importDiposableGoodsFromExcel(HttpServletRequest request) { + + List inputStreams = attachFileManager + .getInputStreamFromAttachFile(request); + int count = 0; + String errorRowNum = ""; + for (InputStream is : inputStreams) { + try { + POIFSFileSystem fs = new POIFSFileSystem(is); + HSSFWorkbook wb = new HSSFWorkbook(fs); + HSSFSheet sheet = wb.getSheetAt(0); + int lastRowNumber = sheet.getLastRowNum(); + for (int i = 1; i < lastRowNumber + 1; i++) {// 注意表头 + HSSFRow row = sheet.getRow(i); + if (row == null || ParerUtils.isBlankRow(row)) { + continue; + } + + // 器械名称 + String name = ParerUtils.getCellValueByColNum(row, + (short) 0); + if (StringUtils.isBlank(name)) { + errorRowNum += "(" + row.getRowNum() + "),"; + continue; + } else { + DisposableGoods disposableGoods = get( + name, null); + if (disposableGoods != null) { + errorRowNum += "(" + row.getRowNum() + "),"; + continue; + } + } + + // 总数 + String amount = ParerUtils.getCellValueByColNum(row, + (short) 1); + + // 类型 + String type = ParerUtils.getCellValueByColNum(row, + (short) 2); + if (StringUtils.isBlank(type)) { + errorRowNum += "(" + row.getRowNum() + "),"; + continue; + } else { + List typeList = httpOptionManager + .getHttpOptionTextById(HttpOption.SYSTEMSETTING_DIPOSABLEGOODS_TYPE); + if (!typeList.contains(type)) { + errorRowNum += "(" + row.getRowNum() + "),"; + continue; + } + } + + // 拼音简称 + String spelling = ParerUtils.getCellValueByColNum(row, + (short) 3); + if (StringUtils.isBlank(spelling)) { + errorRowNum += "(" + row.getRowNum() + "),"; + continue; + } + + // 最小库存 + String minStorage = ParerUtils.getCellValueByColNum(row, + (short) 4); + + // 最大库存 + String maxStorage = ParerUtils.getCellValueByColNum(row, + (short) 5); + + // 参考价 + String referencePrice = ParerUtils.getCellValueByColNum( + row, (short) 6); + if (StringUtils.isBlank(referencePrice)) { + errorRowNum += "(" + row.getRowNum() + "),"; + continue; + } + + DisposableGoodsStock disposableGoodsStock = new DisposableGoodsStock(); + disposableGoodsStock.setName(name); + try { + // TODO 数量并未保存,以前的代码有bug + disposableGoodsStock.setMaxStorage(StringUtils + .isBlank(maxStorage) ? 0 : Integer + .parseInt(maxStorage)); + disposableGoodsStock.setMinStorage(StringUtils + .isBlank(minStorage) ? 0 : Integer + .parseInt(minStorage)); + disposableGoodsStock.setReferencePrice(Double + .parseDouble(referencePrice)); + } catch (NumberFormatException e) { + errorRowNum += "(" + row.getRowNum() + "),"; + continue; + } + + disposableGoodsStock.setSpelling(spelling); + disposableGoodsStock.setType(type); + saveOrUpdate(disposableGoodsStock); + count++; + + if (count % 50 == 0) { + objectDao.clearCache(); + } + + } + } catch (IOException e) { + e.printStackTrace(); + } + } + String resultStr = "共导入" + count + "条记录"; + if (StringUtils.isNotBlank(errorRowNum)) { + errorRowNum = errorRowNum.substring(0, errorRowNum.length() - 1); + resultStr += ",第" + errorRowNum + "行导入失败"; + } + return resultStr; + + } + + @Override + public DisposableGoods getDisposableGoodsOfTousseMaterialByName(String name, + String specification) { + String sql = "where po.name='" + name + + "' and po.isPartOfTousseMaterial='能'"; + if (StringUtils.isNotBlank(specification)) { + sql += " and po.specification = '" + specification + "'"; + } else { + sql += " and po.specification is null"; + } + @SuppressWarnings("unchecked") + List list = objectDao.findBySql( + DisposableGoods.class.getSimpleName(), sql); + if (list != null && list.size() > 0) { + return list.get(0); + } else { + return null; + } + } + + @Override + @SuppressWarnings("unchecked") + public void getErrorRecyclingApplications() { + List recyclingApplications = objectDao.findBySql( + RecyclingApplication.class.getName(), "where po.type = '" + + InvoicePlan.TYPE_DIPOSABLE_GOODS_APPLICATION_FORM + + "'"); + for (RecyclingApplication recyclingApplication : recyclingApplications) { + for (TousseItem item : recyclingApplication.getApplicationItems()) { + Integer amount = 0; + for (Invoice invoice : recyclingApplication.getInvoice()) { + for (DiposableGoodsItem diposableGoodsItem : invoice + .getDiposableGoodsItems()) { + if (StringUtils.equals(diposableGoodsItem.getName(), + item.getTousseName())) { + amount += diposableGoodsItem.getAmount(); + } + } + } + if (amount > item.getAmount()) { + break; + } + } + } + } + + @Override + @SuppressWarnings("unchecked") + public String updateOldData() { + /* + * //器械包材料为空的添加一个材料 List toussedefinitionList = + * objectDao.findBySql(TousseDefinition.class.getSimpleName(), + * " where po.tousseAmount = 0 "); MaterialDefinition material = + * materialDefinitionManager.getMaterialDefinitionByName("手术衣", "件"); + * DiposableGoods goods = getDiposableGoodsByName("平面卷袋", "10*13CM"); + * for (TousseDefinition tousseDefinition : toussedefinitionList) { + * if(tousseDefinition.getName().startsWith("OR")){ MaterialInstance + * materialInstance = new MaterialInstance(); + * materialInstance.setCount(1); + * materialInstance.setMaterialName(material.getName()); + * materialInstance.setTousse(tousseDefinition); + * materialInstance.setMaterialDefinition(material); + * List temp = new ArrayList(); + * temp.add(materialInstance); + * tousseDefinition.setMaterialInstances(temp); }else + * if(tousseDefinition.getName().startsWith("高压灭菌物品") || + * tousseDefinition.getName().startsWith("EO灭菌物品")){ + * DiposableGoodsInstance dipGoodsInstance = new + * DiposableGoodsInstance(); dipGoodsInstance.setAmount(1); + * dipGoodsInstance.setDiposableGoods(goods); + * List goodsList = new + * ArrayList(); goodsList.add(dipGoodsInstance); + * tousseDefinition.setDiposableGoodsItems(goodsList); }else + * if(tousseDefinition.getName().startsWith("工具")){ MaterialInstance + * materialInstance = new MaterialInstance(); + * materialInstance.setCount(1); materialInstance.setMaterialName("工具"); + * materialInstance.setTousse(tousseDefinition); List + * temp = new ArrayList(); temp.add(materialInstance); + * tousseDefinition.setMaterialInstances(temp); } + * objectDao.saveOrUpdate(tousseDefinition); } + */ + + // 按材料统计工作量 + List tousseDefinitions = objectDao + .findAllObjects(TousseDefinition.class.getName()); + for (TousseDefinition tousseDefinition : tousseDefinitions) { + tousseDefinition + .setWorkLoadStatisticalMethod(TousseDefinition.WORKLOAD_STATISTICAL_METHOD_MATERIAL_AND_DIPOSABLES); + int tousseAmount = 0; + if (tousseDefinition.getMaterialInstances() != null) { + for (MaterialInstance materialInstance : tousseDefinition + .getMaterialInstances()) { + tousseAmount += materialInstance.getCount(); + } + } + if (tousseDefinition.getDiposableGoodsItems() != null) { + for (DiposableGoodsInstance instance : tousseDefinition + .getDiposableGoodsItems()) { + tousseAmount += instance.getAmount(); + } + } + tousseDefinition.setTousseAmount(tousseAmount); + objectDao.saveOrUpdate(tousseDefinition); + } + + List tousseInstances = objectDao + .findBySql( + TousseInstance.class.getName(), + " where po.operationTime between to_date('2013-05-01 00:00:00','yyyy-mm-dd HH24:MI:SS') and to_date('2013-05-31 23:59:59','yyyy-mm-dd HH24:MI:SS') order by po.id desc"); + for (TousseInstance tousseInstance : tousseInstances) { + tousseInstance.setStatisticsAmount(tousseInstance + .getTousseDefinition().getTousseAmount()); + objectDao.saveOrUpdate(tousseInstance); + } + List invoices = objectDao + .findBySql( + Invoice.class.getName(), + " where po.sendTime between to_date('2013-05-01 00:00:00','yyyy-mm-dd HH24:MI:SS') and to_date('2013-05-31 23:59:59','yyyy-mm-dd HH24:MI:SS') order by po.id desc"); + for (Invoice invoice : invoices) { + List tousseInstanceList = invoice + .getTousseInstances(objectDao); + if (tousseInstanceList != null) { + for (TousseInstance instance : tousseInstanceList) { + instance.setStatisticsAmount(instance.getTousseDefinition() + .getTousseAmount()); + objectDao.saveOrUpdate(instance); + } + } + + List diposableGoodsItemList = invoice + .getDiposableGoodsItems(); + // 统计包、一次性物品数量 + String invoicePlanType = invoice.getInvoicePlanType(); + if (InvoicePlan.TYPE_DIPOSABLE_GOODS_APPLICATION_FORM + .equals(invoicePlanType)) { + int diposableGoodsAmount = 0; + for (DiposableGoodsItem diposableGoodsItem2 : diposableGoodsItemList) { + diposableGoodsAmount += diposableGoodsItem2.getAmount(); + } + invoice.setDiposableGoodsAmount(diposableGoodsAmount); + // 普通器械包 + } else { + int materialAmount = 0; + for (TousseInstance tousse : tousseInstanceList) { + TousseDefinition tousseDefinition = tousse + .getTousseDefinition(); + if (tousseDefinition != null) { + materialAmount += tousseDefinition.getTousseAmount(); + } + } + invoice.setTousseAmount(materialAmount); + } + objectDao.saveOrUpdate(invoice); + } + + return "更新成功"; + } + + /** + * 这个方法写的有问题(命名和返回值不一致) + * + */ + @SuppressWarnings("unchecked") + @Override + public List getAllDiposableGoods() { + return objectDao.findBySql(DisposableGoodsStock.class.getSimpleName(), + " order by po.externalCode asc"); + } + + /** + * 更新一次性物品单价 + * 注意:此方法应该只更新没有关联其他业务记录的一次性物品价格,如果有发货,退货等记录时,更新价格会导致这些记录和一次性物品价格不同步。 + */ + @Override + public void updateDiposableGoodsPriceFromExcelFile() { + String fileName = "C:/diposablebaseData.xls"; + try { + File file = new File(fileName); + InputStream is = new FileInputStream(file); + POIFSFileSystem fs = new POIFSFileSystem(is); + HSSFWorkbook wb = new HSSFWorkbook(fs); + HSSFSheet httpOptionsheet = wb.getSheet("广医二院供应室"); + int lastRowNum = httpOptionsheet.getLastRowNum(); + Set disposableGoodsIdSet = new HashSet(); + Map disposableGoodsToPriceMap = new HashMap(); + for (int i = 1; i <= lastRowNum; i++) { + HSSFRow row = httpOptionsheet.getRow(i); + if (row == null || ParerUtils.isBlankRow(row)) { + continue; + } + String name = getCellFormatValue(row, 1); + String specification = getCellFormatValue(row, 3); + String price = getCellFormatValue(row, 19); + if (price == null) { + continue; + } + DisposableGoods disposableGoods = get( + name, specification); + if (disposableGoods != null) { + disposableGoodsIdSet.add(disposableGoods.getId()); + disposableGoodsToPriceMap.put(disposableGoods.getId(), + price); + } + } + if (disposableGoodsIdSet.size() > 0) { + // 锁定要修改的一次性物品。 + List disposableGoodsList = getDisposableGoodsByDisposableGoodsIDs_ForUpdate(disposableGoodsIdSet); + if (disposableGoodsList != null) { + for (DisposableGoods disposableGoods : disposableGoodsList) { + Long disposableGoodsId = disposableGoods.getId(); + String price = disposableGoodsToPriceMap + .get(disposableGoodsId); + // 更新IdentificationOfDisposableGoods + String sql = String + .format(" update %s set price=%s where disposableGoodsID=%s", + DisposableGoodsIdentification.class + .getSimpleName(), price, + disposableGoodsId); + objectDao.executeUpdate(sql); + // 更新DisposableGoodsBatchStock + sql = String + .format(" update %s set cost=%s where disposableGoodsID=%s", + DisposableGoodsBatchStock.class + .getSimpleName(), price, + disposableGoodsId); + objectDao.executeUpdate(sql); + // 更新DisposableGoodsBatch + sql = String + .format(" update %s set price=%s where diposablegoods_id=%s", + DisposableGoodsBatch.class + .getSimpleName(), price, + disposableGoodsId); + // 更新DisposableGoodsStock + sql = String + .format(" update %s set referencePrice=%s where disposableGoodsID=%s", + DisposableGoodsStock.class + .getSimpleName(), price, + disposableGoodsId); + // 更新DisposableGoods + sql = String + .format(" update %s set referencePrice=%s where disposableGoodsID=%s", + DisposableGoods.class.getSimpleName(), + price, disposableGoodsId); + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private String getCellFormatValue(HSSFRow row, int cellNum) { + String value = null; + String v = ParerUtils.getCellValueByColNum(row, (short) cellNum); + if (v == null) { + return v; + } else { + value = v.trim(); + if (value.endsWith(".00")) { + value = value.substring(0, value.length() - 3); + } + value = FormatString.formatToVisiableChar(value); + return value; + } + } + + @Override + public DisposableGoodsStock getDiposableGoodsByInventorySerialNumber( + String inventorySerialNumber) { + return (DisposableGoodsStock) objectDao.getByProperty( + DisposableGoodsStock.class.getSimpleName(), "inventorySerialNumber", + inventorySerialNumber); + } + + @Override + public DisposableGoods getDisposableGoodsByInventorySerialNumber(String inventorySerialNumber){ + return (DisposableGoods) objectDao.getByProperty( + DisposableGoods.class.getSimpleName(), "inventorySerialNumber", + inventorySerialNumber); + } + @Override + public DisposableGoods getDisposableGoodsById_ForUpdate(String id) { + return (DisposableGoods) objectDao.getByID_ForUpdate( + DisposableGoods.class.getSimpleName(), Long.valueOf(id)); + } + + @Override + public List getDiposableGoodsBySql_ForUpdate(String sql) { + List retList = objectDao.findBySql_ForUpdate( + DisposableGoodsStock.class.getSimpleName(), sql); + return retList; + } + + @Override + public List getDisposableGoodsBySql(String sql){ + List retList = objectDao.findBySql( + DisposableGoods.class.getSimpleName(), sql); + return retList; + } + + @Override + public List getDisposableGoodsBySql_ForUpdate(String sql){ + List retList = objectDao.findBySql_ForUpdate( + DisposableGoods.class.getSimpleName(), sql); + return retList; + } + @Override + public List joinFetchDisposableGoodsStockByDisposableGoodsIds(String warehouseID,Collection ids){ + if(ids == null || ids.size()==0){ + return null; + } + if(StringUtils.isBlank(warehouseID)){ + return null; + } + String queryString = String + .format("select distinct po from %s po inner join fetch po.goodsBatchs b inner join fetch b.identifications i where po.warehouseID=%s and (%s) ", + DisposableGoodsStock.class.getSimpleName(),warehouseID,SqlUtils.getStringFieldInCollectionsPredicate("po.disposableGoodsID", ids)); + return objectDao.findByHql(queryString); + } + // 一次加载所有的一次性物品以及批次,标识号对象 + @Override + public List getDisposableGoodsStockByBatchBarcodes(String warehouseID,Collection batchBarcodes){ + if(batchBarcodes == null || batchBarcodes.size()==0){ + return null; + } + if(StringUtils.isBlank(warehouseID)){ + return null; + } + String barcodes = SqlUtils.joinToWhereInConditionForStringProperties(batchBarcodes); + // 锁定的方式批量查询 + String queryString = String + .format(" from %s po inner join fetch po.goodsBatchs b inner join fetch b.identifications i where po.warehouseID=%s and b.barcode in(%s) order by po.id asc", + DisposableGoodsStock.class.getSimpleName(),warehouseID,barcodes); + // 此时获取的是按照id升序排列的 + return objectDao.findByHql(queryString); + } + + @Override + public List getDisposableGoodsStockByDisposableGoodsStockIDs(Collection ids){ + if(ids == null || ids.size()==0){ + return null; + } + String queryString = String + .format(" where %s ", + SqlUtils.getNonStringFieldInCollectionsPredicate("po.id", ids)); + // 此时获取的是按照id升序排列的 + return objectDao.findBySql(DisposableGoodsStock.class.getSimpleName(),queryString); + } + @Override + public List getDisposableGoodsStockByDisposableGoodsId(String warehouseID,Long disposableGoodsId){ + List disposableGoodsIds = new ArrayList(); + disposableGoodsIds.add(disposableGoodsId); + return getDisposableGoodsStockByDisposableGoodsIDs(warehouseID, disposableGoodsIds); + } + @Override + public List getDisposableGoodsStockByDisposableGoodsId(Long disposableGoodsID){ + String getDisposableGoodsStockSql = String.format(" where %s ", + SqlUtils.getLongFieldPredicate("po.disposableGoodsID", disposableGoodsID)); + List disposableGoodsStocks = objectDao.findBySql(DisposableGoodsStock.class.getSimpleName(),getDisposableGoodsStockSql); + return disposableGoodsStocks; + } + @Override + public List getDisposableGoodsStockByDisposableGoodsIDs(String warehouseID,Collection diposableGoodsIDsSet){ + String getDisposableGoodsStockSql = String.format(" where %s and po.warehouseID=%s", + SqlUtils.getStringFieldInCollectionsPredicate("po.disposableGoodsID", diposableGoodsIDsSet),warehouseID); + List disposableGoodsStocks = objectDao.findBySql(DisposableGoodsStock.class.getSimpleName(),getDisposableGoodsStockSql); + return disposableGoodsStocks; + } + + @Override + public List getDisposableGoodsBatchStocksByDisposableGoodsStockID(Long disposableGoodsStockID){ + if(disposableGoodsStockID == null){ + return null; + } + String queryString = String + .format(" where %s ", + SqlUtils.getLongFieldPredicate("po.diposableGoods.id", disposableGoodsStockID)); + // 此时获取的是按照id升序排列的 + return objectDao.findBySql(DisposableGoodsBatchStock.class.getSimpleName(),queryString); + } + + @Override + public List getDisposableGoodsBatchStocksExcludingZeroStockByDisposableGoodsStockID(Long disposableGoodsStockID){ + if(disposableGoodsStockID == null){ + return null; + } + String queryString = String + .format(" where po.storage>0 and %s ", + SqlUtils.getLongFieldPredicate("po.diposableGoods.id", disposableGoodsStockID)); + // 此时获取的是按照id升序排列的 + return objectDao.findBySql(DisposableGoodsBatchStock.class.getSimpleName(),queryString); + } + + @Override + public List getDisposableGoodsBatchStocksByDisposableGoodsID(Long disposableGoodsID){ + if(disposableGoodsID == null){ + return null; + } + String queryString = String + .format(" where %s ", + SqlUtils.getLongFieldPredicate("po.disposableGoodsId", disposableGoodsID)); + // 此时获取的是按照id升序排列的 + return objectDao.findBySql(DisposableGoodsBatchStock.class.getSimpleName(),queryString); + } + /** + * 获取一次性物品定义的列表 + * @param warehouseID 拼音或五笔码,或者是物品名称 + * @param batchBarcodes 是否能被科室申请的标志,值yes表示能 + * @return + */ + @Override + public List getDisposableGoodsByBatchBarcodes_ForUpdate(Collection batchBarcodes){ + if(batchBarcodes == null || batchBarcodes.size()==0){ + return null; + } + List disposableGoodsIds = new LinkedList(); + // 锁定的方式批量查询 + String selectDisposableGoodsIdsInBatchSql = String.format("select distinct(b.diposableGoods.id) from %s b where b.diposableGoods.id is not null and %s ",DisposableGoodsBatch.class.getSimpleName(), SqlUtils.getStringFieldInCollectionsPredicate("b.barcode", batchBarcodes)); + String selectDisposableGoodsIdsInExpensiveDisposablegoodsSql = String.format("select distinct(e.disposableGoodsID) from %s e where e.disposableGoodsID is not null and %s ", + ExpensiveDisposablegoods.class.getSimpleName(),SqlUtils.getStringFieldInCollectionsPredicate("e.barcode", batchBarcodes)); + List disposableGoodsIdsInBatch = objectDao.findByHql(selectDisposableGoodsIdsInBatchSql); + if(disposableGoodsIdsInBatch != null){ + disposableGoodsIds.addAll(disposableGoodsIdsInBatch); + } + List disposableGoodsIdsInExpensiveDisposablegoods = objectDao.findByHql(selectDisposableGoodsIdsInExpensiveDisposablegoodsSql); + if(disposableGoodsIdsInExpensiveDisposablegoods != null){ + disposableGoodsIds.addAll(disposableGoodsIdsInExpensiveDisposablegoods); + } + String queryString = String + .format(" from %s po where %s order by po.id asc", + DisposableGoods.class.getSimpleName(),SqlUtils.getNonStringFieldInCollectionsPredicate("po.id", disposableGoodsIds)); + Session session = objectDao.getHibernateSession(); + Query queryObject = session.createQuery(queryString); + queryObject.setLockMode("po", LockMode.UPGRADE); + // 此时获取的是按照id升序排列的 + return queryObject.list(); + } + @Override + public List getDisposableGoodsByDisposableGoodsIDs_ForUpdate(Collection ids){ + String sql = String + .format(" where %s order by po.id asc", + SqlUtils.getNonStringFieldInCollectionsPredicate("po.id", ids)); + return getDisposableGoodsBySql2_ForUpdate(sql); + } + @Override + public Map getIdsToDisposableGoodsMapBySql(String sql){ + Map map = new HashMap(); + List disposableGoodsList = objectDao.findBySql(DisposableGoods.class.getSimpleName(),sql); + if(disposableGoodsList != null){ + for (DisposableGoods disposableGoods : disposableGoodsList) { + map.put(disposableGoods.getId(), disposableGoods); + } + } + return map; + } + @Override + public Map getIdsToDisposableGoodsMapByDisposableGoodsIds(Collection ids){ + String sql = String.format(" where %s", SqlUtils.getNonStringFieldInCollectionsPredicate("po.id", ids)); + return getIdsToDisposableGoodsMapBySql(sql); + } + private List getDisposableGoodsBySql2_ForUpdate(String sql){ + // 锁定的方式批量查询 + String queryString = String + .format(" from %s po %s", + DisposableGoods.class.getSimpleName(),sql); + Session session = objectDao.getHibernateSession(); + Query queryObject = session.createQuery(queryString); + queryObject.setLockMode("po", LockMode.UPGRADE); + // 此时获取的是按照id升序排列的 + return queryObject.list(); + } + @Override + public List getDisposableGoodsBatchByBatchBarcodes(Collection batchBarcodes){ + if(batchBarcodes == null || batchBarcodes.size()==0){ + return null; + } + // 锁定的方式批量查询 + String sql = String + .format(" where %s ",SqlUtils.getStringFieldInCollectionsPredicate("po.barcode", batchBarcodes)); + // 此时获取的是按照id升序排列的 + return objectDao.findBySql(DisposableGoodsBatch.class.getSimpleName(),sql); + } + + @Override + public List getExpensiveDisposablegoodsByBarcodes( + Collection barcodes) { + if (barcodes == null || barcodes.size() == 0) { + return null; + } + String sql = String.format(" where %s ", SqlUtils + .getStringFieldInCollectionsPredicate("po.barcode", barcodes)); + return objectDao.findBySql( + ExpensiveDisposablegoods.class.getSimpleName(), sql); + } + @Override + public List getExpensiveDisposablegoodsByIds(Collection ids){ + if (ids == null || ids.size() == 0) { + return null; + } + String sql = String.format(" where %s ", SqlUtils + .getNonStringFieldInCollectionsPredicate("po.id", ids)); + return objectDao.findBySql( + ExpensiveDisposablegoods.class.getSimpleName(), sql); + } + @Override + public List getExpensiveDisposablegoodsByIds(String ids){ + if (StringUtils.isBlank(ids)) { + return null; + } + String sql = String.format(" where po.id in(%s) ", ids); + return objectDao.findBySql( + ExpensiveDisposablegoods.class.getSimpleName(), sql); + } + @Override + public List getDisposableGoodsBatchesByDisposableGoodsID(Long disposableGoodsID){ + if(disposableGoodsID == null){ + return null; + } + // 锁定的方式批量查询 + String sql = String + .format(" where %s ",SqlUtils.getLongFieldPredicate("po.diposableGoods.id", disposableGoodsID)); + // 此时获取的是按照id升序排列的 + return objectDao.findBySql(DisposableGoodsBatch.class.getSimpleName(),sql); + } + @Override + public List getExpensivediposablegoodsByDisposableGoodsBatchStockId(Long disposableGoodsBatchStockId){ + String sql = String + .format(" where %s and %s ",SqlUtils.getLongFieldPredicate("po.disposableGoodsBatchStock.id", disposableGoodsBatchStockId), + SqlUtils.getStringFieldPredicate("po.status", ExpensiveDisposablegoods.STATUS_IN_WAREHOUSE)); + return objectDao.findBySql(ExpensiveDisposablegoods.class.getSimpleName(),sql); + } + @Override + public List getExpensivediposablegoodsByDisposableGoodsId(Long disposableGoodsId){ + String sql = String + .format(" where %s and %s ",SqlUtils.getLongFieldPredicate("po.disposableGoodsID", disposableGoodsId), + SqlUtils.getStringFieldPredicate("po.status", ExpensiveDisposablegoods.STATUS_IN_WAREHOUSE)); + return objectDao.findBySql(ExpensiveDisposablegoods.class.getSimpleName(),sql); + } + @Override + public List getExpensivediposablegoodsByGodownEntryItemId(Long godownEntryItemId){ + String sql = String + .format(" where %s ",SqlUtils.getLongFieldPredicate("po.godownEntryItemId", godownEntryItemId)); + return objectDao.findBySql(ExpensiveDisposablegoods.class.getSimpleName(),sql); + } + @Override + public List getCurrentUserOrgUnitWarehouseExpensivediposablegoodsByDisposableGoodsId(Long disposableGoodsId){ + String sql = String + .format(" where %s and %s and %s ",SqlUtils.getLongFieldPredicate("po.disposableGoodsID", disposableGoodsId), + SqlUtils.getStringFieldPredicate("po.status", ExpensiveDisposablegoods.STATUS_IN_WAREHOUSE), + SqlUtils.getNonStringFieldInCollectionsPredicate("po.warehouseID", wareHouseManager.getCurrentUserOrgUnitWarehouseIds())); + return objectDao.findBySql(ExpensiveDisposablegoods.class.getSimpleName(),sql); + } + @Override + public List getCurrentUserOrgUnitWarehouseExpensivediposableGoods(String disposableGoodsId,String disposableGoodsStockIds,String disposableGoodsBatchStockIds){ + StringBuilder sqlSB = new StringBuilder(); + if (StringUtils.isNotBlank(disposableGoodsId)) { + sqlSB.append(String.format(" where po.disposableGoodsID=%s ", disposableGoodsId)); + if(StringUtils.isNotBlank(disposableGoodsStockIds)){ + sqlSB.append(String.format(" and po.disposableGoodsStockID in(%s) ", disposableGoodsStockIds)); + } + if(StringUtils.isNotBlank(disposableGoodsBatchStockIds)){ + sqlSB.append(String.format(" and po.disposableGoodsBatchStock.id in(%s) ", disposableGoodsBatchStockIds)); + } + sqlSB.append(String.format(" and %s ", SqlUtils.getNonStringFieldInCollectionsPredicate(" po.warehouseID", wareHouseManager.getCurrentUserOrgUnitWarehouseIds()))); + return objectDao.findBySql(ExpensiveDisposablegoods.class.getSimpleName(),sqlSB.toString()); + } + return null; + } + // 在新的事务中执行删除。 + @Override + public void deleteDiposableGoodsById_TRANS_NEW(String id) { + // TODO + + } + + // 获取批次的可以退库的价格数量 + @Override + public List getDiposableGoodsPriceAmountInfoCanOutEntryByBatchID( + String batchID) { + + List priceAmountList = new LinkedList(); + String batchIDSql = String.format(" where i.batch_id=%s", batchID); + + String isNullFunction = DatabaseUtil + .getSqlIsNullFunctionName(dbConnection); + String sql = String + .format(" select i.price as price, sum(%s(i.amount,0)) as sumAmount from %s i %s group by i.price", + isNullFunction, + DisposableGoodsIdentification.class.getSimpleName(), + batchIDSql); + ResultSet resultSet = objectDao.executeSql(sql.toString()); + if (resultSet != null) { + try { + while (resultSet.next()) { + Long sumAmount = resultSet.getLong("sumAmount"); + Double price = resultSet.getDouble("price"); + double fluctuationPrice = supplyRoomConfigManager + .getTousseFluctuationPrice(price); + + if (sumAmount <= 0) { + continue; + } + PriceAmount priceAmount = new PriceAmount(); + priceAmount.setPrice(price); + priceAmount.setFluctuationPrice(fluctuationPrice); + priceAmount.setAmount(sumAmount); + + priceAmountList.add(priceAmount); + } + } catch (SQLException e) { + e.printStackTrace(); + }finally { + DatabaseUtil.closeResultSetAndStatement(resultSet); + } + } + + return priceAmountList; + } + + // 修改一次性物品名字/规则 + public void updateNameAndSpecification(String oldName, + String oldSpecification, String newName, String newSpecification,String oldApplicationSpecification, String newApplicationSpecification) { + String oldNameAndSpecification = ExpensiveGoodsUtils.getDisposableGoodsFullName(oldName, oldSpecification,oldApplicationSpecification); + String newNameAndSpecification = ExpensiveGoodsUtils.getDisposableGoodsFullName(newName, newSpecification,newApplicationSpecification); + // DisposableGoodsStock +// updateNameAndSpecification(DisposableGoodsStock.class.getSimpleName(), "name", "specification", oldName, oldSpecification, newName, newSpecification); + // DataDirectory_GYEY_COST_ACCOUNTING(广医二院) +// String projectName = CssdUtils.getProjectName(); + if(CssdUtils.isProject("gyey")){ + updateNameAndSpecification("DataDirectory_GYEY_COST_ACCOUNTING", "name", "specification", oldName, oldSpecification, newName, newSpecification); + } + // DepartmentStock + updateFullName(DepartmentStock.class.getSimpleName(), "tousseName", oldNameAndSpecification, newNameAndSpecification); + // DiposableGoodsItem + updateFullName(DiposableGoodsItem.class.getSimpleName(), "name", oldNameAndSpecification, newNameAndSpecification); + // GodownEntryDiposableGoodsItem + updateFullName(GodownEntryDiposableGoodsItem.class.getSimpleName(), "goodsName", oldNameAndSpecification, newNameAndSpecification); + // DisposableGoodsInventory + updateFullName(DisposableGoodsInventory.class.getSimpleName(), "name", oldNameAndSpecification, newNameAndSpecification); + // InvoiceItem + updateFullName(InvoiceItem.class.getSimpleName(), "tousseName", oldNameAndSpecification, newNameAndSpecification); + // receiveRecordItem + updateFullName(ReceiveRecordItem.class.getSimpleName(), "goodsName", oldNameAndSpecification, newNameAndSpecification); + // ReturnGoodsItem + updateFullName(ReturnGoodsItem.class.getSimpleName(), "tousseName", oldNameAndSpecification, newNameAndSpecification); + // StockDiposableGoods + updateNameAndSpecification(StockDiposableGoods.class.getSimpleName(), "name", "specification", oldName, oldSpecification, newName, newSpecification); + // StockTakeItem + updateFullName(InventoryItem.class.getSimpleName(), "materialName", oldNameAndSpecification, newNameAndSpecification); + // TousseItem + updateFullName(TousseItem.class.getSimpleName(), "tousseName", oldNameAndSpecification, newNameAndSpecification); + // 一次性物品发货量对比 报表的处理 + List goodsOptions = objectDao.findBySql(GoodsOption.class.getSimpleName(),String.format(" where po.model='%s'", GoodsOption.MODEL_INVOICEAMOUNTCONTRAST)); + if(goodsOptions != null){ + for (GoodsOption goodsOption : goodsOptions) { + String value = goodsOption.getValue(); + boolean modified = false; + if(StringUtils.isNotBlank(value)){ + String[] values = value.split(";"); + String[] newValues = new String[values.length]; + for (int i=0;i disposableGoodsBatchStocks = getDisposableGoodsBatchStocksByDisposableGoodsID(disposableGoods + .getId()); + + // 库存清0 + for (DisposableGoodsBatchStock disposableGoodsBatchStock : disposableGoodsBatchStocks) { + DisposableGoodsStock disposableGoodsStock = disposableGoodsBatchStock + .getDiposableGoods(); + disposableGoodsBatchStock.setStorage(0L); + disposableGoodsStock.setAmount(0L); + } + // 新建高值耗材 + for (DisposableGoodsBatchStock disposableGoodsBatchStock : disposableGoodsBatchStocks) { + List identifications = disposableGoodsBatchStock + .getIdentifications(); + if (identifications != null) { + for (DisposableGoodsIdentification disposableGoodsIdentification : identifications) { + Long amount = disposableGoodsIdentification.getAmount(); + if (amount <= 0) { + continue; + } + String conclusion = disposableGoodsIdentification + .getConclusion(); + Date entryDate = disposableGoodsIdentification + .getEntryDate(); + String identification = disposableGoodsIdentification + .getIdentification(); + newExpensivediposablegoods(disposableGoodsBatchStock, + amount,disposableGoodsIdentification.getPrice(), conclusion, entryDate, identification,null,null , disposableGoodsIdentification.getBatchIdFromHisSync()); + } + } + } + // 更改物品类型为高值耗材 + disposableGoods + .setGoodsType(DisposableGoods.TYPE_EXPENSIVEDIPOSABLEGOODS); + objectDao.update(disposableGoods); + + // 删除标识号 + objectDao.executeUpdate(String.format( + " delete from %s where disposableGoodsID=%s ", + DisposableGoodsIdentification.class.getSimpleName(), disposableGoods.getId())); + + // 记录日志 + JSONObject jobj = new JSONObject(); + jobj.put("method", "changeGoodsToExpensiveDiposablegoods"); + jobj.put("disposableGoodsName", disposableGoods.getShowName()); + jobj.put("disposableGoodsId", disposableGoods.getId()); + appLogManager.saveLog(AcegiHelper.getLoginUser(), "一次性物品", "普通物品转高值耗材", jobj.toString()); + } + + public void saveOrUpdate(ExpensiveDisposablegoods expensiveDiposablegoods){ + if(StringUtils.isBlank(expensiveDiposablegoods.getBarcode())){ + String barcode = serialNumManager + .getSerialNumberStr(SerialNum.TYPE_BARCODE); + expensiveDiposablegoods.setBarcode(barcode); + } + objectDao.saveOrUpdate(expensiveDiposablegoods); + } + @Override + public void changeExpensiveDiposablegoodsToGoods_TRANS_NEW(String id) { + changeExpensiveDiposablegoodsToGoods_internal(id); + } + + private void changeExpensiveDiposablegoodsToGoods_internal(String id) { + DisposableGoods disposableGoods = getDisposableGoodsById_ForUpdate(id); + if(disposableGoods == null){ + throw new RuntimeException("物品已被删除!"); + } + changeExpensiveDiposablegoodsToGoods_internal(disposableGoods); + } + private void changeExpensiveDiposablegoodsToGoods_internal(DisposableGoods disposableGoods) { + + if(!disposableGoods.expensiveDiposablegoods()){ + // 已经是普通物品,那么直接返回 + return; + } + + List disposableGoodsBatchStocks = getDisposableGoodsBatchStocksByDisposableGoodsID(disposableGoods.getId()); + // 库存清0 + if(disposableGoodsBatchStocks != null){ + for (DisposableGoodsBatchStock disposableGoodsBatchStock : disposableGoodsBatchStocks) { + DisposableGoodsStock disposableGoodsStock = disposableGoodsBatchStock + .getDiposableGoods(); + disposableGoodsBatchStock.setStorage(0L); + disposableGoodsStock.setAmount(0L); + } + } + + // 新建标识号 + if(disposableGoodsBatchStocks != null){ + for (DisposableGoodsBatchStock disposableGoodsBatchStock : disposableGoodsBatchStocks) { + + List expensiveDiposablegoodsList = getExpensivediposablegoodsByDisposableGoodsBatchStockId(disposableGoodsBatchStock.getId()); + String conclusion = ""; + Date entryDate = null; + String identification = ""; + Double price = 0.0; + int amount = 0; + if(expensiveDiposablegoodsList != null && !expensiveDiposablegoodsList.isEmpty()){ + ExpensiveDisposablegoods expensiveDiposablegoods = expensiveDiposablegoodsList.get(0); + conclusion = expensiveDiposablegoods.getConclusion(); + entryDate = expensiveDiposablegoods.getEntryDate(); + identification = expensiveDiposablegoods.getIdentification(); + price = expensiveDiposablegoods.getPrice(); + amount = expensiveDiposablegoodsList.size(); + } + if(amount == 0){ + continue; + } + DisposableGoodsIdentification disposableGoodsIdentification = new DisposableGoodsIdentification(); + disposableGoodsIdentification.setDisposableGoodsID(disposableGoodsBatchStock.getDisposableGoodsId()); + disposableGoodsIdentification.setDisposableGoodsBatchID(disposableGoodsBatchStock.getDisposableGoodsBatchId()); + disposableGoodsIdentification.setDisposableGoodsStockID(disposableGoodsBatchStock.getDisposableGoodsStockId()); + disposableGoodsIdentification.setBatchStock(disposableGoodsBatchStock); + disposableGoodsBatchStock.getIdentifications().add(disposableGoodsIdentification); + disposableGoodsIdentification.adjustAmount(amount); + disposableGoodsIdentification.setBatchStock(disposableGoodsBatchStock); + disposableGoodsIdentification.setConclusion(conclusion); + disposableGoodsIdentification.setEntryDate(entryDate); + disposableGoodsIdentification.setIdentification(identification); + disposableGoodsIdentification.setPrice(price); + disposableGoodsIdentification.setWarehouseID(disposableGoodsBatchStock.getWarehouseID()); + disposableGoodsIdentification.setWarehouseName(disposableGoodsBatchStock.getWarehouseName()); + objectDao.save(disposableGoodsIdentification); + } + } + disposableGoods.setGoodsType(DisposableGoods.TYPE_DIPOSABLEGOODS); + objectDao.update(disposableGoods); + + // 删除高值耗材,仅删除未发货,未领用的? + objectDao.executeUpdate(String.format(" delete from %s where disposableGoodsID=%s and invoiceId is null ", ExpensiveDisposablegoods.class.getSimpleName(),disposableGoods.getId())); + + // 记录日志 + JSONObject jobj = new JSONObject(); + jobj.put("method", "changeExpensiveDiposablegoodsToGoods"); + jobj.put("disposableGoodsName", disposableGoods.getShowName()); + jobj.put("disposableGoodsId", disposableGoods.getId()); + appLogManager.saveLog(AcegiHelper.getLoginUser(), "一次性物品", "高值耗材转普通物品", jobj.toString()); + } + + @Override + public List newExpensivediposablegoods( + DisposableGoodsBatchStock disposableGoodsBatchStock,Long storage,Double price, + String conclusion, Date entryDate, String identification,Long godownEntryId,Long godownEntryItemId , Long batchIdFromHisSync) { + List expensiveDiposablegoodsList = new LinkedList(); + if (storage == null) { + storage = 0L; + } + if(price == null){// 价格为空时用批次库存的价格,用于入库 + price = disposableGoodsBatchStock.getCost(); + } + for (int i = 0; i < storage; ++i) { + ExpensiveDisposablegoods expensiveDiposablegoods = new ExpensiveDisposablegoods(); + expensiveDiposablegoods.setConclusion(conclusion); + expensiveDiposablegoods + .setDisposableGoodsBatchID(disposableGoodsBatchStock + .getDisposableGoodsBatchId()); + expensiveDiposablegoods + .setDisposableGoodsBatchStock(disposableGoodsBatchStock); + expensiveDiposablegoods + .setDisposableGoodsID(disposableGoodsBatchStock + .getDisposableGoodsId()); + expensiveDiposablegoods + .setDisposableGoodsStockID(disposableGoodsBatchStock + .getDisposableGoodsStockId()); + expensiveDiposablegoods.setEntryDate(entryDate); + expensiveDiposablegoods.setIdentification(identification); + expensiveDiposablegoods.setPrice(price); + expensiveDiposablegoods.setWarehouseID(disposableGoodsBatchStock + .getWarehouseID()); + expensiveDiposablegoods.setGodownEntryId(godownEntryId); + expensiveDiposablegoods.setGodownEntryItemId(godownEntryItemId); + expensiveDiposablegoods.setBatchIdFromHisSync(batchIdFromHisSync); + expensiveDiposablegoods.setWarehouseName(disposableGoodsBatchStock + .getWarehouseName()); + expensiveDiposablegoods.adjustAmount(1); + saveOrUpdate(expensiveDiposablegoods); + expensiveDiposablegoodsList.add(expensiveDiposablegoods); + } + return expensiveDiposablegoodsList; + } + + @Override + public void lockAndGetDisposableGoodsResources( + DisposableGoodsServiceContext disposableGoodsServiceContext) { + disposableGoodsServiceContext.validateParams(); + String warehouseId = disposableGoodsServiceContext.getWarehouseId(); + Set disposableGoodsIDsSet = disposableGoodsServiceContext.getDisposableGoodsIdsSet(); + Set diposableGoodsStockIDsSet = disposableGoodsServiceContext.getDisposableGoodsStockIdsSet(); + Set expensiveDisposablegoodsIdsSet = disposableGoodsServiceContext.getExpensiveDisposableGoodsIdsSet(); + Set disposableGoodsBatchIDsSet = disposableGoodsServiceContext.getDisposableGoodsBatchIdsSet(); + Set disposableGoodsBatchStockIDsSet = disposableGoodsServiceContext.getDisposableGoodsBatchStockIdsSet(); + Set identificationIdsSet = disposableGoodsServiceContext.getIdentificationIdsSet(); + Map idToDiposableGoodsMap = disposableGoodsServiceContext.getIdToDisposableGoodsMap(); + Map disposableGoodsIDToDisposableGoodsStockMap = disposableGoodsServiceContext.getDisposableGoodsIDToDisposableGoodsStockMap(); + Map idToDisposableGoodsStockMap = disposableGoodsServiceContext.getIdToDisposableGoodsStockMap(); + Map idToExpensiveDisposablegoodsMap = disposableGoodsServiceContext.getIdToExpensiveDisposableGoodsMap(); + Map barcodeToExpensiveDisposablegoodsMap = disposableGoodsServiceContext.getBarcodeToExpensiveDisposablegoodsMap(); + Map idToDisposableGoodsBatchMap = disposableGoodsServiceContext.getIdToDisposableGoodsBatchMap(); + Map barcodeToDisposableGoodsBatchMap = disposableGoodsServiceContext.getBarcodeToDisposableGoodsBatchMap(); + Map idToDisposableGoodsBatchStockMap = disposableGoodsServiceContext.getIdToDisposableGoodsBatchStockMap(); + Map barcodeToDisposableGoodsBatchStockMap = disposableGoodsServiceContext.getBarcodeToDisposableGoodsBatchStockMap(); + Map idToIdentificationMap = disposableGoodsServiceContext.getIdToIdentificationMap(); + + // 锁定一次性物品 + List disposableGoodsList = getDisposableGoodsByDisposableGoodsIDs_ForUpdate(disposableGoodsIDsSet); + if (disposableGoodsList == null + || disposableGoodsList.size() != disposableGoodsIDsSet.size()) { + throw new RuntimeException("某些物品已被删除!"); + } + for (DisposableGoods disposableGoods : disposableGoodsList) { + idToDiposableGoodsMap.put(disposableGoods.getId(), disposableGoods); + } + // 获取物品库存 + List disposableGoodsStockList = null; + if(disposableGoodsServiceContext.sceneInvoiceAutoDeduction()){ + // 发货自动扣减库存,根据物品定义id和仓库来获取物品库存 + Date validUntil = new Date(); + String validUntilSql = " " + + dateQueryAdapter.dateConverAdapter2(com.forgon.Constants.SIMPLEDATEFORMAT_YYYYMMDDHHMMSS.format(validUntil), + "yyyy-mm-dd HH24:MI:SS"); + + String validUntilStr = String.format(" ( %s > %s) ", "b.expDate", validUntilSql); + String queryString = String + .format("select distinct po from %s po inner join fetch po.goodsBatchs b inner join fetch b.identifications i where %s and i.amount>0 and po.warehouseID=%s and (%s) ", + DisposableGoodsStock.class.getSimpleName(),validUntilStr,warehouseId,SqlUtils.getStringFieldInCollectionsPredicate("po.disposableGoodsID", disposableGoodsIDsSet)); + disposableGoodsStockList = objectDao.findByHql(queryString); + }else{ + if (!diposableGoodsStockIDsSet.isEmpty()) { + disposableGoodsStockList = getDisposableGoodsStockByDisposableGoodsStockIDs(diposableGoodsStockIDsSet); + if (disposableGoodsStockList == null + || disposableGoodsStockList.size() != diposableGoodsStockIDsSet + .size()) { + throw new RuntimeException("某些物品库存已被删除!"); + } + } + } + // 设置物品库存到map + if(disposableGoodsStockList != null){ + disposableGoodsServiceContext.setDisposableGoodsStockList(disposableGoodsStockList); + for (DisposableGoodsStock disposableGoodsStock : disposableGoodsStockList) { + idToDisposableGoodsStockMap.put(disposableGoodsStock.getId(), disposableGoodsStock); + disposableGoodsIDToDisposableGoodsStockMap.put(disposableGoodsStock.getDisposableGoodsID(), disposableGoodsStock); + } + } + + //设置高值耗材 + if (!expensiveDisposablegoodsIdsSet.isEmpty()) { + List expensiveDisposablegoodsList = getExpensiveDisposablegoodsByIds(expensiveDisposablegoodsIdsSet); + if (expensiveDisposablegoodsList == null + || expensiveDisposablegoodsList.size() != expensiveDisposablegoodsIdsSet + .size()) { + throw new RuntimeException("某些高值耗材已被删除!"); + } + disposableGoodsServiceContext.setExpensiveDisposablegoodsList(expensiveDisposablegoodsList); + if (expensiveDisposablegoodsList != null) { + for (ExpensiveDisposablegoods expensiveDisposablegoods : expensiveDisposablegoodsList) { + barcodeToExpensiveDisposablegoodsMap.put(expensiveDisposablegoods.getBarcode(), expensiveDisposablegoods); + idToExpensiveDisposablegoodsMap.put(expensiveDisposablegoods.getId(), expensiveDisposablegoods); + } + } + } + + // 加载所有的批次定义 + if(!disposableGoodsBatchIDsSet.isEmpty()){ + String getDisposableGoodsBatchSql = String.format(" where %s ", + SqlUtils.getNonStringFieldInCollectionsPredicate("po.id", disposableGoodsBatchIDsSet)); + List disposableGoodsBatchs = objectDao.findBySql(DisposableGoodsBatch.class.getSimpleName(), getDisposableGoodsBatchSql); + if (disposableGoodsBatchs == null + || disposableGoodsBatchs.size() != disposableGoodsBatchIDsSet + .size()) { + throw new RuntimeException("某些批次定义已被删除!"); + } + if (disposableGoodsBatchs != null) { + for (DisposableGoodsBatch disposableGoodsBatch : disposableGoodsBatchs) { + idToDisposableGoodsBatchMap.put(disposableGoodsBatch.getId(), disposableGoodsBatch); + barcodeToDisposableGoodsBatchMap.put(disposableGoodsBatch.getBarcode(), disposableGoodsBatch); + } + } + } + + // 获取批次库存 + if(!disposableGoodsBatchStockIDsSet.isEmpty()){ + String batchStockSql = String.format(" where %s ", SqlUtils + .getStringFieldInCollectionsPredicate("po.id", + disposableGoodsBatchStockIDsSet)); + List disposableGoodsBatchStocks = objectDao + .findBySql(DisposableGoodsBatchStock.class.getSimpleName(), + batchStockSql); + + if (disposableGoodsBatchStocks == null || disposableGoodsBatchStocks.size() != disposableGoodsBatchStockIDsSet.size()) { + throw new RuntimeException("某些批次库存已被删除!"); + } + disposableGoodsServiceContext.setDisposableGoodsBatchStockList(disposableGoodsBatchStocks); + for (DisposableGoodsBatchStock diposableGoodBatchStock : disposableGoodsBatchStocks) { + idToDisposableGoodsBatchStockMap.put(diposableGoodBatchStock.getId(), diposableGoodBatchStock); + barcodeToDisposableGoodsBatchStockMap.put(diposableGoodBatchStock.getBarcode(), diposableGoodBatchStock); + } + } + + //设置一次性物品标识号 + if (!identificationIdsSet.isEmpty()) { + String getIdentificationSql = String.format(" where %s ", SqlUtils + .getNonStringFieldInCollectionsPredicate("po.id", + identificationIdsSet)); + List identifications = objectDao + .findBySql( + DisposableGoodsIdentification.class.getSimpleName(), + getIdentificationSql); + + if (identifications == null + || identifications.size() != identificationIdsSet.size()) { + throw new RuntimeException("某些标识号已被删除!"); + } + for (DisposableGoodsIdentification identificationOfDiposableGoods : identifications) { + idToIdentificationMap.put(identificationOfDiposableGoods.getId(), identificationOfDiposableGoods); + } + } + } + + @Override + public List getDisposableGoodsByKeyword(String keyword) { + String hql = "where 1=1 "; + if (StringUtils.isNotBlank(keyword)) { + keyword = keyword.trim(); + Matcher matcher = Pattern.compile("[\\u4E00-\\u9FA5]+").matcher(keyword); + String searchMode = AcegiHelper.getLoginUser().getSearchMode(); + if (matcher.find()) { + hql += " and (spelling like '%" + keyword + "%' or wbCode like '%" + + keyword + "%' or externalCode like '" + keyword + + "%' or po.name like '%" + keyword + "%')"; + } else { + keyword = keyword.toUpperCase(); + hql += Util.getSearchSQLByUserSetting(searchMode, keyword); + } + } + List list = objectDao + .findBySql(DisposableGoods.class.getSimpleName(), hql); + return list; + } + + @Override + public int reCalculateStorageAmount(Long disposableGoodId, int storageAmount) { + List lists = (List) objectDao.getHt().find("from TousseItem where disposableGoodsId = ?", disposableGoodId); + if (lists.size() == 0){ + return storageAmount; + } + int waitDeliverAmount = 0; + for (TousseItem tousseItem : lists) { + if (!tousseItem.terminated()){ + //一次性物品的待发货数量依据是已发数量-申请数量,(状态是非终止了的) + waitDeliverAmount += (tousseItem.getAmount() - tousseItem.getSendOutAmount()); + } + } + String tousseName = lists.get(0).getTousseName(); + logger.debug(String.format("物品:[%s]待发货的数量是:%d", tousseName, waitDeliverAmount)); + int storage = Math.subtractExact(storageAmount, waitDeliverAmount); + if (storage < 0){ + logger.warn(String.format("物品[%s]库存为[%s]少于0", tousseName, storage)); + storage = 0; + } + return storage; + } + + @Override + public int getDisposableGoodsStorage(String handleDepartCoding, + DisposableGoods disposableGoods) { + int storage = 0; + if (StringTools.isNotBlank(handleDepartCoding) && disposableGoods != null) { + //待发货数量 + String waitDeliverAmountSql = "0"; + if (ObjectUtils.equals("true", CssdUtils.getSystemSetConfigByName("storageUseStorageSubtractWaitDeliver"))){ + waitDeliverAmountSql = String.format("(select sum(ti.amount-ti.sendOutAmount) " + + "from TousseItem ti where ti.isTerminated is null and ti.disposableGoodsId=%s group by ti.disposableGoodsId) ", disposableGoods.getId()); + } + + String storageSql = String.format("select (sum(dgs.amount)-%s) storage from WareHouse wh " + + "join DisposableGoodsStock dgs on dgs.warehouseID=wh.id " + + "where wh.orgUnitCode='%s' and dgs.disposableGoodsID=%s ", + waitDeliverAmountSql, handleDepartCoding, disposableGoods.getId()); + + ResultSet result = objectDao.executeSql(storageSql); + try { + if (result.next()){ + storage = result.getInt("storage"); + } + } catch (SQLException e) { + e.printStackTrace(); + }finally { + DatabaseUtil.closeResultSetAndStatement(result); + } + } + return storage; + } + + @Override + public Inventory getHrpDisposableGoodsByInventorySerialNumber(String InventorySerialNumber) { + Inventory inventroy = null; + try { + inventroy = inventoryDao.getInventory(InventorySerialNumber); + } catch (Exception e) { + e.printStackTrace(); + } + return inventroy; + } + + @Override + public List getExpdateDisposableGoodsBatchStocks(Long disposableGoodsID,String expdateType){ + if(disposableGoodsID == null){ + return null; + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(new Date()); + calendar.add(Calendar.DAY_OF_YEAR, 30);// 默认告警日期为30天 + String warningDate = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime()); + String currentDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + //sql语句 + String sql = String.format(" where po.storage > 0 and %s ",SqlUtils.getLongFieldPredicate("po.disposableGoodsId", Long.valueOf(disposableGoodsID))); + switch (expdateType) { + case SystemWarningItemVO.WARNING_TYPE_DIPOSABLEGOODS: + sql += " and po.expDate between " + + dateQueryAdapter.dateAdapter(currentDate) + " and " + + dateQueryAdapter.dateAdapter(warningDate) + + "order by expDate"; + break; + case SystemWarningItemVO.WARNING_TYPE_DISABLED_DIPOSABLEGOODS: + sql += " and po.expDate < " + + dateQueryAdapter.dateAdapter(currentDate) + + "order by expDate"; + break; + default: + sql += " and po.expDate < " + + dateQueryAdapter.dateAdapter(warningDate) + + "order by expDate"; + break; + } + List disposableGoodsBatchStocks = objectDao.findBySql(DisposableGoodsBatchStock.class.getSimpleName(),sql); + + return disposableGoodsBatchStocks; + } + +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/util/ExpensiveGoodsUtils.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/util/ExpensiveGoodsUtils.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/util/ExpensiveGoodsUtils.java (revision 20740) @@ -0,0 +1,155 @@ +/** + * + */ +package com.forgon.disinfectsystem.expensiveGoods.util; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.LinkedList; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; + +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatch; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryItem; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.string.StringTools; +import com.forgon.util.SqlUtils; + +/** + * @author Jeff Li + * + */ +public class ExpensiveGoodsUtils { + // 是否包含某个id + public static boolean isGodownEntryItemsContainItemId( + List items, Long id) { + for (GodownEntryItem godownEntryItem : items) { + Long itemID = godownEntryItem.getId(); + if (itemID != null && itemID.equals(id)) { + return true; + } + } + return false; + } + + public static GodownEntryItem getGodownEntryItemsByItemId( + List items, Long id) { + if (id == null) { + return null; + } + for (GodownEntryItem godownEntryItem : items) { + Long itemID = godownEntryItem.getId(); + if (itemID != null && itemID.equals(id)) { + return godownEntryItem; + } + } + return null; + } + // 根据批次ID获取一次性物品ID + public static List getDiposableGoodsIDsByBatchIDs(ObjectDao objectDao,Iterable batchIDs) { + List diposableGoodsIDs = new LinkedList(); + if(batchIDs == null){ + return diposableGoodsIDs; + } + + String batchIDsStr = SqlUtils.joinToWhereInConditionForNonStringProperties(batchIDs); + if(StringUtils.isBlank(batchIDsStr)){ + return diposableGoodsIDs; + } + + String sql = String + .format(" select distinct b.disposableGoodsID from %s b where b.disposableGoodsBatchID in(%s)", + DisposableGoodsBatchStock.class.getSimpleName(), + batchIDsStr); + ResultSet resultSet = objectDao.executeSql(sql.toString()); + if (resultSet == null) { + return diposableGoodsIDs; + } + try { + while (resultSet.next()) { + Long diposableGoodsID = resultSet.getLong(1); + diposableGoodsIDs.add(diposableGoodsID); + } + } catch (SQLException e) { + e.printStackTrace(); + }finally { + DatabaseUtil.closeResultSetAndStatement(resultSet); + } + return diposableGoodsIDs; + } + + /** + * 根据批次ID从批次定义表获取一次性物品定义ID(与上面的方法不同的是,上一个方法查的是一次性物品批次定义表有可能不准备) + * @param objectDao + * @param batchIds + * @return + */ + public static List getDiposableGoodsIdsFromGoodsBatchByBatchIDs(ObjectDao objectDao,Iterable batchIds) { + List diposableGoodsIds = new LinkedList(); + if(batchIds == null){ + return diposableGoodsIds; + } + + String batchIDsStr = SqlUtils.joinToWhereInConditionForNonStringProperties(batchIds); + if(StringUtils.isBlank(batchIDsStr)){ + return diposableGoodsIds; + } + + //实际上diposablegoods_id表示的是一次性物品库存id.以后再统一改掉命名 + String sql = String + .format(" select distinct b.diposablegoods_id from %s b where b.id in(%s)", + DisposableGoodsBatch.class.getSimpleName(), + batchIDsStr); + ResultSet resultSet = objectDao.executeSql(sql.toString()); + if (resultSet == null) { + return diposableGoodsIds; + } + try { + while (resultSet.next()) { + diposableGoodsIds.add(resultSet.getLong(1)); + } + } catch (SQLException e) { + e.printStackTrace(); + }finally { + DatabaseUtil.closeResultSetAndStatement(resultSet); + } + return diposableGoodsIds; + } + +// public static String[] getNameAndSpecificationFromFullName(String diposableGoodsName) { +// String[] nameAndSpecification = new String[]{diposableGoodsName,null}; +// String specification = null; +// if (StringUtils.isNotBlank(diposableGoodsName) +// && diposableGoodsName.lastIndexOf("[") != -1) { +// specification = diposableGoodsName.substring( +// diposableGoodsName.lastIndexOf("[") + 1, +// diposableGoodsName.length() - 1); +// diposableGoodsName = diposableGoodsName.substring(0, +// diposableGoodsName.lastIndexOf("[")).trim(); +// } +// return nameAndSpecification; +// } + + public static String getDisposableGoodsFullName(String name, + String specification) { + if (StringUtils.isNotBlank(specification)) { + return name + "[" + specification + "]"; + } + return name; + } + public static String getDisposableGoodsFullName(String name, + String specification,String applicationSpecification) { + if (StringUtils.isNotBlank(applicationSpecification)) { + return name + "[" + applicationSpecification + "]"; + } + if (StringUtils.isNotBlank(specification)) { + return name + "[" + specification + "]"; + } + return name; + } +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsGodownEntryManager.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsGodownEntryManager.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsGodownEntryManager.java (revision 20740) @@ -0,0 +1,99 @@ +package com.forgon.disinfectsystem.expensiveGoods.service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import net.sf.json.JSONObject; + +import com.forgon.directory.model.OrgUnit; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntry; +import com.forgon.disinfectsystem.entity.assestmanagement.GodownEntryItem; +import com.forgon.disinfectsystem.vo.DisposableGoodsStorageAdjustVo; + +public interface ExpensiveGoodsGodownEntryManager { + + public GodownEntry getGodownEntryById(String id); + + public Map deleteGodownEntryById_TRANS_NEW(String id); + + public Map deleteGodownOutEntryById_TRANS_NEW(String id); + + /** + * 根据hql查询语句获取数据 + * @param hql HQL查询语句 + * @return + */ + public List getGodownEntryListByHql(String hql); + + // 保存入库单 + public void saveGodownEntry_TRANS_REQUIRED(GodownEntry entry,Map result); + // 保存入库单,只修改库存,不改其他属性,用于盘点与调拨 + public List saveGodownEntryModifyOnlyAmount_TRANS_REQUIRED(GodownEntry entry,Map result); + + public void saveGodownEntry_TRANS_MANDATORY(Collection entrys,Map result); + // 更新入库单 + public void updateGodownEntry_TRANS_REQUIRED(GodownEntry original,GodownEntry entry,Map result); + // 保存退库单 + public List saveGodownOutEntry_TRANS_REQUIRED(GodownEntry entry,Map result,boolean needWriteBack); + + public void saveGodownOutEntry_TRANS_MANDATORY(Collection entrys,Map result); + // 更新退库单 + public void updateGodownOutEntry_TRANS_REQUIRED(GodownEntry original,GodownEntry entry,Map result); + + /** + * 保存调拨单,从源仓库产生出库单,从目标仓库产生入库单 + * @param entry + * @param result + */ + public void saveAppropriateEntry_TRANS_REQUIRED(GodownEntry entry,Map result); + public void loadGodownEntryPrintData(String[] invoiceIds,JSONObject jsonObject); + /** + * 向入库单\出库单\调拨单添加物品,添加的物品的信息以json对象表示 + * @param entry 要添加物品的入库单\出库单 + * @param itemObject 物品详细信息的json对象 + */ + public void addItemToGodownEntry(GodownEntry entry,JSONObject itemObject); + /** + * 更新入库单\出库单\调拨单的信息 + * @param entry + * @param godownEntryInfo + */ + public void updateGodownEntryInfo(GodownEntry entry,JSONObject godownEntryInfo); + + /** + * 设置入库单\出库单\调拨单到对应科室的默认仓库 + * @param entry + */ + public void setGodownEntryDefaultWareHouse(GodownEntry entry, OrgUnit orgUnit); + /** + * 设置入库单\出库单\调拨单到对应科室的默认仓库 + * @param entry 入库单\出库单\调拨单 + * @param orgUnitCoding 科室编码 + */ + public void setGodownEntryDefaultWareHouse(GodownEntry entry,String orgUnitCoding); + + public void printSomeGodownEntryItem(String items,JSONObject jsonObj); + + /** + * 修改入库单的物品明细的各个属性(不支持修改单价、数量等字段)后,需要分别更新到入库明细表、一次n性物品定义、批次定义等表中 + * @param items 物品明细的json数组格式,示例格式: + * [ + * { + id : record.data.id,//入库明细id + disposableGoodsID : record.data.disposableGoodsID,//一次性物品定义id + batchID : record.data.batchID,//批次id + batchNumber : record.data.batchNumber,//批次号 + expDate : record.data.expDate.format('Y-m-d'),//失效期 + supplierName : record.data.supplierName,//供应商 + sterileBatchNumber : record.data.sterileBatchNumber,//灭菌批号 + manufacturer : record.data.manufacturer,//生产厂家 + producingArea : record.data.producingArea,//产地 + certification : record.data.certification,//注册证号 + grade : record.data.grade//类别 + } + * ] + * @param jsonObj 接收返回的参数 + */ + public void modifyGodownEntryItemBaseData(String items,JSONObject jsonObj); +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DisposableGoodsStockManagerImpl.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DisposableGoodsStockManagerImpl.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/DisposableGoodsStockManagerImpl.java (revision 20740) @@ -0,0 +1,354 @@ +package com.forgon.disinfectsystem.expensiveGoods.service; + +import java.math.BigDecimal; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.stream.Collectors; + +import com.forgon.directory.model.OrgUnit; +import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; +import com.forgon.disinfectsystem.common.CssdUtils; +import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; +import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; + +import net.sf.json.JSONObject; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; + +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.disinfectsystem.basedatamanager.supplyroomconfig.service.SupplyRoomConfigManager; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsStock; +import com.forgon.disinfectsystem.entity.basedatamanager.supplyroomconfig.SupplyRoomConfig; +import com.forgon.disinfectsystem.expensiveGoods.util.ExpensiveGoodsUtils; +import com.forgon.security.tools.Util; +import com.forgon.tools.Constants; +import com.forgon.tools.MathTools; +import com.forgon.tools.SqlBuilder; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.string.StringTools; +import com.forgon.tools.util.SqlUtils; + +import org.apache.commons.lang3.ObjectUtils; +import org.apache.log4j.Logger; + +import javax.annotation.Resource; + +public class DisposableGoodsStockManagerImpl implements + DisposableGoodsStockManager { + + protected Logger logger = Logger.getLogger(this.getClass()); + + private ObjectDao objectDao; + + private DiposableGoodBatchStockManager diposableGoodBatchStockManager; + + private SupplyRoomConfigManager supplyRoomConfigManager; + + private WareHouseManager wareHouseManager; + + private ExpensiveGoodsManager diposableGoodsManagerTarget; + + public void setDiposableGoodsManagerTarget(ExpensiveGoodsManager diposableGoodsManagerTarget) { + this.diposableGoodsManagerTarget = diposableGoodsManagerTarget; + } + + public void setWareHouseManager(WareHouseManager wareHouseManager) { + this.wareHouseManager = wareHouseManager; + } + + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + + public void setDiposableGoodBatchStockManager( + DiposableGoodBatchStockManager diposableGoodBatchStockManager) { + this.diposableGoodBatchStockManager = diposableGoodBatchStockManager; + } + + public void setSupplyRoomConfigManager( + SupplyRoomConfigManager supplyRoomConfigManager) { + this.supplyRoomConfigManager = supplyRoomConfigManager; + } + + @SuppressWarnings("unchecked") + @Override + public DisposableGoodsStock getDisposableGoodsStockByDisposableGoodsId( + String disposableGoodsId,String wareHouseId) { + if(DatabaseUtil.isPoIdValid(disposableGoodsId) && DatabaseUtil.isPoIdValid(wareHouseId)){ + String sql = " where po.disposableGoodsID = " + disposableGoodsId + + " and po.warehouseID = " + + wareHouseId; + DisposableGoodsStock disposableGoodsStock = (DisposableGoodsStock)objectDao.getBySql(DisposableGoodsStock.class.getSimpleName(), sql); + return disposableGoodsStock; + } + return null; + } + @SuppressWarnings("unchecked") + @Override + public List getDisposableGoodsStockList(Collection disposableGoodsIds,Collection warehouseIds){ + if(CollectionUtils.isNotEmpty(disposableGoodsIds) && CollectionUtils.isNotEmpty(warehouseIds)){ + String id1 = SqlBuilder.build_number_IN_Statement("disposableGoodsID", SqlBuilder.IN, disposableGoodsIds); + String id2 = SqlBuilder.build_number_IN_Statement("warehouseID", SqlBuilder.IN, warehouseIds); + String sql = " where " + id1 + " and " + id2; + return objectDao.findBySql(DisposableGoodsStock.class.getSimpleName(), sql); + } + return null; + } + @Override + public boolean verifyDiposableGoods(String id, String name, + String specification) { + String sql = "where po.name = '" + name + "'"; + if (StringUtils.isNotEmpty(id)) { + sql += " and po.id != " + id; + } + sql += String.format(" and %s ", SqlUtils.getStringFieldPredicate("po.specification", specification)); + + if (objectDao.getBySql(DisposableGoodsStock.class.getSimpleName(), sql) != null) { + return false; + } else { + return true; + } + } + + + + @Override + public List getDisposableGoodsStockByCodeAndDisposeGoodIds(String handleDepartCode, Set disposableGoodsIds) { + OrgUnit org = new OrgUnit(); + org.setOrgUnitCoding(handleDepartCode); + //找出该部门下的所有仓库 + List list = wareHouseManager.getWareHouseListByOrgUnit(org); + Set warehouseIds = new HashSet<>(); + if(list != null){ + warehouseIds = list.stream().map((warehouse)->warehouse.getId() + "").collect(Collectors.toSet()); + } + if (CollectionUtils.isNotEmpty(warehouseIds)){ + return this.getDisposableGoodsStockList(disposableGoodsIds, warehouseIds); + } + return null; + } + + @Override + public List> searchDisposableGoodsStockList(String spell, + String allItems, String wareHouseId) { + String sql = buildGetDisposableGoodsStockSql(spell, allItems); + if(DatabaseUtil.isPoIdValid(wareHouseId)){ + sql += " and po.warehouseID = " + wareHouseId; + } + List> mapList = getDisposableGoodsStockListInternal(wareHouseId, sql,true); + return mapList; + } + /*public JSONObject searchDisposableGoodsStockList(String spell, + String allItems, String wareHouseId) { + String sql = buildGetDisposableGoodsStockSql(spell, allItems); + + if(DatabaseUtil.isPoIdValid(wareHouseId)){ + sql += " and po.warehouseID = " + wareHouseId; + } + List> mapList = getDisposableGoodsStockListInternal( + wareHouseId, sql,true); + Map map = new HashMap(); + map.put("totalCount", mapList.size()); + map.put("data", mapList); + return JSONObject.fromObject(map); + }*/ + /** + * 将一次性物品的库存信息放入List列表中 + * @param wareHouseId + * @param sql + * @param showReferencePrice + * @return + */ + @SuppressWarnings("unchecked") + private List> getDisposableGoodsStockListInternal( + String wareHouseId, String sql,boolean showReferencePrice) { + /*List disposableGoodsStockList = objectDao.findBySql( + DisposableGoodsStock.class.getSimpleName(), sql);*/ + double floatPercent = supplyRoomConfigManager.getDisposableGoodsFluctuationPercent();// 一次性物品浮动价格系数/ + List> mapList = new ArrayList>(); + //System.out.println("sql:" + sql); + ResultSet resultSet = objectDao.executeSql(sql); + try { + while (resultSet.next()) { + Map item = buildDisposableGoodsStockPropertyMap(resultSet,floatPercent, + showReferencePrice); + if(item != null){ + mapList.add(item); + } + } + } catch (SQLException e) { + e.printStackTrace(); + }finally { + DatabaseUtil.closeResultSetAndStatement(resultSet); + } + return mapList; + } + /** + * 创建获取一次性物品库存的基本sql + * @param simpleSpell + * @param allItems + * @return + */ + private String buildGetDisposableGoodsStockSql(String simpleSpell, + String allItems) { + String sql = "select po.* from " + DisposableGoodsStock.class.getSimpleName() + " po "; + sql += " left join " + DisposableGoods.class.getSimpleName() + " dg on dg.id = po.disposableGoodsID "; + if (StringUtils.equals(allItems, "yes")) { + sql += " where 1=1 "; + } else { + sql += " where dg.isApplicationMaterial = '" + + DisposableGoods.CONSTANT_YES + "'"; + } + + Matcher m = Constants.ChineseCharPattern.matcher(simpleSpell); + String searchMode = AcegiHelper.getLoginUser().getSearchMode(); + if (StringUtils.isNotBlank(simpleSpell)) { + simpleSpell = simpleSpell.toUpperCase(); + if (m.find()) { + sql += " and po.name like '%" + simpleSpell + "%'"; + } else { + sql += Util.getSearchSQLByUserSetting(searchMode, + simpleSpell); + } + } + return sql; + } + /** + * 创建一次性物品库存的性质/值对 + * @param goodsStock + * @param floatPercent + * @param showReferencePrice + * @return + * @throws SQLException + */ + private Map buildDisposableGoodsStockPropertyMap( + ResultSet resultSet,double floatPercent,boolean showReferencePrice) throws SQLException { + Map temp = new HashMap(); + if(resultSet == null) + return temp; + String name = resultSet.getString("name"); + String specification = resultSet.getString("specification"); + String goodsName = ExpensiveGoodsUtils.getDisposableGoodsFullName(name,specification); + String packageSpec = resultSet.getString("packageSpec"); + BigDecimal amount = resultSet.getBigDecimal("amount"); + Long damount = (amount==null?null:amount.longValue()); + long disposableGoodsStockId = resultSet.getLong("id"); + temp.put("id", disposableGoodsStockId); + // TousseDefintionManagerImpl中的查询加上了type,需确认是否可以去掉 + temp.put("type", "一次性物品"); + + temp.put("name", goodsName); + Number n = (Number)resultSet.getObject("disposableGoodsId"); + Long disposableGoodsId = n == null ? null : n.longValue(); + if(DatabaseUtil.isPoIdValid(disposableGoodsId)){ + DisposableGoods disposableGoods = + (DisposableGoods)objectDao.getBySql(DisposableGoods.class.getSimpleName(), "where id=" + disposableGoodsId); + if(disposableGoods != null){ + temp.put("goodsType", disposableGoods.getGoodsType()); + } + } + temp.put("spelling", resultSet.getString("spelling")); + temp.put("amount", damount == null?0:damount); + temp.put("externalCode", resultSet.getString("externalCode")); + temp.put("minApplyAmount", resultSet.getInt("minApplyAmount")); + temp.put("unit", StringTools.getDefaultString(resultSet.getString("unit"))); + temp.put("tousseType", "一次性物品"); + temp.put("packageSpec", packageSpec); + + String displayName; + + if (showReferencePrice) { + double referencePrice = resultSet.getDouble("referencePrice"); + temp.put("referencePrice", referencePrice); + + // 价格修改为浮动价格 + Double price = diposableGoodBatchStockManager.getEarliestPrice(disposableGoodsStockId,referencePrice); + price = MathTools.mul(price, floatPercent).doubleValue(); + temp.put("price", price); + displayName = getDisposableGoodsStockDisplayName(name,specification,price,packageSpec,damount); + }else{ + displayName = getDisposableGoodsStockDisplayName(name,specification,damount); + } + + temp.put("displayName", displayName); + + return temp; + } + /** + * 获取库存的显示名称,会显示当前有多少库存 + * @param disposableGoodsStock + * @return + */ + private String getDisposableGoodsStockDisplayName(String name,String Specification,Long amount){ + if(StringUtils.isBlank(name)){ + return StringTools.EMPTY; + } + String displayName = ExpensiveGoodsUtils.getDisposableGoodsFullName(name,Specification); + displayName += "(库存:"; + displayName += (amount == null?0:amount); + displayName += ")"; + return displayName; + } + /** + * 获取库存的显示名称,根据price是否为null来显示参考价格,同时也显示库存 + * @param disposableGoodsStock 一次性物品库存对象 + * @param price 显示的价格 + * @return + */ + private String getDisposableGoodsStockDisplayName( + DisposableGoodsStock disposableGoodsStock,Double price){ + if(disposableGoodsStock == null){ + return StringTools.EMPTY; + } + return getDisposableGoodsStockDisplayName(disposableGoodsStock.getName(),disposableGoodsStock.getSpecification(), + price,disposableGoodsStock.getPackageSpec(),disposableGoodsStock.getAmount()); + } + private String getDisposableGoodsStockDisplayName(String name,String Specification,Double price, + String packageSpec,Long amount){ + if(StringUtils.isBlank(name)){ + return StringTools.EMPTY; + } + String displayName = ExpensiveGoodsUtils.getDisposableGoodsFullName( + name,Specification); + if(price != null){ + if (StringUtils.isBlank(packageSpec)) { + packageSpec = ""; + } else { + packageSpec = "(" + packageSpec + + ")"; + } + displayName = displayName + packageSpec + + "(参考价:" + price + ")(库存:" + + (amount == null?0:amount) + ")"; + } + return displayName; + } + + @Override + public int getDisposableGoodsStock(String handleDepartCode, String disposableGoodsId) { + Set disposeGoodIds = new HashSet<>(); + disposeGoodIds.add(disposableGoodsId); + List lists = this.getDisposableGoodsStockByCodeAndDisposeGoodIds(handleDepartCode, disposeGoodIds); + //因为这里的物品id只有一个,所以lists的大小只有1 + int storage = CollectionUtils.isNotEmpty(lists) ? lists.get(0).getAmount().intValue() : 0; + // 省医需求:一次性物品库存数量 = 原来的库存数量 - 待发货的数量 + if (ObjectUtils.equals("true", CssdUtils.getSystemSetConfigByName("storageUseStorageSubtractWaitDeliver"))){ + logger.info("原来的库存是:" + storage); + storage = diposableGoodsManagerTarget.reCalculateStorageAmount(Long.parseLong(disposableGoodsId), storage); + logger.info("重新计算后的库存是:" + storage); + } + return storage; + } + +} Index: ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsPurchasePlanManager.java =================================================================== diff -u --- ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsPurchasePlanManager.java (revision 0) +++ ssts-expensivegoods/src/main/java/com/forgon/disinfectsystem/expensiveGoods/service/ExpensiveGoodsPurchasePlanManager.java (revision 20740) @@ -0,0 +1,54 @@ +package com.forgon.disinfectsystem.expensiveGoods.service; + +import java.io.OutputStream; +import java.util.Map; + +import net.sf.json.JSONObject; + +import com.forgon.disinfectsystem.entity.assestmanagement.GoodPurchaseItem; +import com.forgon.disinfectsystem.entity.assestmanagement.GoodPurchasePlan; + +public interface ExpensiveGoodsPurchasePlanManager { + /** + * 保存采购计划单 + * @param goodPurchasePlan 采购计划单 + * @param result + */ + public void saveGoodPurchasePlan(GoodPurchasePlan goodPurchasePlan,Map result); + + public GoodPurchasePlan getGoodPurchasePlanById(String id); + + public GoodPurchaseItem getGoodPurchaseItemById(String itemId); + /** + * 删除采购计划单 + * @param id + * @return + */ + public Map deleteGoodPurchasePlan(String id); + /** + * 更新采购计划单 + * @param original + * @param entry + * @param returnMsg + */ + public void updateGoodPurchasePlan(GoodPurchasePlan original, + GoodPurchasePlan entry, Map returnMsg); + + + public void loadGoodPurchasePlanPrintData( + String[] invoiceIds,JSONObject jsonObject); + + /** + * 根据名称与规格查找最近一次的采购明细 + * @param name + * @param specification + * @return + */ + public GoodPurchaseItem getLastGoodPurchaseItemByNameAndSpecification(String name , String specification); + /** + * 导出采购计划单,可能有多张单,合并导出明细 + * @param ops + * @param ids 要导出的采购计划单的id + */ + public void exportGoodPurchasePlan(OutputStream ops,String ids); +}