Index: ssts-datasync/src/main/java/com/forgon/disinfectsystem/project/model/ProjectBalance.java =================================================================== diff -u -r25246 -r30075 --- ssts-datasync/src/main/java/com/forgon/disinfectsystem/project/model/ProjectBalance.java (.../ProjectBalance.java) (revision 25246) +++ ssts-datasync/src/main/java/com/forgon/disinfectsystem/project/model/ProjectBalance.java (.../ProjectBalance.java) (revision 30075) @@ -2,11 +2,13 @@ /** * 中山眼科的项目及材料余额信息(科研项目) + * 已扩展用到广东省中医院 GDSZYY-57 科研项目耗材申领(一次性物品申领)功能开发 2020-12-25 * @author ShuYongFu * @since 2016-01-15 * */ public class ProjectBalance { + /** * 项目编码 */ @@ -28,6 +30,7 @@ /** * 总余额 + * (到账余额:广东省中医院科研项目的项目级预算对应的视图字段为income_money) */ private Double totalBalance; Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/RecyclingApplicationAction.java =================================================================== diff -u -r29905 -r30075 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/RecyclingApplicationAction.java (.../RecyclingApplicationAction.java) (revision 29905) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/action/RecyclingApplicationAction.java (.../RecyclingApplicationAction.java) (revision 30075) @@ -1403,12 +1403,10 @@ } public void getAllProject(){ - JSONObject result = new JSONObject(); String projectName = StrutsParamUtils.getPraramValue("spell", ""); String userCode = StrutsParamUtils.getPraramValue("userCode", null); - List projList = null; try { - projList = projectManager.getAllProject(userCode , projectName); + JSONObject result = projectManager.getProjectDataList(userCode, projectName); //本地模拟造数代码 /*List projList new ArrayList(); projList = new ArrayList(); @@ -1426,8 +1424,8 @@ proj.setProjCode("ccc"); proj.setProjName("333"); projList.add(proj);*/ - result.put("data", JSONArray.fromObject(projList)); - StrutsResponseUtils.output(JSONArray.fromObject(projList)); + result.put("data", result.optJSONArray(JSONUtil.JSON_KEY_ROWS)); + StrutsResponseUtils.output(result); } catch (Exception e) { e.printStackTrace(); } Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/project/service/BaseProjectManagerImpl.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/project/service/BaseProjectManagerImpl.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/project/service/BaseProjectManagerImpl.java (revision 30075) @@ -0,0 +1,156 @@ +package com.forgon.disinfectsystem.project.service; + +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; + +import com.forgon.directory.acegi.tools.AcegiHelper; +import com.forgon.disinfectsystem.project.dao.ProjectDao; +import com.forgon.disinfectsystem.project.model.DetailBalance; +import com.forgon.disinfectsystem.project.model.ProjectBalance; +import com.forgon.disinfectsystem.vo.TousseItemVo; +import com.forgon.tools.db.InitDbConnection; +import com.forgon.tools.hibernate.ObjectDao; +import com.forgon.tools.json.JSONUtil; + +/** + * 科研项目业务实现父类.目前有中山眼科中心和广东省中医院两个项目的子实现类 + * @author shuyongfu + * @since 2018-08-30 + */ +public class BaseProjectManagerImpl implements ProjectManager { + + protected ObjectDao objectDao; + + /** + * 基于mybatis的项目dao实现(调用herp中间表) + */ + protected ProjectDao projectDaoMybatis; + + + /** + * 项目dao实现类(调用科室http接口) + */ + protected ProjectDao projectDaoImpl; + + protected InitDbConnection dbConnection; + + public void setObjectDao(ObjectDao objectDao) { + this.objectDao = objectDao; + } + + public void setProjectDaoMybatis(ProjectDao projectDaoMybatis) { + this.projectDaoMybatis = projectDaoMybatis; + } + + + public void setProjectDaoImpl(ProjectDao projectDaoImpl) { + this.projectDaoImpl = projectDaoImpl; + } + + public void setDbConnection(InitDbConnection dbConnection) { + this.dbConnection = dbConnection; + } + + /** + * 查询所有的项目(中山眼科的科教经费项目申领一次性物品时提供项目选择) + * @param userCode 人员工号 + * @param projectName 项目名称(用于模糊匹配查询) + * @author ShuYongFu + * @since 2016-01-15 + * @return + */ + public JSONObject getProjectDataList(String userCode,String projectName){ + JSONObject result = JSONUtil.buildJsonObject(true); + List list = null; + if(StringUtils.isBlank(userCode)){ + userCode = AcegiHelper.getLoginUser().getUserName(); + } + if(projectDaoMybatis != null){ + try { + list = projectDaoMybatis.getAllProjectByEmployeeNumAndProjectName(userCode, projectName); + } catch (Exception e) { + e.printStackTrace(); + } + }else if(projectDaoImpl != null){ + try { + list = projectDaoImpl.getAllProjectByEmployeeNumAndProjectName(userCode, projectName); + } catch (Exception e) { + e.printStackTrace(); + } + } + if(CollectionUtils.isNotEmpty(list)){ + JSONUtil.addRowsProperty(result, JSONArray.fromObject(list)); + } + return result; + } + + @Override + public JSONObject getDetailDataList(String projCode, String detailName) { + JSONObject result = JSONUtil.buildJsonObject(true); + List list = null; + if(projectDaoMybatis != null){ + try { + list = projectDaoMybatis.getAllDetailByProjCodeAndDetailName(projCode, detailName); + } catch (Exception e) { + e.printStackTrace(); + } + }else if(projectDaoImpl != null){ + try { + list = projectDaoImpl.getAllDetailByProjCodeAndDetailName(projCode, detailName); + } catch (Exception e) { + e.printStackTrace(); + } + } + if(CollectionUtils.isNotEmpty(list)){ + JSONUtil.addRowsProperty(result, JSONArray.fromObject(list)); + } + return result; + } + + /** + * 根据项目编码判断是否超支(正式方法) + * @param projCode + * @param newTousseItemVoList + * @param categoryCodeFixedSubjectCodeResultMap + * @return + */ + @Override + public JSONObject judgeOverspendByProjCode(String projCode ,Collection newTousseItemVoList , Map categoryCodeFixedSubjectCodeResultMap){ + //各项目的子业务实现类根据业务情况进行实现方法编写,默认返回为成功的结果 + return JSONUtil.buildJsonObject(true); + } + + @Override + public JSONObject judgeOverspendByDetailCode(String detailCode ,Collection newTousseItemVoList) { + //各项目的子业务实现类根据业务情况进行实现方法编写,默认返回为成功的结果 + return JSONUtil.buildJsonObject(true); + } + + @Override + public JSONObject writeBudgetProjectTakeCssdData(String projCode, + String projName, String detailCode, String detailName, + Double applicationMoney, Date applicationDate, + String applicationUserCode, String applicationUserName, + String serialNumber) { + //各项目的子业务实现类根据业务情况进行实现方法编写,默认返回为成功的结果 + return JSONUtil.buildJsonObject(true); + } + + @Override + public JSONObject writeBudgetProjectExecCssdData(String projCode, + String projName, String detailCode, String detailName, + Double applicationMoney, Date applicationDate, + String invoiceUserCode, String invoiceUserName, String serialNumber) { + //各项目的子业务实现类根据业务情况进行实现方法编写,默认返回为成功的结果 + return JSONUtil.buildJsonObject(true); + } + +} Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/project/dao/zsykzx/ProjectDaoImpl.java =================================================================== diff -u -r25246 -r30075 --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/project/dao/zsykzx/ProjectDaoImpl.java (.../ProjectDaoImpl.java) (revision 25246) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/project/dao/zsykzx/ProjectDaoImpl.java (.../ProjectDaoImpl.java) (revision 30075) @@ -1,6 +1,7 @@ package com.forgon.disinfectsystem.project.dao.zsykzx; import java.util.ArrayList; +import java.util.Date; import java.util.List; import org.apache.commons.lang.StringUtils; @@ -13,6 +14,7 @@ import com.forgon.disinfectsystem.common.CssdUtils; import com.forgon.disinfectsystem.project.dao.ProjectDao; import com.forgon.disinfectsystem.project.model.CategorySubject; +import com.forgon.disinfectsystem.project.model.DetailBalance; import com.forgon.disinfectsystem.project.model.ProjectBalance; import com.forgon.disinfectsystem.project.model.ProjectDict; import com.forgon.log.model.Log; @@ -102,7 +104,7 @@ } @Override - public List getAllProjectByEmployeeNumAndProjectName( + public List getAllProjectByEmployeeNumAndProjectName( String employee, String projectName) { JSONObject paramJson = new JSONObject(); paramJson.put("source", SOURCE); @@ -116,7 +118,7 @@ JSONObject result = CssdUtils.sendJSONRequestByHttpPost(HTTP_POST_URL + findMoneyCardBalanceByPiEmployeeNumURL, JSONObject.fromObject(paramJson)); appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_SYNC, Log.TYPE_QUERY, "调用科研项目接口:url="+ (HTTP_POST_URL + findMoneyCardBalanceByPiEmployeeNumURL) +",param=" + paramJson + ",result=" + result); - List projectDictList = new ArrayList(); + List projectBalanceList = new ArrayList(); if(result != null){ if(!StringUtils.equals(result.optString("code"), RESULT_SUCCESS)){ throw new RuntimeException(result.optString("message")); @@ -128,29 +130,29 @@ JSONObject fundProjectsJsonObject = projectJsonArray.optJSONObject(i); String fundProjectCode = fundProjectsJsonObject.optString("projectCode"); String fundProjectName = fundProjectsJsonObject.optString("projectName"); - ProjectDict project = null; + ProjectBalance project = null; if(StringUtils.isBlank(projectName)){ - project = new ProjectDict(); + project = new ProjectBalance(); project.setProjCode(fundProjectCode); // project.setProjName(fundProjectCode + " " + fundProjectName); project.setProjName(fundProjectName); - projectDictList.add(project); + projectBalanceList.add(project); }else if(StringUtils.isNotBlank(projectName) && (fundProjectCode.toLowerCase().indexOf(projectName.trim().toLowerCase()) != -1 || fundProjectName.toLowerCase().indexOf(projectName.trim().toLowerCase()) != -1)){ - project = new ProjectDict(); + project = new ProjectBalance(); project.setProjCode(fundProjectCode); // project.setProjName(fundProjectCode + " " + fundProjectName); project.setProjName(fundProjectName); - projectDictList.add(project); + projectBalanceList.add(project); } } } }else{ throw new RuntimeException("未找到返回的结果"); } - return projectDictList; + return projectBalanceList; } @Override @@ -272,4 +274,40 @@ return result; } + @Override + public List getAllDetailByProjCodeAndDetailName( + String projCode, String detailName) { + // 中山眼科不需要用 + return null; + } + + @Override + public ProjectBalance getProjectBalanceByProjCode(String projCode) { + // 中山眼科不需要用 + return null; + } + + @Override + public DetailBalance getDetailBalanceByDetailCode(String detailCode) { + // 中山眼科不需要用 + return null; + } + + @Override + public int writeBudgetProjectTakeCssdData(String projCode, + String projName, String detailCode, String detailName, + Double applicationMoney, Date applicationDate, + String applicationUserCode, String applicationUserName, + String serialNumber) { + return -1; + } + + @Override + public int writeBudgetProjectExecCssdData(String projCode, + String projName, String detailCode, String detailName, + Double invocieMoney, Date invocieDate, + String invoiceUserCode, String invoiceUserName, String serialNumber) { + return -1; + } + } Index: ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java =================================================================== diff -u -r29970 -r30075 --- ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 29970) +++ ssts-invoice/src/main/java/com/forgon/disinfectsystem/invoicemanager/service/InvoiceManagerImpl.java (.../InvoiceManagerImpl.java) (revision 30075) @@ -49,6 +49,7 @@ import com.forgon.directory.model.BarcodeDevice; import com.forgon.directory.model.OrgUnit; import com.forgon.directory.service.OrgUnitManager; +import com.forgon.directory.vo.LoginUserData; import com.forgon.disinfectsystem.barcode.service.BarcodeManager; import com.forgon.disinfectsystem.barcode.util.BarcodeUtils; import com.forgon.disinfectsystem.basedatamanager.goodsstock.service.GoodsStockManager; @@ -2418,13 +2419,14 @@ tousseItemVo.setTousseName(invoiceItem.getTousseName()); tousseItemVo.setTousseType(invoiceItem.getTousseType()); tousseItemVo.setPrice(invoiceItem.getSettlementPrice()); + tousseItemVo.setRowPrice(MathTools.mul(tousseItemVo.getAmount(), tousseItemVo.getPrice()).doubleValue()); newTousseItemVoList.add(tousseItemVo); } } if(CollectionUtils.isNotEmpty(newTousseItemVoList)){ JSONObject jsonObject = - projectManager.judgeOverspendByProjCode(invoicePlan.getProjCode(), (RecyclingApplication)invoicePlan, newTousseItemVoList , categoryCodeFixedSubjectCodeResultMap); + projectManager.judgeOverspendByProjCode(invoicePlan.getProjCode(), newTousseItemVoList , categoryCodeFixedSubjectCodeResultMap); if(jsonObject.optBoolean("success") == false){ throw new RuntimeException(jsonObject.optString("message")); } @@ -2989,7 +2991,7 @@ submitInvoiceContext.setSourceWarehouse(wareHouseManager.getWareHouseById(sourceWarehouseId)); submitInvoiceContext.setSourceWarehouseName(sourceWarehouseName); submitInvoiceContext.setParams(params); - JSONArray jsonArrayInvoiceItems = params.getJSONArray("invoiceItems"); + JSONArray jsonArrayInvoiceItems = params.optJSONArray("invoiceItems"); //校验限制发货科室的器械包是否为来自该科室 validateTousseInstanceFromDepartForLimitInvoice(departCode,depart,jsonArrayInvoiceItems); @@ -3173,10 +3175,11 @@ recalculateUrgentTousse(AcegiHelper.getLoginUser().getOrgUnitCodingFromSupplyRoomConfig(), submitInvoiceContext); } appLogManager.saveLog(AcegiHelper.getLoginUser(), Log.MODEL_INVOICE, Log.TYPE_ADD, "发货结束,params=" + params); - logger.debug("发货完成,耗时(毫秒数):" + (System.currentTimeMillis() - start)); + String debugInfo = "发货完成,耗时(毫秒数):" + (System.currentTimeMillis() - start); + logger.debug(debugInfo); //本地调试用的语句,需要调试时再放开.正式用必须注释 - if(true){ -// throw new RuntimeException("test old"); + if(CssdUtils.getSystemSetConfigByNameBool("enableInvoiceSubmitDebug")){ + throw new RuntimeException(debugInfo); } return submitInvoiceContext; } Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/project/service/gdszyy/ProjectManagerImpl.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/project/service/gdszyy/ProjectManagerImpl.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/project/service/gdszyy/ProjectManagerImpl.java (revision 30075) @@ -0,0 +1,105 @@ +package com.forgon.disinfectsystem.project.service.gdszyy; + +import java.util.Collection; +import java.util.Date; +import java.util.Map; + +import net.sf.json.JSONObject; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; + +import com.forgon.disinfectsystem.project.model.DetailBalance; +import com.forgon.disinfectsystem.project.model.ProjectBalance; +import com.forgon.disinfectsystem.project.service.BaseProjectManagerImpl; +import com.forgon.disinfectsystem.vo.TousseItemVo; +import com.forgon.tools.MathTools; +import com.forgon.tools.json.JSONUtil; + +/** + * 广东省中医院科研项目实现类 + * @author shuyongfu + * @since 2020-12-25 + * + */ +public class ProjectManagerImpl extends BaseProjectManagerImpl { + + @Override + public JSONObject judgeOverspendByProjCode(String projCode, + Collection newTousseItemVoList, + Map categoryCodeFixedSubjectCodeResultMap) { + JSONObject result = JSONUtil.buildJsonObject(true); + if(projectDaoMybatis != null && StringUtils.isNotBlank(projCode) && CollectionUtils.isNotEmpty(newTousseItemVoList)){ + ProjectBalance projectBalance = projectDaoMybatis.getProjectBalanceByProjCode(projCode); + if(projectBalance == null){ + JSONUtil.addSuccess(result, false); + JSONUtil.addMessage(result, String.format("未找到项目编码为%s的科研项目.", projCode)); + }else{ + Double totalBalance = projectBalance.getTotalBalance(); + if(totalBalance != null && totalBalance.doubleValue() > 0){ + Double summaryMoney = newTousseItemVoList.stream().filter(ti -> ti.disposable()).map(TousseItemVo::getRowPrice).reduce((rowPrice1,rowPrice2)->{ + return MathTools.add(rowPrice1, rowPrice2).doubleValue(); + }).orElse(0D); + if(summaryMoney > totalBalance){ + JSONUtil.addSuccess(result, false); + JSONUtil.addMessage(result, String.format("到账余额为%s,申请金额不能大于该金额!.", totalBalance)); + } + } + } + } + return result; + } + + @Override + public JSONObject judgeOverspendByDetailCode(String detailCode, + Collection newTousseItemVoList) { + JSONObject result = JSONUtil.buildJsonObject(true); + if(projectDaoMybatis != null){ + DetailBalance detailBalance = projectDaoMybatis.getDetailBalanceByDetailCode(detailCode); + if(detailBalance == null){ + JSONUtil.addSuccess(result, false); + JSONUtil.addMessage(result, String.format("未找到指标编码为%s的指标.", detailCode)); + }else{ + Double budgMoney = detailBalance.getBudgMoney(); + if(budgMoney != null && budgMoney.doubleValue() > 0){ + Double summaryMoney = newTousseItemVoList.stream().filter(ti -> ti.disposable()).map(TousseItemVo::getRowPrice).reduce((rowPrice1,rowPrice2)->{ + return MathTools.add(rowPrice1, rowPrice2).doubleValue(); + }).orElse(0D); + if(summaryMoney > budgMoney){ + JSONUtil.addSuccess(result, false); + JSONUtil.addMessage(result, String.format("预算余额为%s,申请金额不能大于该金额!.", budgMoney)); + } + } + } + } + return result; + } + + @Override + public JSONObject writeBudgetProjectTakeCssdData(String projCode, + String projName, String detailCode, String detailName, + Double applicationMoney, Date applicationDate, + String applicationUserCode, String applicationUserName, + String serialNumber) { + JSONObject result = JSONUtil.buildJsonObject(true); + if(projectDaoMybatis != null){ + int dataId = projectDaoMybatis.writeBudgetProjectTakeCssdData(projCode, projName, detailCode, detailName, + applicationMoney, applicationDate, applicationUserCode, applicationUserName, serialNumber); + } + return result; + } + + @Override + public JSONObject writeBudgetProjectExecCssdData(String projCode, + String projName, String detailCode, String detailName, + Double applicationMoney, Date applicationDate, + String invoiceUserCode, String invoiceUserName, String serialNumber) { + JSONObject result = JSONUtil.buildJsonObject(true); + if(projectDaoMybatis != null){ + int dataId = projectDaoMybatis.writeBudgetProjectExecCssdData(projCode, projName, detailCode, detailName, + applicationMoney, applicationDate, invoiceUserCode, invoiceUserName, serialNumber); + } + return result; + } + +} Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/project/service/ProjectManagerImpl.java =================================================================== diff -u -r25246 -r30075 --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/project/service/ProjectManagerImpl.java (.../ProjectManagerImpl.java) (revision 25246) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/project/service/ProjectManagerImpl.java (.../ProjectManagerImpl.java) (revision 30075) @@ -1,4 +1,4 @@ -package com.forgon.disinfectsystem.project.service; +/*package com.forgon.disinfectsystem.project.service; import java.util.ArrayList; import java.util.Collection; @@ -32,15 +32,15 @@ private ObjectDao objectDao; - /** + *//** * 基于mybatis的项目dao实现(调用herp中间表) - */ + *//* private ProjectDao projectDaoMybatis; - /** + *//** * 项目dao实现类(调用科室http接口) - */ + *//* private ProjectDao projectDaoImpl; private InitDbConnection dbConnection; @@ -62,14 +62,14 @@ this.dbConnection = dbConnection; } - /** + *//** * 查询所有的项目(中山眼科的科教经费项目申领一次性物品时提供项目选择) * @param userCode 人员工号 * @param projectName 项目名称(用于模糊匹配查询) * @author ShuYongFu * @since 2016-01-15 * @return - */ + *//* public List getAllProject(String userCode,String projectName){ List list = null; if(projectDaoImpl != null){ @@ -85,13 +85,13 @@ return list; } - /** + *//** * 根据项目编码判断是否超支(过时方法,正式的方法以下面的为准) * @param projCode * @param newTousseItemVoList * RecyclingApplication application * @return - */ + *//* @Deprecated public JSONObject judgeOverspendByProjCode_old(String projCode, RecyclingApplication application ,Collection newTousseItemVoList){ JSONObject jsonObject = new JSONObject(); @@ -100,7 +100,7 @@ if(projectDaoMybatis != null && StringUtils.isNotBlank(projCode)){ //模拟造数据测试代码,正式使用时应删除 - /*projectBalanceList = new ArrayList(); + projectBalanceList = new ArrayList(); ProjectBalance projectBalance = new ProjectBalance(); projectBalance.setInventorySerialNumber("1204"); projectBalance.setTotalBalance(12d); @@ -117,7 +117,7 @@ projectBalance.setInventorySerialNumber("1206"); projectBalance.setTotalBalance(12d); projectBalance.setInventoryPayoutBalance(4d); - projectBalanceList.add(projectBalance);*/ + projectBalanceList.add(projectBalance); //所有的材料分类与支出项对应 List categorySubjectList = projectDaoMybatis.getAllCategorySubject(); @@ -183,11 +183,11 @@ //根据材料分类编码查询出所有的支出项编码 List categoryBelongSubjectCodeList = getSubjectCodeListFromCategorySubjectList(categoryCodeOfDisposableGoods , categorySubjectList); if(CollectionUtils.isNotEmpty(categoryBelongSubjectCodeList)){ - /*if(subjectMoneyMap.containsKey(categoryBelongSubjectCode)){ + if(subjectMoneyMap.containsKey(categoryBelongSubjectCode)){ subjectMoneyMap.put(categoryBelongSubjectCode, subjectMoneyMap.get(categoryBelongSubjectCode) + diposableGoodsMoney); }else{ subjectMoneyMap.put(categoryBelongSubjectCode, diposableGoodsMoney); - }*/ + } //循环材料分类对应的所有支出项余额编码 for (String categoryBelongSubjectCode : categoryBelongSubjectCodeList) { //如果该材料分类对应的某个支出项余额累计超过了该科研项目下该支出项的可用余额则跳出此 @@ -242,7 +242,7 @@ //具体的判断业务逻辑及输出判断结果 //1.循环一次性物品,根据材料编码逐一判断是否超支,如有超过则返回 //2.先判断总余额,如果超过则返回 - /*String departsForInvoicePlanSelectProject = CssdUtils.getSystemSetConfigByName("departsForInvoicePlanSelectProject"); + String departsForInvoicePlanSelectProject = CssdUtils.getSystemSetConfigByName("departsForInvoicePlanSelectProject"); if(StringUtils.isNotBlank(departsForInvoicePlanSelectProject) && (";" + departsForInvoicePlanSelectProject + ";").indexOf(";" + application.getDepart() + ";") != -1 && StringUtils.isNotBlank(projCode) @@ -333,19 +333,19 @@ } } } - }*/ + } } return jsonObject; } - /** + *//** * 根据项目编码判断是否超支(正式方法) * @param projCode * @param newTousseItemVoList * @param application * @param categoryCodeFixedSubjectCodeResultMap * @return - */ + *//* @Override public JSONObject judgeOverspendByProjCode(String projCode, RecyclingApplication application ,Collection newTousseItemVoList , Map categoryCodeFixedSubjectCodeResultMap){ JSONObject jsonObject = new JSONObject(); @@ -429,10 +429,10 @@ return jsonObject; } - /** + *//** * 模拟北大医信中间表的正式数据,构造材料分类编码与支出项的数据记录 * @return - */ + *//* private List testGetCategorySubjectList() { //测试数据 List categorySubjectList = new ArrayList(); @@ -508,10 +508,10 @@ return categorySubjectList; } - /** + *//** * * @return - */ + *//* private JSONObject testProjectBalanceJsonObject(){ //测试数据 JSONObject projectBalanceJsonObject = new JSONObject(); @@ -547,11 +547,11 @@ } return projectBalanceJsonObject; } - /** + *//** * 根据申请项汇总出各材料分类的余额(key为材料分类编码、value为材料分类编码对应的余额)map * @param newTousseItemVoList * @param categoryCodeMoneyMap - */ + *//* private double summaryByTousseItemVoList(Collection newTousseItemVoList , Map categoryCodeMoneyMap){ double totalMoney = 0d; for(TousseItemVo tousseItemVo : newTousseItemVoList){ @@ -597,15 +597,15 @@ return totalMoney; } - /** + *//** * 根据支出项编码、可用余额从材料分类map中查找出最大且未超出支出余额的组合 * @param subjectCode 支出项编码 * @param subjectCode2BalanceAmount 支出项编码对应余额 * @param categorySubjectList 材料分类与支出项对照表 * @param categoryCodeMoneyMap 材料分类及对应金额 * @param alreadySummaryCategoryCodeList 已经被汇总的材料分类集合 * @param categoryCodeFixedSubjectCodeResultMap 材料分类与支出项的搭配所属的适用结果 - */ + *//* private void findMaxMoneyPartBySubjectCodeAndBalanceAmount(String subjectCode , Double subjectCode2BalanceAmount , List categorySubjectList , Map categoryCodeMoneyMap , List alreadySummaryCategoryCodeList , Map categoryCodeFixedSubjectCodeResultMap){ //已经通过材料分类计算到支出项金额 @@ -651,10 +651,10 @@ combineMap(dataMap); System.out.println(totalResultArr.toString()); } - /** + *//** * 对数组进行组合 * @param com 需要进行组合的数组数据 - */ + *//* private static void combineMap(Map dataMap) { //组合个数按最小数量1到最大数量即数组长度进行组合 for (int k = 1; k <= dataMap.size(); k++) { @@ -666,12 +666,12 @@ } } - /** + *//** * 组合 * @param index * @param k * @param arr - */ + *//* public static void combine(int index,int k,Map dataMap) { if(k == 1){ for (int i = index; i < dataMap.size(); i++) { @@ -691,12 +691,12 @@ } } - /** + *//** * 根据类别名称从类别与支出项的中间表取到支出项编码 * @param categoryCode 一次性物品分类编码 * @param categorySubjectList 材料分类与支出项数据集合(中间表的全量数据) * @return - */ + *//* private List getSubjectCodeListFromCategorySubjectList(String categoryCode , List categorySubjectList){ List subjectCodeList = null; if(CollectionUtils.isNotEmpty(categorySubjectList)){ @@ -711,3 +711,4 @@ } } +*/ \ No newline at end of file Index: ssts-datasync/src/main/java/com/forgon/disinfectsystem/project/service/ProjectManager.java =================================================================== diff -u -r25246 -r30075 --- ssts-datasync/src/main/java/com/forgon/disinfectsystem/project/service/ProjectManager.java (.../ProjectManager.java) (revision 25246) +++ ssts-datasync/src/main/java/com/forgon/disinfectsystem/project/service/ProjectManager.java (.../ProjectManager.java) (revision 30075) @@ -1,33 +1,92 @@ package com.forgon.disinfectsystem.project.service; import java.util.Collection; -import java.util.List; +import java.util.Date; import java.util.Map; import net.sf.json.JSONObject; -import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; -import com.forgon.disinfectsystem.project.model.ProjectDict; import com.forgon.disinfectsystem.vo.TousseItemVo; public interface ProjectManager { /** * 查询所有的项目(中山眼科的科教经费项目申领一次性物品时提供项目选择) - * @param userCode 人员工号 + * 后面广东省中医院也有调用 + * @param userCode 人员工号(如不传此参数,则取当前登录用户的工号) * @param projectName 项目名称(用于模糊匹配查询) * @author ShuYongFu * @since 2016-01-15 - * @return + * @return JSONObject + * 成功示例:{success:true,rows:[{detailCode:"指标1编码",detailName:"指标1名称"},{detailCode:"指标2编码",detailName:"指标2名称"}]}, + * 失败示例:{success:false,message:"异常信息"} */ - public List getAllProject(String userCode,String projectName); + public JSONObject getProjectDataList(String userCode,String projectName); /** + * 查询所有的指标(广东省中医院) + * @param projCode 项目编码 + * @param detailName 指标名称(用于模糊匹配查询) + * @author ShuYongFu + * @since 2020-12-25 + * @return JSONObject + * 成功示例:{success:true,rows:[{detailCode:"指标1编码",detailName:"指标1名称"},{detailCode:"指标2编码",detailName:"指标2名称"}]}, + * 失败示例:{success:false,message:"异常信息"} + */ + public JSONObject getDetailDataList(String projCode,String detailName); + + /** * 根据项目编码判断是否超支,并将一次性物品与支出项的对应结果结果输出至最后的map参数中 * @param projCode - * @param application - * @param newTousseItemVoList - * @param categoryCodeFixedSubjectCodeResultMap - * @return + * @param newTousseItemVoList 集合中的TousseItemVo元素必须对下列属性设值(diposable,disposableGoodsId,amount,price,rowPrice) + * @param categoryCodeFixedSubjectCodeResultMap 中山眼科项目有用此参数,广东省中医院传null即可 + * @return JSONObject 返回值说明如下: + * 成功示例:{success:true} + * 失败示例:{success:false,message:"异常信息:如到账余额为xxx,申请金额不能大于该金额!"} */ - public JSONObject judgeOverspendByProjCode(String projCode, RecyclingApplication application , Collection newTousseItemVoList , Map categoryCodeFixedSubjectCodeResultMap); + public JSONObject judgeOverspendByProjCode(String projCode , Collection newTousseItemVoList , Map categoryCodeFixedSubjectCodeResultMap); + + /** + * 根据指标编码检验指标是否超支(广东省中医院专用) + * @param detailCode 指标编码 + * @param newTousseItemVoList 集合中的TousseItemVo元素必须对下列属性设值(diposable,DisposableGoodsId,amount,price,rowPrice) + * @return JSONObject 返回值说明如下: + * 成功示例:{success:true} + * 失败示例:{success:false,message:"异常信息:如预算余额为xxx,申请金额不能大于该金额!"} + */ + public JSONObject judgeOverspendByDetailCode(String detailCode , Collection newTousseItemVoList); + + /** + * 写入占用表数据(科研项目申请一次性物品后调用) + * @param projCode 项目编码 + * @param projName 项目名称 + * @param detailCode 指标编码 + * @param detailName 指标名称 + * @param applicationMoney 申请一次性物品总金额(修改时,按修改前后的差值进行计算) + * @param applicationDate 申请时间 + * @param applicationUserCode 申请人工号 + * @param applicationUserName 申请人名称 + * @param serialNumber 申请单号 + * @return JSONObject 成功示例:{success:true},失败示例:{success:false,message:"异常信息"} + */ + public JSONObject writeBudgetProjectTakeCssdData(String projCode, String projName, String detailCode, + String detailName, Double applicationMoney, Date applicationDate, + String applicationUserCode, String applicationUserName, String serialNumber); + + /** + * 写入执行表数据(科研项目一次性物品发货后调用) + * @param projCode 项目编码 + * @param projName 项目名称 + * @param detailCode 指标编码 + * @param detailName 指标名称 + * @param applicationMoney 申请一次性物品总金额(修改时,按修改前后的差值进行计算) + * @param applicationDate 申请时间 + * @param invoiceUserCode 申请人工号 + * @param invoiceUserName 申请人名称 + * @param serialNumber 发货单对应的申请单号 + * @return JSONObject 成功示例:{success:true},失败示例:{success:false,message:"异常信息"} + */ + public JSONObject writeBudgetProjectExecCssdData(String projCode, String projName, String detailCode, + String detailName, Double applicationMoney, Date applicationDate, + String invoiceUserCode, String invoiceUserName, String serialNumber); + } Index: ssts-datasync/src/main/java/com/forgon/disinfectsystem/project/model/DetailBalance.java =================================================================== diff -u --- ssts-datasync/src/main/java/com/forgon/disinfectsystem/project/model/DetailBalance.java (revision 0) +++ ssts-datasync/src/main/java/com/forgon/disinfectsystem/project/model/DetailBalance.java (revision 30075) @@ -0,0 +1,57 @@ +package com.forgon.disinfectsystem.project.model; + +/** + * 指标余额javabean + * 广东省中医院 GDSZYY-57 科研项目耗材申领(一次性物品申领)功能开发 + * @author ShuYongFu + * @since 2020-12-25 + * + */ +public class DetailBalance { + + /** + * 指标编码 + */ + private String detailCode; + /** + * 指标名称 + */ + private String detailName; + + + /** + * 预算余额(指标级数据) + */ + private Double budgMoney; + + + public String getDetailCode() { + return detailCode; + } + + + public void setDetailCode(String detailCode) { + this.detailCode = detailCode; + } + + + public String getDetailName() { + return detailName; + } + + + public void setDetailName(String detailName) { + this.detailName = detailName; + } + + + public Double getBudgMoney() { + return budgMoney; + } + + + public void setBudgMoney(Double budgMoney) { + this.budgMoney = budgMoney; + } + +} Index: ssts-web/src/main/webapp/disinfectsystem/config/gdszyy/spring/project.xml =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/config/gdszyy/spring/project.xml (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/config/gdszyy/spring/project.xml (revision 30075) @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file Index: ssts-web/src/main/webapp/disinfectsystem/config/gdszyy/interfaces/mybatis/queryAndWriteProject_Mapper.xml =================================================================== diff -u --- ssts-web/src/main/webapp/disinfectsystem/config/gdszyy/interfaces/mybatis/queryAndWriteProject_Mapper.xml (revision 0) +++ ssts-web/src/main/webapp/disinfectsystem/config/gdszyy/interfaces/mybatis/queryAndWriteProject_Mapper.xml (revision 30075) @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + (comp_code,copy_code,proj_code,proj_name,detail_code,detail_name,exec_money,exec_date,exec_code,exec_name,exec_memo,data_source,state) + + + + + + values( + '100110','110', + #{projCode,jdbcType=VARCHAR}, + #{projName,jdbcType=VARCHAR}, + #{detailCode,jdbcType=VARCHAR}, + #{detailName,jdbcType=VARCHAR}, + #{applicationMoney}, + #{applicationDate}, + #{applicationUserCode,jdbcType=VARCHAR}, + #{applicationUserName,jdbcType=VARCHAR}, + #{serialNumber,jdbcType=VARCHAR},'cssd','0' + ) + + + + + + values( + '100110','110', + #{projCode,jdbcType=VARCHAR}, + #{projName,jdbcType=VARCHAR}, + #{detailCode,jdbcType=VARCHAR}, + #{detailName,jdbcType=VARCHAR}, + #{invoiceMoney}, + #{invoiceDate}, + #{invoiceUserCode,jdbcType=VARCHAR}, + #{invoiceUserName,jdbcType=VARCHAR}, + #{serialNumber,jdbcType=VARCHAR},'cssd','0' + ) + + \ No newline at end of file Index: ssts-web/src/main/webapp/disinfectsystem/config/zsykzx/spring/HERP.xml =================================================================== diff -u -r28883 -r30075 --- ssts-web/src/main/webapp/disinfectsystem/config/zsykzx/spring/HERP.xml (.../HERP.xml) (revision 28883) +++ ssts-web/src/main/webapp/disinfectsystem/config/zsykzx/spring/HERP.xml (.../HERP.xml) (revision 30075) @@ -202,17 +202,6 @@ - - - - - - - - - Index: ssts-datasync/src/main/java/com/forgon/disinfectsystem/project/dao/ProjectDao.java =================================================================== diff -u -r25246 -r30075 --- ssts-datasync/src/main/java/com/forgon/disinfectsystem/project/dao/ProjectDao.java (.../ProjectDao.java) (revision 25246) +++ ssts-datasync/src/main/java/com/forgon/disinfectsystem/project/dao/ProjectDao.java (.../ProjectDao.java) (revision 30075) @@ -1,14 +1,20 @@ package com.forgon.disinfectsystem.project.dao; +import java.util.Collection; +import java.util.Date; import java.util.List; +import java.util.Map; import net.sf.json.JSONObject; import org.apache.ibatis.annotations.Param; +import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; import com.forgon.disinfectsystem.project.model.CategorySubject; +import com.forgon.disinfectsystem.project.model.DetailBalance; import com.forgon.disinfectsystem.project.model.ProjectBalance; import com.forgon.disinfectsystem.project.model.ProjectDict; +import com.forgon.disinfectsystem.vo.TousseItemVo; /** * 项目dao,目前仅用于中山眼科的科教经费项目 @@ -34,7 +40,7 @@ * @since 2018-04-18 * @return */ - public List getAllProjectByEmployeeNumAndProjectName(String employee , String projectName); + public List getAllProjectByEmployeeNumAndProjectName(@Param("employee") String employee , @Param("projectName") String projectName); /** * 查询所有材料分类与支出项的数据(北大医信提供中间表) @@ -124,4 +130,61 @@ @Deprecated public List getProjectBalanceListByProjCode(@Param("projCode") String projCode); + /** + * 根据项目编码及指标名称查找指标数据 + * @param projCode + * @param detailName + * @return + */ + public List getAllDetailByProjCodeAndDetailName(@Param("projCode") String projCode,@Param("detailName") String detailName); + + + /** + * 根据项目编码查询项目数据 + * @param projCode + * @return + */ + public ProjectBalance getProjectBalanceByProjCode(@Param("projCode") String projCode); + + /** + * 根据指标编码查询指标数据 + * @param detailCode + * @return + */ + public DetailBalance getDetailBalanceByDetailCode(@Param("detailCode") String detailCode); + + /** + * 写入占用表数据(科研项目申请一次性物品后调用) + * @param projCode 项目编码 + * @param projName 项目名称 + * @param detailCode 指标编码 + * @param detailName 指标名称 + * @param applicationMoney 申请一次性物品总金额(修改时,按修改前后的差值进行计算) + * @param applicationDate 申请时间 + * @param applicationUserCode 申请人工号 + * @param applicationUserName 申请人名称 + * @param serialNumber 申请单号 + * @return JSONObject 成功示例:{success:true},失败示例:{success:false,message:"异常信息"} + */ + public int writeBudgetProjectTakeCssdData(@Param("projCode") String projCode, @Param("projName") String projName, @Param("detailCode") String detailCode, + @Param("detailName") String detailName, @Param("applicationMoney") Double applicationMoney, @Param("applicationDate") Date applicationDate, + @Param("applicationUserCode") String applicationUserCode, @Param("applicationUserName") String applicationUserName, @Param("serialNumber") String serialNumber); + + /** + * 写入执行表数据(科研项目一次性物品发货后调用) + * @param projCode 项目编码 + * @param projName 项目名称 + * @param detailCode 指标编码 + * @param detailName 指标名称 + * @param applicationMoney 申请一次性物品总金额(修改时,按修改前后的差值进行计算) + * @param applicationDate 申请时间 + * @param invoiceUserCode 申请人工号 + * @param invoiceUserName 申请人名称 + * @param serialNumber 发货单对应的申请单号 + * @return JSONObject 成功示例:{success:true},失败示例:{success:false,message:"异常信息"} + */ + public int writeBudgetProjectExecCssdData(@Param("projCode") String projCode, @Param("projName") String projName, @Param("detailCode") String detailCode, + @Param("detailName") String detailName, @Param("invoiceMoney") Double invoiceMoney, @Param("invoiceDate") Date invoiceDate, + @Param("invoiceUserCode") String invoiceUserCode, @Param("invoiceUserName") String invoiceUserName, @Param("serialNumber") String serialNumber); + } Index: ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/project/service/zsykzx/ProjectManagerImpl.java =================================================================== diff -u --- ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/project/service/zsykzx/ProjectManagerImpl.java (revision 0) +++ ssts-datasync-default-impl/src/main/java/com/forgon/disinfectsystem/project/service/zsykzx/ProjectManagerImpl.java (revision 30075) @@ -0,0 +1,233 @@ +package com.forgon.disinfectsystem.project.service.zsykzx; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import net.sf.json.JSONArray; +import net.sf.json.JSONObject; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang.StringUtils; + +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoods; +import com.forgon.disinfectsystem.entity.assestmanagement.DisposableGoodsBatchStock; +import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; +import com.forgon.disinfectsystem.project.model.CategorySubject; +import com.forgon.disinfectsystem.project.service.BaseProjectManagerImpl; +import com.forgon.disinfectsystem.vo.TousseItemVo; +import com.forgon.tools.db.DatabaseUtil; +import com.forgon.tools.json.JSONUtil; + +/** + * 中山眼科项目科研实现类 + * @author shuyongfu + * + */ +public class ProjectManagerImpl extends BaseProjectManagerImpl { + + @Override + public JSONObject judgeOverspendByProjCode(String projCode, + Collection newTousseItemVoList, + Map categoryCodeFixedSubjectCodeResultMap) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("success", true); + if(projectDaoMybatis != null && StringUtils.isNotBlank(projCode)){ + + //所有的材料分类与支出项对应 +// 正式代码 + List categorySubjectList = projectDaoMybatis.getAllCategorySubject(); + //测试数据 +// List categorySubjectList = testGetCategorySubjectList(); + + + //该项目余额与所有的支出项余额 + //正式代码 + JSONObject projectBalanceJsonObject = projectDaoImpl.getProjectBalanceAndSubjectsBalanceListByProjCode(projCode); + //模拟项目余额的测试数据 +// JSONObject projectBalanceJsonObject = testProjectBalanceJsonObject(); + + //具体的判断业务逻辑及输出判断结果 + //1.循环一次性物品,根据材料编码逐一判断是否超支,如有超过则返回 + //2.先判断总余额,如果超过则返回 + if(CollectionUtils.isNotEmpty(newTousseItemVoList)){ + JSONArray projectSubjectsBalanceJsonArray = projectBalanceJsonObject.optJSONArray("projectSubjectsBalanceJsonArray"); + if(CollectionUtils.isEmpty(projectSubjectsBalanceJsonArray)){ + jsonObject.put("success", false); + jsonObject.put("message", "未找到该项目的支出项及余额信息。"); + }else{ + //科研项目的总余额 + double projectTotalBalance = projectBalanceJsonObject.optDouble("projectTotalBalance"); + //循环科研项目的所有支出项余额,并赋值至map集合中 + Map subjectCode2BalanceAmountMapInProject = new HashMap(); + for(int i = 0 ; i < projectSubjectsBalanceJsonArray.size();i++){ + JSONObject projectSubjectsBalanceJsonObject = projectSubjectsBalanceJsonArray.optJSONObject(i); + subjectCode2BalanceAmountMapInProject.put(projectSubjectsBalanceJsonObject.optString("subjectCode"), + projectSubjectsBalanceJsonObject.optDouble("balanceAmount")); + } + + //各材料分类的余额(key为材料分类编码、value为材料分类编码对应的余额) + Map categoryCodeMoneyMap = new HashMap(); + //申请物品的总额 + double totalMoney = 0d; + try{ + totalMoney = summaryByTousseItemVoList(newTousseItemVoList , categoryCodeMoneyMap); + }catch(RuntimeException e){ + jsonObject.put("success", false); + jsonObject.put("message", e.getMessage()); + return jsonObject; + } + + if(totalMoney > projectTotalBalance){ + jsonObject.put("success", false); + jsonObject.put("message", "该项目总额已超支。"); + return jsonObject; + } + //已经归类到未超出对应支出项余额的材料分类编码 + List alreadySummaryCategoryCodeList = new ArrayList(); + //各支出项的余额(key为支出项编码、value为支出项编码对应的余额) + Map subjectMoneyMap = new HashMap(); + //循环支出项余额map + for(String subjectCode : subjectCode2BalanceAmountMapInProject.keySet()){ + //该支出项的可用余额 + Double subjectCode2BalanceAmount = subjectCode2BalanceAmountMapInProject.get(subjectCode); + findMaxMoneyPartBySubjectCodeAndBalanceAmount(subjectCode , subjectCode2BalanceAmount, categorySubjectList, categoryCodeMoneyMap, alreadySummaryCategoryCodeList , categoryCodeFixedSubjectCodeResultMap); + } + //比较是否categoryCodeMoneyMap所有的材料分类编码都已经归入alreadySummaryCategoryCodeList,如果还有未归入,则表示有超支 + boolean allCategoryCodeHasSummaryList = true; + for (String categoryCode : categoryCodeMoneyMap.keySet()) { + if(!alreadySummaryCategoryCodeList.contains(categoryCode)){ + allCategoryCodeHasSummaryList = false; + break; + } + } + if(allCategoryCodeHasSummaryList == false){ + jsonObject.put("success", false); + jsonObject.put("message", "该项目有支出项超支。"); + } + } + } + } + return jsonObject; + } + + /** + * 根据申请项汇总出各材料分类的余额(key为材料分类编码、value为材料分类编码对应的余额)map + * @param newTousseItemVoList + * @param categoryCodeMoneyMap + */ + private double summaryByTousseItemVoList(Collection newTousseItemVoList , Map categoryCodeMoneyMap){ + double totalMoney = 0d; + for(TousseItemVo tousseItemVo : newTousseItemVoList){ + if(TousseDefinition.STR_YES.equals(tousseItemVo.getDiposable()) && DatabaseUtil.isPoIdValid(tousseItemVo.getDisposableGoodsId())){ + DisposableGoods diposableGoods = (DisposableGoods)objectDao.getByProperty(DisposableGoods.class.getSimpleName(), "id", tousseItemVo.getDisposableGoodsId()); + if(diposableGoods != null && diposableGoods.getReferencePrice() != null){ + Double price = tousseItemVo.getPrice();//正式代码 +// Double price = diposableGoods.getReferencePrice();//非正式代码 + //查询失效期离当前时间最近一批的一次性物品,取其价格 + DisposableGoodsBatchStock disposableGoodsBatchStock = null; + + if(dbConnection.isOracle()){ + disposableGoodsBatchStock = + (DisposableGoodsBatchStock)objectDao.getBySql(DisposableGoodsBatchStock.class.getSimpleName(), + " where disposableGoodsId="+tousseItemVo.getDisposableGoodsId() + " and expDate is not null and expDate > sysdate order by expDate"); + }else if(dbConnection.isSqlServer()){ + disposableGoodsBatchStock = + (DisposableGoodsBatchStock)objectDao.getBySql(DisposableGoodsBatchStock.class.getSimpleName(), + " where disposableGoodsId="+tousseItemVo.getDisposableGoodsId() + " and expDate is not null and expDate > GETDATE() order by expDate"); + } + + if(disposableGoodsBatchStock != null){ + price = disposableGoodsBatchStock.getCost(); + }else{ + throw new RuntimeException("未找到一次性物品:" + tousseItemVo.getTousseName() + "的库存信息或库存均已过失效期。"); + } + + double diposableGoodsMoney = tousseItemVo.getAmount() * price; + + totalMoney += diposableGoodsMoney; + //一次性物品分类编码 + String categoryCodeOfDisposableGoods = diposableGoods.getCategoryCode(); + if(categoryCodeMoneyMap.containsKey(categoryCodeOfDisposableGoods)){ + categoryCodeMoneyMap.put(categoryCodeOfDisposableGoods, diposableGoodsMoney + categoryCodeMoneyMap.get(categoryCodeOfDisposableGoods)); + }else{ + categoryCodeMoneyMap.put(categoryCodeOfDisposableGoods, diposableGoodsMoney); + } + }else{ + throw new RuntimeException("未找到id为"+ tousseItemVo.getDisposableGoodsId() +"的一次性物品定义"); + } + } + } + return totalMoney; + } + + /** + * 根据支出项编码、可用余额从材料分类map中查找出最大且未超出支出余额的组合 + * @param subjectCode 支出项编码 + * @param subjectCode2BalanceAmount 支出项编码对应余额 + * @param categorySubjectList 材料分类与支出项对照表 + * @param categoryCodeMoneyMap 材料分类及对应金额 + * @param alreadySummaryCategoryCodeList 已经被汇总的材料分类集合 + * @param categoryCodeFixedSubjectCodeResultMap 材料分类与支出项的搭配所属的适用结果 + */ + private void findMaxMoneyPartBySubjectCodeAndBalanceAmount(String subjectCode , Double subjectCode2BalanceAmount , List categorySubjectList , + Map categoryCodeMoneyMap , List alreadySummaryCategoryCodeList , Map categoryCodeFixedSubjectCodeResultMap){ + //已经通过材料分类计算到支出项金额 + Double alreadyCalSubjectCode2BalanceAmountBycategoryCodeMoneyMap = 0d; + //循环材料分类的中间对照表数据 + for(CategorySubject categorySubject : categorySubjectList){ + if(StringUtils.equals(categorySubject.getSubjectCode(), subjectCode)){ + //从材料分类金额map中找出对应支出项且加数值为最大且未超出支出余额的组合(需传参:支出项编码、支出项总额、材料分类金额) + //循环材料分类的金额的map + for(String categoryCode : categoryCodeMoneyMap.keySet()){ + //如果材料分类编码 + if(StringUtils.equals(categorySubject.getCategoryCode(), categoryCode)){ + if(alreadySummaryCategoryCodeList.contains(categoryCode)){ + continue; + } + //材料分类对应的金额 + Double categoryCodeMoney = categoryCodeMoneyMap.get(categoryCode); + alreadyCalSubjectCode2BalanceAmountBycategoryCodeMoneyMap += categoryCodeMoney; + //如果前面已经计算到该支出项金额的材料分类金额加上当前材料分类金额仍然小于或等于该支出的可用金额时则进行标记 + if(alreadyCalSubjectCode2BalanceAmountBycategoryCodeMoneyMap <= subjectCode2BalanceAmount){ + alreadySummaryCategoryCodeList.add(categoryCode); + categoryCodeFixedSubjectCodeResultMap.put(categoryCode, subjectCode); + }else{ + return; + } + } + } + } + } + } + + @Override + public JSONObject judgeOverspendByDetailCode(String detailCode, + Collection newTousseItemVoList) { + //中山眼科项目不需要此业务,默认返回为成功的结果 + return JSONUtil.buildJsonObject(true); + } + + @Override + public JSONObject writeBudgetProjectTakeCssdData(String projCode, + String projName, String detailCode, String detailName, + Double applicationMoney, Date applicationDate, + String applicationUserCode, String applicationUserName, + String serialNumber) { + //中山眼科项目不需要,默认返回为成功的结果 + return JSONUtil.buildJsonObject(true); + } + + @Override + public JSONObject writeBudgetProjectExecCssdData(String projCode, + String projName, String detailCode, String detailName, + Double applicationMoney, Date applicationDate, + String invoiceUserCode, String invoiceUserName, String serialNumber) { + //中山眼科项目不需要,默认返回为成功的结果 + return JSONUtil.buildJsonObject(true); + } + +} Index: ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java =================================================================== diff -u -r30037 -r30075 --- ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java (.../RecyclingApplicationManagerImpl.java) (revision 30037) +++ ssts-recyclingapplication/src/main/java/com/forgon/disinfectsystem/recyclingapplication/service/RecyclingApplicationManagerImpl.java (.../RecyclingApplicationManagerImpl.java) (revision 30075) @@ -4399,7 +4399,7 @@ if(projectManager != null && StringUtils.isNotBlank(application.getProjCode())){ //验证是否必须选择项目及所选项目是否已经超支 - jsonObject = projectManager.judgeOverspendByProjCode(application.getProjCode() , application, newTousseItemVoList , new HashMap()); + jsonObject = projectManager.judgeOverspendByProjCode(application.getProjCode() , newTousseItemVoList , new HashMap()); if(jsonObject != null && jsonObject.optBoolean("success") == false){ return jsonObject; } Index: ssts-web/src/main/webapp/disinfectsystem/config/zsykzx/spring/project.xml =================================================================== diff -u -r28112 -r30075 --- ssts-web/src/main/webapp/disinfectsystem/config/zsykzx/spring/project.xml (.../project.xml) (revision 28112) +++ ssts-web/src/main/webapp/disinfectsystem/config/zsykzx/spring/project.xml (.../project.xml) (revision 30075) @@ -15,7 +15,7 @@ + class="com.forgon.disinfectsystem.project.service.zsykzx.ProjectManagerImpl">