Преглед на файлове

Merge remote-tracking branch 'origin/main' into main

luofeiyun преди 2 седмици
родител
ревизия
90e22c5212

+ 17 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeVisitorDO.java

@@ -174,4 +174,21 @@ public class TradeVisitorDO extends TenantBaseDO {
 
     @Schema(description = "楼层", example = "")
     private Integer floor;
+
+
+    /**
+     * 入住类型
+     * 1:实际入住 2:临时入住 3:预分房
+     */
+    @Schema(description = "入住类型", example = "")
+    @TableField(exist = false)
+    private String occupancyType;
+
+    @Schema(description = "是否独居")
+    @TableField(exist = false)
+    private Integer isAlone;
+
+    @Schema(description = "是否具备同住关系", example = "")
+    @TableField(exist = false)
+    private Integer isHaveTogethers;
 }

+ 5 - 5
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/impl/TradeOrderServiceImpl.java

@@ -712,8 +712,8 @@ public class TradeOrderServiceImpl implements TradeOrderService {
                     tradeDetailDO.setUseDate(orderDetail.getBoardingTime() == null ? DateUtil.toLocalDateTime(tradeOrderDO.getTravelDate()) : DateUtil.toLocalDateTime(orderDetail.getBoardingTime()));
                     tradeDetailDO.setProductId(product.getId());
                     tradeDetailDO.setProductName(product.getProductName());
-                    tradeDetailDO.setPrice(orderDetail.getOriginPrice());
-                    tradeDetailDO.setActualPrice(orderDetail.getPrice());
+                    tradeDetailDO.setPrice(orderDetail.getOriginPrice()==null?BigDecimal.ZERO:orderDetail.getOriginPrice());
+                    tradeDetailDO.setActualPrice(orderDetail.getPrice()==null?BigDecimal.ZERO:orderDetail.getPrice());
                     tradeDetailDO.setValidityStartDate(LocalDateTimeUtil.of(orderDetail.getBoardingTime()));
                     tradeDetailDO.setValidityEndDate(LocalDateTimeUtil.of(orderDetail.getLeaveTime()));
                     tradeDetailDO.setSpecType(orderDetail.getSpecType());
@@ -787,8 +787,8 @@ public class TradeOrderServiceImpl implements TradeOrderService {
                     tradeDetailDO.setUseDate(orderItem.getUseDate() == null ? DateUtil.toLocalDateTime(tradeOrderDO.getTravelDate()) : DateUtil.toLocalDateTime(orderItem.getUseDate()));
                     tradeDetailDO.setProductId(product.getId());
                     tradeDetailDO.setProductName(product.getProductName());
-                    tradeDetailDO.setPrice(orderDetail.getOriginPrice());
-                    tradeDetailDO.setActualPrice(orderDetail.getPrice());
+                    tradeDetailDO.setPrice(orderDetail.getOriginPrice()==null?BigDecimal.ZERO:orderDetail.getOriginPrice());
+                    tradeDetailDO.setActualPrice(orderDetail.getPrice()==null?BigDecimal.ZERO:orderDetail.getPrice());
                     tradeDetailDO.setSpecType(orderDetail.getSpecType());
                     tradeDetailDO.setId(IdWorker.getId());
                     tradeDetailDO.setProductType(orderDetail.getProductType());
@@ -1302,7 +1302,7 @@ public class TradeOrderServiceImpl implements TradeOrderService {
             return;
         }
         TradeDetailDO tradeDetailDO = tradeOrderDetailBOList.get(0).getTradeDetailDOList().get(0);
-        tradeDetailDO.setActualPrice(tradeDetailDO.getActualPrice().add(subAmount));
+        tradeDetailDO.setActualPrice(tradeDetailDO.getActualPrice()==null?BigDecimal.ZERO: tradeDetailDO.getActualPrice().add(subAmount));
         TradeDetailBaseDO tradeDetailBaseDO = tradeOrderDetailBOList.get(0).getTradeDetailBaseDOList().stream().filter(item -> ObjectUtil.equal(item.getDetailId(), tradeDetailDO.getId())).findFirst().orElse(null);
         Asserts.isTrue(tradeDetailBaseDO != null, "数据异常");
         if (tradeDetailBaseDO != null) {

+ 199 - 51
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/orderjzdetail/OrderJzDetailServiceImpl.java

@@ -2,10 +2,14 @@ package com.yc.ship.module.trade.service.orderjzdetail;
 
 import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.util.IdUtil;
+import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.excel.util.DateUtils;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.yc.ship.framework.common.pojo.PageResult;
@@ -14,23 +18,26 @@ import com.yc.ship.framework.security.core.LoginUser;
 import com.yc.ship.framework.tenant.core.aop.TenantIgnore;
 import com.yc.ship.module.trade.controller.admin.orderjzdetail.vo.OrderJzDetailPageReqVO;
 import com.yc.ship.module.trade.controller.admin.orderjzdetail.vo.OrderJzDetailSaveReqVO;
+import com.yc.ship.module.trade.controller.app.ota.vo.OtaVoucherVO;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeOrderDO;
 import com.yc.ship.module.trade.dal.dataobject.orderjz.OrderJzDO;
 import com.yc.ship.module.trade.dal.dataobject.orderjzdetail.OrderJzDetailDO;
 import com.yc.ship.module.trade.dal.mysql.order.TradeOrderMapper;
 import com.yc.ship.module.trade.dal.mysql.orderjz.OrderJzMapper;
 import com.yc.ship.module.trade.dal.mysql.orderjzdetail.OrderJzDetailMapper;
+import com.yc.ship.module.trade.framework.common.Base64Util;
+import com.yc.ship.module.trade.framework.common.ota.DesUtil;
+import com.yc.ship.module.trade.utils.MD5Utils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static com.yc.ship.framework.security.core.util.SecurityFrameworkUtils.getLoginUser;
@@ -98,7 +105,9 @@ public class OrderJzDetailServiceImpl implements OrderJzDetailService {
         long count = 0;
         String batchNo = IdUtil.getSnowflake(0, 0).nextIdStr();
         // 先删除当前传入游客的历史接站数据
+        List<Long> visitorIds = new ArrayList<>();
         for (OrderJzDetailSaveReqVO orderJzDetailSaveReqVO : createReqVOList) {
+            visitorIds.add(orderJzDetailSaveReqVO.getVisitorId());
             orderJzDetailMapper.delete(new LambdaQueryWrapper<OrderJzDetailDO>().eq(OrderJzDetailDO::getVisitorId, orderJzDetailSaveReqVO.getVisitorId()));
         }
         //处理三方系统退票
@@ -109,22 +118,29 @@ public class OrderJzDetailServiceImpl implements OrderJzDetailService {
             count++;
         }
         try {
+            cancelSupplierJz(visitorIds,orderJzDO.getId(),createReqVOList);
+
             //处理三方系统出票 二期接站
-            createSupplierJz(createReqVOList, orderDo);
+            String supplierOrderId = createSupplierJz(createReqVOList, orderDo);
+            paySupplierJz(supplierOrderId, orderJzDO.getId(),createReqVOList);
         } catch (Exception e) {
             e.printStackTrace();
         }
         return count;
     }
 
-    private void createSupplierJz(List<OrderJzDetailSaveReqVO> createReqVOList, TradeOrderDO tradeOrderDO) {
+    private String createSupplierJz(List<OrderJzDetailSaveReqVO> createReqVOList, TradeOrderDO tradeOrderDO) throws Exception {
         Long id = null;
-        String productId = "";
+        String productId = "2034192879786524673";
+        String method = "createOrder";
+        String createOrderUrl = "http://10.3.10.50/app-api/travelhub-ops-trade/trade/ota/212/" + method;
+        String userId = "67fd6a5e6a2a453a98f288b08d571234";
+        String userKey = "TFD9BEOK";
         String bookname = "";
         String mobile = "";
         String idcard = "";
         for (OrderJzDetailSaveReqVO orderJzDetailSaveReqVO : createReqVOList) {
-            id = orderJzDetailSaveReqVO.getId();
+            id = orderJzDetailSaveReqVO.getJzId();
             mobile = orderJzDetailSaveReqVO.getPhone();
             idcard = orderJzDetailSaveReqVO.getIdCard();
         }
@@ -133,7 +149,7 @@ public class OrderJzDetailServiceImpl implements OrderJzDetailService {
         rep_body.put("travelDate", tradeOrderDO.getTravelDate());
         rep_body.put("travelTime", "");
         rep_body.put("quantity", createReqVOList.size());
-        rep_body.put("productId", "productId");
+        rep_body.put("productId", productId);
         rep_body.put("bookName", bookname);
         rep_body.put("bookMobile", mobile);
         rep_body.put("idCard", idcard);
@@ -148,48 +164,180 @@ public class OrderJzDetailServiceImpl implements OrderJzDetailService {
             vistorList.add(vistor);
         }
         rep_body.put("visitPersons", vistorList);
-//    String bodyStr = DesUtil.encrypt(rep_body.toString(),userKey);
-//    String signStr = userId+method+timestamp+bodyStr+userKey;
-//    log.info("jfg供应商预下单开始,signStr:{}",signStr);
-//    String sign = MD5Utils.getMD5(signStr.getBytes("UTF-8"));
-//
-//    JSONObject rep_head=new JSONObject();
-//    rep_head.put("user_id", userId);
-//    rep_head.put("method",method );
-//    rep_head.put("timestamp", timestamp);
-//    rep_head.put("sign", sign);
-//
-//    JSONObject req=new JSONObject();
-//    req.put("requestHead", rep_head);
-//    req.put("requestBody", bodyStr);
-//    Map<String, String> headMap = new HashMap<>();
-//    headMap.put("Content-type", "application/x-www-form-urlencoded");
-//    log.info("jfg供应商预下单开始,请求地址:{},请求参数:{}",createOrderUrl,req.toString());
-//    String res = HttpUtil.createPost(createOrderUrl).contentType("application/json")
-//            .body(Base64Util.encode(req.toString()))
-//            .headerMap(headMap,false)
-//            .timeout(100000)
-//            .execute().body();
-//    log.info("jfg供应商预下单完成,响应参数:{}",res);
-//    // base64解密
-//    String json = new String(Base64.decodeBase64(res.getBytes("UTF-8")));
-//    log.info("jfg供应商预下单完成,响应response参数:{}",json);
-//    JSONObject jsonObj = JSONUtil.parseObj(json);
-//    JSONObject responseHead = jsonObj.getJSONObject("responseHead");
-//    if(StringUtils.equals("1000",responseHead.getStr("res_code"))){
-//      String response = jsonObj.getStr("responseBody");
-//      String body = "";
-//      try {
-//        body = DesUtil.decrypt(response, userKey);
-//      } catch (Exception e) {
-//        log.info(e.toString());
-//      }
-//      log.info("jfg供应商预下单完成,响应body参数:{}",body);
-//      JSONObject responseBody =JSONUtil.parseObj(body);
-//      return CommonResult.success(new SupplierTradeOrderRespBO().setSupplierOrderNo(responseBody.getStr("partnerOrderId")));
-//    }else{
-//      return CommonResult.error(500,responseHead.getStr("res_msg"));
-//    }
+        String bodyStr = DesUtil.encrypt(rep_body.toString(), userKey);
+        Long timestamp = System.currentTimeMillis() / 1000;
+        String signStr = userId + method + timestamp + bodyStr + userKey;
+        log.info("三峡二期系统预下单开始,signStr:{}", signStr);
+        String sign = MD5Utils.getMD5(signStr.getBytes("UTF-8"));
+
+        JSONObject rep_head = new JSONObject();
+        rep_head.put("user_id", userId);
+        rep_head.put("method", method);
+        rep_head.put("timestamp", timestamp);
+        rep_head.put("sign", sign);
+
+        JSONObject req = new JSONObject();
+        req.put("requestHead", rep_head);
+        req.put("requestBody", bodyStr);
+        Map<String, String> headMap = new HashMap<>();
+        headMap.put("Content-type", "application/x-www-form-urlencoded");
+        log.info("二期预下单开始,请求地址:{},请求参数:{}", createOrderUrl, req.toString());
+        String res = HttpUtil.createPost(createOrderUrl).contentType("application/json")
+                .body(Base64Util.encode(req.toString()))
+                .headerMap(headMap, false)
+                .timeout(100000)
+                .execute().body();
+        log.info("二期系统预下单完成,响应参数:{}", res);
+        // base64解密
+        log.info("二期系统预下单完成,响应response参数:{}", res);
+        JSONObject jsonObj = JSONUtil.parseObj(res);
+        JSONObject responseHead = jsonObj.getJSONObject("responseHead");
+        if (StringUtils.equals("1000", responseHead.getStr("res_code"))) {
+            String response = jsonObj.getStr("responseBody");
+            String body = "";
+            try {
+                body = DesUtil.decrypt(response, userKey);
+            } catch (Exception e) {
+                log.info(e.toString());
+            }
+            log.error("二期下单完成,响应body参数:{}", body);
+            JSONObject responseBody =JSONUtil.parseObj(body);
+            return responseBody.getStr("orderId");
+        } else {
+            log.error("二期下单失败,响应response参数:{}", res);
+        }
+        return  null;
+    }
+
+
+    private void paySupplierJz(String supplierOrderId, Long jzId,List<OrderJzDetailSaveReqVO> createReqVOList) throws Exception {
+        String method = "payOrder";
+        String createOrderUrl = "http://10.3.10.50/app-api/travelhub-ops-trade/trade/ota/212/" + method;
+        String userId = "67fd6a5e6a2a453a98f288b08d571234";
+        String userKey = "TFD9BEOK";
+        JSONObject rep_body = new JSONObject();
+        rep_body.put("orderId", supplierOrderId);
+        rep_body.put("partnerOrderId", jzId);
+
+        String bodyStr = DesUtil.encrypt(rep_body.toString(), userKey);
+        Long timestamp = System.currentTimeMillis() / 1000;
+        String signStr = userId + method + timestamp + bodyStr + userKey;
+        log.info("二期订单支付开始,signStr:{}", signStr);
+        String sign = MD5Utils.getMD5(signStr.getBytes("UTF-8"));
+
+        JSONObject rep_head = new JSONObject();
+        rep_head.put("user_id", userId);
+        rep_head.put("method", method);
+        rep_head.put("timestamp", timestamp);
+        rep_head.put("sign", sign);
+
+        JSONObject req = new JSONObject();
+        req.put("requestHead", rep_head);
+        req.put("requestBody", bodyStr);
+        Map<String, String> headMap = new HashMap<>();
+        headMap.put("Content-type", "application/x-www-form-urlencoded");
+        log.info("二期预支付开始,请求地址:{},请求参数:{}", createOrderUrl, req.toString());
+        String res = HttpUtil.createPost(createOrderUrl).contentType("application/json")
+                .body(Base64Util.encode(req.toString()))
+                .headerMap(headMap, false)
+                .timeout(100000)
+                .execute().body();
+        log.info("二期系统支付完成,响应参数:{}", res);
+        // base64解密
+        String json = new String(org.apache.commons.codec.binary.Base64.decodeBase64(res.getBytes("UTF-8")));
+        log.info("二期系统支付完成,响应response参数:{}", json);
+        JSONObject jsonObj = JSONUtil.parseObj(json);
+        JSONObject responseHead = jsonObj.getJSONObject("responseHead");
+        if (StringUtils.equals("1000", responseHead.getStr("res_code"))) {
+            String response = jsonObj.getStr("responseBody");
+            String body = "";
+            try {
+                body = DesUtil.decrypt(response, userKey);
+            } catch (Exception e) {
+                log.info(e.toString());
+            }
+            log.error("二期支付完成,响应body参数:{}", body);
+            JSONObject responseBody =JSONUtil.parseObj(body);
+            JSONArray vistors =responseBody.getJSONArray("visitPersons");
+            for (int i = 0; i < vistors.size(); i++) {
+                JSONObject vistor = vistors.getJSONObject(i);
+                String idCard = vistor.getStr("idCard");
+                String ticketId = vistor.getStr("ticketId");
+                orderJzDetailMapper.update(new UpdateWrapper<OrderJzDetailDO>().set("extend_order_no", supplierOrderId).set("extend_ticket_no", ticketId).eq("jz_id", jzId).eq("id_card", idCard));
+            }
+        } else {
+            log.error("二期支付失败,响应response参数:{}", json);
+        }
+    }
+
+    private void cancelSupplierJz(List<Long> visitorIds, Long jzId,List<OrderJzDetailSaveReqVO> createReqVOList) throws Exception {
+        String method = "cancelTicket";
+        String createOrderUrl = "http://10.3.10.50/app-api/travelhub-ops-trade/trade/ota/212/" + method;
+        String userId = "67fd6a5e6a2a453a98f288b08d571234";
+        String userKey = "TFD9BEOK";
+        List<OrderJzDetailDO> jzDetailList = orderJzDetailMapper.selectList(new QueryWrapper<OrderJzDetailDO>().in("visitor_id", visitorIds));
+        Map<String, List<OrderJzDetailDO>> groupList = jzDetailList.stream().filter(item -> StringUtils.isNotBlank(item.getExtendOrderNo())).collect(Collectors.groupingBy(OrderJzDetailDO::getExtendOrderNo));
+        if(groupList.isEmpty()){
+            log.error("无可退二期票信息"+jzId);
+            return;
+        }
+        groupList.forEach((supplierOrderId, list) -> {
+            try {
+                JSONObject rep_body = new JSONObject();
+                rep_body.put("orderId", supplierOrderId);
+                rep_body.put("partnerOrderId", jzId);
+                List<String> ticketIds = new ArrayList<>();
+                for (OrderJzDetailDO item : list) {
+                    ticketIds.add(item.getExtendTicketNo());
+                }
+                rep_body.set("refundDetailIds", ticketIds);
+                String bodyStr = DesUtil.encrypt(rep_body.toString(), userKey);
+                Long timestamp = System.currentTimeMillis() / 1000;
+                String signStr = userId + method + timestamp + bodyStr + userKey;
+                log.info("二期系统退票开始,signStr:{}", signStr);
+                String sign = MD5Utils.getMD5(signStr.getBytes("UTF-8"));
+
+                JSONObject rep_head = new JSONObject();
+                rep_head.put("user_id", userId);
+                rep_head.put("method", method);
+                rep_head.put("timestamp", timestamp);
+                rep_head.put("sign", sign);
+
+                JSONObject req = new JSONObject();
+                req.put("requestHead", rep_head);
+                req.put("requestBody", bodyStr);
+                Map<String, String> headMap = new HashMap<>();
+                headMap.put("Content-type", "application/x-www-form-urlencoded");
+                log.info("二期系统退票开始,请求地址:{},请求参数:{}", createOrderUrl, req.toString());
+                String res = HttpUtil.createPost(createOrderUrl).contentType("application/json")
+                        .body(Base64Util.encode(req.toString()))
+                        .headerMap(headMap, false)
+                        .timeout(100000)
+                        .execute().body();
+                log.info("二期系统退票完成,响应参数:{}", res);
+                // base64解密
+                String json = new String(org.apache.commons.codec.binary.Base64.decodeBase64(res.getBytes("UTF-8")));
+                log.info("二期系统退票完成,响应response参数:{}", json);
+                JSONObject jsonObj = JSONUtil.parseObj(json);
+                JSONObject responseHead = jsonObj.getJSONObject("responseHead");
+                if (StringUtils.equals("1000", responseHead.getStr("res_code"))) {
+                    String response = jsonObj.getStr("responseBody");
+                    String body = "";
+                    try {
+                        body = DesUtil.decrypt(response, userKey);
+                    } catch (Exception e) {
+                        log.info(e.toString());
+                    }
+                    log.error("二期系统退票完成,响应body参数:{}", body);
+                } else {
+                    log.error("二期系统退票失败,响应response参数:{}", json);
+                }
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+        });
+
+
     }
 
 

+ 3 - 3
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/otc/impl/OtcTradeOrderServiceImpl.java

@@ -3156,7 +3156,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                         item.put("floor", StringUtils.isEmpty(visitor.getFloor()) ? "" : visitor.getFloor()); // 楼层
 
                         item.put("roomIndex", roomIndex); // 序号(按订单内的房间顺序)
-                        item.put("roomType", (StringUtils.isEmpty(visitor.getRoomType()) ? "" : visitor.getRoomType()) + (StringUtils.isEmpty(visitor.getFloor()) ? "" : (" (" + visitor.getFloor() + ")"))); // 房型(如:豪华标准间 (2F))
+                        item.put("roomType", (StringUtils.isEmpty(visitor.getRoomType()) ? "" : visitor.getRoomType()) + (StringUtils.isEmpty(visitor.getFloor()) ? "" : (" (" + visitor.getFloor() + "F)"))); // 房型(如:豪华标准间 (2F))
                         item.put("roomDescription", roomDescription); // 入住类型(如:2个成人/1个儿童)
 
                         // 游客详情(8列):每个游客独立显示
@@ -3164,7 +3164,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                         item.put("gender", visitor.getGender() != null ? (visitor.getGender() == 1 ? "男" : "女") : ""); // 性别(1=男,其他=女)
                         item.put("credentialType", DictFrameworkUtils.getDictDataLabel(DictTypeConstants.VISITOR_CREDENTIAL_TYPE, visitor.getCredentialType())); // 证件类型(身份证/护照等)
                         item.put("credentialNo", StringUtils.isEmpty(visitor.getCredentialNo()) ? "" : visitor.getCredentialNo()); // 证件号
-                        item.put("visitorType", StringUtils.isEmpty(visitor.getVisitorType()) ? "" : getPersonTypeAll(visitor.getVisitorType())); // 游客类型(成人/儿童/婴儿)
+                        item.put("visitorType", getPersonTypeAll(visitor.getVisitorType())); // 游客类型(成人/儿童/婴儿)
                         item.put("nationalityName", StringUtils.isEmpty(visitor.getNationalityName()) ? "" : visitor.getNationalityName()); // 国籍(如:中国、美国)
                         item.put("valueAddedService", StringUtils.isEmpty(visitor.getValueAddedService()) ? "" : formatPolicyName(visitor.getValueAddedService())); // 增值服务(如:接送站、保险等)
                         item.put("policyName", ""); // 优惠政策(如:早鸟优惠、团立减等)
@@ -3235,7 +3235,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
 
         // 按游客类型统计数量
         Map<String, Long> typeCountMap = roomVisitors.stream()
-                .filter(v -> StringUtils.isNotEmpty(v.getVisitorType()))
+//                .filter(v -> StringUtils.isNotEmpty(v.getVisitorType()))
                 .collect(Collectors.groupingBy(TouristExportVisitorVO::getVisitorType, Collectors.counting()));
 
         StringBuilder sb = new StringBuilder();

+ 2 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/refund/impl/TradeRefundServiceImpl.java

@@ -963,6 +963,8 @@ public class TradeRefundServiceImpl implements TradeRefundService {
             calculateRefundItem.setDetailList(refundSubItemList);
             fee = getRefundFee(originRefundPrice, percent);
         }
+        originRefundPrice = originRefundPrice==null?BigDecimal.ZERO:originRefundPrice;
+        fee = fee==null?BigDecimal.ZERO:fee;
         refundAmount = originRefundPrice.subtract(fee);
 
         calculateRefundItem.setOriginRefundAmount(originRefundPrice);

+ 63 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/utils/MD5Utils.java

@@ -0,0 +1,63 @@
+package com.yc.ship.module.trade.utils;
+
+import java.security.MessageDigest;
+
+public class MD5Utils {
+	
+	private final static char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+			'a', 'b', 'c', 'd', 'e', 'f' };
+	
+	public static String MD5(String s) {
+		
+		try {
+			byte[] strTemp = s.getBytes("utf-8");
+			MessageDigest mdTemp = MessageDigest.getInstance("MD5"); 
+			mdTemp.update(strTemp);
+			byte[] md = mdTemp.digest();
+			int j = md.length;
+			char[] str = new char[j * 2];
+			int k = 0;
+			for (int i = 0; i < j; i++) {
+				byte byte0 = md[i];
+				str[k++] = hexDigits[byte0 >>> 4 & 0xf];
+				str[k++] = hexDigits[byte0 & 0xf];
+			}
+			return new String(str);
+		} catch (Exception e) {
+			return null;
+		}
+	}
+
+	/**
+	 *生成md5
+	 *@param source
+	 * @return
+	 */
+	public static String getMD5(byte[] source) {
+		String s = null;
+		char[] hexDigits = { // 用来将字节转换成 16 进制表示的字符
+				'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+		try {
+			MessageDigest md = MessageDigest.getInstance("MD5");
+			md.update(source);
+			byte[] tmp = md.digest();          // MD5 的计算结果是一个 128 位的长整数,
+			// 用字节表示就是 16 个字节
+			char[] str = new char[16 * 2];   // 每个字节用 16 进制表示的话,使用两个字符,
+			// 所以表示成 16 进制需要 32 个字符
+			int k = 0;                                // 表示转换结果中对应的字符位置
+			for (int i = 0; i < 16; i++) {    // 从第一个字节开始,对 MD5 的每一个字节
+				// 转换成 16 进制字符的转换
+				byte byte0 = tmp[i];  // 取第 i 个字节
+				str[k++] = hexDigits[byte0 >>> 4 & 0xf];  // 取字节中高 4 位的数字转换,
+				// >>> 为逻辑右移,将符号位一起右移
+				str[k++] = hexDigits[byte0 & 0xf];   // 取字节中低 4 位的数字转换
+			}
+			s = new String(str);  // 换后的结果转换为字符串
+
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return s;
+	}
+
+}

+ 7 - 9
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/order/TradeVisitorMapper.xml

@@ -206,21 +206,19 @@
     <select id="selectListByVoyageId" resultType="com.yc.ship.module.trade.dal.dataobject.order.TradeVisitorDO">
         select tv.*,if(pprmt.total_num &gt;=2 and pprmt.enable_share=0,1,0) as isHaveTogethers,if(pprmt.total_num =1 and pprmt.enable_share=0,1,0) as isAlone
         from trade_visitor tv
-                 join trade_order to1 on tv.order_id=to1.id
-                 join trade_order_room_model torm on tv.room_index_id=torm.room_index_id
-                 join product_price_room_model_type pprmt on torm.room_model_type_id = pprmt.id
-        where to1.voyage_id=#{voyageId} and to1.order_status=6
-            join trade_order to1 on tv.order_id=to1.id and to1.deleted=0
-            join trade_order_room_model torm on tv.room_index_id=torm.room_index_id and torm.deleted=0
-            join product_price_room_model_type pprmt on torm.room_model_type_id = pprmt.id and pprmt.deleted=0
+                 join trade_order to1 on tv.order_id=to1.id and to1.deleted=0
+                 join trade_order_room_model torm on tv.room_index_id=torm.room_index_id and torm.deleted=0
+                 join product_price_room_model_type pprmt on torm.room_model_type_id = pprmt.id and pprmt.deleted=0
         where to1.voyage_id=#{voyageId} and to1.order_status=6 and tv.deleted=0
+          and tv.room_index_id is not null
+          and tv.room_model_id is not null
+          and tv.floor is not null
     </select>
 
     <select id="selectListByVoyageIdAndRoomId"
             resultType="com.yc.ship.module.trade.dal.dataobject.order.TradeVisitorDO">
         select tv.*
         from trade_visitor tv
-                 join trade_order b on tv.order_id=b.id
                  join trade_order b on tv.order_id=b.id and b.deleted=0
         where b.order_status=6 and b.voyage_id=#{voyageId} and if(tv.final_room_id is null,tv.init_room_id,tv.final_room_id)=#{roomId}
     </select>
@@ -276,7 +274,7 @@
             tv.credential_type AS credentialType,
             tv.credential_no AS credentialNo,
             tv.type AS visitorType,
-            tv.floor as floor,
+            torm.floor as floor,
             a.name AS nationalityName,
             GROUP_CONCAT(ps.product_name) AS valueAddedService,
             tor.remark,

BIN
ship-module-trade/ship-module-trade-biz/src/main/resources/templates/tourist_template_agent.xlsx


BIN
ship-module-trade/ship-module-trade-biz/src/main/resources/templates/tourist_template_operator.xlsx