QisdaController.java 11.0 KB
package com.myproject.webapp.controller.qisda;

import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.myproject.bean.CodeBean;
import com.myproject.bean.json.InventoryItem;
import com.myproject.bean.json.LiteOrder;
import com.myproject.bean.json.LiteOrderItem;
import com.myproject.bean.qisda.AppendInfo;
import com.myproject.bean.qisda.InquiryShelfBean;
import com.myproject.bean.qisda.ShelfInfo;
import com.myproject.bean.update.Barcode;
import com.myproject.bean.update.DataLog;
import com.myproject.bean.update.Storage;
import com.myproject.bean.update.StoragePos;
import com.myproject.bean.update.qisda.DNInfo;
import com.myproject.bean.update.qisda.DNItem;
import com.myproject.bean.update.qisda.OutInfo;
import com.myproject.bean.update.qisda.OutItem;
import com.myproject.dao.mongo.IDataLogDao;
import com.myproject.dao.mongo.IStoragePosDao;
import com.myproject.dao.mongo.qisda.IDNInfoDao;
import com.myproject.dao.mongo.qisda.IDNItemDao;
import com.myproject.dao.mongo.qisda.IOutInfoDao;
import com.myproject.dao.mongo.qisda.IOutItemDao;
import com.myproject.exception.ApiException;
import com.myproject.exception.ValidateException;
import com.myproject.manager.IBarcodeManager;
import com.myproject.manager.IStoragePosManager;
import com.myproject.util.StorageConstants;
import com.myproject.webapp.controller.qisda.util.OutInfoCache;
import com.myproject.webapp.controller.storage.BaseController;
import com.myproject.webapp.controller.webService.DataCache;
import com.myproject.webapp.controller.webService.ITaskService;
import com.myproject.webapp.controller.webService.QisdaApiController;
import com.myproject.webapp.controller.webService.StorageDataController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;


/**
 * 佳世达
 */
@Controller
public class QisdaController extends BaseController {

    @Autowired
    private DataCache dataCache;

    @Autowired
    private ITaskService taskService;

    @Autowired
    protected IBarcodeManager barcodeManager;
    @Autowired
    private IDataLogDao dataLogDao;
    @Autowired
    private IDNInfoDao dNInfoDao;
    @Autowired
    private IDNItemDao dNItemDao;

    @Autowired
    private IOutInfoDao outInfoDao;

    @Autowired
    private IOutItemDao outItemDao;

    @Autowired
    private IStoragePosDao storagePosDao;

    @Autowired
    private OutInfoCache outInfoCache;

    /**
     * DN单收料
     * @param request
     * @return
     */
    @RequestMapping("/qisda/dnIn")
    public String dnIn(HttpServletRequest request){
        //if(currentDnInfo != null){
            //if(currentDnInfo.isDNIn())
        //}
        return "qisda/dnIn";
    }

    private static String vimRfid = "";

    /**
     * 当前DN单
     */
    private static DNInfo currentDnInfo;

    /**
     * RFID绑定DN单和Facility, Key为RFID, Value为DN单信息
     */
    private static Map<String, DNInfo> rfidDnMap = new ConcurrentHashMap<>();

    /**
     * 根据入库时的RFID,获取入库方式
     */
    public static DNInfo getDnInfo(String rfid){
        if(rfid == null || rfid.equals("000")){
            rfid = "";
        }
        DNInfo dnInfo = rfidDnMap.get(rfid);
        String usedRfid = "=" + rfid;
        if(dnInfo == null){
            dnInfo = rfidDnMap.get(usedRfid);
        }else{
            //已经使用过,清除掉
            rfidDnMap.remove(rfid);
            rfidDnMap.put(usedRfid, dnInfo);
        }
        if(dnInfo == null){
            //如果未找到料架对应的DNInfo,当作纯入库处理
            dnInfo = new DNInfo();
            dnInfo.setDnNo("");
        }
        return dnInfo;
    }

    /**
     * VMI入料处的RFID, 用于绑定DN单或者Facility
     * @param request
     * @return
     */
    @RequestMapping("/service/store/qisda/vmiRfid")
    @ResponseBody
    public String vmiRfid(HttpServletRequest request){
        String rfid = request.getParameter("rfid");
        vimRfid = rfid;
        DNInfo dnInfo = rfidDnMap.get(rfid);
        if(dnInfo != null){
            return "move";
        }else{
            //料串和包装料料架
//            if(StorageConstants.SHEFL_TYPE.isAShelf(rfid) || StorageConstants.SHEFL_TYPE.isBShelf(rfid) ){
//                if(currentDnInfo != null){
//                    rfidDnMap.put(rfid, currentDnInfo);
//                    log.info("自动绑定["+rfid+"]"+ currentDnInfo.getShowStr());
//                    return "move";
//                }
//            }
        }
        return "stop";
    }

    /**
     * 上料完成时,清除RFID信息
     */
    @RequestMapping("/service/store/qisda/clearPutInRfid")
    @ResponseBody
    public String clearPutInRfid(HttpServletRequest request){
        String rfid = request.getParameter("rfid");
        log.info("上料机构上料完成后,清理RFID["+rfid+"]信息");
        if(!Strings.isNullOrEmpty(rfid)){
            rfidDnMap.remove(rfid);
            String usedRfid = "=" + rfid;
            rfidDnMap.remove(usedRfid);
        }
        return "OK";
    }


