hjg
2024-07-09 30304784e82d4bba24121328da8eb8490aec4f4f
JavaSource/com/mandi/webservice/service/impl/FdXSTDService.java
@@ -1,61 +1,37 @@
package com.mandi.webservice.service.impl;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.annotation.Resource;
import com.mandi.fendan.util.ConvertTool;
import com.mandi.servlet.file.impl.FileLoadImpl;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.mandi.basicconfig.mapper.FdRepertoryNexusMapper;
import com.mandi.basicconfig.mapper.NczsjMapper;
import com.mandi.basicconfig.persist.FdRepertoryNexus;
import com.mandi.basicconfig.persist.Ncck;
import com.mandi.basicconfig.persist.Ncdepart;
import com.mandi.basicconfig.persist.Ncworker;
import com.mandi.basicconfig.persist.Ncywdy;
import com.mandi.basicconfig.persist.*;
import com.mandi.common.JSONobj;
import com.mandi.common.Wxhtmethod;
import com.mandi.common.Jacksonmethod;
import com.mandi.common.ParamFileter.BigDecimalfiter;
import com.mandi.common.SpringContext;
import com.mandi.common.Wxhtmethod;
import com.mandi.dao.common.ObjectResult;
import com.mandi.dao.common.PageResult;
import com.mandi.fendan.mapper.BsheetEcgbMapper;
import com.mandi.fendan.mapper.BusinessMapper;
import com.mandi.fendan.mapper.Fd_BsheetMapper;
import com.mandi.fendan.mapper.Fd_CompanyMapper;
import com.mandi.fendan.mapper.Fd_GbxstdMapper;
import com.mandi.fendan.mapper.Fd_GbxstdmxMapper;
import com.mandi.fendan.mapper.Fd_VehicleMapper;
import com.mandi.fendan.mapper.Fd_XSTDMXMapper;
import com.mandi.fendan.mapper.Fd_XSTDMapper;
import com.mandi.fendan.mapper.Fd_YKTMapper;
import com.mandi.fendan.mapper.VehicleXSTDMapper;
import com.mandi.fendan.persist.BsheetEcgb;
import com.mandi.fendan.persist.Fd_Bsheet;
import com.mandi.fendan.persist.Fd_Company;
import com.mandi.fendan.persist.Fd_Gbxstd;
import com.mandi.fendan.persist.Fd_Gbxstdmx;
import com.mandi.fendan.persist.Fd_XSTD;
import com.mandi.fendan.persist.Fd_XSTDMX;
import com.mandi.fendan.persist.Vehicle_XSTD;
import com.mandi.fendan.mapper.*;
import com.mandi.fendan.persist.*;
import com.mandi.fendan.util.Contants;
import com.mandi.fendan.util.ConvertTool;
import com.mandi.fendan.util.ThreadPoolUtil;
import com.mandi.fendan.util.persist.Serviceenum;
import com.mandi.fendan.util.persist.WaitXSTDMX;
import com.mandi.fendan.util.persist.Yktbsitem;
import com.mandi.servlet.file.impl.FileLoadImpl;
import com.mandi.webservice.service.IFdXSTDService;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
@Service
public class FdXSTDService implements IFdXSTDService{
@@ -89,6 +65,9 @@
   private Logger log= Logger.getLogger(FileLoadImpl.class);
   public static Boolean refreshMsLedLock = false;
   public static Boolean refreshYrLedLock = false;
   public static Boolean refreshKjLedLock = false;
   @Override
   @Transactional(rollbackFor=Exception.class)
   public ObjectResult<Boolean> saveFd_xstd(String dataArr) throws Exception {
@@ -408,35 +387,36 @@
         prr.setCode(1);
         prr.setErrmsg("一卡通业务单未找到,请确认单号是否正确!");
         return prr;
      }else{
         if(fdb.getStatus()!=Serviceenum.在办){
            prr.setCode(2);
            prr.setErrmsg("一卡通业务单不是在办状态,系统不做处理!");
            return prr;
         }
         if(StringUtils.isBlank(cardID)){
            prr.setCode(1);
            prr.setErrmsg("参数:一卡通卡号为空!");
            return prr;
         }
         if(dataArr==null){
            prr.setCode(1);
            prr.setErrmsg("参数:批次号为空!");
            return prr;
         }
         Map<String, Object> mp=this.yktper.getcardinuse(cardID);
         if(mp==null){
            throw new Exception("卡号不正确未找到在用卡!");
         }
         vehicleId=mp.get("numberplates")==null?"":mp.get("numberplates").toString();
         if(!vehicleId.equals(fdb.getVehicleId())){
            prr.setCode(1);
            prr.setErrmsg("参数:卡号关联的车牌号和业务单关联的车牌号不一致");
            return prr;
         }
         yktywdh=fdb.getBsNo();
      }
      if (fdb.getStatus() != Serviceenum.在办) {
         prr.setCode(2);
         prr.setErrmsg("一卡通业务单不是在办状态,系统不做处理!");
         return prr;
      }
      if (StringUtils.isBlank(cardID)) {
         prr.setCode(1);
         prr.setErrmsg("参数:一卡通卡号为空!");
         return prr;
      }
      if (dataArr == null) {
         prr.setCode(1);
         prr.setErrmsg("参数:批次号为空!");
         return prr;
      }
      Map<String, Object> mp = this.yktper.getcardinuse(cardID);
      if (mp == null) {
         throw new Exception("卡号不正确未找到在用卡!");
      }
      vehicleId = mp.get("numberplates") == null ? "" : mp.get("numberplates").toString();
      if (!vehicleId.equals(fdb.getVehicleId())) {
         prr.setCode(1);
         prr.setErrmsg("参数:卡号关联的车牌号和业务单关联的车牌号不一致");
         return prr;
      }
      // yktywdh = fdb.getBsNo();
      int wcnum=this.bsper.getweightDoc(vehicleId, fdb.getBsNo());
      if(wcnum<=0){
@@ -457,24 +437,42 @@
            return prr;
         }
      } catch (Exception e) {
         // TODO: handle exception
      }
      String currPch="";// 当前批次号
      List<String> pchList = new ArrayList<>();
      //第一次添加装卸记录发送装车信息
      int sfzc=this.fbper.getbsitembyNo(fdb.getBsNo());
      if(sfzc<=0) {
         //发送微信公众号提醒信息
         String url=Contants.yktLocalAdd+"/routine/sendZcMsg.htm";
         Map<String, String> mp=new HashMap<String, String>();
         Map<String, String> paramMp=new HashMap<String, String>();
         mp.put("sdepartNo", fdb.getSdepartNo());
         mp.put("vehicleId", vehicleId);
         mp.put("businessNo", fdb.getBsNo());
         Wxhtmethod.postJson(url, mp);
         Wxhtmethod.postJson(url, paramMp);
      }
      //现场过完毛重后出现扫码装车的,必须重新过磅
      // 现场过完毛重后出现扫码装车的,必须重新过磅
      int grossNum=this.bsper.getgrosstDoc(vehicleId, fdb.getBsNo());
      List tdmxPchList = new ArrayList();
      for (JsonElement je : dataArr) {
         JsonObject jo=je.getAsJsonObject();
         String tdmx_pch = jo.get("tdmx_pch").getAsString();
         tdmxPchList.add(tdmx_pch);
      }
      if("08".equals(fdb.getSdepartNo())) { // 只是义瑞厂区有效
         // 检查是否当前区域已经排队
         Map paramMap = new HashMap();
         paramMap.put("vehicleId", vehicleId);
         paramMap.put("tdmxPchList", tdmxPchList);
         String jsonStr = Jacksonmethod.tojson(paramMap, false);
         JsonObject jsonObject = Wxhtmethod.postJsonStr(Contants.yr_canDoScanUrl, jsonStr);
         if (jsonObject.get("code").getAsInt() != 0) {
            prr.setCode(1);
            prr.setErrmsg(jsonObject.get("errmsg").getAsString());
            return prr;
         }
      }
      for (JsonElement je : dataArr) {
         JsonObject jo=je.getAsJsonObject();
         String tdmx_pch = jo.get("tdmx_pch").getAsString();
@@ -565,17 +563,10 @@
            bsi.setRecompany(wx.getTdmx_shdw());
         }else{
            bsi.setRecompany(
                  /*xstd.getTd_ywdybh().equals(Contants.nc_ywdy_ZZ)?"郑州报关":
                     xstd.getTd_ywdybh().equals(Contants.nc_ywdy_MT)?"河南报关":
                        xstd.getTd_ywdybh().equals(Contants.nc_ywdy_MS)?"明晟报关":
                     "科技报关"*/
                    ConvertTool.covertToCustoms(xstd.getTd_ywdybh())
                     );
         }
         bsi.setReID("");
         /*bsi.setDecompany(xstd.getTd_ywdybh().equals(Contants.nc_ywdy_ZZ)?"郑州明泰":
               xstd.getTd_ywdybh().equals(Contants.nc_ywdy_MS)?"河南明晟新材料":
            "眀泰科技");*/
         bsi.setDecompany(ConvertTool.ncCovertToFactoryName(xstd.getTd_ywdybh()));
         bsi.setDeID("");
         bsi.setFrombatch("ERP系统");
