|  |  |  | 
|---|
|  |  |  | package com.ld.igds.inout.service.impl; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.bstek.dorado.data.entity.EntityUtils; | 
|---|
|  |  |  | import com.ld.igds.check.dto.CheckItemData; | 
|---|
|  |  |  | import com.ld.igds.common.CoreCommonService; | 
|---|
|  |  |  | import com.ld.igds.constant.BizType; | 
|---|
|  |  |  | import com.ld.igds.constant.Constant; | 
|---|
|  |  |  | import com.ld.igds.constant.RedisConst; | 
|---|
|  |  |  | import com.ld.igds.data.CommonData; | 
|---|
|  |  |  | import com.ld.igds.data.Page; | 
|---|
|  |  |  | import com.ld.igds.inout.InoutConstant; | 
|---|
|  |  |  | import com.ld.igds.inout.dto.InoutCheckData; | 
|---|
|  |  |  | import com.ld.igds.inout.dto.InoutCheckParam; | 
|---|
|  |  |  | import com.ld.igds.inout.dto.InoutData; | 
|---|
|  |  |  | import com.ld.igds.inout.dto.InoutParam; | 
|---|
|  |  |  | import com.ld.igds.inout.mapper.InoutCheckMapper; | 
|---|
|  |  |  | import com.ld.igds.inout.mapper.InoutRecordMapper; | 
|---|
|  |  |  | import com.ld.igds.inout.service.InoutService; | 
|---|
|  |  |  | import com.ld.igds.io.constant.OrderRespEnum; | 
|---|
|  |  |  | import com.ld.igds.models.Depot; | 
|---|
|  |  |  | import com.ld.igds.models.InoutLossOver; | 
|---|
|  |  |  | import com.ld.igds.models.InoutPrice; | 
|---|
|  |  |  | import com.ld.igds.util.ContextUtil; | 
|---|
|  |  |  | import com.ld.igds.util.DateUtil; | 
|---|
|  |  |  | import com.ld.igds.util.RedisUtil; | 
|---|
|  |  |  | import com.ld.igds.websocket.WebSocketPacket; | 
|---|
|  |  |  | import com.ld.igds.websocket.WebSocketServer; | 
|---|
|  |  |  | import lombok.extern.slf4j.Slf4j; | 
|---|
|  |  |  | import org.apache.commons.lang3.StringUtils; | 
|---|
|  |  |  | import org.apache.commons.lang3.time.DateFormatUtils; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import javax.annotation.Resource; | 
|---|
|  |  |  | import java.util.*; | 
|---|
|  |  |  | import java.util.concurrent.ExecutorService; | 
|---|
|  |  |  | import java.util.concurrent.Executors; | 
|---|
|  |  |  | import java.util.concurrent.FutureTask; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Slf4j | 
|---|
|  |  |  | @Component | 
|---|
|  |  |  | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private InoutRecordMapper inoutMapper; | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private RedisUtil redisUtil; | 
|---|
|  |  |  | private InoutCheckMapper inoutCheckMapper; | 
|---|
|  |  |  | @Resource | 
|---|
|  |  |  | private CoreCommonService commonService; | 
|---|
|  |  |  | private RedisUtil redisUtil; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public InoutData inoutProgressQuery(InoutParam param) throws Exception { | 
|---|
|  |  |  | if (StringUtils.isEmpty(param.getCompanyId())) { | 
|---|
|  |  |  | param.setCompanyId(ContextUtil.getCompanyId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 首先从缓存中获取,如果没有则从数据库获取 | 
|---|
|  |  |  | InoutData result = this.getFromInoutCache(param); | 
|---|
|  |  |  | if (null != result) { | 
|---|
|  |  |  | 
|---|
|  |  |  | return "没有获取到被删除数据的ID,无法删除!"; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 缓存中删除 | 
|---|
|  |  |  | this.delInoutFromCache(param.getDeptId(), param.getType(), param.getId(), false); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | inoutMapper.deleteData(param); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | delFromCache(param.getDeptId(), param.getType(), param.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public String inoutStop(InoutParam param) { | 
|---|
|  |  |  | public String inoutStop(InoutParam param) throws Exception { | 
|---|
|  |  |  | if (StringUtils.isEmpty(param.getCompanyId())) { | 
|---|
|  |  |  | param.setCompanyId(ContextUtil.getCompanyId()); | 
|---|
|  |  |  | param.setCompanyId(ContextUtil.getDefaultCompanyId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | // 缓存中删除 | 
|---|
|  |  |  | this.delInoutFromCache(param.getDeptId(), param.getType(), param.getId(), false); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | param.setProgress(InoutConstant.PROGRESS_RECORD); | 
|---|
|  |  |  | param.setRecordStatus(InoutConstant.RECORD_STATUS_ERROR); | 
|---|
|  |  |  | param.setRecordStatus(InoutConstant.RECORD_STATUS_DEL); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 缓存中删除 | 
|---|
|  |  |  | delFromCache(param.getDeptId(), param.getType(), param.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | inoutMapper.inoutStop(param); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public String insertData(InoutData data) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | data.setUpdateTime(new Date()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (StringUtils.isEmpty(data.getCompanyId())) { | 
|---|
|  |  |  | data.setCompanyId(ContextUtil.getCompanyId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (null == data.getDeptId()) { | 
|---|
|  |  |  | data.setDeptId(ContextUtil.subDeptId(null)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 获取当前仓库的实际库存 | 
|---|
|  |  |  | if (StringUtils.isNotEmpty(data.getDepotId())) { | 
|---|
|  |  |  | if (null == data.getFoodYear() || null == data.getFoodType()) { | 
|---|
|  |  |  | Depot depot = commonService.getCacheDepot(data.getCompanyId(), data.getDepotId()); | 
|---|
|  |  |  | if (null == data.getFoodYear()) { | 
|---|
|  |  |  | data.setFoodYear(depot.getFoodYear()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (null == data.getFoodType()) { | 
|---|
|  |  |  | data.setFoodType(depot.getFoodType()); | 
|---|
|  |  |  | String id = this.createId(data.getRegisterTime(), data.getCompanyId()); | 
|---|
|  |  |  | if (StringUtils.isEmpty(data.getId())) { | 
|---|
|  |  |  | if (InoutConstant.TYPE_IN.equals(data.getType())) { | 
|---|
|  |  |  | data.setId("R_" + id); | 
|---|
|  |  |  | } else if (InoutConstant.TYPE_OUT.equals(data.getType())) { | 
|---|
|  |  |  | data.setId("C_" + id); | 
|---|
|  |  |  | } else if (Constant.LOSS_OVER_OVER.equals(data.getType())) { | 
|---|
|  |  |  | data.setId("R_" + id); | 
|---|
|  |  |  | } else if (Constant.LOSS_OVER_LOSS.equals(data.getType())) { | 
|---|
|  |  |  | data.setId("C_" + id); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | data.setId("M_" + id); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (StringUtils.isEmpty(data.getCheckId())) { | 
|---|
|  |  |  | data.setCheckId(id); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (null == data.getRegisterTime()) { | 
|---|
|  |  |  | data.setRegisterTime(new Date()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (null == data.getUserName()) { | 
|---|
|  |  |  | data.setUserName(""); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String id = this.createId(data.getRegisterTime(), data.getCompanyId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (StringUtils.isEmpty(data.getId())) { | 
|---|
|  |  |  | if (InoutConstant.TYPE_IN.equals(data.getType())) { | 
|---|
|  |  |  | data.setId("R_" + id); | 
|---|
|  |  |  | } else if (InoutConstant.TYPE_OUT.equals(data.getType())) { | 
|---|
|  |  |  | data.setId("C_" + id); | 
|---|
|  |  |  | } else if (Constant.LOSS_OVER_OVER.equals(data.getType())) { | 
|---|
|  |  |  | data.setId("R_" + id); | 
|---|
|  |  |  | } else if (Constant.LOSS_OVER_LOSS.equals(data.getType())) { | 
|---|
|  |  |  | data.setId("C_" + id); | 
|---|
|  |  |  | InoutData newData; | 
|---|
|  |  |  | if (EntityUtils.isEntity(data)) { | 
|---|
|  |  |  | newData = new InoutData(); | 
|---|
|  |  |  | BeanUtils.copyProperties(data, newData, new String[]{"checkItems", "files"}); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | data.setId("M_" + id); | 
|---|
|  |  |  | newData = data; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (StringUtils.isEmpty(data.getCheckId())) { | 
|---|
|  |  |  | data.setCheckId(id); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (null == data.getDeptId()) { | 
|---|
|  |  |  | data.setDeptId(ContextUtil.subDeptId(null)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (null == data.getUserName()) { | 
|---|
|  |  |  | data.setUserName(""); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | inoutMapper.insertData(newData); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | updateInoutCache(newData); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | log.error("------------出入库执行保存出错---{}", e); | 
|---|
|  |  |  | return "后台异常:" + e.getMessage(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | inoutMapper.insertData(data); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 如果不是手动补录的数据,添加到缓存中 | 
|---|
|  |  |  | if (!InoutConstant.RECORD_STATUS_ADD.equals(data.getRecordStatus())) { | 
|---|
|  |  |  | this.addInoutCache(data); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public String updateData(InoutData data) throws Exception { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | data.setUpdateTime(new Date()); | 
|---|
|  |  |  | if (StringUtils.isEmpty(data.getCompanyId())) { | 
|---|
|  |  |  | data.setCompanyId(ContextUtil.getCompanyId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | inoutMapper.updateData(newData); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //如果是完成状态不在进行后期处理,单独走complete方法 | 
|---|
|  |  |  | if (InoutConstant.PROGRESS_RECORD.equals(newData.getProgress())) { | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | //更新缓存 | 
|---|
|  |  |  | updateInoutCache(newData); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public String updateDataByHandle(InoutData data) { | 
|---|
|  |  |  | data.setUpdateTime(new Date()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (StringUtils.isEmpty(data.getCompanyId())) { | 
|---|
|  |  |  | data.setCompanyId(ContextUtil.getCompanyId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | InoutData newData; | 
|---|
|  |  |  | if (EntityUtils.isEntity(data)) { | 
|---|
|  |  |  | newData = new InoutData(); | 
|---|
|  |  |  | BeanUtils.copyProperties(data, newData, new String[]{"checkItems", "files"}); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | newData = data; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 更新緩存 | 
|---|
|  |  |  | if (InoutConstant.PROGRESS_RECORD.equals(newData.getProgress())) { | 
|---|
|  |  |  | this.delInoutFromCache(newData.getDeptId(), newData.getType(), newData.getId(), true); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | this.updateInoutCache(newData); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | inoutMapper.updateDataByHandle(newData); | 
|---|
|  |  |  | InoutParam param = new InoutParam(); | 
|---|
|  |  |  | param.setId(newData.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //更新缓存 | 
|---|
|  |  |  | updateInoutCache(inoutMapper.inoutQueryById(param)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | param.setUserId("%" + param.getUserId() + "%"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (null != param.getRecordStatus() && InoutConstant.RECORD_STATUS_NORMAL.equals(param.getRecordStatus())) { | 
|---|
|  |  |  | param.setRecordStatus(null); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<InoutData> records = inoutMapper.pageRecordData(page, param); | 
|---|
|  |  |  | //判断入库重量是否为空,为空则赋值结算重量 | 
|---|
|  |  |  | if(records != null){ | 
|---|
|  |  |  | if (records != null) { | 
|---|
|  |  |  | for (InoutData record : records) { | 
|---|
|  |  |  | if(record.getRecordWeight() == null || record.getRecordWeight() == 0.0){ | 
|---|
|  |  |  | if (record.getRecordWeight() == null || record.getRecordWeight() == 0.0) { | 
|---|
|  |  |  | record.setRecordWeight(record.getSettleWeight()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | return records; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //    @Override | 
|---|
|  |  |  | //    public InoutData getLastRecord(InoutParam param) { | 
|---|
|  |  |  | //        return inoutMapper.getLastRecord(param); | 
|---|
|  |  |  | //    } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //    @Override | 
|---|
|  |  |  | //    public int updateCuStorage(InoutParam param) { | 
|---|
|  |  |  | //        return inoutMapper.updateCuStorage(param); | 
|---|
|  |  |  | //    } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public String validate(String intelCard, String plateNum) { | 
|---|
|  |  |  | InoutParam param = new InoutParam(); | 
|---|
|  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public String toComplete(InoutParam param) throws Exception { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (null == param.getCompanyId()) { | 
|---|
|  |  |  | param.setCompanyId(ContextUtil.getCompanyId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | param.setUpdateTime(new Date()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (null == param.getFoodType()) { | 
|---|
|  |  |  | // 根据仓库信息获取缓存 | 
|---|
|  |  |  | Depot depot = commonService.getCacheDepot(param.getCompanyId(), param.getDepotId()); | 
|---|
|  |  |  | param.setFoodType(depot.getFoodType()); | 
|---|
|  |  |  | if (null == param.getCompanyId()) { | 
|---|
|  |  |  | param.setCompanyId(ContextUtil.getDefaultCompanyId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 清除缓存 | 
|---|
|  |  |  | this.delInoutFromCache(param.getDeptId(), param.getType(), param.getId(), true); | 
|---|
|  |  |  | //        this.delFromCache(param.getDeptId(), param.getType(), param.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | inoutMapper.toComplete(param); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public String quickComplete(InoutData data) throws Exception { | 
|---|
|  |  |  | if (null == data.getCompanyId()) { | 
|---|
|  |  |  | data.setCompanyId(ContextUtil.getCompanyId()); | 
|---|
|  |  |  | data.setCompanyId(ContextUtil.getDefaultCompanyId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (null == data.getCompleteTime()) { | 
|---|
|  |  |  | data.setCompleteTime(new Date()); | 
|---|
|  |  |  | 
|---|
|  |  |  | if (null == data.getEmptyWeightTime()) { | 
|---|
|  |  |  | data.setEmptyWeightTime(new Date()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //调整时间差 | 
|---|
|  |  |  | if (InoutConstant.TYPE_IN.equals(data.getType())) { | 
|---|
|  |  |  | 
|---|
|  |  |  | // 设置流程结束 | 
|---|
|  |  |  | data.setProgress(InoutConstant.PROGRESS_RECORD); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (null == data.getFoodType()) { | 
|---|
|  |  |  | // 根据仓库信息获取缓存 | 
|---|
|  |  |  | Depot depot = commonService.getCacheDepot(data.getCompanyId(), data.getDepotId()); | 
|---|
|  |  |  | data.setFoodType(depot.getFoodType()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 清除缓存 | 
|---|
|  |  |  | this.delInoutFromCache(data.getDeptId(), data.getType(), data.getId(), false); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //执行更新 | 
|---|
|  |  |  | inoutMapper.updateData(data); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //更新缓存 | 
|---|
|  |  |  | updateInoutCache(data); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public void addInoutCache(InoutData data) { | 
|---|
|  |  |  | data.setFiles(null); | 
|---|
|  |  |  | data.setCheckItems(null); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | this.setInoutCache(data.getDeptId(), data); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 推送到大屏 | 
|---|
|  |  |  | List<InoutData> list = this.getListInoutCache(data.getDeptId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | this.notifyToScreen(data.getDeptId(), list, null); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public void updateInoutCache(InoutData data) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | data.setFiles(null); | 
|---|
|  |  |  | data.setCheckItems(null); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | this.setInoutCache(data.getDeptId(), data); | 
|---|
|  |  |  | if (InoutConstant.PROGRESS_RECORD.equals(data.getProgress())) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 推送到大屏 | 
|---|
|  |  |  | List<InoutData> list = this.getListInoutCache(data.getDeptId()); | 
|---|
|  |  |  | List<InoutData> completeList = this.getCompleteListInoutCache(data.getDeptId()); | 
|---|
|  |  |  | delFromCache(data.getDeptId(), data.getType(), data.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | this.notifyToScreen(data.getCompanyId(), list, completeList); | 
|---|
|  |  |  | setCompleteInoutCache(data.getDeptId(), data); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | setInoutCache(data.getDeptId(), data); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public void delInoutFromCache(String deptId, String type, String id, boolean addToComplete) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public void delFromCache(String deptId, String type, String id) { | 
|---|
|  |  |  | if (StringUtils.isEmpty(deptId)) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | if (StringUtils.isEmpty(id)) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //删除未完成流程的缓存 | 
|---|
|  |  |  | //从未完成列表中删除 | 
|---|
|  |  |  | String key = this.buildInoutKey(deptId, InoutConstant.KEY_INOUT_LIST, type, id); | 
|---|
|  |  |  | InoutData inoutData = (InoutData) redisUtil.get(key); | 
|---|
|  |  |  | redisUtil.del(key); | 
|---|
|  |  |  | List<InoutData> list = this.getListInoutCache(deptId); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //删除已完成流程的缓存 | 
|---|
|  |  |  | key = this.buildInoutKey(deptId, InoutConstant.KEY_INOUT_COMPLETE_LIST, type, id); | 
|---|
|  |  |  | redisUtil.del(key); | 
|---|
|  |  |  | List<InoutData> completeList = this.getCompleteListInoutCache(deptId); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (addToComplete) { | 
|---|
|  |  |  | addInoutCompleteCache(inoutData); | 
|---|
|  |  |  | completeList = this.getCompleteListInoutCache(deptId); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 通知到大屏 | 
|---|
|  |  |  | notifyToScreen(deptId, list, completeList); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 添加到已经完成的队列中 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param data | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void addInoutCompleteCache(InoutData data) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (null == data.getCompleteTime()) { | 
|---|
|  |  |  | data.setCompleteTime(new Date()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (!InoutConstant.PROGRESS_RECORD.equals(data.getProgress())) { | 
|---|
|  |  |  | data.setProgress(InoutConstant.PROGRESS_RECORD); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | this.setCompleteInoutCache(data.getDeptId(), data); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<InoutData> getListInoutCache(String deptId) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String pattern = RedisConst.buildKey(deptId, InoutConstant.KEY_INOUT_LIST); | 
|---|
|  |  |  | Set<String> keys = redisUtil.keys(pattern); | 
|---|
|  |  |  | if (null == keys || keys.isEmpty()) { | 
|---|
|  |  |  | 
|---|
|  |  |  | if (StringUtils.isEmpty(param.getDeptId())) { | 
|---|
|  |  |  | param.setDeptId(ContextUtil.subDeptId(null)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<InoutData> list = getListInoutCache(param.getDeptId()); | 
|---|
|  |  |  | if (null == list || list.isEmpty()) | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public void initInoutScreen(String deptId) { | 
|---|
|  |  |  | if (null == deptId) { | 
|---|
|  |  |  | deptId = ContextUtil.subDeptId(null); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<InoutData> curList = this.getListInoutCache(deptId); | 
|---|
|  |  |  | List<InoutData> complateList = this.getCompleteListInoutCache(deptId); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | notifyToScreen(deptId, curList, complateList); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public void notifyWeb(InoutData result) { | 
|---|
|  |  |  | // 如果当前为满车称重执行推送 | 
|---|
|  |  |  | if (result.getType().equals(InoutConstant.TYPE_IN) && result.getProgress().equals(InoutConstant.PROGRESS_WEIGHT_FULL)) { | 
|---|
|  |  |  | WebSocketPacket packet = new WebSocketPacket(); | 
|---|
|  |  |  | packet.setBizType(BizType.SCREEN_CHECK.getCode()); | 
|---|
|  |  |  | packet.setCompanyId(result.getCompanyId()); | 
|---|
|  |  |  | packet.setOrderResp(OrderRespEnum.MSG_SUCCESS.getCode()); | 
|---|
|  |  |  | packet.setData(result); | 
|---|
|  |  |  | packet.setBizTag(InoutConstant.PROGRESS_WEIGHT_FULL); | 
|---|
|  |  |  | log.debug("----向化验大屏推送满车称重信息 ----{}", result.getPlateNum()); | 
|---|
|  |  |  | WebSocketServer.sendByBizTag(packet); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public InoutData getLastRecord(String companyId, String depotId) { | 
|---|
|  |  |  | InoutParam param = new InoutParam(); | 
|---|
|  |  |  | param.setCompanyId(companyId); | 
|---|
|  |  |  | param.setDepotId(depotId); | 
|---|
|  |  |  | public InoutData getLastRecord(InoutParam param) { | 
|---|
|  |  |  | return inoutMapper.getLastRecord(param); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | public String addInoutDataByLossOver(InoutData data) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 获取上一车的流水数据 | 
|---|
|  |  |  | InoutData inoutData = this.getLastRecord(data.getCompanyId(), data.getDepotId()); | 
|---|
|  |  |  | //    InoutData inoutData = this.getLastRecord(data.getCompanyId(), data.getDepotId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //        // 设置流水的库存 | 
|---|
|  |  |  | //        if (InoutConstant.TYPE_IN.equals(inoutData.getType())) { | 
|---|
|  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public void delInoutDataByLossOver(InoutParam param) { | 
|---|
|  |  |  | inoutMapper.deleteData(param); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public void setCheckCache(InoutData data) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String cacheKey = RedisConst.buildKey(data.getCompanyId(), data.getCheckId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //化验结果存入缓存3天 | 
|---|
|  |  |  | redisUtil.set(cacheKey, data.getCheckItems(), 60 * 60 * 24 * 3); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @SuppressWarnings("unchecked") | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<CheckItemData> getCheckCache(String companyId, String checkId) { | 
|---|
|  |  |  | String cacheKey = RedisConst.buildKey(companyId, checkId); | 
|---|
|  |  |  | return (List<CheckItemData>) redisUtil.get(cacheKey); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | 
|---|
|  |  |  | return result.getNumValue1(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public int checkExist(InoutParam param) { | 
|---|
|  |  |  | return inoutMapper.checkExist(param); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 未完成流程存入缓存 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | 
|---|
|  |  |  | * @param data | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | private void setInoutCache(String deptId, InoutData data) { | 
|---|
|  |  |  | String key = this.buildInoutKey(deptId, | 
|---|
|  |  |  | InoutConstant.KEY_INOUT_LIST, data.getType(), data.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String key = this.buildInoutKey(deptId, InoutConstant.KEY_INOUT_LIST, data.getType(), data.getId()); | 
|---|
|  |  |  | redisUtil.set(key, data, InoutConstant.KEY_INOUT_LIST_TIME); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | private void setCompleteInoutCache(String deptId, InoutData data) { | 
|---|
|  |  |  | String key = this.buildInoutKey(deptId, InoutConstant.KEY_INOUT_COMPLETE_LIST, data.getType(), data.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //设置缓存到第二天凌晨(计算当前时间到第二天凌晨的时间差秒数) | 
|---|
|  |  |  | redisUtil.set(key, data, DateUtil.getNowToNextDaySeconds()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 推送到大屏,判断只有当大屏在线时候才处理当前逻辑,避免页面卡顿,调用子任务完成推送 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param deptId | 
|---|
|  |  |  | * @param curList      未完成流程个数 | 
|---|
|  |  |  | * @param completeList 已经完成流程个数 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | private void notifyToScreen(String deptId, List<InoutData> curList, | 
|---|
|  |  |  | List<InoutData> completeList) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (null == WebSocketServer.contextOnLineMap.get(BizType.SCREEN | 
|---|
|  |  |  | .getCode())) { | 
|---|
|  |  |  | WebSocketServer.contextOnLineMap.put(BizType.SCREEN.getCode(), | 
|---|
|  |  |  | false); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (null == WebSocketServer.contextOnLineMap.get(BizType.SCREEN_INOUT | 
|---|
|  |  |  | .getCode())) { | 
|---|
|  |  |  | WebSocketServer.contextOnLineMap.put( | 
|---|
|  |  |  | BizType.SCREEN_INOUT.getCode(), false); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (null == WebSocketServer.contextOnLineMap.get(BizType.SCREEN_CHECK | 
|---|
|  |  |  | .getCode())) { | 
|---|
|  |  |  | WebSocketServer.contextOnLineMap.put( | 
|---|
|  |  |  | BizType.SCREEN_CHECK.getCode(), false); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (WebSocketServer.contextOnLineMap.get(BizType.SCREEN.getCode()) | 
|---|
|  |  |  | || WebSocketServer.contextOnLineMap.get(BizType.SCREEN_INOUT | 
|---|
|  |  |  | .getCode()) | 
|---|
|  |  |  | || WebSocketServer.contextOnLineMap.get(BizType.SCREEN_CHECK | 
|---|
|  |  |  | .getCode())) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (null == completeList) { | 
|---|
|  |  |  | completeList = this.getCompleteListInoutCache(deptId); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 创建一个子任务进行推送信息 | 
|---|
|  |  |  | FutureTask<String> futureTask = new FutureTask<>( | 
|---|
|  |  |  | new NotifyScreenTask(curList, completeList, deptId)); | 
|---|
|  |  |  | ExecutorService executorService = Executors.newCachedThreadPool(); | 
|---|
|  |  |  | executorService.submit(futureTask); | 
|---|
|  |  |  | executorService.shutdown(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | 
|---|
|  |  |  | public String buildInoutKey(String deptId, String key, String type, String bizId) { | 
|---|
|  |  |  | return Constant.APP_NAME + ":" + deptId + ":" + key + ":" + type + ":" + bizId; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public Page<InoutCheckData> pageSampleData(InoutCheckParam param) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //设置起始和截止时间 | 
|---|
|  |  |  | if (null != param.getStart()) { | 
|---|
|  |  |  | param.setStart(DateUtil.getCurZero(param.getStart())); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (null != param.getEnd()) { | 
|---|
|  |  |  | param.setEnd(DateUtil.getNextZero(param.getEnd())); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 设置车牌和检验单据的模糊查询 | 
|---|
|  |  |  | if (StringUtils.isNotEmpty(param.getPlateNum())) { | 
|---|
|  |  |  | param.setPlateNum("%" + param.getPlateNum() + "%"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (StringUtils.isNotEmpty(param.getCheckId())) { | 
|---|
|  |  |  | param.setCheckId("%" + param.getCheckId() + "%"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Page<InoutCheckData> page = new Page<>(param.getPage(), param.getLimit()); | 
|---|
|  |  |  | page.setSearchCount(true); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<InoutCheckData> records = inoutCheckMapper.pageSampleData(page, param); | 
|---|
|  |  |  | page.setRecords(records); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return page; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public String updateSampleData(InoutCheckData data) { | 
|---|
|  |  |  | if (StringUtils.isEmpty(data.getCompanyId())) { | 
|---|
|  |  |  | data.setCompanyId(ContextUtil.getCompanyId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (StringUtils.isEmpty(data.getDeptId())) { | 
|---|
|  |  |  | data.setDeptId(ContextUtil.subDeptId(null)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | inoutCheckMapper.updateSampleData(data); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public Page<InoutCheckData> pageCheckData(InoutCheckParam param) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //设置起始和截止时间 | 
|---|
|  |  |  | if (null != param.getStart()) { | 
|---|
|  |  |  | param.setStart(DateUtil.getCurZero(param.getStart())); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (null != param.getEnd()) { | 
|---|
|  |  |  | param.setEnd(DateUtil.getNextZero(param.getEnd())); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 设置检验单据的模糊查询 | 
|---|
|  |  |  | if (StringUtils.isNotEmpty(param.getCheckId())) { | 
|---|
|  |  |  | param.setCheckId("%" + param.getCheckId() + "%"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Page<InoutCheckData> page = new Page<>(param.getPage(), param.getLimit()); | 
|---|
|  |  |  | page.setSearchCount(true); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | List<InoutCheckData> records = inoutCheckMapper.pageCheckData(page, param); | 
|---|
|  |  |  | page.setRecords(records); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return page; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public String updateCheckData(InoutData data) { | 
|---|
|  |  |  | data.setUpdateTime(new Date()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | inoutCheckMapper.updateCheckData(data); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //更新缓存 | 
|---|
|  |  |  | updateInoutCache(data); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<InoutPrice> getPrice(InoutCheckParam param) { | 
|---|
|  |  |  | if (null == param.getStart()) { | 
|---|
|  |  |  | param.setStart(new Date()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (null == param.getEnd()) { | 
|---|
|  |  |  | param.setEnd(new Date()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return inoutCheckMapper.getPrice(param); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public InoutCheckData inoutDataByCheckId(InoutCheckParam param) throws Exception { | 
|---|
|  |  |  | List<InoutCheckData> list = inoutCheckMapper.inoutDataByCheckId(param); | 
|---|
|  |  |  | if (null == list || list.size() == 0) | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | if (list.size() == 1) { | 
|---|
|  |  |  | return list.get(0); | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | throw new Exception("当前条件下存在多个满足条件的数据,请核查!!"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<InoutLossOver> listLossOver(InoutParam param) { | 
|---|
|  |  |  | if (StringUtils.isEmpty(param.getCompanyId())) { | 
|---|
|  |  |  | param.setCompanyId(ContextUtil.getCompanyId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | List<InoutLossOver> list = inoutMapper.listLossOver(param); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return list; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public double sumLossOverWeight(InoutParam param) { | 
|---|
|  |  |  | CommonData result = inoutMapper.sumLossOverWeight(param); | 
|---|
|  |  |  | return result.getNumValue1(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|