Administrator
2023-04-21 195945efc5db921a4c9eb8cf9421c172273293f5
JavaSource/com/mandi/webservice/service/impl/FdXSTDService.java
@@ -8,7 +8,9 @@
import com.mandi.basicconfig.mapper.NczsjMapper;
import com.mandi.basicconfig.persist.*;
import com.mandi.common.JSONobj;
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;
@@ -24,6 +26,7 @@
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;
@@ -61,6 +64,9 @@
   private FdRepertoryNexusMapper reNxPer;
   private Logger log= Logger.getLogger(FileLoadImpl.class);
   public static Boolean refreshMsLedLock = false;
   public static Boolean refreshYrLedLock = false;
   @Override
   @Transactional(rollbackFor=Exception.class)
@@ -583,7 +589,47 @@
       // 此处异步触发一下明晟发车
      if("06".equals(fdb.getSdepartNo())) {
         final String cph = currPch;
         ThreadPoolUtil.getInstance().execute(()->sendToMsLed(cph));
         final String finalVehicleId = vehicleId;
         ThreadPoolUtil.getInstance().execute(()->{
            synchronized (FdXSTDService.refreshMsLedLock) {
               if (FdXSTDService.refreshMsLedLock) { // 系统繁忙
                  log.info(finalVehicleId + "" + cph + "系统繁忙!");
                  return;
               }
            }
            try {
               synchronized (FdXSTDService.refreshMsLedLock) {
                  FdXSTDService.refreshMsLedLock = true;
               }
               sendToMsLed(cph);
            } catch (Exception e) {
               log.error("出现异常:"+ e.getMessage(),e);
            } finally {
               synchronized (FdXSTDService.refreshMsLedLock) {
                  FdXSTDService.refreshMsLedLock = false;
               }
            }
         });
      }
      if("08".equals(fdb.getSdepartNo())) {
         final String cph = currPch;
         ThreadPoolUtil.getInstance().execute(()->{
            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;
               }
            }
         });
      }
      prr.setCode(0);
      prr.setErrmsg("装车操作成功!");
@@ -599,10 +645,16 @@
      //A区  76-86 +  99-1
      //B区  14-33 +  99-2
      //C区  53-67 +  99-3
      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<>());
         }
@@ -612,17 +664,14 @@
      //"(车牌号)\\-(A区已装车)/(A区总计)\\-(B区已装车)/(B区总计)\\-(C区已装车)/(C区总计)\\r\\n";
      String formatStr = "%s %s/%s %s/%s %s/%s\r\n";
      // 只有1个区
      String speakTxtFormatStr1 = "车号%s ,装货%d件已完成,请司机清点货物后尽快驶离装货区。";
      // 只有2个区
      String speakTxtFormatStr2 = "车号%s,%s区装货%d件已全部扫描完成,请司机清点货物后去%s区装货。";
      // 只有3个区
      String speakTxtFormatStr3 = "车号%s,%s区装货%d件已全部扫描完成,请司机清点货物后去%s区%s区装货。";
      Map speakParam = new HashMap(1);
      for (Map.Entry<String, List<Map>> entry : ywbhListMap.entrySet()) { // 遍历每个业务单的
      for (Map.Entry<String, List<Map>> entry : ywbhListMap.entrySet()) {
         // 遍历每个业务单的
         // 当前装车A、B、C区
         boolean currA = false,currB = false, currC = false;
         boolean hasZcwc = false; // 保证已经完成了
         // String ywhb = entry.getKey();
         String ywhb = entry.getKey();
         List<Map> vehicleIdTotalList = entry.getValue();
         Map<String, Integer> totalAbcMap = new HashMap(3); // 总计信息
         totalAbcMap.put("A", 0);
@@ -636,7 +685,7 @@
         for (Map map : vehicleIdTotalList) {
            String hw = (String) map.get("tdmx_hwmc");
            String pch = (String) map.get("tdmx_pch");
            if("".equals(cph))  cph = (String) map.get("tdmx_fdcph");
            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); // 取最后两位
@@ -670,96 +719,159 @@
               }
            }
         }
         if (!hasZcwc) continue; //没有装车完成的也跳过
         if (!(currA || currB || currC) && abcMap.get("A") + abcMap.get("B") + abcMap.get("C") ==
         // 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, fillSpace(abcMap.get("A")), fillSpace(totalAbcMap.get("A")),
               fillSpace(abcMap.get("B")), fillSpace(totalAbcMap.get("B")),
               fillSpace(abcMap.get("C")), fillSpace(totalAbcMap.get("C")));
         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")) { // 当前车在A区装车完成
         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")) {// 当前车在B区装车完成
         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")) {// 当前车在C区装车完成
         if(currC && abcMap.get("C") == totalAbcMap.get("C") && totalAbcMap.get("C")>0) {// 当前车在C区装车完成
            total = totalAbcMap.get("C");
         }
         if(total > 0) { // 播放语音,请离开区域
            speakParam.clear();
            String speakTxt=null ;
            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);
         try {
            String speakTxt = startToSpeak(cph,total,abcMap,totalAbcMap);
            if(StringUtils.isNotBlank(speakTxt)) {
               log.info("SpeakTxt:"+ speakTxt);
               speakParam.put("SpeakTxt", speakTxt);
            }
            speakParam.put("SpeakTxt", speakTxt);
            log.info("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 {
        String re = Wxhtmethod.post(Contants.msLedServiceAddr + "/SendLED",paramMap);
        // 语音只播一条
        String re1 = Wxhtmethod.post(Contants.msLedServiceAddr + "/Speak",speakParam);
         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){}
   }
   String fillSpace(int str){
   /**
    * 准备语音
    * @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.yRZcList("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);
   }
   String fillWithZero(int str){
      String s;
      if(str<10 && str>=0) s= "0" + str;
      else s=String.valueOf(str);