@@ -590,6 +581,8 @@
         remp.put("td_tdls",tdmx.getTdmx_tdls());
         remp.put("tdmx_tdfl",tdmx.getTdmx_tdfl());
         relist.add(remp);
         currPch  = tdmx.getTdmx_pch();
         pchList.add(tdmx.getTdmx_pch());
      }
      if(grossNum>0) {
@@ -607,16 +600,375 @@
//            this.bsper.delvehicleQ(vehicleId);
            //删除车辆排队信息
            String url=Contants.yktLocalAdd+"/search/vehicleQueue/delItem.htm";
            Map<String, String> mp=new HashMap<String, String>();
            Map<String, String> paramMp=new HashMap<String, String>();
            mp.put("vehicleID", vehicleId);
            Wxhtmethod.postJson(url, mp);
            Wxhtmethod.postJson(url, paramMp);
         }
      }
       // 此处异步触发一下明晟发车
      if("06".equals(fdb.getSdepartNo())) {
         final String pch = currPch;
         final String finalVehicleId = vehicleId;
         ThreadPoolUtil.getInstance().execute(()->{
            Map paramMap = new HashMap();
            paramMap.put("vehicleId", finalVehicleId);
            paramMap.put("tdmxPchList", tdmxPchList);
            String jsonStr = Jacksonmethod.tojson(paramMap, false);
            JsonObject jsonObject = Wxhtmethod.postJsonStr(Contants.ms_DoScanUrl, jsonStr);
            if (jsonObject.get("code").getAsInt() != 0) {
               prr.setCode(1);
               prr.setErrmsg(jsonObject.get("errmsg").getAsString());
               // return prr;
            }
         });
         // 延迟1.5秒执行,保证数据执行完了
         ThreadPoolUtil.getInstance().execute(()->{
            synchronized (FdXSTDService.refreshMsLedLock) {
               if (FdXSTDService.refreshMsLedLock) { // 系统繁忙
                  log.info(finalVehicleId + "" + pch + "系统繁忙!");
                  return;
               }
            }
            try {
               synchronized (FdXSTDService.refreshMsLedLock) {
                  FdXSTDService.refreshMsLedLock = true;
               }
               sendToMsLed(pch);
            } catch (Exception e) {
               log.error("出现异常:"+ e.getMessage(),e);
            } finally {
               synchronized (FdXSTDService.refreshMsLedLock) {
                  FdXSTDService.refreshMsLedLock = false;
               }
            }
         },1500);
      }
      if("08".equals(fdb.getSdepartNo())) {
         final String cph = currPch;
         ThreadPoolUtil.getInstance().execute(()->{
            // 这个地方不再请求
            /*Map scanCodeParamMap = new HashMap();
            scanCodeParamMap.put("pch",cph);
            Wxhtmethod.post(Contants.yr_scanCodeNoticeUrl, scanCodeParamMap);*/
            try {
               synchronized (FdXSTDService.refreshYrLedLock) {
                  if (FdXSTDService.refreshYrLedLock) { // 系统繁忙
                     return  ;
                  }
                  FdXSTDService.refreshYrLedLock = true;
               }
               sendToYrLed(cph);
            } catch (Exception e) {
               log.error(e);
            } finally {
               synchronized (FdXSTDService.refreshYrLedLock) {
                  FdXSTDService.refreshYrLedLock = false;
               }
            }
         });
      } else if("04".equals(fdb.getSdepartNo())) { // 科技
         final String cph = currPch;
         ThreadPoolUtil.getInstance().execute(()->{
            try {
               synchronized (FdXSTDService.refreshKjLedLock) {
                  if (FdXSTDService.refreshKjLedLock) { // 系统繁忙
                     return  ;
                  }
                  FdXSTDService.refreshKjLedLock = true;
               }
               sendToKjLed(cph);
            } catch (Exception e) {
               log.error(e);
            } finally {
               synchronized (FdXSTDService.refreshKjLedLock) {
                  FdXSTDService.refreshKjLedLock = false;
               }
            }
         });
      }
      prr.setCode(0);
      prr.setErrmsg("装车操作成功!");
      prr.setList(relist);
      return prr;
   }
   /**
    *  挪到一卡通
    * @param currPch 当前批次号
    */
   public void sendToMsLed(String currPch){
      //A区  76-86 +  99-1
      //B区  14-33 +  99-2
      //C区  53-67 +  99-3
      // 2024年改
      //A区  73-88 +  99-1 +  40-45
      //B区  14-27 +  99-2 +  46-49
      //C区  50-65 +  99-3
      //D区  28-39 +   69-72   + 89-98
      log.info("LED-ABC当前扫码批次号:" + currPch);
      List<Map> totalList =  tdmxper.getHwList("06"); // 获取明晟所有在办业务单的信息
      log.info("LED-ABC获取信息条数:" + totalList.size());
      Map<String,List<Map>> ywbhListMap = new HashMap<>();
      for (Map map : totalList) {
         String ywdw = (String) map.get("tdmx_fdywbh");
         if(ywdw == null) {
            log.info("出现业务单号为null的情况:" + Jacksonmethod.tojson(map,false));
            continue;
         }
         if(ywbhListMap.get(ywdw) == null) {
            ywbhListMap.put(ywdw, new ArrayList<>());
         }
         ywbhListMap.get(ywdw).add(map);
      }
      String str1 = " 车号  A区  B区  C区" + "\r\n", str2="";
      //"(车牌号)\\-(A区已装车)/(A区总计)\\-(B区已装车)/(B区总计)\\-(C区已装车)/(C区总计)\\r\\n";
      String formatStr = "%s %s/%s %s/%s %s/%s\r\n";
      // 只有1个区
      Map speakParam = new HashMap(1);
      for (Map.Entry<String, List<Map>> entry : ywbhListMap.entrySet()) {
         // 遍历每个业务单的
         // 当前装车A、B、C区; D区只参与记录,不参与LED显示和语言播报
         boolean currA = false,currB = false, currC = false, currD = false;
         boolean hasZcwc = false; // 保证已经完成了
         String ywhb = entry.getKey();
         List<Map> vehicleIdTotalList = entry.getValue();
         // 总计信息
         Map<String, Integer> totalAbcMap = new HashMap(3);
         totalAbcMap.put("A", 0);
         totalAbcMap.put("B", 0);
         totalAbcMap.put("C", 0);
         /* 已装信息 */
         Map<String, Integer> abcMap = new HashMap(3);
         abcMap.put("A", 0);
         abcMap.put("B", 0);
         abcMap.put("C", 0);
         String cph = ""; // 车牌号
         for (Map map : vehicleIdTotalList) {
            String hw = (String) map.get("tdmx_hwmc");
            String pch = (String) map.get("tdmx_pch");
            if(StringUtils.isBlank(cph))  cph = (String) map.get("tdmx_fdcph");
            Integer zcbz = (Integer) map.get("tdmx_zcbz");
            String hh = hw.replaceAll("\\-.*","");
            hh = hh.substring(hh.length()-2); // 取最后两位
            int num = Integer.parseInt(hh);
            if (num >= 73 && num <= 88 || hw.lastIndexOf("99-1") >= 0) { // A区
               totalAbcMap.put("A",totalAbcMap.get("A") + 1);
               if (zcbz != null && zcbz == 1) { // 装车完成
                  abcMap.put("A", abcMap.get("A") + 1);
                  hasZcwc = true;
               }
               if(pch.equals(currPch)) {
                  currA = true; currB = false;currC =false;currD=false;
               }
            } else if (num >= 14 && num <= 27 || hw.lastIndexOf("99-2") >= 0) { // B区
               totalAbcMap.put("B", totalAbcMap.get("B") + 1);
               if (zcbz != null && zcbz == 1) {
                  abcMap.put("B", abcMap.get("B") + 1);
                  hasZcwc = true;
               }
               if(pch.equals(currPch)) {
                  currA = false; currB = true;currC =false;currD=false;
               }
            } else if (num >= 50 && num <= 65 || hw.lastIndexOf("99-3") >= 0) { // C区
               totalAbcMap.put("C", totalAbcMap.get("C") + 1);
               if (zcbz != null && zcbz == 1) {
                  abcMap.put("C", abcMap.get("C") + 1);
                  hasZcwc = true;
               }
               if(pch.equals(currPch)) {
                  currA = false; currB = false; currC =true; currD=false;
               }
            } else if(num>=28 && num<=39 ||   (num>=69 && num<=72) || (num>=89 && num<=98)) {
               if(pch.equals(currPch)) {
                  currA = false; currB = false;currC =false;currD=true;
               }
            }
         }
         // if (!hasZcwc) continue; //没有装车完成的也跳过
         /*if (!(currA || currB || currC) && abcMap.get("A") + abcMap.get("B") + abcMap.get("C") ==
               totalAbcMap.get("A") + totalAbcMap.get("B") + totalAbcMap.get("C")) { // 非当前车牌号,已经装车完成但是未出厂
            continue;
         }*/
         if(totalAbcMap.get("B")==0 && totalAbcMap.get("C")==0 && totalAbcMap.get("A")==0) {
            continue;
         }
         str2 += String.format(formatStr, cph, fillWithZero(abcMap.get("A")), fillWithZero(totalAbcMap.get("A")),
               fillWithZero(abcMap.get("B")), fillWithZero(totalAbcMap.get("B")),
               fillWithZero(abcMap.get("C")), fillWithZero(totalAbcMap.get("C")));
         log.info(ywhb +  "投屏准备完成,开始准备语音。");
         // 开始准备语音
         int total = 0;
         if(currA && abcMap.get("A") == totalAbcMap.get("A") && totalAbcMap.get("A")>0) { // 当前车在A区装车完成
            total = totalAbcMap.get("A");
         }
         if(currB && abcMap.get("B") == totalAbcMap.get("B") && totalAbcMap.get("B")>0) {// 当前车在B区装车完成
            total = totalAbcMap.get("B");
         }
         if(currC && abcMap.get("C") == totalAbcMap.get("C") && totalAbcMap.get("C")>0) {// 当前车在C区装车完成
            total = totalAbcMap.get("C");
         }
         try {
            String speakTxt = startToSpeak(cph,total,abcMap,totalAbcMap);
            if(StringUtils.isNotBlank(speakTxt)) {
               log.info("SpeakTxt:"+ speakTxt);
               speakParam.put("SpeakTxt", speakTxt);
            }
         }catch (Exception e){
            log.error("准备语音出错!" + e.getMessage(),e);
         }
         // 准备语音结束
         // 单辆车的单个业务单的信息结束
      }
      if(StringUtils.isBlank(str2)) {
         str2 = "无车辆";
      }
      Map paramMap = new HashMap();
      paramMap.put("strTitle",str1);
      paramMap.put("strContent",str2);
      try {
         log.info("LED-ABC webServiceAddrss:"+Contants.msLedServiceAddr+"st1::" +str1+";;;;;str2::"+str2);
          String re = Wxhtmethod.post(Contants.msLedServiceAddr + "/SendLED",paramMap);
         log.info("LED-ABC result:"+re);
         // 语音只播一条
          String re1 = Wxhtmethod.post(Contants.msLedServiceAddr + "/Speak",speakParam);
      }catch (Exception e){}
   }
   /**
    * 准备语音 ,挪到一卡通
    * @param cph 车牌号
    * @param total 当前区总数
    * @param abcMap A、B、C为key的区已装数目
    * @param totalAbcMap A、B、C为key的区总数
    * @return
    */
   String startToSpeak(String cph, int total,Map<String,Integer> abcMap,Map<String,Integer> totalAbcMap) {
      String speakTxt=null ;
      if(total > 0) { // 播放语音,请离开区域
         String speakTxtFormatStr1 = "车号%s ,装货%d件已完成,请司机清点货物后尽快驶离装货区。";
         // 只有2个区
         String speakTxtFormatStr2 = "车号%s,%s区装货%d件已全部扫描完成,请司机清点货物后去%s区装货。";
         // 只有3个区
         String speakTxtFormatStr3 = "车号%s,%s区装货%d件已全部扫描完成,请司机清点货物后去%s区%s区装货。";
         if( (abcMap.get("A")>0  && totalAbcMap.get("B")==0 && totalAbcMap.get("C")==0) ||
               (abcMap.get("B")>0  && totalAbcMap.get("A")==0 && totalAbcMap.get("C")==0)  ||
               (abcMap.get("C")>0  && totalAbcMap.get("B")==0 && totalAbcMap.get("D")==0)
         ) { // 只有一个区域有货物
            speakTxt= String.format(speakTxtFormatStr1, cph, total);
         }else  if(totalAbcMap.get("A")>0 && totalAbcMap.get("B")>0 &&
               (totalAbcMap.get("C")==0 || totalAbcMap.get("C") == abcMap.get("C"))){ // AB都有货 C区已完或无货
            if(totalAbcMap.get("C")>0 && abcMap.get("A")< totalAbcMap.get("A") && abcMap.get("B")< totalAbcMap.get("B")) { // C装完AB未装完
               speakTxt= String.format(speakTxtFormatStr3, cph,"C", total,"A","B");
            } else if(abcMap.get("A")== totalAbcMap.get("A") && abcMap.get("B")< totalAbcMap.get("B")) { //A完B未完
               speakTxt = String.format(speakTxtFormatStr2, cph, "A", total, "B");
            }else if(abcMap.get("B")== totalAbcMap.get("B") && abcMap.get("A")< totalAbcMap.get("A")) {//B完A未完
               speakTxt = String.format(speakTxtFormatStr2, cph, "B", total, "A");
            }else { // 全部装完
               speakTxt= String.format(speakTxtFormatStr1, cph, total);
            }
         }else if(totalAbcMap.get("C")>0 && totalAbcMap.get("B")>0 &&
               (totalAbcMap.get("A")==0 || totalAbcMap.get("A") == abcMap.get("A")) ){ //BC有货 A区已完或无货
            if(totalAbcMap.get("A")>0 && abcMap.get("C")< totalAbcMap.get("C") && abcMap.get("B")< totalAbcMap.get("B")) {  // A装完BC未装完
               speakTxt= String.format(speakTxtFormatStr3, cph,"A", total,"B","C");
            } else if(abcMap.get("C")== totalAbcMap.get("C") && abcMap.get("B")< totalAbcMap.get("B")) { // C完B未装完
               speakTxt = String.format(speakTxtFormatStr2, cph, "C", total, "B");
            }else if(abcMap.get("B")== totalAbcMap.get("B") && abcMap.get("C")< totalAbcMap.get("C")) {// B完C未装完
               speakTxt = String.format(speakTxtFormatStr2, cph, "B", total, "C");
            }else { // 全部装完
               speakTxt= String.format(speakTxtFormatStr1, cph, total);
            }
         }else  if (totalAbcMap.get("A")>0 && totalAbcMap.get("C")>0 &&
               (totalAbcMap.get("B")==0 || totalAbcMap.get("B") == abcMap.get("B")) ) { //AC有货
            if(totalAbcMap.get("B")>0 && abcMap.get("A")< totalAbcMap.get("A") && abcMap.get("C")< totalAbcMap.get("C")) {
               speakTxt= String.format(speakTxtFormatStr3, cph,"B", total,"A","C");
            } else if(abcMap.get("A")== totalAbcMap.get("A") && abcMap.get("C")< totalAbcMap.get("C")) { // A装完C未装完
               speakTxt = String.format(speakTxtFormatStr2, cph, "A", total, "C");
            }else if(abcMap.get("C")== totalAbcMap.get("C") && abcMap.get("A")< totalAbcMap.get("A")) {// C装完A未装完
               speakTxt = String.format(speakTxtFormatStr2, cph, "C", total, "A");
            }else { // 全部装完
               speakTxt= String.format(speakTxtFormatStr1, cph, total);
            }
         }else if(totalAbcMap.get("A")>0 && totalAbcMap.get("B")>0 && totalAbcMap.get("C")>0) { // 3区都有货物,且只有一个取装完了
            if(abcMap.get("A")>0 && abcMap.get("B")<totalAbcMap.get("B") && abcMap.get("C")<totalAbcMap.get("C")) {
               speakTxt= String.format(speakTxtFormatStr3, cph,"A", total,"B","C");
            } else if(abcMap.get("B")>0 && abcMap.get("C")==0 && abcMap.get("A")==0) {
               speakTxt= String.format(speakTxtFormatStr3, cph,"B", total,"A","C");
            } else if(abcMap.get("C")>0 && abcMap.get("A")==0 && abcMap.get("B")==0) {
               speakTxt= String.format(speakTxtFormatStr3, cph,"C", total,"A","B");
            } else { // 全部装完
               speakTxt= String.format(speakTxtFormatStr1, cph, total);
            }
         } else {
            speakTxt= String.format(speakTxtFormatStr1, cph, total);
         }
      }
      return speakTxt;
   }
   @Override
   public void sendToYrLed(String currPch) {
         // 状态 一磅后,待装;PDA扫码 在装; 二次过磅后消失
         // 装车区 两个汉字加两个英文或数字
         String strTitle="序号  车号   装车区  状态\r\n";
         String strContent = "";
         String contentFormatStr = "%s   %s  %s   %s\r\n";
         List<Map> list = tdmxper.kjZcList("08");
         int index = 1;
         for (Map map : list) {
            String numberplates = (String) map.get("numberplates"); // 车牌号
            String zcWz = (String) map.get("zcWz"); // 装车位置
            if(StringUtils.isNotBlank(zcWz)){
               zcWz = zcWz.substring(0,4);
            } else { // 空是6个位置
               zcWz = "      ";
            }
            String zcStatus = (String) map.get("zcStatus"); // 装车位置 在办/待办
            strContent += String.format(contentFormatStr, fillWithZero(index++), numberplates, zcWz, zcStatus);
         }
         Map paramMap = new HashMap();
         paramMap.put("strTitle",strTitle);
         paramMap.put("strContent",strContent);
         Wxhtmethod.post(Contants.yr_zcLedUrl + "/SendLED",paramMap);
         log.info("yr_zcLedUrl: " + Contants.yr_zcLedUrl + ";title:" + strTitle + ",content:" + strContent);
   }
   @Override
   public void sendToKjLed(String currPch) {
      // 状态 一磅后,待装;PDA扫码 在装; 二次过磅后消失
      // 装车区 两个汉字加两个英文或数字
      String strTitle="序号  车号   装车区  状态\r\n";
      String strContent = "";
      String contentFormatStr = "%s   %s  %s   %s\r\n";
      List<Map> list = tdmxper.kjZcList("04");
      int index = 1;
      for (Map map : list) {
         String numberplates = (String) map.get("numberplates"); // 车牌号
         String zcWz = (String) map.get("zcWz"); // 装车位置
         if(StringUtils.isNotBlank(zcWz)) {
            zcWz = zcWz.substring(0,4);
         } else { // 空是6个位置
            zcWz = "      ";
         }
         String zcStatus = (String) map.get("zcStatus"); // 装车位置 在办/待办
         strContent += String.format(contentFormatStr, fillWithZero(index++), numberplates, zcWz, zcStatus);
      }
      Map paramMap = new HashMap();
      paramMap.put("strTitle",strTitle);
      paramMap.put("strContent",strContent);
      String re = Wxhtmethod.post(Contants.kj_zcLedUrl + "/SendLED",paramMap);
      log.info("回复:" + re +";kj_zcLedUrl: " + Contants.kj_zcLedUrl + ";title:" + strTitle + ",content:" + strContent);
   }
   String fillWithZero(int str){
      String s;
      if(str<10 && str>=0) s= "0" + str;
      else s=String.valueOf(str);
      return s;
   }
   @Override
