jiazx0107@163.com
2023-06-25 1a47d9eef4cfe9385ce66b791de84db54a5ba87c
igds-inout/src/main/java/com/ld/igds/inout/service/impl/InoutServiceImpl.java
@@ -1,7 +1,6 @@
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;
@@ -9,16 +8,17 @@
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.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;
@@ -39,6 +39,8 @@
    @Resource
    private InoutRecordMapper inoutMapper;
    @Resource
    private InoutCheckMapper inoutCheckMapper;
    @Resource
    private RedisUtil redisUtil;
    @Resource
    private CoreCommonService commonService;
@@ -48,6 +50,7 @@
        if (StringUtils.isEmpty(param.getCompanyId())) {
            param.setCompanyId(ContextUtil.getCompanyId());
        }
        // 首先从缓存中获取,如果没有则从数据库获取
        InoutData result = this.getFromInoutCache(param);
        if (null != result) {
@@ -92,24 +95,26 @@
            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);
@@ -118,65 +123,52 @@
    @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 (null == data.getRegisterTime()) {
            data.setRegisterTime(new Date());
        }
        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 (StringUtils.isEmpty(data.getCheckId())) {
            data.setCheckId(id);
        }
        if (null == data.getDeptId()) {
            data.setDeptId(ContextUtil.subDeptId(null));
        }
        if (null == data.getUserName()) {
            data.setUserName("");
            if (null == data.getUserName()) {
                data.setUserName("");
            }
            inoutMapper.insertData(data);
            updateInoutCache(data);
        } 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());
        }
@@ -190,17 +182,31 @@
        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);
        //更新缓存
        updateInoutCache(newData);
        return null;
    }
@@ -231,12 +237,16 @@
        if (null != param.getUserId()) {
            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());
                }
            }
@@ -256,16 +266,6 @@
        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();
@@ -284,27 +284,25 @@
    @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());
@@ -315,7 +313,6 @@
        if (null == data.getEmptyWeightTime()) {
            data.setEmptyWeightTime(new Date());
        }
        //调整时间差
        if (InoutConstant.TYPE_IN.equals(data.getType())) {
@@ -344,50 +341,34 @@
        // 设置流程结束
        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;
        }
@@ -397,44 +378,14 @@
        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()) {
@@ -467,6 +418,7 @@
        if (StringUtils.isEmpty(param.getDeptId())) {
            param.setDeptId(ContextUtil.subDeptId(null));
        }
        List<InoutData> list = getListInoutCache(param.getDeptId());
        if (null == list || list.isEmpty())
            return null;
@@ -490,35 +442,6 @@
            }
        }
        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
@@ -554,10 +477,7 @@
    }
    @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);
    }
@@ -565,16 +485,16 @@
    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())) {
            data.setCurStorage(inoutData.getCurStorage()
                    + inoutData.getSettleWeight());
        } else if (InoutConstant.TYPE_OUT.equals(inoutData.getType())) {
            data.setCurStorage(inoutData.getCurStorage()
                    - inoutData.getSettleWeight());
        }
//        // 设置流水的库存
//        if (InoutConstant.TYPE_IN.equals(inoutData.getType())) {
//            data.setCurStorage(inoutData.getCurStorage()
//                    + inoutData.getSettleWeight());
//        } else if (InoutConstant.TYPE_OUT.equals(inoutData.getType())) {
//            data.setCurStorage(inoutData.getCurStorage()
//                    - inoutData.getSettleWeight());
//        }
        // 添加补单数据
        this.insertData(data);
@@ -596,12 +516,6 @@
        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);
    }
    /**
     * 出入库流程ID创建 202001030001 202001030001
@@ -677,6 +591,11 @@
        return result.getNumValue1();
    }
    @Override
    public int checkExist(InoutParam param) {
        return inoutMapper.checkExist(param);
    }
    /**
     * 未完成流程存入缓存
     *
@@ -684,9 +603,7 @@
     * @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);
    }
@@ -698,7 +615,6 @@
     */
    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());
    }
@@ -706,12 +622,17 @@
    /**
     * 推送到大屏,判断只有当大屏在线时候才处理当前逻辑,避免页面卡顿,调用子任务完成推送
     *
     * @param deptId
     * @param curList      未完成流程个数
     * @param completeList 已经完成流程个数
     * @param companyId 组织编号
     * @param deptId    分库编号
     * @param progress  流转节点
     */
    private void notifyToScreen(String deptId, List<InoutData> curList,
                                List<InoutData> completeList) {
    public void notifyToScreen(String companyId, String deptId, String progress) {
        // 推送到大屏
        List<InoutData> curList = this.getListInoutCache(deptId);
        List<InoutData> completeList = this.getCompleteListInoutCache(deptId);
        if (null == WebSocketServer.contextOnLineMap.get(BizType.SCREEN
                .getCode())) {
@@ -735,13 +656,10 @@
                || WebSocketServer.contextOnLineMap.get(BizType.SCREEN_CHECK
                .getCode())) {
            if (null == completeList) {
                completeList = this.getCompleteListInoutCache(deptId);
            }
            // 创建一个子任务进行推送信息
            FutureTask<String> futureTask = new FutureTask<>(
                    new NotifyScreenTask(curList, completeList, deptId));
            FutureTask<String> futureTask = new FutureTask<>(new NotifyScreenTask(curList, completeList, deptId));
            ExecutorService executorService = Executors.newCachedThreadPool();
            executorService.submit(futureTask);
            executorService.shutdown();
@@ -760,4 +678,94 @@
    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.setCompanyId(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);
    }
}