Index: ssts-web/src/main/webapp/disinfectsystem/borrow/borrowingTousseForm.js =================================================================== diff -u -r17869 -r18462 --- ssts-web/src/main/webapp/disinfectsystem/borrow/borrowingTousseForm.js (.../borrowingTousseForm.js) (revision 17869) +++ ssts-web/src/main/webapp/disinfectsystem/borrow/borrowingTousseForm.js (.../borrowingTousseForm.js) (revision 18462) @@ -107,9 +107,21 @@ return node; } +/** + * 归还剩余的所有物品 + * @param id 申请单id + */ +function returnAllApplication(id) { + createReturnApplication(id, true); +} -//归还物品 -function createReturnApplication(id){ + +/** + * 归还物品 + * @param id 申请单id + * @param isReturnAll 是否全部归还剩余的 + */ +function createReturnApplication(id, isReturnAll){ RecyclingApplicationTableManager.getAvailableForReturnTousses(id,function(tousses){ if(!Ext.isEmpty(tousses)){ // if(tousses != null){ @@ -142,30 +154,31 @@ optionsArray.push(j); optionsArrays.push(optionsArray); } - items.push({ - columnWidth : .5, - layout : 'form', - labelWidth : 90, - items : [{ - xtype : 'combo', - fieldLabel : '归还数量', - id : 'returnAmount'+i, - name : 'returnAmount'+i, - valueField : 'value', - displayField : 'value', - allowBlank : false, - editable : true, - store : new Ext.data.SimpleStore({ - fields : [ 'value' ], - data : optionsArrays - }), - forceSelection : true, - mode : 'local', - value : amount, - triggerAction : 'all', - anchor : '95%' - }] - }); + items.push({ + columnWidth : .5, + layout : 'form', + labelWidth : 90, + items : [{ + xtype : 'combo', + fieldLabel : '归还数量', + id : 'returnAmount'+i, + name : 'returnAmount'+i, + valueField : 'value', + displayField : 'value', + allowBlank : false, + editable : false, + store : new Ext.data.SimpleStore({ + fields : [ 'value' ], + data : optionsArrays + }), + forceSelection : true, + mode : 'local', + value : amount, + triggerAction : isReturnAll ? '': 'all', + hideTrigger : isReturnAll, + anchor : '95%' + }] + }); } if(items.length>0){ var form = new top.Ext.FormPanel({ @@ -216,7 +229,7 @@ form.form.submit({ url : WWWROOT + '/disinfectSystem/recyclingApplicationAction!createReturnApplication.do', method : 'POST', - params : {returnTousses :returnTousses,tousseLeaseId:id}, + params : {returnTousses :returnTousses,tousseLeaseId:id, isCreateReturnApplication : !isReturnAll}, waitMsg : '正在保存数据,请稍候', waitTitle : '提交表单', success : function(form, action) { @@ -372,19 +385,19 @@ dataIndex:'tousseName' },{ header:'类型', - width:70, + width:120, dataIndex:'type' },{ header:'数量', width:60, dataIndex:'amount' },{ header:'单价', - width:80, + width:60, dataIndex:'price' },{ header:'小计', - width:100, + width:80, dataIndex:'rowPrice' },{ header:'时间', @@ -409,7 +422,15 @@ baseParams : {id:id}, uiProviders:{ 'col': top.Ext.tree.ColumnNodeUI - } + }, + listeners : { + load : function (_this, node, response) { + var result = Ext.decode(response.responseText); + if (result.success === false){ + showResult('加载出错了,原因如下:' + result.message) + } + } + } }), root: new top.Ext.tree.AsyncTreeNode({ text:'器械包' Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java =================================================================== diff -u -r18383 -r18462 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java (.../RecyclingApplicationManagerImpl.java) (revision 18383) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java (.../RecyclingApplicationManagerImpl.java) (revision 18462) @@ -3483,7 +3483,7 @@ Map applyTousses = this.calculateBeforeReturn(restApplyTousses, canReturnAmount); logger.info("这次归还物品数量是:" + applyTousses); Map actualReturnTousses = new HashMap<>(); - this.createReturnApplication("admin", borrowApplication.getId(), applyTousses, actualReturnTousses); + this.createReturnApplication("admin", borrowApplication.getId(), applyTousses, actualReturnTousses, true); actualAllReturnTousses.putAll(actualReturnTousses); logger.info("这次实际归还了的数量是" + actualAllReturnTousses); logger.info("剩余的申请物品的数量是" + restApplyTousses); @@ -3536,19 +3536,25 @@ * @param borrowApplicationId 借物单id * @param applyReturnTousses 此次申请归还物品及数量的Map * @param OUT_actualReturnTousses 实际归还物品及数量的Map + * @param isCreateReturnApplication 是否需要创建申请还物单 * @return */ @Override public Map createReturnApplication(String applicant, Long borrowApplicationId, Map applyReturnTousses, - Map OUT_actualReturnTousses) { + Map OUT_actualReturnTousses, boolean isCreateReturnApplication) { RecyclingApplication borrowApplication = (RecyclingApplication) objectDao .getByProperty(RecyclingApplication.class.getSimpleName(), "id", borrowApplicationId); if(borrowApplication == null) return applyReturnTousses; if(MapUtils.isEmpty(applyReturnTousses)) return applyReturnTousses; + + if (!isCreateReturnApplication && !InvoicePlan.DELIVERSTATUS_DELIVERED.equals(borrowApplication.getDeliverStatus())){ + throw new RuntimeException("该单不是已发货状态,不能使用完全归还功能!"); + } + // 将申请归还和待归还的物品做对比,获得实际应还的物品及数量 Map unreturnTousseMap = getUnreturnTousse(borrowApplicationId); @@ -3570,19 +3576,60 @@ if(MapUtils.isEmpty(actualReturnTousses)) return applyReturnTousses; + + //是否需要创建申请还物单,完全归还功能不需要创建 + if (isCreateReturnApplication){ + this.createReturnApplication(applicant, borrowApplication, actualReturnTousses); + // 修改借物单状态 + borrowApplication.setReturnStatus(RecyclingApplication.RETURN_STATUS_AWAITCONFIRM); + borrowApplication.setOrderByFiled(InvoicePlan.RETURN_AWAITCONFIRM); + } + else { + // 修改借物单状态为已归还,因为完全归还会将剩余的归还,并不需要归还待确认和在回收中归还 + borrowApplication.setReturnStatus(RecyclingApplication.RETURN_STATUS_RETURNED); + borrowApplication.setOrderByFiled(InvoicePlan.RETURN_RETURNED); + Date now = new Date(); + borrowApplication.setSubmitTime(now); + borrowApplication.setRemark(String.format("【该申请单在%s被%s通过完全归还完成】", DateTools.getFormatDateStr(now, DateTools.COMMON_DATE_HMS), AcegiHelper.getLoginUserFullName())); + } + saveOrUpdate(borrowApplication); + + // 设置实际归还物品及数量 + if(OUT_actualReturnTousses != null){ + OUT_actualReturnTousses.clear(); + OUT_actualReturnTousses.putAll(actualReturnTousses); + } + // 剩余待归还物品及数量 + /* Map restReturnTousses = new HashMap<>(); + for(Map.Entry entry : applyReturnTousses.entrySet()){ + String touseName = entry.getKey(); + Integer applyReturnAmount = entry.getValue(); + int actualReturnAmount = MapUtils.getIntValue(actualReturnTousses, touseName, 0); + int restReturnAmount = applyReturnAmount - actualReturnAmount; + if(restReturnAmount > 0){ + restReturnTousses.put(touseName, restReturnAmount); + } + }*/ + return this.calculateRestAmount(convertAppAmount, applyReturnTousses,unreturnTousseMap); + } + + /** + * 创建申请还物单 + * @param applicant 申请人 + * @param borrowApplication 借物单 + * @param actualReturnTousses 实际需要归还物品的map + */ + private void createReturnApplication(String applicant, RecyclingApplication borrowApplication, Map actualReturnTousses) { RecyclingApplication returnApplication = new RecyclingApplication(); returnApplication.setDepart(borrowApplication.getDepart()); - returnApplication.setDepartCoding(borrowApplication - .getDepartCoding()); + returnApplication.setDepartCoding(borrowApplication.getDepartCoding()); returnApplication.setApplicationTime(new Date()); returnApplication.setSettleAccountsDepart(borrowApplication.getSettleAccountsDepart()); returnApplication.setSettleAccountsDepartCoding(borrowApplication.getSettleAccountsDepartCoding()); - returnApplication - .setRecyclingStatus(InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE); + returnApplication.setRecyclingStatus(InvoicePlan.RECYCLINGSTATUS_AWAITRECYCLE); returnApplication.setOrderByFiled(InvoicePlan.RECYCLING_AWAITRECYCLE); - returnApplication - .setType(InvoicePlan.TYPE_APPLYING_FOR_RETURN_FORM); + returnApplication.setType(InvoicePlan.TYPE_APPLYING_FOR_RETURN_FORM); returnApplication.setApplicant(applicant); returnApplication.setParent(borrowApplication); returnApplication.setHandleDepart(borrowApplication.getHandleDepart()); @@ -3591,25 +3638,20 @@ int includeInvoiceItems = 0; // 组建申请的物品 List applicationItems = new ArrayList<>(); - for(Map.Entry entry : actualReturnTousses.entrySet()){ + for(Entry entry : actualReturnTousses.entrySet()){ TousseItem tousseItem = new TousseItem(); applicationItems.add(tousseItem); - String tousseName = entry.getKey(); tousseItem.setTousseName(tousseName); tousseItem.setDiposable("否"); tousseItem.setAmount(entry.getValue()); tousseItem.setInvoicePlan(returnApplication); TousseDefinition td = tousseDefinitionManager.getTousseDefinitionByName(tousseName); if (td != null) { - if (!TousseDefinition.PACKAGE_TYPE_DRESSING.equals(td - .getTousseType()) - && TousseDefinition.STR_YES.equals(td - .getIsRecycling())) { + if (!TousseDefinition.PACKAGE_TYPE_DRESSING.equals(td.getTousseType()) && TousseDefinition.STR_YES.equals(td.getIsRecycling())) { includeRecyclingItems = 1; } - if (TousseDefinition.PACKAGE_TYPE_DRESSING.equals(td - .getTousseType())) { + if (TousseDefinition.PACKAGE_TYPE_DRESSING.equals(td.getTousseType())) { includeInvoiceItems = 1; } tousseItem.setIsRecycling(td.getIsRecycling()); @@ -3627,31 +3669,6 @@ returnApplication.setIncludeRecyclingItems(includeRecyclingItems); returnApplication.setIncludeInvoiceItems(includeInvoiceItems); saveOrUpdate(returnApplication); - - // 修改借物单状态 - borrowApplication - .setReturnStatus(RecyclingApplication.RETURN_STATUS_AWAITCONFIRM); - borrowApplication.setOrderByFiled(InvoicePlan.RETURN_AWAITCONFIRM); - saveOrUpdate(borrowApplication); - - // 设置实际归还物品及数量 - if(OUT_actualReturnTousses != null){ - OUT_actualReturnTousses.clear(); - OUT_actualReturnTousses.putAll(actualReturnTousses); - } - - // 剩余待归还物品及数量 - /* Map restReturnTousses = new HashMap<>(); - for(Map.Entry entry : applyReturnTousses.entrySet()){ - String touseName = entry.getKey(); - Integer applyReturnAmount = entry.getValue(); - int actualReturnAmount = MapUtils.getIntValue(actualReturnTousses, touseName, 0); - int restReturnAmount = applyReturnAmount - actualReturnAmount; - if(restReturnAmount > 0){ - restReturnTousses.put(touseName, restReturnAmount); - } - }*/ - return this.calculateRestAmount(convertAppAmount, applyReturnTousses,unreturnTousseMap); } /** @@ -3699,23 +3716,31 @@ return actualReturnTousses; } + + @Override + public List> getConvertAppAmountDetail(Long borrowApplicationId) { + StringBuilder sql = new StringBuilder() + .append("select po.ipId as \"id\",po.tiName as \"tousseName\",count(po.barcode) as \"convertAmount\",po.submitTime as \"submitTime\" ") + .append("from (select distinct ip.id ipId,tis.tousseName tiName,ra.id raId,ip.submitTime,bd.barcode ") + .append("from invoicePlan ip ") + .append("join Invoice i on i.invoicePlan_ID = ip.id ") + .append("join TousseInstance tis on tis.invoice_id = i.id ") + .append("join UseRecord ur on tis.useRecord_id = ur.id ") + .append("join barcodeDevice bd on tis.id = bd.id ") + .append("join RecyclingApplication ra on ra.userecord_id = ur.id ") + .append("where i.invoicePlanType = ? and ip.id = ? ) po ") + .append("group by po.ipId,po.tiName,po.submitTime "); + // .append("join TousseItem ti on ra.id = ti.recyclingApplication_ID and ti.tousseDefinitionId = tis.tousseDefinition_id ") + return objectDao.findSqlByParam(sql.toString(), new Object[]{InvoicePlan.TYPE_BORROWINGSINGLE, borrowApplicationId}); + } + /** * 根据借物单id来查找该借物单上的物品被转换成申请单的情况 * @param borrowApplicationId 借物单id * @return 返回参数有两个(key:物品的名称,value:该物品被转换成申请单的数量) */ private Map getConvertAppAmount(Long borrowApplicationId){ - StringBuilder sql = new StringBuilder(). - append("select ti.tousseName as \"tousseName\",count(ti.amount) as \"convertAmount\" "). - append("from TousseInstance tis "). - append("join Invoice i on tis.invoice_id = i.id "). - append("join UseRecord ur on tis.useRecord_id = ur.id "). - append("join RecyclingApplication ra on ra.userecord_id = tis.useRecord_id "). - append("join invoicePlan ip on ra.id = ip.id "). - append("join TousseItem ti on ip.id = ti.recyclingApplication_ID "). - append("where i.invoicePlanType = ? and i.invoicePlan_ID = ? "). - append("group by ti.tousseName"); - List> list = objectDao.findSqlByParam(sql.toString(), new Object[]{InvoicePlan.TYPE_BORROWINGSINGLE, borrowApplicationId}); + List> list = this.getConvertAppAmountDetail(borrowApplicationId); Map resultMap = new HashMap<>(); for (Map objectMap : list) { resultMap.put(objectMap.get("tousseName").toString(), Integer.parseInt(objectMap.get("convertAmount").toString())); Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManager.java =================================================================== diff -u -r18383 -r18462 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManager.java (.../RecyclingApplicationManager.java) (revision 18383) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManager.java (.../RecyclingApplicationManager.java) (revision 18462) @@ -155,7 +155,7 @@ */ public Map createReturnApplication(String applicant, Long borrowApplicationId, Map applyReturnTousses, - Map OUT_actualReturnTousses); + Map OUT_actualReturnTousses, boolean isCreateReturnApplication); public Collection getUnreturnBorrowApplication( String departCode); @@ -253,4 +253,11 @@ * @return */ public RecyclingApplication newRecyclingApplication(String applicant,String depart,String departCoding); + + /** + * 根据借物单id来查找该借物单上的物品被转换成申请单的情况 + * @param borrowApplicationId 借物单id + * @return 返回的参数是具体的转换情况 + */ + List> getConvertAppAmountDetail(Long borrowApplicationId); } Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/result/LoadTousseLeaseItemsResultBuilder.java =================================================================== diff -u --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/result/LoadTousseLeaseItemsResultBuilder.java (revision 0) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/result/LoadTousseLeaseItemsResultBuilder.java (revision 18462) @@ -0,0 +1,265 @@ +package com.forgon.disinfectsystem.recyclingapplication.result; + +import com.forgon.disinfectsystem.entity.invoicemanager.Invoice; +import com.forgon.disinfectsystem.entity.invoicemanager.InvoiceItem; +import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; +import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; +import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingItem; +import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingRecord; +import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; +import com.forgon.disinfectsystem.recyclingapplication.service.RecyclingApplicationManager; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.util.ForgonDateUtils; +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +/** + * @author zhonghaowen + * @apiNote 点开借物单,查看里面的发货,归还详情结果构造类 + * @since 2017-06-19 + */ +public class LoadTousseLeaseItemsResultBuilder { + + private final SimpleDateFormat dateFormat = ForgonDateUtils.SIMPLEDATEFORMAT_YYYYMMDDHHMM; + + private RecyclingApplicationManager recyclingApplicationManager; + + private ObjectDao objectDao; + + protected Logger logger = Logger.getLogger(this.getClass()); + + public LoadTousseLeaseItemsResultBuilder(RecyclingApplicationManager recyclingApplicationManager, ObjectDao objectDao) { + this.recyclingApplicationManager = recyclingApplicationManager; + this.objectDao = objectDao; + } + + /** + * 构造借物单里面物品详情的返回结果 + * + * @param recyclingApplication 借物单 + */ + public JSONArray buildLoadTousseLeaseItems(RecyclingApplication recyclingApplication) { + JSONArray result = new JSONArray(); + List tousseItems = recyclingApplication.getApplicationItems(); + if (tousseItems != null) { + for (TousseItem tousseItem : tousseItems) { + JSONObject parent = this.buildBorrowParentNode(recyclingApplication, tousseItem); + JSONArray children = new JSONArray(); + children = this.buildInvoiceItem(recyclingApplication, children, tousseItem); + children = this.buildReturnItem(recyclingApplication, children, tousseItem); + parent.put("children", children); + result.add(parent); + } + } + logger.debug(String.format("借物单[%s]详情最后构建的结果如下:%s", recyclingApplication.getId(), result)); + return result; + } + + /** + * 构建叶子节点的公共属性 + * + * @param json 叶子节点 + * @param children 要添加到父节点的叶子节点 + */ + private void buildLeafNode(JSONObject json, JSONArray children) { + json.put("price", null); + json.put("rowPrice", null); + json.put("uiProvider", "col"); + json.put("leaf", "true"); + json.put("iconCls", "task"); + children.add(json); + } + + /** + * 构造借物单物品详情的父节点 + * + * @param recyclingApplication 借物单 + * @param tousseItem 借物单上的物品 + * @return 借物的节点 + */ + private JSONObject buildBorrowParentNode(RecyclingApplication recyclingApplication, TousseItem tousseItem) { + JSONObject parent = new JSONObject(); + parent.put("id", tousseItem.getId()); + parent.put("tousseName", tousseItem.getTousseName()); + parent.put("type", "申请借物"); + parent.put("amount", tousseItem.getAmount()); + parent.put("price", tousseItem.getPrice()); + parent.put("rowPrice", tousseItem.getRowPrice()); + parent.put("time", dateFormat.format(recyclingApplication.getApplicationTime())); + parent.put("uiProvider", "col"); + parent.put("cls", "master-task"); + parent.put("iconCls", "task-folder"); + return parent; + } + + + /** + * 构造借物单物品详情归还的节点 + * + * @param recyclingApplication 借物单 + * @param children 借物单的归还物品节点 + * @param tousseItem 借物单上的物品 + * @return 所有归还的节点 + */ + private JSONArray buildReturnItem(RecyclingApplication recyclingApplication, JSONArray children, TousseItem tousseItem) { + List recyclingApplications = recyclingApplication.getRecyclingApplications(); + if (recyclingApplications != null) { + for (RecyclingApplication applyToReturnApplication : recyclingApplications) { + this.buildApplyReturn(applyToReturnApplication, children, tousseItem); + this.buildActual(applyToReturnApplication, children, tousseItem); + } + } + this.buildConvertAppAmountDetail(recyclingApplication, children, tousseItem); + //如果只用了完全归还来归还物品(即没有通过归还,然后回收来归还的情况),这时的归还数量等于剩余可归还数量 + this.buildAllReturnAmount(recyclingApplication, children, tousseItem); + return children; + } + + /** + * 构造通过全部归还的归还详情 + * + * @param recyclingApplication 借物单 + * @param children 借物单的归还物品节点 + * @param tousseItem 借物单上的物品 + */ + private void buildAllReturnAmount(RecyclingApplication recyclingApplication, JSONArray children, TousseItem tousseItem) { + Map canReturnAmount = recyclingApplicationManager.getCanReturnAmount(recyclingApplication.getId()); + if (InvoicePlan.RETURN_STATUS_RETURNED.equals(recyclingApplication.getReturnStatus()) && MapUtils.isNotEmpty(canReturnAmount)) { + JSONObject json = new JSONObject(); + List applicationItems = recyclingApplication.getApplicationItems(); + //因为这些都是申请的物品,所以这里的applicationItems不用判空 + Optional first = applicationItems.stream().filter(item -> item.getTousseName().equals(tousseItem.getTousseName())).findFirst(); + if (first.isPresent()) { + TousseItem item = first.get(); + json.put("id", item.getId()); + json.put("tousseName", item.getTousseName()); + json.put("type", "使用完全归还"); + json.put("amount", MapUtils.getInteger(canReturnAmount, item.getTousseName(), 0)); + json.put("time", dateFormat.format(recyclingApplication.getSubmitTime())); + this.buildLeafNode(json, children); + } + } + } + + + /** + * 构造通过使用记录转申请单归还的归还详情 + * + * @param recyclingApplication 借物单 + * @param children 借物单的归还物品节点 + * @param tousseItem 借物单上的物品 + */ + private void buildConvertAppAmountDetail(RecyclingApplication recyclingApplication, JSONArray children, TousseItem tousseItem) { + List> convertAppAmountList = recyclingApplicationManager.getConvertAppAmountDetail(recyclingApplication.getId()); + Optional> convertAppAmountMap = convertAppAmountList.stream().filter(item -> + ObjectUtils.equals(tousseItem.getTousseName(), item.get("tousseName"))).findFirst(); + if (convertAppAmountMap.isPresent()) { + Map map = convertAppAmountMap.get(); + JSONObject json = new JSONObject(); + json.put("id", map.getOrDefault("id", null)); + json.put("tousseName", map.getOrDefault("tousseName", null)); + json.put("type", "使用使用记录归还"); + json.put("amount", map.getOrDefault("convertAmount", null)); + json.put("time", dateFormat.format(map.getOrDefault("submitTime", new Date()))); + this.buildLeafNode(json, children); + } + } + + /** + * 构造通过回收真正归还的详情 + * + * @param recyclingApplication 借物单 + * @param children 借物单的归还物品节点 + * @param tousseItem 借物单上的物品 + */ + private void buildActual(RecyclingApplication recyclingApplication, JSONArray children, TousseItem tousseItem) { + RecyclingRecord r_record = recyclingApplication.getRecyclingRecord(objectDao); + List items; + if (r_record != null && (items = r_record.getItems()) != null) { + for (RecyclingItem item : items) { + JSONObject json = new JSONObject(); + if (StringUtils.equals(item.getTousseName(), tousseItem.getTousseName())) { + json.put("id", item.getId()); + json.put("tousseName", item.getTousseName()); + json.put("type", "实际还物"); + json.put("amount", item.getAmount()); + json.put("time", dateFormat.format(r_record.getRecyclingTime())); + this.buildLeafNode(json, children); + break; + } + } + } + } + + /** + * 构造通过申请还物的详情 + * + * @param applyToReturnApplication 借物单 + * @param children 借物单的归还物品节点 + * @param tousseItem 借物单上的物品 + */ + private void buildApplyReturn(RecyclingApplication applyToReturnApplication, JSONArray children, TousseItem tousseItem) { + List applicationItems = applyToReturnApplication.getApplicationItems(); + if (applicationItems != null) { + for (TousseItem item : applicationItems) { + JSONObject json = new JSONObject(); + if (StringUtils.equals(item.getTousseName(), tousseItem.getTousseName())) { + json.put("id", item.getId()); + json.put("tousseName", item.getTousseName()); + json.put("type", "申请还物"); + json.put("amount", item.getAmount()); + json.put("time", dateFormat.format(applyToReturnApplication.getApplicationTime())); + this.buildLeafNode(json, children); + break; + } + } + } + } + + /** + * 构造借物单上发货的详情 + * + * @param recyclingApplication 借物单 + * @param children 借物单的归还物品节点 + * @param tousseItem 借物单上的物品 + */ + private JSONArray buildInvoiceItem(RecyclingApplication recyclingApplication, JSONArray children, TousseItem tousseItem) { + List invoiceList = recyclingApplication.getInvoice(); + if (invoiceList == null) { + return children; + } + for (Invoice invoice : invoiceList) { + if (Invoice.STATUS_UNDELIVERED.equals(invoice.getStatus())) { + continue; + } + Set invoiceItemList = invoice.getInvoiceItem(); + if (invoiceItemList != null) { + for (InvoiceItem invoiceItem : invoiceItemList) { + JSONObject json = new JSONObject(); + if (StringUtils.equals(invoiceItem.getTousseName(), tousseItem.getTousseName())) { + json.put("id", invoiceItem.getId()); + json.put("tousseName", invoiceItem.getTousseName()); + json.put("type", "发货"); + json.put("amount", invoiceItem.getAmount()); + json.put("time", dateFormat.format(invoice.getSendTime())); + this.buildLeafNode(json, children); + break; + } + } + } + } + return children; + } + +} Index: ssts-web/src/main/webapp/disinfectsystem/borrow/borrowingTousseView.js =================================================================== diff -u -r18320 -r18462 --- ssts-web/src/main/webapp/disinfectsystem/borrow/borrowingTousseView.js (.../borrowingTousseView.js) (revision 18320) +++ ssts-web/src/main/webapp/disinfectsystem/borrow/borrowingTousseView.js (.../borrowingTousseView.js) (revision 18462) @@ -296,7 +296,11 @@ returnButton = ""; } - return inoviceButton + returnButton; + if (!SSTS_borrow_returnAll && deliverStatus === statusArr[2] && (returnStatusArr[0] == returnStatus || returnStatusArr[1] == returnStatus)){ + returnButton = ""; + } + + return inoviceButton + returnButton; } },{id : 'operationRemark',header : "备注",dataIndex : 'remark'} ]; @@ -455,11 +459,13 @@ tableContent += "" + content + "
"; record.set("htmlContent",tableContent); } - + + e.getTarget().setAttribute('data-qtip', tableContent); + e.getTarget().setAttribute('data-qwidth', 450); + e.getTarget().setAttribute('data-qtitle', ' 申请物品列表:'); //var rowEl = Ext.fly(e.getTarget());// 把target转换成Ext.Element对象 - var rowEl = Ext4.fly(e.getTarget()); - rowEl.set({ - 'data-qtip' : tableContent,'data-qwidth':450,'data-qtitle':' 申请物品列表:'},false); + // var rowEl = Ext4.fly(e.getTarget()); + // rowEl.set({'data-qtip' : tableContent,'data-qwidth':450,'data-qtitle':' 申请物品列表:'},false); // rowEl.set({ // 'ext:qtip' : tableContent,'ext:qwidth':450,'ext:qwidth':450,'ext:qtitle':" 申请物品列表:"}, false); } Index: ssts-web/src/main/webapp/disinfectsystem/borrow/borrowingTousseView.jsp =================================================================== diff -u -r18320 -r18462 --- ssts-web/src/main/webapp/disinfectsystem/borrow/borrowingTousseView.jsp (.../borrowingTousseView.jsp) (revision 18320) +++ ssts-web/src/main/webapp/disinfectsystem/borrow/borrowingTousseView.jsp (.../borrowingTousseView.jsp) (revision 18462) @@ -64,6 +64,14 @@ SSTS_Invoice_End = false; + +//归还所有物品start +var SSTS_borrow_returnAll = true; + +SSTS_borrow_returnAll = false; + +//归还所有物品end + var returnStatusArr = new Array(); returnStatusArr.push('<%=InvoicePlan.RETURN_STATUS_UNRETURNED%>');//未归还 returnStatusArr.push('<%=InvoicePlan.RETURN_STATUS_PARTIALLY_RETURNED%>');//部分归还 Index: ssts-web/src/test/java/test/forgon/disinfectsystem/borrow/BorrowApplicationTest.java =================================================================== diff -u -r17840 -r18462 --- ssts-web/src/test/java/test/forgon/disinfectsystem/borrow/BorrowApplicationTest.java (.../BorrowApplicationTest.java) (revision 17840) +++ ssts-web/src/test/java/test/forgon/disinfectsystem/borrow/BorrowApplicationTest.java (.../BorrowApplicationTest.java) (revision 18462) @@ -478,7 +478,7 @@ * @return 返回剩余的物品(名字减去数量) */ private Map returnGood(RecyclingApplication tousseApplication, Map map) { - return recyclingApplicationManager.createReturnApplication("admin", tousseApplication.getId(), map, null); + return recyclingApplicationManager.createReturnApplication("admin", tousseApplication.getId(), map, null, true); } Index: ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java =================================================================== diff -u -r18406 -r18462 --- ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java (.../UseRecordManagerImpl.java) (revision 18406) +++ ssts-userecord/src/main/java/com/forgon/disinfectsystem/useRecord/service/UseRecordManagerImpl.java (.../UseRecordManagerImpl.java) (revision 18462) @@ -1239,6 +1239,11 @@ * @return 如果true则允许该物品转换成申请单 */ private boolean isCanTransferToAppFlag(Map temp, TousseInstance tousseInstance, Long borrowId) { + RecyclingApplication borrowApplication = objectDao.getHt().get(RecyclingApplication.class, borrowId); + //如果当前借物单的归还状态是已归还,则表示已经全部归还(有可能是通过DGZYY-105:全部归还来完成的),所以使用记录里面的物品不能转成申请单 + if (borrowApplication != null && InvoicePlan.RETURN_STATUS_RETURNED.equals(borrowApplication.getReturnStatus())){ + return false; + } boolean canTransferToAppFlag = true; //先得到待归还数量 Map unReturnTousse = recyclingApplicationManager.getCanReturnAmount(borrowId); Index: ssts-web/src/main/resources/systemset/operationDefine.xml =================================================================== diff -u -r18418 -r18462 --- ssts-web/src/main/resources/systemset/operationDefine.xml (.../operationDefine.xml) (revision 18418) +++ ssts-web/src/main/resources/systemset/operationDefine.xml (.../operationDefine.xml) (revision 18462) @@ -42,6 +42,7 @@ + Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/RecyclingApplicationAction.java =================================================================== diff -u -r18422 -r18462 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/RecyclingApplicationAction.java (.../RecyclingApplicationAction.java) (revision 18422) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/RecyclingApplicationAction.java (.../RecyclingApplicationAction.java) (revision 18462) @@ -17,6 +17,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import com.forgon.disinfectsystem.recyclingapplication.result.LoadTousseLeaseItemsResultBuilder; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; @@ -54,8 +55,6 @@ import com.forgon.disinfectsystem.entity.invoicemanager.InvoiceItem; import com.forgon.disinfectsystem.entity.invoicemanager.InvoicePlan; import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; -import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingItem; -import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingRecord; import com.forgon.disinfectsystem.entity.tousseitem.TousseItem; import com.forgon.disinfectsystem.exception.RecyclingRecordException; import com.forgon.disinfectsystem.goodFilterConfig.service.GoodFilterConfigManager; @@ -568,8 +567,9 @@ String message = "提交成功。"; try { - recyclingApplicationManager.createReturnApplication(applicant, - borrowApplicationId, applyReturnTousses, null); + String isCreateReturnApplication = StrutsParamUtils.getPraramValue("isCreateReturnApplication", "true"); + boolean createReturnApplication = "true".equals(isCreateReturnApplication); + recyclingApplicationManager.createReturnApplication(applicant, borrowApplicationId, applyReturnTousses, null, createReturnApplication); } catch (Exception ex) { message = "提交失败。" + ex.getMessage(); // message = "提交失败。"; @@ -580,134 +580,16 @@ outPrint(response, message); } - public String loadTousseLeaseItems() { - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); - StringBuffer jsonStr = new StringBuffer(); - List tousseItems = recyclingApplication - .getApplicationItems(); - - for (int index = 0; CollectionUtils.isNotEmpty(tousseItems) && index < tousseItems.size();index++) { - TousseItem tousseItem = tousseItems.get(index); - if (jsonStr.length() != 0) { - jsonStr.append(","); - } - jsonStr.append("{id:") - .append(tousseItem.getId()) - .append(",tousseName:'") - .append(tousseItem.getTousseName()) - .append("',type:'申请借物',amount:") - .append(tousseItem.getAmount()) - .append(",price:").append(tousseItem.getPrice()) - .append(",rowPrice:").append(tousseItem.getRowPrice()) - .append(",time:'") - .append(dateFormat.format(recyclingApplication - .getApplicationTime())) - .append("',uiProvider:'col',cls:'master-task',iconCls:'task-folder',children:["); - - boolean isThereAMatch = false; - if (recyclingApplication.getInvoice() != null - && recyclingApplication.getInvoice().size() > 0) { - for (int i = 0; i < recyclingApplication.getInvoice().size(); i++) { - Invoice invoice = recyclingApplication.getInvoice().get(i); - if (Invoice.STATUS_UNDELIVERED.equals(invoice.getStatus())) { - continue; - } - if (invoice.getInvoiceItem() != null) { - for (InvoiceItem invoiceItem : invoice.getInvoiceItem()) { - if (StringUtils.equals(invoiceItem.getTousseName(), - tousseItem.getTousseName())) { - if (isThereAMatch) { - jsonStr.append(","); - } - jsonStr.append("{id:") - .append(invoiceItem.getId()) - .append(",tousseName:'") - .append(invoiceItem.getTousseName()) - .append("',type:'发货',amount:") - .append(invoiceItem.getAmount()) - .append(",price:null,rowPrice:null") - .append(",time:'") - .append(dateFormat.format(invoice - .getSendTime())) - .append("',uiProvider:'col',leaf:true,iconCls:'task'}"); - isThereAMatch = true; - break; - } - } - } - } - } - - if (recyclingApplication.getRecyclingApplications() != null - && recyclingApplication.getRecyclingApplications().size() > 0) { - for (int i = 0; i < recyclingApplication - .getRecyclingApplications().size(); i++) { - RecyclingApplication applyToReturnApplication = recyclingApplication - .getRecyclingApplications().get(i); - if (applyToReturnApplication.getApplicationItems() != null) { - for (TousseItem item : applyToReturnApplication - .getApplicationItems()) { - if (StringUtils.equals(item.getTousseName(), - tousseItem.getTousseName())) { - if (isThereAMatch) { - jsonStr.append(","); - } - jsonStr.append("{id:") - .append(item.getId()) - .append(",tousseName:'") - .append(item.getTousseName()) - .append("',type:'申请还物',amount:") - .append(item.getAmount()) - .append(",price:null,rowPrice:null") - .append(",time:'") - .append(dateFormat - .format(applyToReturnApplication - .getApplicationTime())) - .append("',uiProvider:'col',leaf:true,iconCls:'task'}"); - isThereAMatch = true; - break; - } - } - } - RecyclingRecord r_record = applyToReturnApplication.getRecyclingRecord(objectDao); - if (r_record != null && r_record.getItems() != null) { - for (RecyclingItem item : r_record.getItems()) { - if (StringUtils.equals(item.getTousseName(), - tousseItem.getTousseName())) { - if (isThereAMatch) { - jsonStr.append(","); - } - jsonStr.append("{id:") - .append(item.getId()) - .append(",tousseName:'") - .append(item.getTousseName()) - .append("',type:'实际还物',amount:") - .append(item.getAmount()) - .append(",time:'") - .append(dateFormat - .format(r_record.getRecyclingTime())) - .append("',uiProvider:'col',leaf:true,iconCls:'task'}"); - isThereAMatch = true; - break; - } - } - } - } - } - - jsonStr.append("]}"); - } - HttpServletResponse response = StrutsParamUtils.getResponse(); - response.setCharacterEncoding("UTF-8"); - PrintWriter out; + public void loadTousseLeaseItems() { try { - out = response.getWriter(); - out.println("[" + jsonStr.toString() + "]"); - out.close(); - } catch (IOException e) { - e.printStackTrace(); + LoadTousseLeaseItemsResultBuilder resultBuilder = new LoadTousseLeaseItemsResultBuilder(recyclingApplicationManager, objectDao); + JSONArray result = resultBuilder.buildLoadTousseLeaseItems(recyclingApplication); + StrutsResponseUtils.output(result); } - return null; + catch (Exception e) { + logger.error(e, e); + StrutsResponseUtils.output(false, e.getMessage()); + } } /**