@@ -669,7 +1021,6 @@
            return orr;
         }
      } catch (Exception e) {
         // TODO: handle exception
      }
//      Fd_Bsheet nr=this.fbper.getbyVehicleId(vehicleId, Serviceenum.在办);
//      if(nr==null){
@@ -698,6 +1049,10 @@
         String tdmx_pch=jo.get("tdmx_pch").getAsString();
//         Fd_XSTDMX tdmx=this.tdmxper.getbyPCH(tdmx_pch);
         Fd_XSTDMX tdmx=this.tdmxper.getbyPCHONE(tdmx_pch,vehicleId);
         if(tdmx == null) {
            String errMsg = "一卡通卸车失败,请查看【" + tdmx_pch +"】出库关闭标志!";
            throw  new Exception(errMsg);
         }
//         if(tdmx.getTdmx_zcbz()!=1){
////            throw new Exception("批次号:"+tdmx_pch+" 已经提交装车,不能重复提交装车!");
//            continue;
@@ -726,7 +1081,7 @@
   }
   @Override
   public ObjectResult<Map<String, Object>> getcInfo(String cardID) {
   public ObjectResult<Map<String, Object>> getcInfo(String cardID,boolean needRecord) {
      ObjectResult<Map<String, Object>> orr=new ObjectResult<Map<String,Object>>();
      Map<String, Object> rem=new HashMap<String, Object>();
      Map<String, Object> mp=this.yktper.getcardinuse(cardID);
@@ -736,6 +1091,13 @@
         return orr;
      }
      String vehicleId=mp.get("numberplates")==null?"":mp.get("numberplates").toString();
      String type = (String)mp.get("type");
      String sdepartNo = null;
      if(type.equals("外来车辆卡")) {
         sdepartNo = (String) mp.get("sdepartNo");
      }
      List<Fd_Bsheet> fd_bList = this.fbper.getListbyVehicleId(vehicleId, Serviceenum.在办);
      if (fd_bList == null||fd_bList.isEmpty()) {
         orr.setCode(1);
@@ -765,7 +1127,8 @@
            return orr;
         }
      }
      String businessNo = bsper.getBusinessNoByCardNo(cardID);
      // 改成使用在用卡的卡号、车牌号码、厂区来确认是否有销售的业务单 btid=3 businesstype00002
      String businessNo = bsper.getBusinessNoByCardNo(cardID,vehicleId,sdepartNo);
      if(StringUtils.isBlank(businessNo)) {
         orr.setCode(1);
         orr.setErrmsg("未找到该卡的在办业务单!");
@@ -774,6 +1137,7 @@
//      List<Vehicle_XSTD> vxl=this.vhxper.getlistbyVehicleId(vehicleId);
      List<Vehicle_XSTD> vxl= this.vhxper.getlistbyVehicleIdandbsNoGp(vehicleId, businessNo);
      List<Map<String, Object>> datamp=new ArrayList<Map<String, Object>>();
      Map<String,Fd_XSTD> xstdMap = new HashMap(); // 缓存Fd_XSTD,避免多查
      for (Vehicle_XSTD vx : vxl) {
         String tdbh=vx.getXstdNo();
         Fd_XSTD td=this.tdper.getbyTDBH(tdbh);
@@ -797,10 +1161,25 @@
         tdm.put("td_tdbh", td.getTd_tdbh());
         tdm.put("td_tdls", td.getTd_tdls());
         tdm.put("td_jylx", td.getTd_jylx());
         Fd_XSTD fd_xstd = xstdMap.get(td.getTd_tdbh());
         if(xstdMap.get(td.getTd_tdbh())==null) { // 保证同一个提单只查一遍
            fd_xstd = tdper.getbyttdbh(td.getTd_tdbh());
         }
         //增加客户名称 备注
         if(StringUtils.isBlank(fd_xstd.getTd_fpbh())){
            Nckh nckh = zsjper.getNckhbyCode(fd_xstd.getTd_khbh());// 客户不存在的特殊情况是不应该存在的,以防万一,加判空。
            tdm.put("td_khmc",nckh!=null?nckh.getName():"");
         }else {
            String name = ConvertTool.covertToCustoms(fd_xstd.getTd_ywdybh());
            tdm.put("td_khmc", name);
         }
         tdm.put("td_bz",fd_xstd.getTd_bz());
         mm.put("td", tdm);
         mm.put("tdmx", tdmxl);
         datamp.add(mm);
      }
      rem.put("cph", vehicleId);
      rem.put("sjmc", fd_b.getDriver());
      rem.put("dh", fd_b.getPhone());
@@ -818,7 +1197,9 @@
         }else {
            mr.put("firstzxhtime", new Date());
         }
         this.bsper.updateTaskTime(mr);
         if(needRecord) { // 为true 则更新第一次扫卡时间,否则不记录
            this.bsper.updateTaskTime(mr);
         }
      }else {
         orr.setCode(1);
         orr.setErrmsg("未找到装车记录");