Index: ssts-web/src/main/webapp/disinfectsystem/basedatamanager/importbasedata/disposableImportInventoryRecord.xls =================================================================== diff -u Binary files differ Index: ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/action/ImportInventoryRecordController.java =================================================================== diff -u --- ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/action/ImportInventoryRecordController.java (revision 0) +++ ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/action/ImportInventoryRecordController.java (revision 21235) @@ -0,0 +1,125 @@ +package com.forgon.disinfectsystem.inventoryrecord.action; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.apache.commons.lang.StringUtils; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindException; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.ModelAndView; + +import com.forgon.attachfile.service.AttachFileManager; +import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; +import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; +import com.forgon.disinfectsystem.inventoryrecord.service.InventoryRecordManager; +import com.forgon.disinfectsystem.maintain.importbasedata.service.ImportBasedataManager; + + + /** + * 盘点单Excel导入 + * @author YanWeiNing + * + */ +@Controller +public class ImportInventoryRecordController { + + private ImportBasedataManager importBasedataManager; + + private WareHouseManager wareHouseManager; + + private AttachFileManager attachFileManager; + + private InventoryRecordManager inventoryRecordManager; + + public void setInventoryRecordManager( + InventoryRecordManager inventoryRecordManager) { + this.inventoryRecordManager = inventoryRecordManager; + } + + public void setAttachFileManager(AttachFileManager attachFileManager) { + this.attachFileManager = attachFileManager; + } + + public void setWareHouseManager(WareHouseManager wareHouseManager) { + this.wareHouseManager = wareHouseManager; + } + + public void setImportBasedataManager( + ImportBasedataManager importBasedataManager) { + this.importBasedataManager = importBasedataManager; + } + + @RequestMapping(value = "/disinfectsystem/basedatamanager/importbasedata/importInventoryRecord.mhtml", method=RequestMethod.POST) + protected ModelAndView onSubmit(HttpServletRequest request, + HttpServletResponse response) + throws Exception { + JSONArray importInventoryRecordJson = new JSONArray(); + String msg = "导入成功!"; + String[][] retMsgObj = new String[1][3]; + retMsgObj[0][0] = ""; + retMsgObj[0][1] = "成功"; + retMsgObj[0][2] = ""; +// String batchNumbers = request.getParameter("batchNumberList"); + List errInfos = new LinkedList(); + String redirectUrl = "/disinfectsystem/basedatamanager/importbasedata/importInventoryRecord"; + String poName = "",formatFile=""; + try { + String type = request.getParameter("type"); + List inputStreams = attachFileManager.getInputStreamFromAttachFile(request); + switch(type){ + case "disposableInventoryRecord": + poName = "一次性物品盘点单"; + formatFile = "/disinfectsystem/basedatamanager/importbasedata/disposableImportInventoryRecord.xls"; + //返回导入单数据的json + importInventoryRecordJson = inventoryRecordManager.importDisposableInventoryRecordFromInputStreams_TRANS_REQUIRED(request,inputStreams,errInfos); + break; +// case "material": +// // 材料 +// importBasedataManager.importMaterialEntrysFromInputStreams_TRANS_REQUIRED(inputStreams); +// break; + default: + throw new RuntimeException("类型参数错误!"); + } + } catch (Exception e) { + e.printStackTrace(); + msg = e.getMessage(); + retMsgObj[0][1] = "失败"; + errInfos.add(msg); + } + retMsgObj[0][2] = StringUtils.join(errInfos, "
"); +// request.setAttribute("batchNumberList", batchNumbers); + request.setAttribute("poName", poName); + request.setAttribute("formatFile",formatFile); + request.setAttribute("importItems", importInventoryRecordJson.toString()); + request.setAttribute("actionUrl","/disinfectsystem/basedatamanager/importbasedata/importInventoryRecord.mhtml"); + return new ModelAndView(redirectUrl, "msg", retMsgObj); + } + + + @RequestMapping(value = "/disinfectsystem/basedatamanager/importbasedata/importInventoryRecord.mhtml", method=RequestMethod.GET) + protected Object formBackingObject(HttpServletRequest request) + throws Exception { + boolean isDiposable = "disposableInventoryRecord".equals(request.getParameter("type")); +// String batchNumbers = request.getParameter("batchNumberList"); + String poName = "",formatFile=""; + if(isDiposable){ + poName = "一次性物品盘点单"; + formatFile = "/disinfectsystem/basedatamanager/importbasedata/disposableImportInventoryRecord.xls"; + } +// request.setAttribute("batchNumberList", batchNumbers); + request.setAttribute("poName", poName); + request.setAttribute("actionUrl","/disinfectsystem/basedatamanager/importbasedata/importInventoryRecord.mhtml"); + request.setAttribute("formatFile",formatFile); + return "/disinfectsystem/basedatamanager/importbasedata/importInventoryRecord"; + } +} Index: ssts-web/src/main/webapp/disinfectsystem/stocktakerecordmanager/inventoryDisposableGoodsForm.js =================================================================== diff -u -r20317 -r21235 --- ssts-web/src/main/webapp/disinfectsystem/stocktakerecordmanager/inventoryDisposableGoodsForm.js (.../inventoryDisposableGoodsForm.js) (revision 20317) +++ ssts-web/src/main/webapp/disinfectsystem/stocktakerecordmanager/inventoryDisposableGoodsForm.js (.../inventoryDisposableGoodsForm.js) (revision 21235) @@ -383,6 +383,12 @@ }] })], buttons : [{ + text : '导入盘点数量', + hidden:status=="已更新"?true:false, + handler : function() { + importInventoryDisposableGoods(); + } + },{ text : '导出', hidden:(recordId == ""), handler : function() { @@ -489,4 +495,63 @@ } } + function importInventoryDisposableGoods(){ + //获得inventoryRecordForm的数据 + var itemsFromStore = top.Ext.getCmp('inventoryRecordForm').getStore(); + //页面盘点明细批次号数组 + var batchNumberList = new Array(); + itemsFromStore.each(function(record){ + batchNumberList.push(record.data.batchNumber); + }); +// console.log(batchNumberList); + var url = WWWROOT+'/disinfectsystem/basedatamanager/importbasedata/importInventoryRecord.mhtml?type=disposableInventoryRecord'; + //若导入成功则返回execel的导入数据 + var importItemsJsonStr = openModalWindow(url,batchNumberList,'760','400'); + if(importItemsJsonStr){ + //获得execel数据json对象 + var importJsObject = JSON.parse(importItemsJsonStr); +// console.log(itemsFromStore); +// console.log(importJsObject); + //循环匹配导入单并设盘点数量 + for(var i=0;i inputStreams,List errInfos); } Index: ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/service/InventoryRecordManagerImpl.java =================================================================== diff -u -r21075 -r21235 --- ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/service/InventoryRecordManagerImpl.java (.../InventoryRecordManagerImpl.java) (revision 21075) +++ ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/service/InventoryRecordManagerImpl.java (.../InventoryRecordManagerImpl.java) (revision 21235) @@ -2,6 +2,7 @@ import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.sql.ResultSet; import java.text.ParseException; @@ -17,6 +18,8 @@ import java.util.Map; import java.util.Set; +import javax.servlet.http.HttpServletRequest; + import net.sf.json.JSONArray; import net.sf.json.JSONObject; @@ -39,6 +42,7 @@ import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; import com.forgon.disinfectsystem.common.CssdUtils; import com.forgon.disinfectsystem.diposablegoods.service.DiposableGoodBatchStockManager; +import com.forgon.disinfectsystem.diposablegoods.service.DiposableGoodsManager; import com.forgon.disinfectsystem.diposablegoods.service.GodownEntryManager; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; @@ -59,6 +63,7 @@ import com.forgon.disinfectsystem.entity.stocktakemanager.InventoryExpensiveItem; import com.forgon.disinfectsystem.entity.stocktakemanager.InventoryItem; import com.forgon.disinfectsystem.entity.stocktakemanager.InventoryRecord; +import com.forgon.disinfectsystem.exception.ImportDataException; import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsGodownEntryManager; import com.forgon.disinfectsystem.expensiveGoods.service.ExpensiveGoodsStockManager; import com.forgon.disinfectsystem.inventorymanagement.constant.gdsy.ConstantDefinition; @@ -74,15 +79,21 @@ import com.forgon.log.service.LogManager; import com.forgon.serialnumber.model.SerialNum; import com.forgon.serialnumber.service.SerialNumManager; +import com.forgon.systemsetting.model.HttpOption; +import com.forgon.tools.GB2Alpha; +import com.forgon.tools.GB2WB; import com.forgon.tools.MathTools; import com.forgon.tools.Path; import com.forgon.tools.date.DateTools; import com.forgon.tools.db.DatabaseUtil; import com.forgon.tools.excel.ExcelCellStyle; import com.forgon.tools.excel.ExcelHelper; +import com.forgon.tools.excel.ParerUtils; import com.forgon.tools.hibernate.BasePoManagerImpl; import com.forgon.tools.json.JSONUtil; +import edu.emory.mathcs.backport.java.util.Arrays; + /** * @author qjw * @@ -106,6 +117,8 @@ private DiposableGoodBatchStockManager diposableGoodBatchStockManager; + private DiposableGoodsManager diposableGoodsManager; + private MaterialDefinitionManager materialDefinitionManager; private LogManager appLogManager; @@ -135,6 +148,10 @@ this.diposableGoodBatchStockManager = diposableGoodBatchStockManager; } + public void setDiposableGoodsManager(DiposableGoodsManager diposableGoodsManager) { + this.diposableGoodsManager = diposableGoodsManager; + } + public void setStockTakeRecordManager( StockTakeRecordManager stockTakeRecordManager) { this.stockTakeRecordManager = stockTakeRecordManager; @@ -1641,4 +1658,214 @@ return objectDao.findAllObjects(InventoryRecord.class.getSimpleName()); } + +/////导入一次性物品盘点单///// + @Override + public JSONArray importDisposableInventoryRecordFromInputStreams_TRANS_REQUIRED(HttpServletRequest request,List inputStreams,List errInfos){ + List sheets = getSheetsFromStreams(inputStreams); + if(sheets.size() == 0){ + throw new RuntimeException("没有要导入的表格!"); + } + // + return importInventoryRecordJsonFromSheets(request,sheets,errInfos); + } + + private List getSheetsFromStreams(List inputStreams) { + List sheets = new LinkedList(); + // 提取所有sheet + for (InputStream is : inputStreams) { + try { + POIFSFileSystem fs = new POIFSFileSystem(is); + HSSFWorkbook wb = new HSSFWorkbook(fs); + for (int i = 0, len = wb.getNumberOfSheets(); i < len; i++) { + HSSFSheet sheet = wb.getSheetAt(i); + if(sheet == null){ + String msg = String.format("第%s个表格为空!", i); + throw new RuntimeException(msg); + } + sheets.add(sheet); + } + } catch (Exception e) { + throw new RuntimeException("提取文件出错!"); + } + } + return sheets; + } + + private JSONArray importInventoryRecordJsonFromSheets(HttpServletRequest request,List sheets,List errInfos){ + Map returnMsg = new HashMap(); +// String warehouseID = request.getParameter("warehouseID"); +// if(StringUtils.isBlank(warehouseID)){ +// throw new RuntimeException(String.format("仓库id不能为空!")); +// } + String batchNumberStr = request.getParameter("batchNumberList"); + if(StringUtils.isBlank(batchNumberStr)){ + throw new RuntimeException(String.format("页面盘点明细批号没获得!")); + } + List batchNumberList = Arrays.asList(batchNumberStr.split(",")); + JSONArray importInventoryItemJsonArry =new JSONArray(); + boolean err = false; + for (HSSFSheet hssfSheet : sheets) { + try { + importInventoryItemJsonArry = buildInventoryRecordJson(request,hssfSheet,errInfos,batchNumberList); + } catch (Exception e) { + e.printStackTrace(); + errInfos.add(e.getMessage()); + err = true; + } + } + if(err){ + throw new RuntimeException(String.format("导入文件失败!")); + } + return importInventoryItemJsonArry; + } + // 构造导入盘点明细单json数组 + private JSONArray buildInventoryRecordJson(HttpServletRequest request,HSSFSheet diposableSheet + ,List errInfos,ListbatchNumberList){ + boolean err = false; + JSONArray importInventoryItemJsonArry = new JSONArray(); + int lastRowNum = diposableSheet.getLastRowNum(); + for (int i = 2; i <= lastRowNum; i++) { + HSSFRow row = diposableSheet.getRow(i); + int currentRowNum = i + 1; + if (row == null || ParerUtils.isBlankRow(row)) { + continue; + } + try { + //获得导入盘点单的数据的json + JSONObject importItemJson = getinventoryRecordJsonFromCurrentRow(row,currentRowNum,batchNumberList); + //是否有名字,规格,批号,价格同时相同的 + if(importInventoryItemJsonArry.size()>0){ + for (int j = 0; j < importInventoryItemJsonArry.size(); j++) { + JSONObject job = importInventoryItemJsonArry.getJSONObject(j); + String name = job.getString("name"); + String specification = job.getString("specification"); + String batchNumber = job.getString("batchNumber"); + String price = job.getString("price"); + if(importItemJson.getString("name").equals(name) + && importItemJson.getString("specification").equals(specification) + && importItemJson.getString("batchNumber").equals(batchNumber) + && importItemJson.getString("price").equals(price) + ){ + throw new RuntimeException(String.format("第" + currentRowNum + "行不能其他行同时有重复的物品名称,规格,批号,单价!")); + } + } + } + // + importInventoryItemJsonArry.add(importItemJson); + } catch (Exception e) { + err = true; + errInfos.add(e.getMessage()); + } + } + if (importInventoryItemJsonArry.size() == 0){ + throw new RuntimeException(String.format("【%s】导入项为空!", diposableSheet.getSheetName())); + } + if(err){ + throw new RuntimeException(diposableSheet.getSheetName()+"导入失败!"); + } + return importInventoryItemJsonArry; + } + + private JSONObject getinventoryRecordJsonFromCurrentRow(HSSFRow row,int currentRowNum,ListbatchNumberList){ + //序号 + String rowIndex = ParerUtils.getCellFormatValue(row, 0); + // 外部编码 + String externalCode = ParerUtils.getCellFormatValue(row, 1); + // 物品名称 + String name = ParerUtils.getCellFormatValue(row, 2); + if (StringUtils.isBlank(name)) { + throw new ImportDataException("第" + currentRowNum + "行物品名称不能为空!"); + } + //规格 + String specification = ParerUtils.getCellFormatValue(row, 3); + // 失效日期 + Date expDate = null; + String expDateStr = ParerUtils.getCellFormatValue(row, 4); + if (StringUtils.isNotBlank(expDateStr)) { + expDateStr = expDateStr.trim(); + if(expDateStr.length() != Constants.SIMPLEDATEFORMAT_YYYYMMDD.toPattern().length()){ + throw new ImportDataException("第" + currentRowNum + + "行产品有效期日期格式必须为yyyy-MM-dd!"); + } + try { + expDate = Constants.SIMPLEDATEFORMAT_YYYYMMDD.parse(expDateStr); + } catch (ParseException e) { + System.out.println(e); + } + } + if (expDate == null) { + throw new ImportDataException("第" + currentRowNum + + "行产品有效期日期格式必须为yyyy-MM-dd!"); + } + // 批次号 + String batchNumber = ParerUtils.getCellFormatValue(row, 5); + if (StringUtils.isBlank(batchNumber)) { + throw new ImportDataException("第" + currentRowNum + "行物品批次不能为空!"); + } + //页面盘点明细的批次号是否包括导入的批次号 + if(!batchNumberList.contains(batchNumber)){ + throw new ImportDataException("该盘点明细不包含第" + currentRowNum + "行物品的批次号:"+batchNumber); + } + //账面数量 + String storageStr = ParerUtils.getCellFormatValue(row, 6); + Integer storage = null; + if (StringUtils.isNotBlank(storageStr)) { + try{ + storage = Integer.parseInt(storageStr); + }catch(NumberFormatException e){ + } + if(storage == null || storage<0){ + throw new ImportDataException("第" + currentRowNum+ "行物品的账面数量必须是正整数!"); + } + }else{ + throw new ImportDataException("第" + currentRowNum + "行物品账面数量不能为空!"); + } + //盘点数量 + String amountStr = ParerUtils.getCellFormatValue(row, 7); + Integer amount = null; + if (StringUtils.isNotBlank(amountStr)) { + try{ + amount = Integer.parseInt(amountStr); + }catch(NumberFormatException e){ + } + if(amount == null || amount<0){ + throw new ImportDataException("第" + currentRowNum+ "行物品的盘点数量必须是正整数!"); + } + }else{ + throw new ImportDataException("第" + currentRowNum + "行物品盘点数量不能为空!"); + } + //单价 + String priceStr = ParerUtils.getCellFormatValue(row, 8); + Double price = null; + if (StringUtils.isNotBlank(priceStr)) { + try { + price = Double.parseDouble(priceStr); + } catch (NumberFormatException e) { + } + } + if (price == null) { + throw new ImportDataException("第" + currentRowNum+ "行的物品单价必须为有效数字!"); + } + // 供应商 + String supplierName = ParerUtils.getCellFormatValue(row, 9); + //顺序号 + String sequence = ParerUtils.getCellFormatValue(row, 10); + + //返回json对象 + JSONObject importInventoryRecord = new JSONObject(); + importInventoryRecord.put("rowIndex", rowIndex); + importInventoryRecord.put("externalCode", externalCode); + importInventoryRecord.put("name", name); + importInventoryRecord.put("specification", specification); + importInventoryRecord.put("expDate", expDate); + importInventoryRecord.put("batchNumber", batchNumber); + importInventoryRecord.put("storage", storage); + importInventoryRecord.put("amount", amount); + importInventoryRecord.put("price", price); + importInventoryRecord.put("supplierName", supplierName); + importInventoryRecord.put("sequence", sequence); + + return importInventoryRecord; + } } Index: ssts-web/src/main/webapp/disinfectsystem/basedatamanager/importbasedata/importInventoryRecord.jsp =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/basedatamanager/importbasedata/importInventoryRecord.jsp (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/basedatamanager/importbasedata/importInventoryRecord.jsp (revision 21235) @@ -0,0 +1,182 @@ +<%@ page contentType="text/html; charset=UTF-8"%> +<%@ include file="/common/taglibs.jsp"%> + + + +一次性物品盘点单导入 + +<%@ include file="/common/includeUploadFilesJSAndCSS.jsp"%> + + + + + + + + + + + + + + + + + +
+ +
+
    +
  • 当前位置--导入${poName }
  • +
+
+ + +
+
+
+
+

导入${poName }

+
+
+ + + + + +
${poName }文件:
+
+ + + + + + + + + + + + + +
Excel表格名称状态失败信息
${msgArr[0]}${msgArr[1]} ${msgArr[2]}
+
+
+
+
+ +
+ + \ No newline at end of file Index: ssts-web/src/main/resources/spring/applicationContext-disinfectsystem-action.xml =================================================================== diff -u -r16282 -r21235 --- ssts-web/src/main/resources/spring/applicationContext-disinfectsystem-action.xml (.../applicationContext-disinfectsystem-action.xml) (revision 16282) +++ ssts-web/src/main/resources/spring/applicationContext-disinfectsystem-action.xml (.../applicationContext-disinfectsystem-action.xml) (revision 21235) @@ -51,6 +51,10 @@ + + +