Explorar o código

bug修改,电子发票功能接口完善

lishiqiang hai 2 semanas
pai
achega
d5c0f72285

+ 22 - 4
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/order/AdminTradeOrderController.java

@@ -5,27 +5,28 @@ import com.yc.ship.framework.common.pojo.CommonResult;
 import com.yc.ship.framework.common.util.collection.CollectionUtils;
 import com.yc.ship.framework.common.util.collection.MapUtils;
 import com.yc.ship.framework.common.util.object.BeanUtils;
+import com.yc.ship.framework.operatelog.core.annotations.OperateLog;
 import com.yc.ship.module.member.api.user.MemberUserApi;
 import com.yc.ship.module.member.api.user.dto.MemberUserRespDTO;
 import com.yc.ship.module.system.api.user.AdminUserApi;
 import com.yc.ship.module.system.api.user.dto.AdminUserRespDTO;
 import com.yc.ship.module.trade.controller.admin.order.vo.order.TradeOrderLogRespVO;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeOrderLogDO;
+import com.yc.ship.module.trade.framework.annotation.PlatTenantEnv;
+import com.yc.ship.module.trade.service.order.AdminTradeOrderService;
 import com.yc.ship.module.trade.service.order.TradeOrderLogService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.util.List;
 import java.util.Map;
 
 import static com.yc.ship.framework.common.pojo.CommonResult.success;
