Index: ssts-web/src/main/webapp/disinfectsystem/returnMaterialRecord/returnMaterialRecordView.js =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/returnMaterialRecord/returnMaterialRecordView.js (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/returnMaterialRecord/returnMaterialRecordView.js (revision 14590) @@ -0,0 +1,327 @@ +var entityName = "退货记录"; +var grid; + +var loadFormData = function(grid) { + var operate = '修改'; + var records = grid.getSelectionModel().getSelections(); + if (records.length == 0) { + showResult("请选择要" + operate + "的" + entityName + "!"); + return false; + } + if (records.length > 1) { + showResult("一次只能" + operate + "一个" + entityName + "!"); + return false; + } + + var id = records[0].data['id']; + addAndEditReturnMaterialRecord(id, false); + ReturnMaterialRecordTableManager.getReturnMaterialRecordById(id,setReturnMaterialRecordForm); +}; + +/** + * 修改记录 + * modifyRecord函数 触发modify函数调用,并传入当前列的值以及record.data对象 + * 页面中需要定义 modify(v,data) 函数 + */ +function modify(v,data){ + loadFormData(grid); +} + +function initQueryValueAndReload() { + var startDate = $Id('startDate').value; + var endDate = $Id('endDate').value; + var code = Ext.getCmp('code').getValue(); + if(startDate || endDate){ + if(!compareDate(startDate,endDate)){ + showResult("开始时间不能大于结束时间"); + return; + } + } + + $Id('parm_s_startDate').value = startDate; + $Id('parm_s_endDate').value = endDate; + $Id('parm_s_keyWord').value = code; + grid.dwrReload(); +} + +Ext.onReady(function() { + Ext.QuickTips.init(); + Ext.BLANK_IMAGE_URL = WWWROOT + '/ext/resources/images/default/s.gif'; + + if(supplyRoomType==1){ + document.getElementById('parm_s_searchAll').value = 'true'; + }else{ + document.getElementById('parm_s_searchAll').value = 'false'; + } + + var columns = [ + {header : "操作人",width : 120,dataIndex : 'operator', renderer : modifyRecord}, + {header : "退货时间",width : 120,dataIndex : 'returnTime', renderer : myDateFormatByMinute}, + {header : "退货人",width : 120,dataIndex : 'returnOfPeople'}, + {header : "退货科室",width : 120,dataIndex : 'depart'}, + //{header : "退货状态",width : 120,dataIndex : 'signStatus'}, + //{header : "类型",width : 80,dataIndex : 'type'}, + {header : "金额",width : 80,dataIndex : 'settlementPrice'}, //每一张退货单的金额(陈家儒改) +// {header : "查看发货单",width : 70,renderer: function(v,p,record){ +// var invoiceStatus = record.data.invoiceStatus; +// if(invoiceStatus == ''){ +// return null; +// }else if(invoiceStatus == '部分签收'){ +// return ""; +// }else{ +// return ""; +// } +// } +// }, + {id:'operationRemark',header: "备注", dataIndex: 'remark'} + ]; + + var readerDetail = [ + {name : 'id'}, + {name : 'operator'}, + {name : 'returnTime'}, + {name : 'depart'}, +// {name : 'signStatus'}, + {name : 'returnOfPeople'}, +// {name : 'invoiceStatus'}, +// {name : 'recyclingApplicationId'}, +// {name : 'type'}, + {name : 'settlementPrice'}, + {name : 'remark'} + ]; + + var filters = new Ext.grid.GridFilters({ + filters:[ + {type: 'string', dataIndex: 'operator'}, + {type: 'date', dataIndex: 'returnTime'}, + {type: 'string', dataIndex: 'depart'}, + {type: 'string', dataIndex: 'signStatus'}, + {type: 'string', dataIndex: 'returnOfPeople'}, + {type: 'string', dataIndex: 'type'}, +// {type: 'double', dataIndex: 'settlementPrice'}, + {type: 'string', dataIndex: 'remark'} + ] + }); + + var sign = true; + + var tbar = [{ + text : '添加', + iconCls : 'btn_ext_application_add', + hidden : SSTS_ReturnGoodsRecord_Create, + handler : function() { + addAndEditReturnMaterialRecord(0, true); + } + }]; + + grid = new Ext.ux.ForgonPageGrid( { + title : entityName + '列表', + tbar : tbar, + pageSize : 20, + defaultSortField : 'returnTime', + defaultSortDirection : 'DESC', + searchDisableIndexes:['signOperate'], + isCheckboxSelectionModel : true, + rememberSelected : false, + isShowSearchField : true, + columns : columns, + plugins: filters, + autoExpandColumn : 'operationRemark', + renderTo : 'gridDiv', + frame : false + }, + readerDetail, + ReturnMaterialRecordTableManager.findReturnMaterialRecordTableList, + null + ); + + //表格行鼠标移入时,悬浮窗显示该退货记录相应的物品及数量 + grid.on('mouseover', function(e) {// 添加mouseover事件 + var index = grid.getView().findRowIndex(e.getTarget());// 根据mouse所在的target可以取到列的位置 + //由于第0行并未触发时,所以加上条件行号为0 + if(index || index == 0){ + try{ + index = parseInt(index);//空白行时取到的index值为false,其它行时值为行索引号,从0开始 + + var record = this.getStore().getAt(index); + if (!record.data['id']) { //防止鼠标悬停到最后一行(汇总的那一行)id就会为空(陈家儒改) + return; + } + var BorrowName = ''; + var BorrowAmount = ''; + var tableContent = record['htmlContent'];//用属性绶存明细结果,第二次光标移入时,从缓存查询得出 + if(!tableContent){ + var content = ""; + var diposableGoodsData = null;//是否为一次性物品 + DWREngine.setAsync(false); + ReturnGoodsRecordTableManager.findReturnGoodsItemVoListByReturnGoodsRecordId(record.data['id'],function(voItems){ + for(var i=0;i" + voItems[i].amount+"" + voItems[i].fluctuationPrice+""; + + //如果为一次性物品且有批次号 + if(voItems[i].diposableGoodsID && voItems[i].batchNumber){ + diposableGoodsData = true; + content +="" + voItems[i].batchNumber + "" + voItems[i].barcode + ""; + } + content +=""; + } + }); + DWREngine.setAsync(true); + tableContent = ""; + tableContent += ""; + //如果为一次性物品 + if(diposableGoodsData){ + tableContent += ""; + } + tableContent += content; + tableContent += "

物品名称

退货数量

单价

批次

条码


"; + record['htmlContent'] = encodeURI(tableContent);//加上此句会导致js报错 + }else{ + tableContent = decodeURI(tableContent); + } + + var rowEl = Ext.fly(e.getTarget());// 把target转换成Ext.Element对象 + rowEl.set({ + 'ext:qtip' : tableContent,'ext:qwidth':450,'ext:qtitle':' '+entityName+'列表:'}); + + }catch(e){ + //console.log("行号转换整数错误:rowIndex" + index + ',错误信息:' + e.message); + } + } + }); + + var dt = new Date(); + var v = dt.getMonth() + 1; + if(v<10){ + v = "0" + v; + } + var startDayOfMonth = dt.getFullYear() + "/" + v + "/01"; + var form = new Ext.Panel({ + layout : 'table', + frame : true, + region : 'north', + border : false, + bodyBorder : false, + layoutConfig : {columns : 2}, + height : 63, + items : [{ + width :900, + layout : 'column', + items:[{ + columnWidth : 1, + layout : 'form', + labelWidth : 60, + items : [{ + fieldLabel : '物品名称', + xtype : 'combo', + id : 'code', + name : 'code', + queryParam : 'spell', + minChars : 0, + valueField : 'id', + displayField : 'displayName', + width : 600, + store : new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/baseData/tousseDefinitionAction!searchInsideTousseAndDiposableGoods.do?showUnAppDiposableGoods=true', + method : 'POST' + }), + reader : new Ext.data.JsonReader({ + totalProperty : 'totalCount', + root : 'data' + }, [ + {name : 'id',mapping : 'id'}, + {name : 'spelling',mapping : 'spelling'}, + {name : 'name',mapping : 'name'}, + {name : 'displayName',mapping : 'displayName'} + ]) + }), + forceSelection : true, + lazyInit : true, + triggerAction : 'all', + hideTrigger : true, + typeAhead : false, + allowBlank : true, + anchor : '97%', + listeners : { + select : function(combo, record, index) { + Ext.getCmp('code').setValue(record.data.name); + } + } + }] + },{ + columnWidth : .5, + layout : 'form', + labelWidth : 60, + items : [{ + xtype : 'datefield', + fieldLabel : '开始日期', + name : 'startDate', + id : 'startDate', + readOnly : false, + editable : false, + altFormats:'Y-m-d|Y-n-j|y-n-j|y-m-j|y-m-d|y-n-d|Y-n-d|Y-m-j|Ymd|Ynj|ynj|ymj|ymd|ynd|Ynd|Ymj|Y/m/d|Y/n/j|y/n/j|y/m/j|y/m/d|y/n/d|Y/n/d|Y/m/j', + format : 'Y-m-d', + value : new Date(startDayOfMonth), + anchor : '94%' + }] + },{ + columnWidth : .5, + layout : 'form', + labelWidth : 60, + items : [{ + xtype : 'datefield', + fieldLabel : '结束日期', + name : 'endDate', + id : 'endDate', + altFormats:'Y-m-d|Y-n-j|y-n-j|y-m-j|y-m-d|y-n-d|Y-n-d|Y-m-j|Ymd|Ynj|ynj|ymj|ymd|ynd|Ynd|Ymj|Y/m/d|Y/n/j|y/n/j|y/m/j|y/m/d|y/n/d|Y/n/d|Y/m/j', + readOnly : false, + editable : false, + value : new Date(), + format : 'Y-m-d', + anchor : '94%' + }] + }] + },{ + width :150, + layout : 'column', + items : [{ + columnWidth : .5, + layout :'form', + items : [{ + xtype : 'button', + text : '查询', + minWidth : 70, + iconCls : 'icon_search', + handler : function() { + initQueryValueAndReload(); + } + }] + },{ + columnWidth : .5, + layout :'form', + items : [{ + xtype : 'button', + text : '重置', + minWidth : 70, + iconCls : 'icon_set', + handler : function() { + $Id('code').value = ""; + } + }] + }] + }] + }); + + var viewport = new Ext.Viewport({ + layout : 'border', + items : [form,{ + region : 'center', + margins : '0 0 0 0', + layout : 'fit', + items : grid + }] + }); + +}); \ No newline at end of file Index: ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/dwr/table/ReturnMaterialRecordTableManager.java =================================================================== diff -u --- ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/dwr/table/ReturnMaterialRecordTableManager.java (revision 0) +++ ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/dwr/table/ReturnMaterialRecordTableManager.java (revision 14590) @@ -0,0 +1,114 @@ +package com.forgon.disinfectsystem.returnmaterialrecord.dwr.table; + +import java.util.List; +import java.util.Map; + +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.entity.basedatamanager.materialdefinition.MaterialDefinition; +import com.forgon.disinfectsystem.entity.returngoodsrecord.ReturnGoodsRecord; +import com.forgon.disinfectsystem.entity.returnmaterialrecord.ReturnMaterialItem; +import com.forgon.disinfectsystem.entity.returnmaterialrecord.ReturnMaterialRecord; +import com.forgon.disinfectsystem.returngoodsrecord.service.ReturnGoodsItemVO; +import com.forgon.disinfectsystem.returnmaterialrecord.service.ReturnMaterialRecordManager; +import com.forgon.tools.json.JSONUtil; + +public class ReturnMaterialRecordTableManager { + private GridManager gridManager; + private DateQueryAdapter dateQueryAdapter; + private ReturnMaterialRecordManager returnMaterialRecordManager; + + public void setGridManager(GridManager gridManager) { + this.gridManager = gridManager; + } + public void setDateQueryAdapter(DateQueryAdapter dateQueryAdapter) { + this.dateQueryAdapter = dateQueryAdapter; + } + + public void setReturnMaterialRecordManager( + ReturnMaterialRecordManager returnMaterialRecordManager) { + this.returnMaterialRecordManager = returnMaterialRecordManager; + } + public String findReturnMaterialRecordTableList( + Map> parameterMap) { + String sql = "where 1=1"; + Map sqlWhereParamMap = gridManager + .getParamFromView(parameterMap); + String keyWord = sqlWhereParamMap.get("keyWord"); + int codeIndex = keyWord.lastIndexOf("["); + String specification = ""; + if (StringUtils.isNotBlank(keyWord) && keyWord.lastIndexOf("[") != -1) { + specification = keyWord.substring(codeIndex + 1, + keyWord.length() - 1); + keyWord = keyWord.substring(0, codeIndex); + } + String startDate = sqlWhereParamMap.get("startDate"); + String endDate = sqlWhereParamMap.get("endDate"); + if (StringUtils.isNotBlank(keyWord)) { + if (StringUtils.isNotBlank(specification)) { + sql += " and po.id in (select rmi.returnMaterialRecord.id from " + + ReturnMaterialItem.class.getName() + + " rmi inner join " + MaterialDefinition.class.getSimpleName() + + " md on md.id=rmi.materialDefinitionId where md.name = '" + + keyWord + "' and dg.specification='" + specification + + "')"; + } else { + sql += " and (po.id in (select rmi.returnMaterialRecord.id from " + + ReturnMaterialItem.class.getName() + + " rmi inner join " + MaterialDefinition.class.getSimpleName() + + " md on md.id=rmi.materialDefinitionId where md.name = '" + + keyWord + + "' and (md.specification is null or md.specification = '')) or po.id in (select rmi.returnMaterialRecord.id from " + + ReturnMaterialItem.class.getName() + + " rmi inner join " + MaterialDefinition.class.getSimpleName() + + " md on md.id=rmi.materialDefinitionId where md.name = '" + + keyWord + "'))"; + } + } + + if (StringUtils.isNotBlank(startDate)) { + startDate += " 00:00:00"; + sql += " and po.returnTime >= " + + dateQueryAdapter.dateAdapter(startDate); + } + + if (StringUtils.isNotBlank(endDate)) { + endDate += " 23:59:59"; + sql += " and po.returnTime <= " + + dateQueryAdapter.dateAdapter(endDate); + } + sql += " and po.handleDepartCode = '" + AcegiHelper.getLoginUser() + .getCurrentOrgUnitCode() + "'"; + return gridManager.renderGrid(parameterMap, + ReturnMaterialRecord.class.getSimpleName(), sql, new String[] { + "returnMaterialItems" }); + } + public String getReturnMaterialRecordById(String id) { + JSONObject json = JSONUtil.buildJsonObject(false); + try{ + ReturnMaterialRecord rmr = returnMaterialRecordManager.get(id); + if(rmr != null){ + json.put("id", rmr.getId()); + json.put("operator", rmr.getOperator()); + json.put("depart", rmr.getDepart()); + json.put("returnTime", rmr.getReturnTime()); + json.put("remark", rmr.getRemark()); + json.put("returnOfPeople", rmr.getReturnOfPeople()); + json.put("departCoding", rmr.getDepartCoding()); + json.put("settlementPrice", rmr.getSettlementPrice()); + JSONUtil.addSuccess(json, true); + } + }catch(Exception e){ + e.printStackTrace(); + } + return json.toString(); + } + public List loadMaterialPriceAmountInfoCanReturned(String departCoding,String materialDefId,String sourceWareHouseId){ + return returnMaterialRecordManager.loadMaterialPriceAmountInfoCanReturned(departCoding, materialDefId,sourceWareHouseId); + } +} Index: ssts-web/src/main/webapp/homepage/menuconfigure.js =================================================================== diff -u -r14551 -r14590 --- ssts-web/src/main/webapp/homepage/menuconfigure.js (.../menuconfigure.js) (revision 14551) +++ ssts-web/src/main/webapp/homepage/menuconfigure.js (.../menuconfigure.js) (revision 14590) @@ -364,7 +364,8 @@ singleClickExpand:singleClickExpandTree, hidden:SSTS_ReturnGoodsRecord_Menu, children:[ - {hidden :SSTS_ReturnGoodsRecord_Menu,text:"退货记录信息",href:WWWROOT+'/disinfectsystem/returnGoodsRecord/returnGoodsRecordView.jsp',hrefTarget:linkTarget,leaf:true} + {hidden :SSTS_ReturnGoodsRecord_Menu,text:"退货记录信息",href:WWWROOT+'/disinfectsystem/returnGoodsRecord/returnGoodsRecordView.jsp',hrefTarget:linkTarget,leaf:true}, + {hidden :SSTS_ReturnGoodsRecord_Menu,text:"材料退货记录",href:WWWROOT+'/disinfectsystem/returnMaterialRecord/returnMaterialRecordView.jsp',hrefTarget:linkTarget,leaf:true} ] },{ text:"召回记录管理", Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/returnmaterialrecord/ReturnMaterialItem.java =================================================================== diff -u -r13527 -r14590 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/returnmaterialrecord/ReturnMaterialItem.java (.../ReturnMaterialItem.java) (revision 13527) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/returnmaterialrecord/ReturnMaterialItem.java (.../ReturnMaterialItem.java) (revision 14590) @@ -32,6 +32,8 @@ private Integer amount;//退货数量 + private Double price; //单价 + private BigDecimal settlementPrice = new BigDecimal("0.00");// 退货物品小结价格 private ReturnMaterialRecord returnMaterialRecord;//退货记录 @@ -40,12 +42,12 @@ /** - * 仓库ID + * 供应室仓库ID */ private Long warehouseId; /** - * 仓库名称 + * 供应室仓库名称 */ private String warehouseName; @@ -85,6 +87,14 @@ this.amount = amount; } + public Double getPrice() { + return price; + } + + public void setPrice(Double price) { + this.price = price; + } + @Column(scale = 2) public BigDecimal getSettlementPrice() { return settlementPrice; Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/action/MaterialDefinitionAction.java =================================================================== diff -u -r14407 -r14590 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/action/MaterialDefinitionAction.java (.../MaterialDefinitionAction.java) (revision 14407) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/action/MaterialDefinitionAction.java (.../MaterialDefinitionAction.java) (revision 14590) @@ -7,22 +7,28 @@ import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.sql.SQLException; +import java.util.ArrayList; 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 javax.servlet.http.HttpSession; + import net.sf.json.JSONArray; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; import net.sf.json.processors.DefaultValueProcessor; import net.sf.json.util.CycleDetectionStrategy; + +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.forgon.directory.acegi.tools.AcegiHelper; import com.forgon.directory.model.OrgUnit; import com.forgon.disinfectsystem.basedatamanager.goodsstock.service.GoodsStockManager; @@ -609,31 +615,47 @@ public String getMaterialDefinitionDataForMaterial() { if (spell == null) { spell = ""; - } - String jsonStr = ""; + } try { spell = java.net.URLDecoder.decode(spell, "UTF-8"); Long warehouseId = StrutsParamUtils.getPraramLongValue("wareHouseId", null); - jsonStr = materialDefinitionManager - .searchMaterialDefinitionAndStockByWarehouseId((spell), true , warehouseId) - .toString(); - HttpServletResponse response = StrutsParamUtils.getResponse(); - response.setCharacterEncoding("UTF-8"); - PrintWriter out; - try { - out = response.getWriter(); - out.print(jsonStr); - out.close(); - } catch (IOException e) { - e.printStackTrace(); - } - + JSONObject json = materialDefinitionManager + .searchMaterialDefinitionAndStockByWarehouseId((spell), true , warehouseId); + StrutsResponseUtils.output(json); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } + + public void getMaterialDataForReturnMaterial(){ + if (spell == null) { + spell = ""; + } + try { + spell = java.net.URLDecoder.decode(spell, "UTF-8"); + String departCoding = StrutsParamUtils.getPraramValue("departCoding", + null); + List wareHouses = wareHouseManager.getWareHouseListByUnitCode(departCoding); + List wareHouseIds = new ArrayList(); + if(CollectionUtils.isNotEmpty(wareHouses)){ + for(WareHouse wh : wareHouses){ + wareHouseIds.add(wh.getId()); + } + } + + List> mapList = materialDefinitionManager + .searchMaterialDefinitionOrDiposableGoodsBySpell((spell), true , wareHouseIds); + + Map map = new HashMap(); + map.put("totalCount", mapList.size()); + map.put("data", mapList); + StrutsResponseUtils.output(JSONObject.fromObject(map)); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } /** * 获取材料类型的树 Index: ssts-web/src/main/webapp/disinfectsystem/returnMaterialRecord/returnMaterialRecordView.jsp =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/returnMaterialRecord/returnMaterialRecordView.jsp (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/returnMaterialRecord/returnMaterialRecordView.jsp (revision 14590) @@ -0,0 +1,101 @@ +<%@ page contentType="text/html; charset=UTF-8"%> +<%@ include file="/common/taglibs.jsp"%> +<%@ page import="com.forgon.directory.vo.LoginUserData,com.forgon.tools.SpringBeanManger,com.forgon.disinfectsystem.entity.returngoodsrecord.ReturnGoodsRecord,java.util.Date,com.forgon.disinfectsystem.basedatamanager.supplyroomconfig.service.SupplyRoomConfigManager" %> +<% + LoginUserData userData = AcegiHelper.getLoginUser(); + String userName = userData.getUserFullName(); + request.setAttribute("userName",userName); + + Integer fontSize = userData.getFontSize(); + if (fontSize == null){ + fontSize = 12; + } + request.setAttribute("fontSize", fontSize); + + String currentOrgUnitName = userData.getCurrentOrgUnitName(); + String currentOrgUnitCode = userData.getCurrentOrgUnitCode(); + + if(currentOrgUnitName!=null && currentOrgUnitCode!=null){ + request.setAttribute("depart",currentOrgUnitName); + request.setAttribute("departCoding",currentOrgUnitCode); + } + + SupplyRoomConfigManager supplyRoomConfigManager = (SupplyRoomConfigManager)SpringBeanManger.getBean("supplyRoomConfigManager"); + String orgUnitCoding = userData.getOrgUnitCodingFromSupplyRoomConfig(); + int supplyRoomType = supplyRoomConfigManager.getSupplyRoomTypeByOrgUnitCoding(orgUnitCoding); + request.setAttribute("supplyRoomType", supplyRoomType); +%> + + + +<%@ include file="/common/includeExtJsAndCss.jsp"%> + + + + + + + + + + + + + + + + + + + + + + + +退货记录 + + + + + + + + +
+ + + + +
+ + + + + +
+
+
+ + \ No newline at end of file Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java =================================================================== diff -u -r14493 -r14590 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java (.../GoodsStockManagerImpl.java) (revision 14493) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManagerImpl.java (.../GoodsStockManagerImpl.java) (revision 14590) @@ -86,16 +86,8 @@ List list = objectDao.getBySql_ForUpdate2(GoodsStock.class.getSimpleName(), sql); return list; } - /** - * 根据仓库下的包定义的id或者是材料定义的id获取库存信息。此方法可能会多返回一些记录,但这是些记录并不是你想要的。 - *

如要获取仓库1下的张三和仓库2下的李四,应该只会有两条记录返回。但是此方法的实现,可能还会返回仓库1下的李四和仓库2下的张三 - * @param wareHouseIds - * @param goodsDefId 器械包定义或者是材料定义的id - * @param toussedefIdOrMaterialDefId true为包定义id,false为材料定义id - * @return - */ @SuppressWarnings("unchecked") - private List getGoodsStock(Collection wareHouseIds,Collection goodsDefId,boolean toussedefIdOrMaterialDefId){ + public List getGoodsStock(Collection wareHouseIds,Collection goodsDefId,boolean toussedefIdOrMaterialDefId){ String wareHouseIdPredicate = SqlUtils.getNonStringFieldInCollectionsPredicate("wareHouseId", wareHouseIds); String goodsDefIdPredicate = ""; String amountPredicate = " 1=1 "; Index: ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/service/ReturnMaterialItemManagerImpl.java =================================================================== diff -u --- ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/service/ReturnMaterialItemManagerImpl.java (revision 0) +++ ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/service/ReturnMaterialItemManagerImpl.java (revision 14590) @@ -0,0 +1,27 @@ +package com.forgon.disinfectsystem.returnmaterialrecord.service; + +import net.sf.json.JSONObject; + +import com.forgon.disinfectsystem.entity.returnmaterialrecord.ReturnMaterialItem; + +public class ReturnMaterialItemManagerImpl implements ReturnMaterialItemManager { + + @Override + public ReturnMaterialItem fromJson(JSONObject json) { + if(json == null){ + return null; + } + ReturnMaterialItem item = new ReturnMaterialItem(); + String tousseName = json.optString("materialName"); + Long materialDefinitionId = json.optLong("materialDefinitionId"); + Long amount = json.optLong("amount"); + Double price = json.optDouble("price"); + + item.setMaterialDefinitionId(materialDefinitionId); + item.setMaterialName(tousseName); + item.setAmount(amount.intValue()); + item.setPrice(price); + return item; + } + +} Index: ssts-web/src/main/webapp/disinfectsystem/stocktakerecordmanager/inventoryrecordView.js =================================================================== diff -u -r13953 -r14590 --- ssts-web/src/main/webapp/disinfectsystem/stocktakerecordmanager/inventoryrecordView.js (.../inventoryrecordView.js) (revision 13953) +++ ssts-web/src/main/webapp/disinfectsystem/stocktakerecordmanager/inventoryrecordView.js (.../inventoryrecordView.js) (revision 14590) @@ -25,12 +25,13 @@ }; InventoryRecordTableManager.addInventoryRecord(JSON.stringify(params),function(result){ + var json = top.Ext.decode(result); hideMessageBox(true); grid.dwrReload(); - if(result){ + if(json.success){ showResult("保存成功"); }else{ - showResult("保存失败!"); + showResult(json.message); } }); } Index: ssts-web/src/main/webapp/WEB-INF/dwr.xml =================================================================== diff -u -r14297 -r14590 --- ssts-web/src/main/webapp/WEB-INF/dwr.xml (.../dwr.xml) (revision 14297) +++ ssts-web/src/main/webapp/WEB-INF/dwr.xml (.../dwr.xml) (revision 14590) @@ -283,6 +283,12 @@ + + + + + + Index: ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/model/MaterialItemData.java =================================================================== diff -u --- ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/model/MaterialItemData.java (revision 0) +++ ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/model/MaterialItemData.java (revision 14590) @@ -0,0 +1,75 @@ +package com.forgon.disinfectsystem.returnmaterialrecord.model; + +import com.forgon.tools.MathTools; + +/** + * 从数据库中查找MaterialItem返回的数据记录 + * @author kzh + * + */ +public class MaterialItemData { + private String name; + private Integer amount; + private Long materialDefinitionId; + private Double price; + private Long materialItemId; + private Integer returnedAmount; //materialItem的退货数量 + private Integer newReturnedAmount; //materialItem新的退货数量,用于处理数据后更新数据库 + private Long materialInvoiceItemId; //材料发货明细的id MaterialInvoiceItem的id + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public Integer getAmount() { + return amount; + } + public void setAmount(Integer amount) { + this.amount = amount; + } + public Long getMaterialDefinitionId() { + return materialDefinitionId; + } + public void setMaterialDefinitionId(Long materialDefinitionId) { + this.materialDefinitionId = materialDefinitionId; + } + public Double getPrice() { + return price; + } + public void setPrice(Double price) { + this.price = price; + } + + public Long getMaterialItemId() { + return materialItemId; + } + public void setMaterialItemId(Long materialItemId) { + this.materialItemId = materialItemId; + } + public Integer getReturnedAmount() { + return returnedAmount; + } + public void setReturnedAmount(Integer returnedAmount) { + this.returnedAmount = returnedAmount; + } + public Integer getNewReturnedAmount() { + return newReturnedAmount; + } + public void setNewReturnedAmount(Integer newReturnedAmount) { + this.newReturnedAmount = newReturnedAmount; + } + public Long getMaterialInvoiceItemId() { + return materialInvoiceItemId; + } + public void setMaterialInvoiceItemId(Long materialInvoiceItemId) { + this.materialInvoiceItemId = materialInvoiceItemId; + } + /** + * 获取可以退货的数量 + * @return + */ + public int canReturnNum(){ + return MathTools.sub(amount, newReturnedAmount).intValue(); + } +} Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManager.java =================================================================== diff -u -r13395 -r14590 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManager.java (.../GoodsStockManager.java) (revision 13395) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/basedatamanager/goodsstock/service/GoodsStockManager.java (.../GoodsStockManager.java) (revision 14590) @@ -1,5 +1,6 @@ package com.forgon.disinfectsystem.basedatamanager.goodsstock.service; +import java.util.Collection; import java.util.List; import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; @@ -34,5 +35,15 @@ * @return */ public List getGoodsStockList(GoodsStock goodsStock); + /** + * 根据仓库下的包定义的id或者是材料定义的id获取库存信息。此方法可能会多返回一些记录,但这是些记录并不是你想要的。 + *

如要获取仓库1下的张三和仓库2下的李四,应该只会有两条记录返回。但是此方法的实现,可能还会返回仓库1下的李四和仓库2下的张三 + * @param wareHouseIds + * @param goodsDefId 器械包定义或者是材料定义的id + * @param toussedefIdOrMaterialDefId true为包定义id,false为材料定义id + * @return + */ + public List getGoodsStock(Collection wareHouseIds, + Collection goodsDefId,boolean toussedefIdOrMaterialDefId); } Index: ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/action/ReturnMaterialRecordAction.java =================================================================== diff -u --- ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/action/ReturnMaterialRecordAction.java (revision 0) +++ ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/action/ReturnMaterialRecordAction.java (revision 14590) @@ -0,0 +1,140 @@ +package com.forgon.disinfectsystem.returnmaterialrecord.action; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +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.directory.acegi.tools.AcegiHelper; +import com.forgon.disinfectsystem.entity.returngoodsrecord.ReturnGoodsItem; +import com.forgon.disinfectsystem.entity.returnmaterialrecord.ReturnMaterialItem; +import com.forgon.disinfectsystem.entity.returnmaterialrecord.ReturnMaterialRecord; +import com.forgon.disinfectsystem.returnmaterialrecord.service.ReturnMaterialItemManager; +import com.forgon.disinfectsystem.returnmaterialrecord.service.ReturnMaterialRecordManager; +import com.forgon.tools.StrutsParamUtils; +import com.forgon.tools.StrutsResponseUtils; +import com.forgon.tools.json.JSONUtil; +import com.opensymphony.xwork2.ModelDriven; +import com.opensymphony.xwork2.Preparable; + +/** + * 材料退货 + * @author kzh + * + */ +@ParentPackage(value = "default") +@Namespace(value = "/disinfectSystem") +@Action(value = "returnMaterialRecordAction") +public class ReturnMaterialRecordAction implements ModelDriven,Preparable{ + private ReturnMaterialRecord returnMaterialRecord; + private ReturnMaterialRecordManager returnMaterialRecordManager; + private ReturnMaterialItemManager returnMaterialItemManager; + + public void setReturnMaterialRecordManager( + ReturnMaterialRecordManager returnMaterialRecordManager) { + this.returnMaterialRecordManager = returnMaterialRecordManager; + } + + public void setReturnMaterialItemManager( + ReturnMaterialItemManager returnMaterialItemManager) { + this.returnMaterialItemManager = returnMaterialItemManager; + } + + /** + * 保存材料退货记录 + */ + public void save(){ + JSONObject json = JSONUtil.buildJsonObject(false, "保存失败"); + try { + // 设置退货时间 + Date returnTime = null; + try { + SimpleDateFormat dateFormat = new SimpleDateFormat( + "yyyy-MM-dd HH:mm"); + String returnTimeStr = StrutsParamUtils.getPraramValue( + "returnTime", null); + returnTime = dateFormat.parse(returnTimeStr); + } catch (ParseException e1) { + } + if (returnTime == null) + returnTime = new Date(); + returnMaterialRecord.setReturnTime(returnTime); + String handleDepartCode = AcegiHelper.getLoginUser().getOrgUnitCodingFromSupplyRoomConfig(); + returnMaterialRecord.setHandleDepartCode(handleDepartCode); + + List returnGoodsItems = new ArrayList(); + returnMaterialRecord.setReturnMaterialItems(returnGoodsItems); + + // 拿到页面的退货明细 + String returnGoodsDetails = StrutsParamUtils.getRequest().getParameter("returnMaterialItems"); + + if (StringUtils.isBlank(returnGoodsDetails)) { + throw new RuntimeException("退货明细不能为空!"); + } + // + JSONArray itemsArray = JSONArray.fromObject(returnGoodsDetails); + int size = itemsArray.size(); + for (int i = 0; i < size; ++i) { + JSONObject obj = itemsArray.getJSONObject(i); + if(obj == null){ + throw new RuntimeException("退货明细参数错误!"); + } + ReturnMaterialItem item = returnMaterialItemManager.fromJson(obj); + item.setReturnMaterialRecord(returnMaterialRecord); + + returnGoodsItems.add(item); + + } + returnMaterialRecordManager + .save_TRANS_REQUIRED(returnMaterialRecord); + JSONUtil.addSuccess(json, true); + JSONUtil.addMessage(json, "保存成功"); + } catch (Exception ex) { + ex.printStackTrace(); + JSONUtil.addMessage(json, ex.getMessage()); + } + StrutsResponseUtils.output(json); + } + + public void loadReturnMaterialItem(){ + String id = StrutsParamUtils.getPraramValue("id", ""); + JSONArray array = new JSONArray(); + if (StringUtils.isNotBlank(id)) {// 初始化加载的数据 + returnMaterialRecord = returnMaterialRecordManager.get(id); + List returnGoodsItems = returnMaterialRecord.getReturnMaterialItems(); + for (ReturnMaterialItem returnGoodsItem : returnGoodsItems) { + try { + JSONObject json = new JSONObject(); + json.put("id", returnGoodsItem.getId()); + json.put("materialName", returnGoodsItem.getMaterialName()); + json.put("amount", returnGoodsItem.getAmount()); + json.put("price", returnGoodsItem.getPrice()); + json.put("materialDefinitionId", returnGoodsItem.getMaterialDefinitionId()); + json.put("settlementPrice", returnGoodsItem.getSettlementPrice()); + array.add(json); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + StrutsResponseUtils.output(array); + } + @Override + public ReturnMaterialRecord getModel() { + return returnMaterialRecord; + } + + @Override + public void prepare() throws Exception { + returnMaterialRecord = new ReturnMaterialRecord(); + } +} Index: ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/service/ReturnMaterialItemManager.java =================================================================== diff -u --- ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/service/ReturnMaterialItemManager.java (revision 0) +++ ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/service/ReturnMaterialItemManager.java (revision 14590) @@ -0,0 +1,9 @@ +package com.forgon.disinfectsystem.returnmaterialrecord.service; + +import com.forgon.disinfectsystem.entity.returnmaterialrecord.ReturnMaterialItem; + +import net.sf.json.JSONObject; + +public interface ReturnMaterialItemManager { + public ReturnMaterialItem fromJson(JSONObject json); +} Index: ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/dwr/table/InventoryRecordTableManager.java =================================================================== diff -u -r13387 -r14590 --- ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/dwr/table/InventoryRecordTableManager.java (.../InventoryRecordTableManager.java) (revision 13387) +++ ssts-web/src/main/java/com/forgon/disinfectsystem/inventoryrecord/dwr/table/InventoryRecordTableManager.java (.../InventoryRecordTableManager.java) (revision 14590) @@ -13,6 +13,7 @@ import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; import com.forgon.disinfectsystem.entity.stocktakemanager.InventoryRecord; import com.forgon.disinfectsystem.inventoryrecord.service.InventoryRecordManager; +import com.forgon.tools.json.JSONUtil; import com.forgon.tools.util.SqlUtils; /** @@ -71,12 +72,15 @@ } // 创建盘点记录 - public boolean addInventoryRecord(String params) { + public String addInventoryRecord(String params) { + boolean success = false; + String message = null; try { inventoryRecordManager.addInventoryRecord(params); + success = true; } catch (Exception e) { - return false; + message = e.getMessage(); } - return true; + return JSONUtil.buildJsonObject(success, message).toString(); } } Index: ssts-web/src/main/webapp/disinfectsystem/returnMaterialRecord/returnMaterialRecordForm.js =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/returnMaterialRecord/returnMaterialRecordForm.js (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/returnMaterialRecord/returnMaterialRecordForm.js (revision 14590) @@ -0,0 +1,776 @@ + +function setReturnMaterialRecordForm(result){ + var returnGoodsRecord = top.Ext.decode(result); + if(returnGoodsRecord.success){ + top.Ext.getCmp("id").setValue(returnGoodsRecord.id); + top.Ext.getCmp("operator").setValue(returnGoodsRecord.operator); + top.Ext.getCmp("depart").setValue(returnGoodsRecord.depart); + top.Ext.getCmp("returnTime").setValue(returnGoodsRecord.returnTime); +// Ext.getCmp("signStatus").setValue(returnGoodsRecord.signStatus); + top.Ext.getCmp("remark").setValue(returnGoodsRecord.remark); + top.Ext.getCmp("returnOfPeople").setValue(returnGoodsRecord.returnOfPeople); + top.Ext.getCmp("departCoding").setValue(returnGoodsRecord.departCoding); +// top.Ext.getCmp("totalMoney").setValue(returnGoodsRecord.settlementPrice); +// var warehouse = top.Ext.getCmp("warehouse"); +// if(warehouse != null){ +// warehouse.setValue(returnGoodsRecord.warehouseName); +// } + } +} + +function removeGridItem(){ + var totalMoney = 0.0; + var rows = top.Ext.getCmp('returnGoodsItemGrid').getSelectionModel().getSelections();// 返回值为 + if (rows) { + for ( var i = 0; i < rows.length; i++) { + returnGoodsItemStore.remove(rows[i]); + } + } + setTotalMoney(); +} + +function addAndEditReturnMaterialRecord(id, enableBtn){ + function setTotalMoney() { + var totalMoney = 0.0; + returnGoodsItemStore.each(function(record){ + totalMoney = accAdd(totalMoney,accMul(record.data.price,record.data.amount)); + totalMoney = (totalMoney).toFixed(2); + top.Ext.getCmp("totalMoney").setValue(totalMoney); + }); + } + + function checkAmount(amount,canReturnAmout){ + if(parseInt(amount) > parseInt(canReturnAmout)){ + showResult('退货数量不能大于可退货数量'); + return false; + } + return true; + } + // 添加材料 + function onAddMaterialClick(){ + var count = top.Ext.getCmp("count1").getValue(); + var materialDefId = top.Ext.getCmp('selectedMaterialDefId').getValue(); + var index = materialStore.find("id",materialDefId); + if(index == -1){ + showResult('请选择材料'); + return; + } + var price = top.Ext.getCmp("combo_price").getValue(); + if(price+'' == ''){ + showResult('请选择价格!'); + return; + } + var priceAmount = null; + var index = priceStore.find('price', price); + if(index == -1){ + showResult('请选择价格!'); + return; + } + priceAmount = priceStore.getAt(index).data; + + var amountCanReturn = priceAmount.sentAmount - priceAmount.returnedAmount; + var material = materialStore.getAt(index); + if(!checkAmount(count,amountCanReturn)){ + return; + } + var materialItem = new addReturnMaterialItem({ + id:0, + materialName:material.data.name, + amount:count, + price:price, + amountCanReturn:amountCanReturn, + materialDefinitionId:materialDefId + }); + + returnGoodsItemStore.add(materialItem); + setTotalMoney(); + } + + var editableConfig = {editable:false}; + editableConfig.editable = enableBtn; + //材料store + var materialStore = new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/baseData/materialDefinitionAction!getMaterialDataForReturnMaterial.do', + method : 'POST' + }), + reader : new Ext.data.JsonReader({ + totalProperty : 'totalCount', + root : 'data' + }, [ + {name : 'id',mapping : 'id'}, + {name : 'name',mapping : 'name'}, + {name : 'displayName',mapping : 'displayName'}, + {name : 'spelling',mapping : 'spelling'}, + {name : 'storage',mapping : 'storage'} + ]), + listeners : { + beforeload : function(store,option) { + store.baseParams['departCoding'] = getCurrentDepartCoding(); + } + } + }); + + var departJsonStore = new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/baseData/supplyRoomConfigAction!getAllOrgUnitName.do', + method : 'POST' + }), + reader : new Ext.data.JsonReader({ + root : 'data' + },[ + {name : 'id',mapping : 'id'}, + {name : 'name',mapping : 'name'} + ] + ) + }); + + var addReturnMaterialItem = Ext.data.Record.create([{name : 'id'}, + {name : 'materialName'}, + {name : 'amount'}, + {name : 'price'}, + {name : 'amountCanReturn'}, + {name : 'materialDefinitionId'}, + {name : 'settlementPrice'}]); + + //该退货记录已经录入的退货详细信息 + var dataReader = new Ext.data.JsonReader({ + fields : [ + {name : 'id'}, + {name : 'materialName'}, + {name : 'price'}, + {name : 'amount'}, + {name : 'materialDefinitionId'}, + {name : 'settlementPrice'} + ] + }); + + //初始化加载器械包 + returnGoodsItemStore = new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/returnMaterialRecordAction!loadReturnMaterialItem.do', + method : 'POST' + }), + reader : dataReader, + listeners : { + load : function() { + setTotalMoney(); + } + } + }); + + var wareHouseStore = new Ext.data.Store({ + proxy : new Ext.data.HttpProxy({ + url : WWWROOT + '/disinfectSystem/baseData/wareHouseAction!getCSSDWareHouseData.do', + method : 'POST' + }), + reader : new Ext.data.JsonReader({ + totalProperty : 'totalCount', + root : 'data' + }, [ + {name : 'id',mapping : 'id'}, + {name : 'name',mapping : 'name'}, + {name : 'orgUnitCode',mapping : 'orgUnitCode'}, + ]), + listeners : { + load : function(store,records) { + var id = top.Ext.getCmp('warehouseId').getValue(); + var name = top.Ext.getCmp('warehouseName').getValue(); + if(records.length > 0 && (id == null || id == '')){ + id=records[0].data.id; + name = records[0].data.name; + } + top.Ext.getCmp('warehouse').setValue(id); + top.Ext.getCmp('warehouseId').setValue(id); + top.Ext.getCmp('warehouseName').setValue(name); + } + } + }); + + var priceStore = new Ext.data.Store({ + reader : new Ext.data.JsonReader({ + fields : [ + {name : 'price'}, + {name : 'sentAmount'}, + {name : 'returnedAmount'} + ] + }) + }); + var PriceRecord = Ext.data.Record.create([ + {name : 'price'}, + {name : 'sentAmount'}, + {name : 'returnedAmount'} + ]); + + //清空价格 + function clearPrice() { + priceStore.removeAll(); + top.Ext.getCmp("combo_price").setValue(''); + } + + // 设置价格 + function setPrices(prices) { + priceStore.removeAll(); + top.Ext.getCmp("combo_price").setValue(''); + if(typeof(prices) == 'undefined' || prices == null){ + return; + } + for(var i = 0;i 0){ + top.Ext.getCmp("combo_price").setValue(prices[0].price); + } + } + + // 获取当前部门编码 + function getCurrentDepartCoding(){ + return top.Ext.getCmp('departCoding').getValue(); + } + //获取当前部门 + function getCurrentDepart(){ + return top.Ext.getCmp('depart').getValue(); + } + // 器械包,科室退货人为空时才能更改退货人科室 + function loadPeopleByStaffNum(staffNumField){ + var staffNum = staffNumField.getValue(); + if(staffNum){ + UserTableManager.getUserObjByName(staffNum,function(user){ + if(user){ + var fullName = user.split(",")[0]; + var orgUnitNames = user.split(",")[1]; + var orgUnitCodes = user.split(",")[2]; + top.Ext.getCmp('returnOfPeople').setValue(fullName);//设置退货人 + var currentDepart = getCurrentDepart(); + var currentDepartCoding = getCurrentDepartCoding(); + var resetDepart = true; + if(currentDepart != '' || currentDepartCoding != ''){ + resetDepart = false; + } + if(resetDepart){ + if(orgUnitNames){ + var orgUnitName = orgUnitNames.split(';')[0];//如果有多个,默认拿第一个,当前系统只有一个; + top.Ext.getCmp('depart').setValue(orgUnitName.substring(orgUnitName.lastIndexOf("-")+1));//设置科室 + } + if(orgUnitCodes){ + var orgUnitCode = orgUnitCodes.split(';')[0]; + top.Ext.getCmp('departCoding').setValue(orgUnitCode);//科室代码 + } + } + + }else{ + showResult('找不到该员工号所对应的人员信息'); + top.Ext.getCmp('returnOfPeople').setValue(); + top.Ext.getCmp('depart').setValue(); + top.Ext.getCmp('departCoding').setValue(); + } + updateGoodsComboStatus(); + }); + } + staffNumField.setValue(); + } + + function updateGoodsComboStatus(){ + var departcoding = getCurrentDepartCoding(); + var disable = false; + if(isUndefinedOrNullOrEmpty(departcoding)){ + disable = true; + } + top.Ext.getCmp('package1').setDisabled(disable); + } + + //获取grid的数据 + function getReturnGoodsDetailGridData() { + var returnGoodsDetails = buildJSONStringFromStore(returnGoodsItemStore); + //alert(returnGoodsDetails); + top.Ext.getCmp('returnMaterialItems').setValue(returnGoodsDetails); + } + /** + * 精确计算arg1和arg2的和 + * @param arg1 + * @param arg2 + * @return + */ + function accAdd(arg1,arg2){ + var r1,r2,m; + try{r1=arg1.toString().split(".")[1].length;}catch(e){r1=0;} + try{r2=arg2.toString().split(".")[1].length;}catch(e){r2=0;} + m=Math.pow(10,Math.max(r1,r2)); + return (arg1*m+arg2*m)/m; + } + /** + * 精确计算arg1和arg2的乘积 + * @param arg1 + * @param arg2 + * @return + */ + function accMul(arg1,arg2) { + arg1 = arg1+''; + arg2 = arg2+''; +// alert('arg1='+arg1+',arg2='+arg2) + var m=0,s1=arg1.toString(),s2=arg2.toString(); + try{m+=s1.split(".")[1].length;}catch(e){} + try{m+=s2.split(".")[1].length;}catch(e){} + return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m); + } + //计算行总价 + function rowTotalRender(value, cellmeta, record, rowIndex, columnIndex, store) { + return accMul(record.data.price,record.data.amount); + } + var cmArr = new Array(new Ext.grid.RowNumberer(), + {id : 'autoWidth',header : "物品",dataIndex : 'materialName',width : 180,menuDisabled:true}, + {header : "数量",width : 50,dataIndex : 'amount',menuDisabled:true, + editor : new top.Ext.form.NumberField({ + allowBlank : false, + disabled:!enableBtn, + allowNegative : false, + style : 'text-align: left', + allowDecimals : false + }) + }, + {header : "可退货数量",width : 120,dataIndex : 'amountCanReturn',menuDisabled:true}, + {header : "单价",width : 120,dataIndex : 'price',menuDisabled:true}, + {header : "金额",width : 60,dataIndex : 'rowTotal',renderer:rowTotalRender,menuDisabled:true}, + {header : '删除',dataIndex:'button',width:60,menuDisabled:true, + renderer: function(v,p,record){ + var str = ''; + if(editableConfig.editable){ + str = ""; + } + + return str; + } + }); + + var cm = new top.Ext.grid.ColumnModel(cmArr); + + if(id == 0){//添加 + returnGoodsItemStore.removeAll(); + }else{//修改 + returnGoodsItemStore.on("beforeload", function(thiz, options) { + thiz.baseParams["id"] = id; + }); + returnGoodsItemStore.load(); + } + + /*var deptStore = new Ext.data.SimpleStore({ + fields : [ 'departName','departCoding' ], + url : WWWROOT + '/disinfectSystem/baseData/supplyRoomConfigAction!getAllOrgUnitName.do' + });*/ + + form = new top.Ext.FormPanel({ + id : 'returnGoodsRecordForm', + frame : true, + border : 0, + labelSeparator : ':', + bodyStyle : 'padding:5px 5px 0px 5px', + width : 600, + labelAlign:'right', + autoHeight : true, + autoScroll : true, + items : [{ + xtype:"fieldset", + layout:'column', + title :'退货记录信息', + autoHeight:true, + items:[{ + layout : 'column', + items : [{ + xtype : 'hidden', + name : 'id', + id : 'id' + },{ + xtype : 'hidden', + name : 'returnMaterialItems', + id : 'returnMaterialItems' + },{ + xtype : 'hidden', + name : 'departCoding', + id : 'departCoding' + },{ + xtype : 'hidden', + name : 'warehouseId', + id : 'warehouseId' + },{ + xtype : 'hidden', + name : 'warehouseName', + id : 'warehouseName' + },{ + xtype:'hidden', + name:'selectedMaterialDefId', + id:'selectedMaterialDefId' + },{ + columnWidth : .5, + layout : 'form', + labelWidth : 80, + items : [{ + xtype : 'textfield', + fieldLabel : '操作人', + maxLength : '16', + id : 'operator', + name : 'operator', + allowBlank : false, + value : $Id('userName').value, + anchor : '80%', + readOnly : true, + cls:'fieldReadOnlyNoRemove' + }] + }, { + columnWidth : .5, + layout : 'form', + labelWidth : 70, + items : [{ + xtype : 'datefieldWithMin', + fieldLabel : '时间', + id : 'returnTime', + name : 'returnTime', + editable:false, + disabled:!editableConfig.editable, + allowBlank: false, + format:'Y-m-d H:i', + value: new Date(), + anchor : '80%' + }] + }, { + columnWidth : .5, + layout : 'form', + labelWidth : 80, + items : [{ + xtype : 'textfield', + fieldLabel : '退货人员工号', + id : 'returnOfPeopleBarcode', + name : 'returnOfPeopleBarcode', + disabled:!editableConfig.editable, + allowBlank : true, + listeners : { + specialkey : function(field,e){ + if(e.getKey() == 13){ + loadPeopleByStaffNum(field); + } + } + }, + anchor : '80%' + }] + } ,{ + columnWidth : .5, + layout : 'form', + labelWidth : 70, + items : [{ + xtype : 'textfield', + fieldLabel : '退货人', + id : 'returnOfPeople', + name : 'returnOfPeople', + allowBlank : true, + anchor : '80%', + readOnly : true, + cls:'x-item-disabled' + }] + } , { + columnWidth : .5, + layout : 'form', + labelWidth : 80, + items : [{ + xtype : 'combo', + id : 'depart', + name : 'depart', + disabled:!editableConfig.editable, + queryParam : 'spell', + fieldLabel : '退货人科室', + queryParam : 'spell', + minChars : 0, + valueField : 'name', + displayField : 'name', + anchor : '80%', + store : departJsonStore, + forceSelection : true, + lazyInit : true, + triggerAction : 'all', + hideTrigger : true, + typeAhead : false, + allowBlank : false, + listeners :{ + select:function(combo, record, index ){ + var tem = record.data.id; + top.Ext.getCmp('departCoding').setValue(tem); + updateGoodsComboStatus(); + } + } + }] + } ,{ + columnWidth : .5, + layout : 'form', + labelWidth : 70, + items:[{ + xtype : 'combo', + fieldLabel : '退货仓库', + id : 'warehouse', + name : 'warehouse', + minChars : 0, + valueField : 'id', + displayField : 'name', + store : wareHouseStore, + forceSelection : true, + lazyInit : false, + triggerAction : 'all', + hideTrigger : true, + typeAhead : false, + allowBlank : false, + width : 100, + listeners : { + select : function(combo, record, index) { + top.Ext.getCmp('warehouse').setValue(record.data.name); + top.Ext.getCmp('warehouseId').setValue(record.data.id); + top.Ext.getCmp('warehouseName').setValue(record.data.name); + top.Ext.getCmp('remark').focus(); + }, + specialkey : function(field, ee) { + if (ee.getKey() == Ext.EventObject.ENTER) { + top.Ext.getCmp('remark').focus(); + } + } + } + }] + },{ + columnWidth : .5, + layout : 'form', + labelWidth : 80, + items : [{ + xtype : 'textfield', + fieldLabel : '总金额', + maxLength : '16', + id : 'totalMoney', + name : 'totalMoney', + anchor : '80%', + readOnly : true, + cls:'x-item-disabled' + }] + },{ + columnWidth : 1, + layout : 'form', + labelWidth : 80, + items : [{ + xtype : 'textarea', + height : 45, + fieldLabel : '备注', + id : 'remark', + name : 'remark', + disabled:!editableConfig.editable, + allowBlank : true, + anchor : '90%' + }] + }] + }] + },{ + xtype:"fieldset", + layout:'column', + title :'退货记录明细', + autoHeight:true, + items:[{ + layout : 'form', + columnWidth : 1, + items :[new top.Ext.grid.EditorGridPanel({ + id : 'returnGoodsItemGrid', + store : returnGoodsItemStore, + bodyStyle : 'border:1px solid #afd7af', + cm : cm, + width :720, + height : 270, + autoExpandColumn : 'autoWidth', + border : true, + frame : false, + viewConfig: { + forceFit:true + }, + clicksToEdit : 1,// 设置点击几次才可编辑 + selModel : new top.Ext.grid.RowSelectionModel({ + singleSelect : false + }), + tbar : new top.Ext.Panel({ + border: false, + items:[{ + xtype: 'toolbar', + items: [{ + text : '物品名称 :' + },{ + disabled:!enableBtn, + xtype : 'combo', + id : 'package1', + name : 'package1', + queryParam : 'spell', + minChars : 0, + valueField : 'id', + displayField : 'displayName', + width : 200, + store : materialStore, + forceSelection : true, + lazyInit : true, + triggerAction : 'all', + hideTrigger : true, + emptyText : '材料的拼音码、五笔码或者名称', + typeAhead : false, + allowBlank : true, + disabled:true, + anchor : '97%', + listeners : { + select : function(combo, record, index) { + top.Ext.getCmp('package1').setValue(); + var depart = getCurrentDepart(); + if(depart == ''){ + showResult("必须先填写部门!"); + return ; + } + var warehouseId = top.Ext.getCmp("warehouseId").getValue(); + if(isUndefinedOrNullOrEmpty(warehouseId)){ + showResult('请先选择仓库!'); + return ; + } + ReturnMaterialRecordTableManager.loadMaterialPriceAmountInfoCanReturned( + getCurrentDepartCoding(),record.data.id,warehouseId,function(priceAmountList){ + if(priceAmountList != null){ + setPrices(priceAmountList); + } + }); + top.Ext.getCmp('package1').setValue(record.data.name); + top.Ext.getCmp('selectedMaterialDefId').setValue(record.data.id); + }, + specialkey : function(field, ee) { + if (ee.getKey() == Ext.EventObject.ENTER) { + top.Ext.getCmp('count1').focus(); + } + } + } + },{ + text : '单价 :' + },{ + xtype : 'combo', + id : 'combo_price', + name : 'combo_price', + valueField : 'price', + displayField : 'price', + store : priceStore, + editable : false, + forceSelection : true, + mode : 'local', + triggerAction : 'all', + typeAhead : false, + allowBlank : false, + width : 150, + anchor : '95%', + disabled:!enableBtn + },{ + text : '数量 :' + },{ + xtype : 'numberfield', + id : 'count1', + name : 'count1', + style : 'text-align: left', + anchor : '95%', + width : 50, + disabled:!enableBtn, + allowNegative : false, + allowDecimals : false, + listeners : { + specialkey : function(field, ee) { + if (ee.getKey() == Ext.EventObject.ENTER) { + onAddMaterialClick(); + } + } + } + }, + { + text : '添加', + iconCls : 'btn_ext_add', + disabled:!enableBtn, + handler : function() { + onAddMaterialClick(); + } + }] + }] + }), + listeners:{ + afteredit : function(e) { + if(!checkAmount(e.value,e.record.data.amountCanReturn)){ + var col = e.field;//获取被修改的列 + var originalValue = e.originalValue;//获取原始值 + e.record.set(col,originalValue); //将单元格数据返回以前值,record为当前行数据集 + }else{ + setTotalMoney(); + } + } + } + })] + }] + }], + buttonAlign :'center', + buttons : [{ + text : '保存', + id : 'saveBtn', + hidden:SSTS_ReturnGoodsRecord_Create && SSTS_ReturnGoodsRecord_Update, + disabled:!enableBtn, + handler : function(){ + top.Ext.MessageBox.confirm("请确认","是否保存"+ entityName + "信息?",function(btn) { + if(btn=='yes') { + if(!form.getForm().isValid()){ + showResult('请正确填写表单各值'); + return false; + } +// if(top.Ext.getCmp('returnOfPeople').getValue().length<1){ +// showResult('退货人信息不能为空'); +// return false; +// } + + if(returnGoodsItemStore.getCount()<1){ + showResult('退货详细信息列表不能为空'); + return false; + } + + //获取grid数据 + getReturnGoodsDetailGridData(); + top.Ext.getCmp("depart").enable(); + /*top.Ext.getCmp('returnOfPeople').setDisabled(false); + top.Ext.getCmp('depart').setDisabled(false);*/ +// return false; + form.form.submit({ + url : WWWROOT + '/disinfectSystem/returnMaterialRecordAction!save.do', + method : 'POST', + waitMsg : '正在保存数据,请稍候', + waitTitle : '提交表单', + success : function(form, action) { + showResult(action.result.message); + if(action.result.success){ + top.Ext.getCmp('returnGoodsRecordWin').close(); + grid.dwrReload(); + } + }, + failure : function(form, action) { + top.Ext.getCmp("depart").disable();// 禁止修改科室 + showResult(action.result.message); + } + }); + } + }); + } + },{ + text : '取消', + handler : function() { + top.Ext.getCmp('returnGoodsRecordWin').close(); + } + }] + }); + + var win = new top.Ext.Window({ + id : 'returnGoodsRecordWin', + layout : 'fit', + title : entityName + '信息', + width : 780, + modal : true, +// autoHeight : true, + border : false, + height:580, + plain : true, + items : [ form ] + }); + win.show(); +} \ No newline at end of file Index: ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/service/ReturnMaterialRecordManagerImpl.java =================================================================== diff -u --- ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/service/ReturnMaterialRecordManagerImpl.java (revision 0) +++ ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/service/ReturnMaterialRecordManagerImpl.java (revision 14590) @@ -0,0 +1,360 @@ +package com.forgon.disinfectsystem.returnmaterialrecord.service; + +import java.math.BigDecimal; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.Predicate; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.disinfectsystem.basedatamanager.goodsstock.service.GoodsStockManager; +import com.forgon.disinfectsystem.basedatamanager.warehouse.service.WareHouseManager; +import com.forgon.disinfectsystem.entity.basedatamanager.warehouse.WareHouse; +import com.forgon.disinfectsystem.entity.goodsstock.GoodsStock; +import com.forgon.disinfectsystem.entity.invoicemanager.MaterialInvoice; +import com.forgon.disinfectsystem.entity.invoicemanager.MaterialInvoiceItem; +import com.forgon.disinfectsystem.entity.invoicemanager.MaterialItem; +import com.forgon.disinfectsystem.entity.returnmaterialrecord.ReturnMaterialItem; +import com.forgon.disinfectsystem.entity.returnmaterialrecord.ReturnMaterialRecord; +import com.forgon.disinfectsystem.returngoodsrecord.service.ReturnGoodsItemVO; +import com.forgon.disinfectsystem.returnmaterialrecord.model.MaterialItemData; +import com.forgon.tools.MathTools; +import com.forgon.tools.SqlBuilder; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.db.InitDbConnection; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.string.StringTools; + +public class ReturnMaterialRecordManagerImpl implements + ReturnMaterialRecordManager { + + private ObjectDao objectDao; + private GoodsStockManager goodsStockManager; + private WareHouseManager wareHouseManager; + private InitDbConnection dbConnection; + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + public void setGoodsStockManager(GoodsStockManager goodsStockManager) { + this.goodsStockManager = goodsStockManager; + } + public void setWareHouseManager(WareHouseManager wareHouseManager) { + this.wareHouseManager = wareHouseManager; + } + public void setDbConnection(InitDbConnection dbConnection) { + this.dbConnection = dbConnection; + } + @Override + public ReturnMaterialRecord get(String returnMaterialRecordId) { + if(DatabaseUtil.isPoIdValid(returnMaterialRecordId)){ + return (ReturnMaterialRecord) objectDao + .getByProperty(ReturnMaterialRecord.class.getSimpleName(), "id", + Long.valueOf(returnMaterialRecordId)); + } + return null; + } + @SuppressWarnings("unchecked") + @Override + public void save_TRANS_REQUIRED( + ReturnMaterialRecord returnMaterialRecord) { + if(returnMaterialRecord == null){ + throw new RuntimeException("退货单不能为空"); + } + if(CollectionUtils.isEmpty(returnMaterialRecord.getReturnMaterialItems())){ + throw new RuntimeException("请选择退货物品"); + } + objectDao.saveOrUpdate(returnMaterialRecord); + + Set materialDefIds = new HashSet(); + List clinicwareHouseIds = wareHouseManager.getWareHouseIdsByUnitCode(returnMaterialRecord.getDepartCoding()); + List handleDepartWareHoouseIds = new ArrayList();//wareHouseManager.getWareHouseIdsByUnitCode(returnMaterialRecord.getHandleDepartCode()); + handleDepartWareHoouseIds.add(returnMaterialRecord.getWarehouseId()); + for(ReturnMaterialItem item : returnMaterialRecord.getReturnMaterialItems()){ + if(DatabaseUtil.isPoIdValid(item.getMaterialDefinitionId())){ + materialDefIds.add(item.getMaterialDefinitionId()); + } + } + //临床的库存数据 + List clinicGoodsStocks = goodsStockManager.getGoodsStock(clinicwareHouseIds, materialDefIds, false); + //供应室库存数据 + List cssdGoodsStocks = goodsStockManager.getGoodsStock(handleDepartWareHoouseIds, materialDefIds, false); + List invoiceMaterialItems = getInvoiceMaterialItem(materialDefIds, clinicwareHouseIds, + handleDepartWareHoouseIds); + if(CollectionUtils.isEmpty(invoiceMaterialItems)){ + throw new RuntimeException("没有找到当前科室的发货数据"); + } + Set materialItemIds = new HashSet(); + if(CollectionUtils.isNotEmpty(invoiceMaterialItems)){ + for(MaterialItemData item : invoiceMaterialItems){ + if(DatabaseUtil.isPoIdValid(item.getMaterialItemId())){ + materialItemIds.add(item.getMaterialItemId()); + } + } + } + String sql = " where id in ( " + StringTools.join(materialItemIds, ",") + " ) "; + System.out.println(sql); + List materialItemInDB = objectDao.getBySql_ForUpdate2(MaterialItem.class.getSimpleName(), sql ); + + returnMaterialRecord.setSettlementPrice(0.0); + for(ReturnMaterialItem rmi : returnMaterialRecord.getReturnMaterialItems()){ + Integer returnAmount = rmi.getAmount(); + List curInvoiceMaterialItems = findMaterialItem(invoiceMaterialItems, rmi.getMaterialDefinitionId(),rmi.getPrice()); + if(CollectionUtils.isEmpty(curInvoiceMaterialItems)){ + throw new RuntimeException(String.format("未找到材料%s(单价:%f)的发货数据",rmi.getMaterialName(),rmi.getPrice())); + } + BigDecimal settlementPrice = null; + while(returnAmount > 0){ + for(MaterialItemData mItem : curInvoiceMaterialItems){ + int canReturnAmount = mItem.canReturnNum(); + if(canReturnAmount <= 0){ + continue; + } + int curReturnAmount = Math.min(returnAmount, canReturnAmount); + mItem.setNewReturnedAmount(MathTools.add(mItem.getNewReturnedAmount(),curReturnAmount).intValue()); + + subClinicGoodsStock(returnMaterialRecord, + clinicGoodsStocks, rmi, mItem, curReturnAmount); + + addCssdGoodsStock(returnMaterialRecord,cssdGoodsStocks,mItem,curReturnAmount); + addMaterialItemReturnAmout(materialItemInDB,mItem.getMaterialItemId(),curReturnAmount); + returnAmount = MathTools.sub(returnAmount, curReturnAmount).intValue(); + settlementPrice = MathTools.add(settlementPrice, MathTools.mul(mItem.getPrice(), curReturnAmount)); + } + } + rmi.setSettlementPrice(settlementPrice); + rmi.setWarehouseId(returnMaterialRecord.getWarehouseId()); + rmi.setWarehouseName(returnMaterialRecord.getWarehouseName()); + returnMaterialRecord.setSettlementPrice(MathTools.add(returnMaterialRecord.getSettlementPrice(), settlementPrice).doubleValue()); + objectDao.saveOrUpdate(rmi); + } + objectDao.saveOrUpdate(returnMaterialRecord); + } + private void addMaterialItemReturnAmout(List materialItemInDB,Long materialItemId,int curReturnAmount){ + MaterialItem mi = CollectionUtils.find(materialItemInDB, new Predicate(){ + @Override + public boolean evaluate(MaterialItem object) { + if(materialItemId.equals(object.getId())){ + return true; + } + return false; + } + }); + if(mi != null){ + mi.setReturnedAmount(MathTools.add(mi.getReturnedAmount(), curReturnAmount).intValue()); + objectDao.saveOrUpdate(mi); + } + } + private void addCssdGoodsStock(ReturnMaterialRecord returnMaterialRecord,List cssdGoodsStocks, + MaterialItemData mItem,int curReturnAmount){ + GoodsStock gs = CollectionUtils.find(cssdGoodsStocks, new Predicate(){ + @Override + public boolean evaluate(GoodsStock object) { + if(mItem.getMaterialDefinitionId().equals(object.getMaterialDefinitionId()) + && mItem.getPrice().equals(object.getPrice())){ + return true; + } + return false; + } + + }); + if(gs== null){ + gs = new GoodsStock(); + WareHouse wareHouse = wareHouseManager.getDefaultWareHouseByUnitCode(returnMaterialRecord.getHandleDepartCode()); + gs.setMaterialDefinitionId(mItem.getMaterialDefinitionId()); + gs.setGoodsType(GoodsStock.TYPE_MATERIAL); + gs.setName(mItem.getName()); + gs.setOrgUnitCode(wareHouse.getOrgUnitCode()); + gs.setOrgUnitName(wareHouse.getOrgUnitName()); + gs.setPrice(mItem.getPrice()); + gs.setWareHouseId(wareHouse.getId()); + gs.setWareHouseName(wareHouse.getName()); + } + gs.setAmount(MathTools.add(gs.getAmount(), curReturnAmount).intValue()); + objectDao.saveOrUpdate(gs); + } + /** + * 材料退货时扣减临床的库存 + * @param returnMaterialRecord + * @param clinicGoodsStocks + * @param rmi + * @param mItem + * @param curReturnAmount + */ + private void subClinicGoodsStock(ReturnMaterialRecord returnMaterialRecord, + List clinicGoodsStocks, ReturnMaterialItem rmi, + MaterialItemData mItem, int curReturnAmount) { + int goodsStockAmountForModify = curReturnAmount; + while(goodsStockAmountForModify > 0){ + int amountModified = 0; + GoodsStock gs = CollectionUtils.find(clinicGoodsStocks, new Predicate(){ + @Override + public boolean evaluate(GoodsStock object) { + if(rmi.getMaterialDefinitionId().equals(object.getMaterialDefinitionId()) + && object.getAmount() > 0 + && mItem.getPrice().equals(object.getPrice())){ + return true; + } + return false; + } + + }); + if(gs== null){ + throw new RuntimeException(rmi.getMaterialName() + "的库存不足"); + } + if(gs.getAmount() < goodsStockAmountForModify){ + goodsStockAmountForModify -= gs.getAmount(); + amountModified = gs.getAmount(); + gs.setAmount(0); + }else{ + amountModified = goodsStockAmountForModify; + gs.setAmount(gs.getAmount() - goodsStockAmountForModify); + goodsStockAmountForModify = 0; + } + objectDao.saveOrUpdate(gs); + + MaterialItem mi = new MaterialItem(); + mi.setAmount(amountModified); + mi.setGoodsStockId(gs.getId()); + mi.setMaterialDefinitionId(mItem.getMaterialDefinitionId()); + mi.setName(mItem.getName()); + mi.setPrice(mItem.getPrice()); + mi.setReturnMaterialItemID(rmi.getId()); + mi.setMaterialInvoiceItemID(mItem.getMaterialInvoiceItemId()); + mi.setReturnMaterialRecordID(returnMaterialRecord.getId()); + objectDao.saveOrUpdate(mi); + } + } + private List findMaterialItem(List sourceList,Long materialDefId,Double price){ + List retList = new ArrayList(); + if(CollectionUtils.isNotEmpty(sourceList) && materialDefId != null && price != null){ + for(MaterialItemData mi:sourceList){ + if(materialDefId.equals(mi.getMaterialDefinitionId()) && price.equals(mi.getPrice())){ + retList.add(mi); + } + } + } + return retList; + } + /** + * 获取发货单关联的MaterialItem + * @param materialDefIds + * @param clinicwareHouseIds + * @param handleDepartWareHoouseIds + * @return + */ + private List getInvoiceMaterialItem(Set materialDefIds, + List clinicwareHouseIds, List handleDepartWareHoouseIds) { + String materialDefIdsSql = StringTools.join(materialDefIds, ","); + String handleDepartWareHoouseIdsSql = StringTools.join(handleDepartWareHoouseIds, ","); + String clinicwareHouseIdsSql = StringTools.join(clinicwareHouseIds, ","); + String sql = "select mii.id materialInvoiceItemId, mi.id materialItemId,mi.returnedAmount, mi.name,mi.materialDefinitionId,mi.price,mi.amount" + + " from " + MaterialItem.class.getSimpleName() + " mi " + + " inner join " + MaterialInvoice.class.getSimpleName() + " invoice " + + " on invoice.id = mi.materialInvoice_id " + + " inner join " + MaterialInvoiceItem.class.getSimpleName() + " mii " + + " on mii.id = mi.materialInvoiceItemID " + + " where mi.materialDefinitionId in (" + materialDefIdsSql + ")" + + " and invoice.sourceWarehouseId in (" + handleDepartWareHoouseIdsSql + ")" + + " and invoice.warehouseId in (" + clinicwareHouseIdsSql + ")" + + " and (mi.amount > mi.returnedAmount or mi.returnedAmount is null)" + + " order by invoice.sendTime desc"; + + + ResultSet rs = objectDao.executeSql(sql); + List invoiceMaterialItems = new ArrayList(); //查询到的数据库中发货单的MaterialItem数据 + try { + while(rs.next()){ + long materialDefinitionId = rs.getLong("materialDefinitionId"); + long materialItemId = rs.getLong("materialItemId"); + long materialInvoiceItemId = rs.getLong("materialInvoiceItemId"); + double price = rs.getDouble("price"); + int amount = rs.getInt("amount"); + String name = rs.getString("name"); + Integer returnedAmount = rs.getInt("returnedAmount"); + //按材料定义id及价格及发货项的id查询 + MaterialItemData find = CollectionUtils.find(invoiceMaterialItems, new Predicate(){ + @Override + public boolean evaluate(MaterialItemData mi) { + if(mi.getMaterialDefinitionId().equals(materialDefinitionId) + && mi.getPrice().equals(price) + && mi.getMaterialItemId().equals(materialItemId)){ + return true; + } + return false; + } + }); + if(find == null){ + find = new MaterialItemData(); + invoiceMaterialItems.add(find); + find.setMaterialDefinitionId(materialDefinitionId); + find.setName(name); + find.setPrice(price); + find.setMaterialItemId(materialItemId); + find.setMaterialInvoiceItemId(materialInvoiceItemId); + find.setReturnedAmount(returnedAmount); + find.setNewReturnedAmount(returnedAmount); + } + find.setAmount(MathTools.add(find.getAmount(), amount).intValue()); + } + } catch (SQLException e) { + e.printStackTrace(); + }finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + return invoiceMaterialItems; + } + + public List loadMaterialPriceAmountInfoCanReturned( + String departCoding,String materialDefId,String sourceWareHouseId){ + StringBuilder sql = new StringBuilder(); + List priceAmountList = new LinkedList(); + + String isNullFunction = DatabaseUtil.getSqlIsNullFunctionName(dbConnection); + + sql.append(String + .format("select m.price, sum(%s(m.amount,0)) as sumAmount, sum(%s(m.returnedAmount,0)) as sumReturnedAmount from " + + MaterialInvoice.class.getSimpleName() + " i inner join " + + MaterialItem.class.getSimpleName() + " m on i.id = m.materialInvoice_id " + + " where m.materialDefinitionId=%s and %s(m.amount,0)>%s(m.returnedAmount,0) and m.goodsStockId is not null ", + isNullFunction, + isNullFunction,materialDefId,isNullFunction,isNullFunction)); + sql.append(" and i.departCoding = '" + departCoding + "'");// 限定部门 +// sql.append(" and i.orgUnitCoding='" + AcegiHelper.getCurrentOrgUnitCode() + "'"); + sql.append(" and i.sourceWarehouseId=" + sourceWareHouseId ); + sql.append(" group by m.price"); + System.out.println(sql); + ResultSet resultSet = objectDao.executeSql(sql.toString()); + try { + while (resultSet.next()) { + Long sumAmount = resultSet.getLong("sumAmount"); + Long sumReturnedAmount = resultSet.getLong("sumReturnedAmount"); + Double price = resultSet.getDouble("price"); + + if(sumAmount <= sumReturnedAmount){ + continue; + } + ReturnGoodsItemVO.PriceAmount priceAmount = new ReturnGoodsItemVO.PriceAmount(); + priceAmount.setPrice(price); + priceAmount.setFluctuationPrice(price); + priceAmount.setReturnedAmount(sumReturnedAmount); + priceAmount.setSentAmount(sumAmount); + priceAmountList.add(priceAmount); + } + } catch (SQLException e) { + e.printStackTrace(); + }finally { + DatabaseUtil.closeResultSetAndStatement(resultSet); + } + + return priceAmountList; + } +} Index: ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/action/ReturnGoodsRecordAction.java =================================================================== diff -u -r14422 -r14590 --- ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/action/ReturnGoodsRecordAction.java (.../ReturnGoodsRecordAction.java) (revision 14422) +++ ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returngoodsrecord/action/ReturnGoodsRecordAction.java (.../ReturnGoodsRecordAction.java) (revision 14590) @@ -220,7 +220,7 @@ public String loadReturnGoodsItemById() { String id = StrutsParamUtils.getPraramValue("id", ""); - String jsonStr = null; + JSONArray array = new JSONArray(); if (StringUtils.isNotBlank(id)) {// 初始化加载的数据 returnGoodsRecord = returnGoodsRecordManager.getById(id); List returnGoodsItems = returnGoodsRecord @@ -234,45 +234,23 @@ .getBatchNumber(); } try { - if (StringUtils.isBlank(jsonStr)) { - jsonStr = "{id : '" + returnGoodsItem.getId() - + "',tousseName : '" - + returnGoodsItem.getTousseName() - + "',amount :'" + returnGoodsItem.getAmount() - + "',barcode : '" + barcode - + "',isDelivery : '" - + returnGoodsItem.getIsDelivery() - + "',batchNumber : '" + batchNumber - + "',price : " + returnGoodsItem.getPrice() - + ",expDate : '" + returnGoodsItem.getExpDate() - + "',fluctuationPrice : '" - + returnGoodsItem.getFluctuationPrice() + "'}"; - } else { - jsonStr = jsonStr + "," + "{id : '" - + returnGoodsItem.getId() + "',tousseName : '" - + returnGoodsItem.getTousseName() - + "',amount :'" + returnGoodsItem.getAmount() - + "',barcode : '" + barcode - + "',isDelivery : '" - + returnGoodsItem.getIsDelivery() - + "',batchNumber:'" + batchNumber - + "',price : " + returnGoodsItem.getPrice() - + ",expDate : '" + returnGoodsItem.getExpDate() - + "',fluctuationPrice : '" - + returnGoodsItem.getFluctuationPrice() + "'}"; - } + JSONObject json = new JSONObject(); + json.put("id", returnGoodsItem.getId()); + json.put("tousseName", returnGoodsItem.getTousseName()); + json.put("amount", returnGoodsItem.getAmount()); + json.put("barcode", barcode); + json.put("isDelivery", returnGoodsItem.getIsDelivery()); + json.put("batchNumber", batchNumber); + json.put("price", returnGoodsItem.getPrice()); + json.put("expDate", returnGoodsItem.getExpDate()); + json.put("fluctuationPrice", returnGoodsItem.getFluctuationPrice()); + array.add(json); } catch (Exception e) { e.printStackTrace(); } } } - try { - StrutsParamUtils.getResponse().setCharacterEncoding("UTF-8"); - StrutsParamUtils.getResponse().getWriter() - .println("[" + jsonStr + "]"); - } catch (IOException e) { - e.printStackTrace(); - } + StrutsResponseUtils.output(array); return null; } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/returnmaterialrecord/ReturnMaterialRecord.java =================================================================== diff -u -r13070 -r14590 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/returnmaterialrecord/ReturnMaterialRecord.java (.../ReturnMaterialRecord.java) (revision 13070) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/returnmaterialrecord/ReturnMaterialRecord.java (.../ReturnMaterialRecord.java) (revision 14590) @@ -17,13 +17,15 @@ import javax.persistence.Table; import javax.persistence.Transient; +import org.apache.commons.collections4.CollectionUtils; import org.hibernate.annotations.Cache; import org.hibernate.annotations.CacheConcurrencyStrategy; import org.hibernate.annotations.Cascade; import com.fasterxml.jackson.annotation.JsonIgnore; import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; +import com.forgon.tools.MathTools; /** * @author shuyongfu @@ -51,13 +53,15 @@ private String handleDepartCode;//退回科室编码(一二级供应室编码) + private Double settlementPrice; + /** - * 仓库ID + * 供应室仓库ID */ private Long warehouseId; /** - * 仓库名称 + * 供应室仓库名称 */ private String warehouseName; @@ -184,4 +188,23 @@ this.srcWarehouseName = srcWarehouseName; } + public Double getSettlementPrice() { + if(settlementPrice == null){ + calculateSettlementPrice(); + } + return settlementPrice; + } + + public void setSettlementPrice(Double settlementPrice) { + this.settlementPrice = settlementPrice; + } + + public void calculateSettlementPrice(){ + if(CollectionUtils.isNotEmpty(returnMaterialItems)){ + settlementPrice = 0.0; + for(ReturnMaterialItem item:returnMaterialItems){ + settlementPrice = MathTools.add(item.getSettlementPrice(),settlementPrice).doubleValue(); + } + } + } } Index: ssts-web/src/main/resources/spring/applicationContext-disinfectsystem-service.xml =================================================================== diff -u -r14297 -r14590 --- ssts-web/src/main/resources/spring/applicationContext-disinfectsystem-service.xml (.../applicationContext-disinfectsystem-service.xml) (revision 14297) +++ ssts-web/src/main/resources/spring/applicationContext-disinfectsystem-service.xml (.../applicationContext-disinfectsystem-service.xml) (revision 14590) @@ -1074,6 +1074,30 @@ + + + + + + + + + + + + + + + + + + + + + wareHouseIds = new ArrayList(); + if(DatabaseUtil.isPoIdValid(warehouseId)){ + wareHouseIds.add(warehouseId); + } List> mapList = searchMaterialDefinitionOrDiposableGoodsBySpell( - simpleSpell, isSeachMaterialDefinition , warehouseId); + simpleSpell, isSeachMaterialDefinition , wareHouseIds); Map map = new HashMap(); map.put("totalCount", mapList.size()); @@ -222,10 +229,9 @@ } return sql; } - @SuppressWarnings("unchecked") - private List> searchMaterialDefinitionOrDiposableGoodsBySpell( - String simpleSpell, boolean isSeachMaterialDefinition , Long warehouseId) { + public List> searchMaterialDefinitionOrDiposableGoodsBySpell( + String simpleSpell, boolean isSeachMaterialDefinition , Collection warehouseIds) { String sql = "where 1=1 "; Pattern pat = Pattern.compile("[\\u4E00-\\u9FA5]+"); Matcher m = pat.matcher(simpleSpell); @@ -245,10 +251,11 @@ List> mapList = new ArrayList>(); if (isSeachMaterialDefinition) {// 查询再生材料 - if(warehouseId != null && warehouseId != 0){ + if(CollectionUtils.isNotEmpty(warehouseIds)){ + String wareHousePredicate = SqlUtils.getNonStringFieldInCollectionsPredicate("gs.wareHouseId", warehouseIds); long l = System.currentTimeMillis(); String materialSql = "select md.id,md.name,md.specification,md.externalCode,md.cost,gs.amount as storage " - + "from MaterialDefinition md left join (select materialDefinitionId , wareHouseId ,sum(amount) as amount from goodsstock where materialDefinitionId is not null and materialDefinitionId<>0 group by wareHouseId,materialDefinitionId ) gs on md.id=gs.materialDefinitionId and gs.wareHouseId=" + warehouseId; + + "from MaterialDefinition md left join (select materialDefinitionId , wareHouseId ,sum(amount) as amount from goodsstock where materialDefinitionId is not null and materialDefinitionId<>0 group by wareHouseId,materialDefinitionId ) gs on md.id=gs.materialDefinitionId and " + wareHousePredicate; if(StringUtils.isNotBlank(simpleSpell)){ materialSql += " where md.spelling like '%" + simpleSpell + "%' or md.wbCode like '%" + simpleSpell Index: ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/service/ReturnMaterialRecordManager.java =================================================================== diff -u --- ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/service/ReturnMaterialRecordManager.java (revision 0) +++ ssts-returngoods/src/main/java/com/forgon/disinfectsystem/returnmaterialrecord/service/ReturnMaterialRecordManager.java (revision 14590) @@ -0,0 +1,37 @@ +package com.forgon.disinfectsystem.returnmaterialrecord.service; + +import java.util.List; + +import com.forgon.disinfectsystem.entity.returnmaterialrecord.ReturnMaterialRecord; +import com.forgon.disinfectsystem.returngoodsrecord.service.ReturnGoodsItemVO; + +/** + * 材料退货的处理 + * @author kzh + * + */ +public interface ReturnMaterialRecordManager { + /** + * 根据id获取材料退货记录 + * @param returnMaterialRecordId 材料退货记录id + * @return + */ + public ReturnMaterialRecord get(String returnMaterialRecordId); + + /** + * 保存材料退货记录 + * @param returnMaterialRecord + */ + public void save_TRANS_REQUIRED( + ReturnMaterialRecord returnMaterialRecord); + + /** + * 获取当前用户给临床科室对应价格的材料的发货数量及退货数量 + * @param departCoding + * @param materialDefId + * @param sourceWareHouseId 原发货仓库 + * @return + */ + public List loadMaterialPriceAmountInfoCanReturned( + String departCoding,String materialDefId,String sourceWareHouseId); +} Index: ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/service/MaterialDefinitionManager.java =================================================================== diff -u -r14420 -r14590 --- ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/service/MaterialDefinitionManager.java (.../MaterialDefinitionManager.java) (revision 14420) +++ ssts-tousse/src/main/java/com/forgon/disinfectsystem/tousse/materialdefinition/service/MaterialDefinitionManager.java (.../MaterialDefinitionManager.java) (revision 14590) @@ -1,7 +1,9 @@ package com.forgon.disinfectsystem.tousse.materialdefinition.service; import java.io.OutputStream; +import java.util.Collection; import java.util.List; +import java.util.Map; import javax.servlet.http.HttpServletRequest; @@ -44,6 +46,11 @@ */ public JSONObject searchMaterialDefinitionAndStockByWarehouseId( String simpleSpell, boolean isSeachMaterialDefinition , Long warehouseId); + /** + * 根据拼音码、五笔码、仓库获取材料信息及库存 + */ + public List> searchMaterialDefinitionOrDiposableGoodsBySpell( + String simpleSpell, boolean isSeachMaterialDefinition , Collection warehouseIds); public String importMaterialDefinitionFromExcel(HttpServletRequest request); Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/MaterialItem.java =================================================================== diff -u -r13373 -r14590 --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/MaterialItem.java (.../MaterialItem.java) (revision 13373) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/invoicemanager/MaterialItem.java (.../MaterialItem.java) (revision 14590) @@ -43,6 +43,11 @@ private Integer amount; /** + * 退货数量 + */ + private Integer returnedAmount; + + /** * 材料库存id,相当于一次性物品库存标识对象的Id */ private Long goodsStockId; @@ -125,6 +130,14 @@ this.amount = amount; } + public Integer getReturnedAmount() { + return returnedAmount; + } + + public void setReturnedAmount(Integer returnedAmount) { + this.returnedAmount = returnedAmount; + } + @ManyToOne @JoinColumn(name="materialInvoice_id") public MaterialInvoice getMaterialInvoice() {