    /**
     * 清除所有的绑定信息
     */
    @RequestMapping("/service/store/qisda/clearAllBind")
    @ResponseBody
    public String unBindAllReel(HttpServletRequest request){
        String so = request.getParameter("so");
        if(Strings.isNullOrEmpty(so)){
            return "无工单号参数so,无法解绑";
        }
        log.info("开始解绑绑定工单["+so+"]的料盘");
        int count = 0;
        List<StoragePos> bindPosList = storagePosDao.allBindPos(so);
        for (StoragePos storagePos : bindPosList) {
            storagePosDao.unbindReel(storagePos);
            log.info("解除["+storagePos.getBarcode().getBarcode()+"]的工单["+so+"]绑定");
            count = count + 1;
        }
        String msg = "工单["+so+"]解除绑定完成,共解绑["+count+"]盘";
        log.info(msg);
        return msg;
    }

    /**
     * 获取VMI线上当前的RFID
     * @param request
     * @return
     */
    @RequestMapping("/service/store/qisda/getVmiRfid")
    @ResponseBody
    public String getVmiRfid(HttpServletRequest request){
        return vimRfid;
    }

    /**
     * 将RFID和DN单绑定起来
     */
    @RequestMapping("/service/store/qisda/bindDn")
    @ResponseBody
    public String bindDn(HttpServletRequest request){
        String rfid = request.getParameter("rfid");
        String dnNo = request.getParameter("dnNo");
        String facility = request.getParameter("facility");
//        if(Strings.isNullOrEmpty(rfid)){
//            rfid = vimRfid;
//        }
        if(Strings.isNullOrEmpty(rfid)){
            return "x未读到RFID";
        }

        DNInfo newDnInfo = new DNInfo();
        if(Strings.isNullOrEmpty(dnNo)){
            //Facility收料
            log.info("开始绑定Facility ["+facility+"]到["+rfid+"]");
            newDnInfo.setFacilityInfo(facility);
        }else{
            //DN单收料
            log.info("开始绑定DN单 ["+dnNo+"]到["+rfid+"]");
            newDnInfo.setDnNo(dnNo);
        }

        if(newDnInfo.isCisIn()){
            return "xDn单号不能为空";
        }

        //停止当前DN单,并进行切换
        String stopCurrent = request.getParameter("stopCurrent");
        if(stopCurrent != null && stopCurrent.equals("true") || currentDnInfo == null){
            log.info("DN单["+dnNo+"]facility["+facility+"]切换操作");
            DNInfo dbDN = dNInfoDao.findDNInfo(newDnInfo.getDnNo());
            if(dbDN == null){
                if(newDnInfo.isDNIn()){
                    log.info("未找到DN单["+dnNo+"],从佳世达获取");
                    boolean isCheck = false;
                    try {
                        List<DNItem> dnItems = QisdaApiController.GetDNDetails(dnNo, isCheck);
                        dNItemDao.insertAll(dnItems);
                        newDnInfo = dNInfoDao.save(newDnInfo);
                        newDnInfo.addItems(dnItems);
                    } catch (ApiException e) {
                        return e.getMessage();
                    }
                }else if(newDnInfo.isFacilityIn()){
                    log.info("新建Facility["+newDnInfo.getDnNo()+"]收料");
                    newDnInfo = dNInfoDao.save(newDnInfo);
                }
            }

            currentDnInfo = newDnInfo;
            rfidDnMap.put(rfid, currentDnInfo);

            String msg = "设置["+rfid+"]"+ newDnInfo.getShowStr()+"成功";
            log.info(msg);
            return "OK"+msg;

        }else{
            String currentDnNo = "";
            if(currentDnInfo != null){
                currentDnNo = currentDnInfo.getDnNo();
            }
            if(!newDnInfo.getDnNo().equals(currentDnNo)){
                return "c是否停止当前操作:"+currentDnInfo.getShowStr()+"?";
            }

            rfidDnMap.put(rfid, currentDnInfo);
            String msg = "设置["+rfid+"]"+ newDnInfo.getShowStr()+"成功";
            log.info(msg);
            return "OK"+msg;
        }
    }

    /**
     * DN单收料
     * @param request
     * @return
     */
    @RequestMapping("/qisda/orderOut")
    public String orderOut(HttpServletRequest request){
        return "qisda/orderOut";
    }

    @RequestMapping(value = "/service/store/qisda/outInfoList")
    @ResponseBody
    public Collection<OutInfo> outInfoList(HttpServletRequest request){
        return outInfoCache.getCachedOutInfos();
    }


    @RequestMapping("/service/store/qisda/dnInfo")
    @ResponseBody
    public DNInfo getDnItems(HttpServletRequest request){
        DNInfo dnInfo = currentDnInfo;
        if(dnInfo != null){
            List<DNItem> items = dNItemDao.findDnItems(dnInfo.getDnNo());
            dnInfo.addItems(items);
        }
        return dnInfo;
    }

    @RequestMapping(value = "/service/store/qisda/dnDetail")
    @ResponseBody
    public DNInfo dnDetail(HttpServletRequest request){
        String dnNo = request.getParameter("dnNo");
        if(Strings.isNullOrEmpty(dnNo)){
            return null;
        }
        DNInfo dnInfo = dNInfoDao.findDNInfo(dnNo);
        if(dnInfo != null){
            List<DNItem> items = dNItemDao.findDnItems(dnNo);
            dnInfo.addItems(items);
        }
        return dnInfo;
    }


    @RequestMapping(value = "/service/store/qisda/outDetail")
    @ResponseBody
    public OutInfo outDetail(HttpServletRequest request){
        String hSerial = request.getParameter("hSerial");
        if(Strings.isNullOrEmpty(hSerial)){
            return null;
        }
        OutInfo outInfo = outInfoDao.findByHSerial(hSerial);

        if(outInfo != null){
            List<OutItem> items = outItemDao.findByHSerial(hSerial);
            outInfo.updateOutItems(items);
        }
        return outInfo;
    }



}