+import static com.yc.ship.framework.operatelog.core.enums.OperateTypeEnum.API;
 
 /**
  * 后台管理:订单通用接口
@@ -46,6 +47,9 @@ public class AdminTradeOrderController {
     @Resource
     private MemberUserApi memberUserApi;
 
+    @Resource
+    private AdminTradeOrderService adminTradeOrderService;
+
     @GetMapping("getOrderLogListByOrderId")
     @Operation(summary = "通过订单ID获得订单日志列表")
     public CommonResult<List<TradeOrderLogRespVO>> getOrderLogListByOrderId(@RequestParam("orderNo")  String orderNo) {
@@ -68,5 +72,19 @@ public class AdminTradeOrderController {
         });
         return success(tradeOrderLogRespVoList);
     }
+    @PostMapping("/order-apply-invoice")
+    @Operation(summary = "订单开票")
+    @OperateLog(type = API)
+    @PlatTenantEnv
+    public CommonResult<?> orderApplyInvoice(@RequestBody String jsonstr){
+        return  adminTradeOrderService.orderApplyInvoice(jsonstr);
+    }
 
+    @PostMapping("/plat-apply-invoice")
+    @Operation(summary = "平台订单开票")
+    @OperateLog(type = API)
+    @PlatTenantEnv
+    public CommonResult<?> platApplyInvoice(@RequestBody String jsonstr){
+        return  adminTradeOrderService.platApplyInvoice(jsonstr);
+    }
 }

+ 10 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/order/vo/order/TradeOrderRespExcelVO.java

@@ -42,6 +42,11 @@ public class TradeOrderRespExcelVO {
     @DictFormat("system_user_sex")
     private Integer gender;
 
+    @Schema(description = "证件类型")
+    @ExcelProperty(value = "证件类型", converter = DictConvert.class)
+    @DictFormat("credential_type")
+    private String credentialType;
+
     @Schema(description = "证件号")
     @ExcelProperty("证件号")
     private String credentialNo;
@@ -50,6 +55,11 @@ public class TradeOrderRespExcelVO {
     @ExcelProperty("国籍")
     private String nationality;
 
+    @Schema(description = "客户类型")
+    @ExcelProperty(value = "客户类型", converter = DictConvert.class)
+    @DictFormat("tour_type")
+    private String visitorType;
+
     @Schema(description = "生日")
     @ExcelProperty("生日")
     private String birthday;

+ 11 - 50
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/invoice/impl/InvoiceServiceImpl.java

@@ -52,7 +52,6 @@ import java.util.stream.Collectors;
 
 import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception0;
-import static com.yc.ship.module.trade.enums.ApiConstants.ORDER_CHANGE_TYPE_OLD;
 import static com.yc.ship.module.trade.enums.ErrorCodeConstants.*;
 
 
@@ -116,24 +115,16 @@ public class InvoiceServiceImpl implements InvoiceService {
             }
             Asserts.isTrue(ObjectUtil.equals(order.getIsInvoice(), InvoiceStatusEnum.NOT_INVOICED.getValue())
                     || ObjectUtil.equals(order.getIsInvoice(), InvoiceStatusEnum.INVOICE_FAILED.getValue()), ORDER_INVOICED.getCode(), "订单{}已开票", orderNo);
-            if(ObjectUtil.equals(order.getIsChangeOrder(),ORDER_CHANGE_TYPE_OLD)){
-                //如果是改签原订单,只计算退款手续费
-                BigDecimal totalFee = tradeRefundRepositoryService.getOrderRefundFee(order.getId());
-                if (totalFee != null) {
-                    amt = amt.add(totalFee);
-                }
-            }else{
-                amt = amt.add(order.getPayAmount());
-                //减去退款金额
-                BigDecimal orderRefundAmount = tradeRefundRepositoryService.getOrderRefundAmount(order.getId());
-                if (orderRefundAmount != null) {
-                    amt = amt.subtract(orderRefundAmount);
-                }
-                //减去未使用金额
-                BigDecimal unusedAmount = tradeOrderRepositoryService.getUnUsedAmount(order.getId());
-                if (unusedAmount != null) {
-                    amt = amt.subtract(unusedAmount);
-                }
+            amt = amt.add(order.getPayAmount());
+            //减去退款金额
+            BigDecimal orderRefundAmount = tradeRefundRepositoryService.getOrderRefundAmount(order.getId());
+            if (orderRefundAmount != null) {
+                amt = amt.subtract(orderRefundAmount);
+            }
+            //减去未使用金额
+            BigDecimal unusedAmount = tradeOrderRepositoryService.getUnUsedAmount(order.getId());
+            if (unusedAmount != null) {
+                amt = amt.subtract(unusedAmount);
             }
             orderList.add(order);
             if (StringUtils.isBlank(reqDTO.getAccountId()) && Objects.equals(order.getSellMethod(), SellMethodEnum.MINI_APP.getType())) {
@@ -143,12 +134,10 @@ public class InvoiceServiceImpl implements InvoiceService {
         if (reqDTO.getTotalPrice() == null) {
             reqDTO.setTotalPrice(reqDTO.getPrice());
         }
-        boolean isSingInvoice = false;
         //计算开票金额,如果未传值则用订单总金额
         if (reqDTO.getPrice() == null) {
             reqDTO.setPrice(amt);
         } else {
-            isSingInvoice = true;
             Asserts.isTrue(amt.compareTo(reqDTO.getTotalPrice()) == 0, "开票金额发生变更,请重新刷新后发起,{},{}", reqDTO.getPrice(), amt);
         }
 
@@ -157,41 +146,13 @@ public class InvoiceServiceImpl implements InvoiceService {
 
         tradeOrderRepositoryService.updateInvoiceStatus(orderList, InvoiceStatusEnum.INVOICE_INVOIING.getValue());
         String fpSupplier = configApi.getPlatformConfigValueByKey("supplier");
-        CommonResult<InvoiceDO> result;
         invoiceDO.setFpSupplier(fpSupplier);
-        if (StringUtils.equals("group", fpSupplier)) {
-            result = invoiceGroupService.invoiceIssuance(invoiceDO,reqDTO.getRemark());
-        } else {
-            result = invoiceHangxinService.invoiceIssuance(invoiceDO);
-        }
+        CommonResult<InvoiceDO> result = invoiceGroupService.invoiceIssuance(invoiceDO,reqDTO.getRemark());
         if (result.isSuccess()) {
             tradeOrderRepositoryService.updateInvoiceStatus(orderList, InvoiceStatusEnum.INVOICE_SUCCESS.getValue());
         } else {
             tradeOrderRepositoryService.updateInvoiceStatus(orderList, InvoiceStatusEnum.INVOICE_FAILED.getValue());
         }
-
-
-        if(isSingInvoice && reqDTO.getTotalPrice().subtract(reqDTO.getPrice()).compareTo(BigDecimal.ZERO)>0){
-            InvoiceDO invoiceDO2 = this.buildInvoice(reqDTO, reqDTO.getTotalPrice().subtract(reqDTO.getPrice()));
-            invoiceDetailService.createInvoiceDetail(orderList, invoiceDO2.getId());
-
-            tradeOrderRepositoryService.updateInvoiceStatus(orderList, InvoiceStatusEnum.INVOICE_INVOIING.getValue());
-            CommonResult<InvoiceDO> result2;
-            invoiceDO2.setFpSupplier(fpSupplier);
-            if (StringUtils.equals("group", fpSupplier)) {
-                result2 = invoiceGroupService.invoiceIssuance(invoiceDO2,reqDTO.getRemark());
-            } else {
-                result2 = invoiceHangxinService.invoiceIssuance(invoiceDO2);
-            }
-            if (result2.isSuccess()) {
-                tradeOrderRepositoryService.updateInvoiceStatus(orderList, InvoiceStatusEnum.INVOICE_SUCCESS.getValue());
-            }
-//            else {
-                //第二张发票失败了不处理,可能另外一个发票已经成功
-                //tradeOrderRepositoryService.updateInvoiceStatus(orderList, InvoiceStatusEnum.INVOICE_FAILED.getValue());
-//            }
-        }
-
         return result;
 
     }

+ 2 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/AdminTradeOrderService.java

@@ -54,4 +54,6 @@ public interface AdminTradeOrderService {
 
     CommonResult<?> cancelRefund(Long refundId);
 
+    CommonResult<?> orderApplyInvoice(String jsonstr);
+    CommonResult<?> platApplyInvoice(String jsonstr);
 }

+ 76 - 4
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/impl/AdminTradeOrderServiceImpl.java

@@ -3,6 +3,8 @@ package com.yc.ship.module.trade.service.order.impl;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.yc.ship.framework.common.lang.Asserts;
@@ -11,6 +13,8 @@ import com.yc.ship.framework.common.util.collection.CollectionUtils;
 import com.yc.ship.framework.common.util.object.ObjectUtils;
 import com.yc.ship.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.yc.ship.framework.security.core.LoginUser;
+import com.yc.ship.module.ota.api.OtaDistributorApi;
+import com.yc.ship.module.ota.api.dto.DistributorRespDTO;
 import com.yc.ship.module.otc.api.agency.dto.AgencyUserLoginInfoRespDTO;
 import com.yc.ship.module.product.api.dto.ProductSpuRespDTO;
 import com.yc.ship.module.trade.api.contract.ContractApi;
@@ -20,7 +24,9 @@ import com.yc.ship.module.trade.api.dto.TradeRefundAuditReqDTO;
 import com.yc.ship.module.trade.api.dto.TradeRefundCalculateRespDTO;
 import com.yc.ship.module.trade.api.dto.TradeRefundCreateReqDTO;
 import com.yc.ship.module.trade.api.dto.TradeRefundRespDTO;
+import com.yc.ship.module.trade.api.invoice.dto.InvoicingReqDTO;
 import com.yc.ship.module.trade.controller.admin.order.vo.refund.*;
+import com.yc.ship.module.trade.convert.invoice.InvoiceConvert;
 import com.yc.ship.module.trade.convert.order.TradeRefundConvert;
 import com.yc.ship.module.trade.dal.dataobject.audituser.AuditUserDO;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeDetailDO;
@@ -34,7 +40,11 @@ import com.yc.ship.module.trade.dal.mysql.order.TradeOrderMapper;
 import com.yc.ship.module.trade.dal.mysql.refund.CancelAuditMapper;
 import com.yc.ship.module.trade.dal.mysql.tradeOrderaudit.TradeOrderAuditMapper;
 import com.yc.ship.module.trade.enums.RefundChannelEnum;
+import com.yc.ship.module.trade.enums.TradeOrderOperateTypeEnum;
 import com.yc.ship.module.trade.enums.TradeOrderStatusEnum;
+import com.yc.ship.module.trade.framework.annotation.TradeOrderLog;
+import com.yc.ship.module.trade.framework.common.TradeOrderLogUtils;
+import com.yc.ship.module.trade.service.invoice.InvoiceService;
 import com.yc.ship.module.trade.service.order.AdminTradeOrderService;
 import com.yc.ship.module.trade.service.order.TradeOrderRepositoryService;
 import com.yc.ship.module.trade.service.order.bo.TradeVisitorBO;
@@ -46,10 +56,7 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -87,6 +94,10 @@ public class AdminTradeOrderServiceImpl implements AdminTradeOrderService {
     private ContractApi contractApi;
     @Resource
     private TradeOrderRepositoryService tradeOrderRepositoryService;
+    @Resource
+    private OtaDistributorApi distributorApi;
+    @Resource
+    private InvoiceService invoiceService;
 
     @Override
     public CommonResult<TradeRefundCreateRespVO> refund(LoginUser loginUser, TradeRefundCreateReqVO refundCreateReqVO) {
@@ -328,6 +339,7 @@ public class AdminTradeOrderServiceImpl implements AdminTradeOrderService {
     }
 
     @Override
+    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.MANUL_CANCEL)
     public CommonResult<?> cancelOrder(Long orderId) {
         TradeOrderDO tradeOrderDO = tradeOrderRepositoryService.getById(orderId);
         Asserts.isTrue(tradeOrderDO != null, "订单不存在");
@@ -346,6 +358,7 @@ public class AdminTradeOrderServiceImpl implements AdminTradeOrderService {
 
             AuditUserDO auditUserDO = auditUserMapper.selectOne(new LambdaQueryWrapperX<AuditUserDO>().eq(AuditUserDO::getType, 4).eq(AuditUserDO::getAuditStatus, 1).eq(AuditUserDO::getDeleted, 0).orderByDesc(AuditUserDO::getCreateTime).last("limit 1"));
             tradeOrderMapper.update(new UpdateWrapper<TradeOrderDO>().set("audit_type", 4).set("audit_user", auditUserDO == null ? "" : auditUserDO.getAuditUser()).set("order_status", TradeOrderStatusEnum.CANCEL_AUDIT.getStatus()).set("audit_status", 1).eq("id", tradeOrderDO.getId()));
+            TradeOrderLogUtils.setOrderInfo(orderId, tradeOrderDO.getOrderStatus(), TradeOrderStatusEnum.CANCEL_AUDIT.getStatus());
             return CommonResult.success("订单取消审核中");
 //        }else{
 //            return tradeOrderPayService.cancelOrder(orderId);
@@ -366,4 +379,63 @@ public class AdminTradeOrderServiceImpl implements AdminTradeOrderService {
         return tradeRefundService.cancelRefund(refundId);
     }
 
+    @Override
+    public CommonResult<?> orderApplyInvoice(String jsonStr) {
+        JSONObject reqObj = JSONUtil.parseObj(jsonStr);
+        List<String> orderNoList = Arrays.asList(reqObj.getStr("orderNos").split(","));
+        String otaId = reqObj.getStr("otaId");
+        String remark = reqObj.getStr("remark");
+        if(StringUtils.isNotBlank(otaId)){
+            //平台开旅行社发票
+            DistributorRespDTO distributorRespDTO = distributorApi.getDistributorById(Long.parseLong(otaId));
+            if (distributorRespDTO==null){
+                throw exception(INVOICING_FAIL);
+            }
+            InvoicingReqDTO reqDTO = InvoiceConvert.INSTANCE.convertOtc(distributorRespDTO);
+            reqDTO.setOrderIdList(orderNoList);
+            reqDTO.setTitleType(1);
+            reqDTO.setRemark(remark);
+            reqDTO.setPrice(reqObj.getBigDecimal("amount"));
+            reqDTO.setTotalPrice(reqObj.getBigDecimal("totalAmount"));
+            return invoiceService.applyInvoicing(reqDTO);
+        }
+        LoginUser loginUser = getLoginUser();
+        CommonResult<DistributorRespDTO> distributorResult = distributorApi.getDistributorByAccountTenantId(loginUser.getTenantId());
+        if (distributorResult.isError()){
+            throw exception(INVOICING_FAIL);
+        }
+        DistributorRespDTO distributorRespDTO = distributorResult.getCheckedData();
+        InvoicingReqDTO reqDTO = InvoiceConvert.INSTANCE.convertOtc(distributorRespDTO);
+        reqDTO.setOrderIdList(orderNoList);
+        reqDTO.setTitleType(1);
+        reqDTO.setRemark(remark);
+        reqDTO.setPrice(reqObj.getBigDecimal("amount"));
+        reqDTO.setTotalPrice(reqObj.getBigDecimal("totalAmount"));
+        return invoiceService.applyInvoicing(reqDTO);
+    }
+
+    @Override
+    public CommonResult<?> platApplyInvoice(String jsonStr) {
+        JSONObject reqObj = JSONUtil.parseObj(jsonStr);
+        List<String> orderNoList = Arrays.asList(reqObj.getStr("orderNos").split(","));
+        String otaId = reqObj.getStr("otaId");
+        String remark = reqObj.getStr("remark");
+        if(StringUtils.isBlank(otaId)){
+            throw exception(INVOICING_FAIL_OTA);
+        }
+        //平台开旅行社发票
+        DistributorRespDTO distributorRespDTO = distributorApi.getDistributorById(Long.parseLong(otaId));
+        if (distributorRespDTO == null){
+            throw exception(INVOICING_FAIL);
+        }
+        InvoicingReqDTO reqDTO = InvoiceConvert.INSTANCE.convertOtc(distributorRespDTO);
+        reqDTO.setOrderIdList(orderNoList);
+        reqDTO.setTitleType(1);
+        reqDTO.setIsPlat(1);
+        reqDTO.setRemark(remark);
+        reqDTO.setPrice(reqObj.getBigDecimal("amount"));
+        reqDTO.setTotalPrice(reqObj.getBigDecimal("totalAmount"));
+        return invoiceService.applyInvoicing(reqDTO);
+    }
+
 }

+ 1 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/impl/TradeOrderRepositoryServiceImpl.java

@@ -276,6 +276,7 @@ public class TradeOrderRepositoryServiceImpl implements TradeOrderRepositoryServ
     public TradeOrderDO getOrderByNo(String orderNo) {
         LambdaQueryWrapper<TradeOrderDO> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(TradeOrderDO::getOrderNo, orderNo);
+        queryWrapper.eq(TradeOrderDO::getDeleted, 0);
 
         return tradeOrderMapper.selectOne(queryWrapper);
     }

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

@@ -596,7 +596,7 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
 
 
     @Override
-    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.ORDER_AUDIT)
+    @TradeOrderLog(operateType = TradeOrderOperateTypeEnum.CANCEL_AUDIT)
     @TenantIgnore
     public CommonResult<?> cancelAuto(Long orderId) {
         TradeOrderDO tradeOrderDO = tradeOrderMapper.selectById(orderId);
@@ -1377,7 +1377,6 @@ public class OtcTradeOrderServiceImpl implements OtcTradeOrderService {
                 AdminUserRespDTO user = adminUserApi.getUser(Long.parseLong(spu.getSellerId()));
                 if (user != null) {
                     spu.setSellerName(user.getNickname());
-                    spu.setBusinessName(user.getNickname());
                 }
             }
         });

+ 2 - 5
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/order/TradeOrderMapper.xml

@@ -1039,7 +1039,6 @@
         o.item_id,
         o.payment_date,
         o.remark,
-        o.route_plan_id,
         o.seller_id,
         o.sell_method,
         o.share_name,
@@ -1048,7 +1047,6 @@
         o.store_id,
         o.store_name,
         o.visitor_type,
-        ps.cost_price,
         tou.contact_name,
         tou.credential_no,
         tou.mobile,
@@ -1076,15 +1074,14 @@
         LEFT JOIN trade_refund_detail trd ON trd.trade_detail_id = td.id
         AND trd.refund_status = 6
         INNER JOIN trade_order_user tou ON o.id = tou.order_id
-        INNER JOIN product_spu ps ON ps.id = td.product_id
         LEFT JOIN trade_invoice_detail i ON i.order_no = o.order_no
         LEFT JOIN trade_invoice ii ON i.invoice_id = ii.id AND ii.invoice_status IN (1,3)
         LEFT JOIN (select order_id,payment_type from trade_order_pay where pay_status=1 GROUP BY order_id) op ON op.order_id = o.id
         LEFT JOIN ota_bill_order obo ON obo.order_id = o.id
         LEFT JOIN ota_bill_store obs ON obs.id = obo.bill_store_id AND obs.bill_status=1
-        where td.validity_end_date >= DATE_SUB(NOW(), INTERVAL #{canInvoicedDay} DAY)
+        where td.use_date >= DATE_SUB(NOW(), INTERVAL #{canInvoicedDay} DAY)
         and o.is_invoice in (0,2)
-        and o.order_status in (7,8,9,11,12)
+        and o.order_status in (6,7,8,9,11,12)
         <if test="vo.orderNo != null and vo.orderNo != ''">
             AND o.order_no = #{vo.orderNo}
         </if>

+ 3 - 1
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/order/TradeVisitorMapper.xml

@@ -217,7 +217,9 @@
     </select>
 
     <select id="getExportVisitorList" resultType="com.yc.ship.module.trade.controller.admin.order.vo.order.TradeOrderRespExcelVO">
-        select t1.order_no orderNo,t1.group_no groupNo,t1.order_status orderStatus,t1.source_name sourceName,t3.name name,t3.gender gender,t3.credential_no credentialNo,t7.name nationality,t3.birthday birthday,t3.mobile mobile,t3.age age,t3.mobile mobile,t5.short_name roomModelName,t3.floor floor,t6.room_num roomName,t2.price price,t3.remark remark
+        select t1.order_no orderNo,t1.group_no groupNo,t1.order_status orderStatus,t1.source_name sourceName,t3.name name,
+        t3.gender gender,t3.type visitorType,t3.credential_type credentialType,t3.credential_no credentialNo,
+        t7.name nationality,t3.birthday birthday,t3.mobile mobile,t3.age age,t3.mobile mobile,t5.short_name roomModelName,t3.floor floor,t6.room_num roomName,t2.price price,t3.remark remark
         from trade_order t1 inner join trade_detail t2 on t1.id=t2.order_id and t2.product_type = 0 and t2.deleted = 0
         inner join trade_visitor t3 on t2.visitor_id=t3.id and t3.deleted =0
         left join trade_order_room_model t4 on t3.room_index_id=t4.room_index_id and t4.deleted=0