Index: ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/vo/RecyclingSumInfoVo.java =================================================================== diff -u -r37855 -r37885 --- ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/vo/RecyclingSumInfoVo.java (.../RecyclingSumInfoVo.java) (revision 37855) +++ ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/vo/RecyclingSumInfoVo.java (.../RecyclingSumInfoVo.java) (revision 37885) @@ -1,6 +1,8 @@ package com.forgon.disinfectsystem.recyclingrecord.vo; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; import com.forgon.disinfectsystem.entity.basedatamanager.toussedefinition.TousseDefinition; @@ -21,7 +23,18 @@ * 主要用于原有丢失报损,又打开删除丢失报损信息时,需要调整装配任务的状态 */ private Set recyclingItemIdOfhaveErrorOrDamage; - + /** + * SZSDSRMYY-128 是否在回收清点模块显示回收时间 配置为true时,启用在回收清点模块显示回收时间 + */ + private boolean enableDisplayRecyclingTimeOfrecyclingRecordList = false; + /** + * 原回收记录中物品的数量 + */ + private Map oldRecyclingItmeAmountMap; + /** + * 回收后物品的数量 + */ + private Map newRecyclingItmeAmountMap; public List getTousseDefinitions() { return tousseDefinitions; } @@ -37,5 +50,38 @@ Set recyclingItemIdOfhaveErrorOrDamage) { this.recyclingItemIdOfhaveErrorOrDamage = recyclingItemIdOfhaveErrorOrDamage; } + + public boolean isEnableDisplayRecyclingTimeOfrecyclingRecordList() { + return enableDisplayRecyclingTimeOfrecyclingRecordList; + } + + public void setEnableDisplayRecyclingTimeOfrecyclingRecordList( + boolean enableDisplayRecyclingTimeOfrecyclingRecordList) { + this.enableDisplayRecyclingTimeOfrecyclingRecordList = enableDisplayRecyclingTimeOfrecyclingRecordList; + } + + public Map getOldRecyclingItmeAmountMap() { + if(oldRecyclingItmeAmountMap == null){ + oldRecyclingItmeAmountMap = new HashMap(); + } + return oldRecyclingItmeAmountMap; + } + + public void setOldRecyclingItmeAmountMap( + Map oldRecyclingItmeAmountMap) { + this.oldRecyclingItmeAmountMap = oldRecyclingItmeAmountMap; + } + + public Map getNewRecyclingItmeAmountMap() { + if(newRecyclingItmeAmountMap == null){ + newRecyclingItmeAmountMap = new HashMap(); + } + return newRecyclingItmeAmountMap; + } + + public void setNewRecyclingItmeAmountMap( + Map newRecyclingItmeAmountMap) { + this.newRecyclingItmeAmountMap = newRecyclingItmeAmountMap; + } } Index: ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/recyclingrecord/RecyclingDateDetails.java =================================================================== diff -u --- ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/recyclingrecord/RecyclingDateDetails.java (revision 0) +++ ssts-basedata/src/main/java/com/forgon/disinfectsystem/entity/recyclingrecord/RecyclingDateDetails.java (revision 37885) @@ -0,0 +1,74 @@ +package com.forgon.disinfectsystem.entity.recyclingrecord; + +import java.util.Date; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Index; +import javax.persistence.Table; + +import org.hibernate.annotations.Cache; +import org.hibernate.annotations.CacheConcurrencyStrategy; +import org.hibernate.annotations.DynamicInsert; +import org.hibernate.annotations.DynamicUpdate; +/** + * @author zc.li + * 2024年4月11日 + * 回收物品的每次回收的信息 SZSDSRMYY-128 + */ +@Entity +@DynamicInsert(false) +@DynamicUpdate(true) +@Table(indexes = {@Index(columnList = "recyclingItemId", name = "rdd_recyclingItemId_index")}) +@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) +public class RecyclingDateDetails { + private Long id; + /** + * 所属回收项 + */ + private Long recyclingItemId; + /** + * 回收时间 + */ + private Date recyclingDate; + /** + * 本次回收数量 + */ + private Integer amount; + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getRecyclingItemId() { + return recyclingItemId; + } + + public void setRecyclingItemId(Long recyclingItemId) { + this.recyclingItemId = recyclingItemId; + } + + public Date getRecyclingDate() { + return recyclingDate; + } + + public void setRecyclingDate(Date recyclingDate) { + this.recyclingDate = recyclingDate; + } + + public Integer getAmount() { + return amount; + } + + public void setAmount(Integer amount) { + this.amount = amount; + } + +} Index: ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManagerImpl.java =================================================================== diff -u -r37876 -r37885 --- ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManagerImpl.java (.../RecyclingRecordManagerImpl.java) (revision 37876) +++ ssts-recyclingrecord/src/main/java/com/forgon/disinfectsystem/recyclingrecord/service/RecyclingRecordManagerImpl.java (.../RecyclingRecordManagerImpl.java) (revision 37885) @@ -91,6 +91,7 @@ import com.forgon.disinfectsystem.entity.recycledepartmentgroup.DepartmentGroup; import com.forgon.disinfectsystem.entity.recyclingapplication.RecyclingApplication; import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingBasketSequence; +import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingDateDetails; import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingItem; import com.forgon.disinfectsystem.entity.recyclingrecord.RecyclingRecord; import com.forgon.disinfectsystem.entity.tousseitem.MaterialModifyRecord; @@ -1948,6 +1949,10 @@ if(confirmation && RecyclingRecord.STATUS_SAVED.equals(record.getStatus())){ throw new RuntimeException("该回收记录已被修改,请刷新后再操作!"); } + RecyclingSumInfoVo recyclingSumInfoVo = setRecyclingSumInfoVoInfo(); + if(recyclingSumInfoVo.isEnableDisplayRecyclingTimeOfrecyclingRecordList()){ + loopSetOldRecyclingItemInfo(record, recyclingSumInfoVo); + } //放入篮筐的物品 List basketItemJson = JSONUtil.fromJson(params.optJSONArray("tousseJson"), RecyclingBasketItemVo.class) ; //校验点击清点确认按钮时,篮筐中的物品 @@ -1975,7 +1980,7 @@ } } } - RecyclingSumInfoVo recyclingSumInfoVo = new RecyclingSumInfoVo(); + setHaveErrorOrDamageInfo(record, recyclingSumInfoVo); if(!DatabaseUtil.isPoIdValid(record.getId())){ recyclingContext.setNewRecyclingRecord(true); @@ -2174,6 +2179,12 @@ Set taskGroupOfModifiedNumOfTousse = new HashSet();//被修改数量的器械包的任务组 //设置回收物品 setRecylingItems(recyclingContext, record, tousseItemJson,tousseDefinitions,urgentTousseItems,tousseDefIdTousseItemVoMap,taskGroupOfModifiedNumOfTousse, cameraPhotoInfo); + if(recyclingSumInfoVo.isEnableDisplayRecyclingTimeOfrecyclingRecordList()){ + loopSetNewRecyclingItemInfo(record, recyclingSumInfoVo); + setRecyclingDateDetails(recyclingSumInfoVo); + recyclingSumInfoVo.setNewRecyclingItmeAmountMap(null); + recyclingSumInfoVo.setOldRecyclingItmeAmountMap(null); + } //设置回收误差、器械报损 setMaterialErrorDamageDetail(record, errorDamageDetail,confirmation,recyclingSumInfoVo); //设置回收记录状态 @@ -2745,7 +2756,7 @@ setUrgentTousseItems(record, urgentTousseItems); //丢失项 JSONArray errorDamageDetailArr = params.optJSONArray("errorDamageDetail"); - RecyclingSumInfoVo recyclingSumInfoVo = new RecyclingSumInfoVo(); + RecyclingSumInfoVo recyclingSumInfoVo = setRecyclingSumInfoVoInfo(); setHaveErrorOrDamageInfo(record, recyclingSumInfoVo); List errorDamageDetail = JSONUtil.fromJson(errorDamageDetailArr,MaterialErrorDamageDetailVo.class); //是否确认 @@ -8095,6 +8106,11 @@ tdIdOfPacked.addAll(foreignTdIdOfPacked); } } + Map recyclingDateDetailsMap = null;//回收物品的时间map key:RecyclingItem.id value:[{amount:1,recyclingDate:2024-01-01 00:00}] + boolean enableDisplayRecyclingTimeOfrecyclingRecordList = CssdUtils.getSystemSetConfigByNameBool("enableDisplayRecyclingTimeOfrecyclingRecordList", false); + if(enableDisplayRecyclingTimeOfrecyclingRecordList){ + recyclingDateDetailsMap = setRecyclingDateDetailsArr(recyclingRecordId); + } for (int i = 0; i < items.size(); i++) { JSONObject item = (JSONObject)items.get(i); Long tousseDefinitionId = item.optLong("tousseDefinitionId"); @@ -8105,6 +8121,13 @@ item.put("packed", false); } } + if(enableDisplayRecyclingTimeOfrecyclingRecordList && MapUtils.isNotEmpty(recyclingDateDetailsMap)){ + JSONArray arr = recyclingDateDetailsMap.get(item.optLong("id")); + if(CollectionUtils.isNotEmpty(arr)){ + item.put("recyclingDateDetails", recyclingDateDetailsMap.get(item.optLong("id"))); + item.put("lastRecyclingDate", arr.getJSONObject(0).optString("recyclingDate")); + } + } if(DatabaseUtil.isPoIdValid(tousseDefinitionId) && tdMap.containsKey(tousseDefinitionId)){ item.put("taskGroup", tdMap.get(tousseDefinitionId).getTaskGroup()); } @@ -10601,4 +10624,156 @@ } } } + /** + * 获取原回收记录中物品的数量 + * @param record + * @param recyclingSumInfoVo + */ + private void loopSetOldRecyclingItemInfo(RecyclingRecord record, RecyclingSumInfoVo recyclingSumInfoVo){ + if(record == null || CollectionUtils.isEmpty(record.getItems())){ + return; + } + for (RecyclingItem ri : record.getItems()) { + recyclingSumInfoVo.getOldRecyclingItmeAmountMap().put(ri.getId(), ri.getAmount()); + } + } + /** + * 获取保存后回收物品的数量信息 + * @param record 回收记录 + * @param recyclingSumInfoVo + */ + private void loopSetNewRecyclingItemInfo(RecyclingRecord record, RecyclingSumInfoVo recyclingSumInfoVo){ + if(record == null || CollectionUtils.isEmpty(record.getItems())){ + return; + } + for (RecyclingItem ri : record.getItems()) { + recyclingSumInfoVo.getNewRecyclingItmeAmountMap().put(ri.getId(), ri.getAmount()); + } + } + /** + * 设置回收汇总的基本信息 + * @param recyclingSumInfoVo + */ + private RecyclingSumInfoVo setRecyclingSumInfoVoInfo(){ + RecyclingSumInfoVo recyclingSumInfoVo = new RecyclingSumInfoVo(); + recyclingSumInfoVo.setEnableDisplayRecyclingTimeOfrecyclingRecordList(CssdUtils.getSystemSetConfigByNameBool("enableDisplayRecyclingTimeOfrecyclingRecordList", false)); + return recyclingSumInfoVo; + } + /** + * 批量插入回收记录中物品的回收时间信息 + * @param updateArr 物品数量修改信息 + */ + private void batchInsertRecyclingDateDetails(JSONArray updateArr){ + if(CollectionUtils.isEmpty(updateArr)){ + return; + } + String idColumnName = null; + String idColumnValue = null; + if(DatabaseUtil.isOracle(dbConnection.getDatabase())){ + idColumnName = "id,"; + idColumnValue = "hibernate_sequence.nextval,"; + }else{ + idColumnName = ""; + idColumnValue = ""; + } + Timestamp newDate = new Timestamp(new Date().getTime()); + StringBuffer sql = new StringBuffer(); + sql.append("insert into "); + sql.append(RecyclingDateDetails.class.getSimpleName()); + sql.append(" ("); + sql.append(idColumnName); + sql.append(" amount,r.recyclingItemId,recyclingDate) values ("); + sql.append(idColumnValue); + sql.append(" ?,?,?)"); + jdbcTemplate.batchUpdate(sql.toString(), new BatchPreparedStatementSetter() { + @Override + public void setValues(PreparedStatement ps, int i) throws SQLException { + JSONObject obj = updateArr.getJSONObject(i); + ps.setInt(1, obj.optInt("amount", 0)); + ps.setLong(2, obj.optLong("recyclingItemId")); + ps.setTimestamp(3, newDate); + } + + @Override + public int getBatchSize() { + return updateArr.size(); + } + }); + } + /** + * 设置回收物品的回收时间详情 + * @param recyclingSumInfoVo 回收汇总信息 + */ + private void setRecyclingDateDetails(RecyclingSumInfoVo recyclingSumInfoVo){ + //获取被修改的数量 + JSONArray updateArr = new JSONArray(); + if(MapUtils.isNotEmpty(recyclingSumInfoVo.getNewRecyclingItmeAmountMap())){ + for (Entry newEntry : recyclingSumInfoVo.getNewRecyclingItmeAmountMap().entrySet()) { + Long newRecyclingItemId = newEntry.getKey(); + Integer newAmount = newEntry.getValue(); + if(recyclingSumInfoVo.getOldRecyclingItmeAmountMap().containsKey(newRecyclingItemId)){ + newAmount -= recyclingSumInfoVo.getOldRecyclingItmeAmountMap().get(newRecyclingItemId); + } + if(newAmount != 0){ + JSONObject obj = new JSONObject(); + obj.put("amount", newAmount); + obj.put("recyclingItemId", newRecyclingItemId); + updateArr.add(obj); + } + } + } + //获取被删除的回收项 + List delRecyclingItemIds = new ArrayList(); + if(MapUtils.isNotEmpty(recyclingSumInfoVo.getOldRecyclingItmeAmountMap())){ + for (Long oldRecyclingItemId : recyclingSumInfoVo.getOldRecyclingItmeAmountMap().keySet()) { + if(!recyclingSumInfoVo.getNewRecyclingItmeAmountMap().containsKey(oldRecyclingItemId)){ + delRecyclingItemIds.add(oldRecyclingItemId); + } + } + } + batchInsertRecyclingDateDetails(updateArr); + if(delRecyclingItemIds.size() > 0){ + String sql = "delete from RecyclingDateDetails where 1=1 " + + SqlUtils.getInLongListSql("recyclingItemId", delRecyclingItemIds); + objectDao.excuteSQL(sql); + } + } + /** + * 获取回收记录里物品每次的回收时间 + * @param recyclingRecordId 回收记录id + * @return key:RecyclingItem.id value:[{amount:1,recyclingDate:2024-01-01 00:00}] + */ + private Map setRecyclingDateDetailsArr(Long recyclingRecordId){ + Map recyclingDateDetailsArr = new HashMap(); + ResultSet rs = null; + try { + StringBuffer sbf = new StringBuffer(); + sbf.append("select rd.recyclingItemId,rd.amount,rd.recyclingDate from "); + sbf.append(RecyclingDateDetails.class.getSimpleName()); + sbf.append(" rd where exists (select 1 from "); + sbf.append(RecyclingItem.class.getSimpleName()); + sbf.append(" ri where ri.recyclingRecord_id="+ recyclingRecordId +" and rd.recyclingItemId=ri.id ) order by rd.recyclingItemId, rd.recyclingDate desc"); + rs = objectDao.executeSql(sbf.toString()); + while (rs.next()){ + Long recyclingItemId = rs.getLong("recyclingItemId"); + JSONArray arr = recyclingDateDetailsArr.get(recyclingItemId); + if(arr == null){ + arr = new JSONArray(); + } + JSONObject item = new JSONObject(); + Date recyclingDate = rs.getTimestamp("recyclingDate"); + if(recyclingDate != null){ + item.put("recyclingDate", DateTools.YMDHMFORMAT.get().format(recyclingDate)); + } + item.put("amount", rs.getInt("amount")); + arr.add(item); + recyclingDateDetailsArr.put(recyclingItemId, arr); + } + } catch (SQLException e) { + e.printStackTrace(); + }finally { + DatabaseUtil.closeResultSetAndStatement(rs); + } + return recyclingDateDetailsArr; + } }