Browse Source

mj增值订单发票

zoujiajian 1 year ago
parent
commit
59ecacce2d

+ 2 - 1
netflix-dao/src/main/java/com/cyksj/mapper/UserInvoiceOrderRelateMapper.java

@@ -1,6 +1,7 @@
 package com.cyksj.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.dto.InvoiceOrderDto;
 import com.cyksj.model.entity.UserInvoiceOrderRelate;
 import org.apache.ibatis.annotations.Param;
 
@@ -13,5 +14,5 @@ import java.util.List;
  * 创建时间:2024/12/12 17:24
  */
 public interface UserInvoiceOrderRelateMapper extends BaseMapper<UserInvoiceOrderRelate> {
-	void batchInsert(@Param("recordId") Long recordId, @Param("userId") Long userId, @Param("orderIds") List<Long> orderIds);
+	void batchInsert(@Param("recordId") Long recordId, @Param("userId") Long userId, @Param("orders") List<InvoiceOrderDto> orderDtos);
 }

+ 18 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/InvoiceOrderDto.java

@@ -0,0 +1,18 @@
+package com.cyksj.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: InvoiceOrderDto
+ * 创建者: JavaZou
+ * 创建时间:2025/5/20 14:25
+ */
+@Getter
+@Setter
+public class InvoiceOrderDto {
+	private Long orderId;
+
+	private Integer type;
+}

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserInvoiceOrderRelate.java

@@ -24,4 +24,9 @@ public class UserInvoiceOrderRelate extends BaseEntity{
 	 * 订单id
 	 */
 	private Long orderId;
+
+	/**
+	 * 默认1普通订单,2是增值订单
+	 */
+	private Integer type;
 }

+ 2 - 1
netflix-dao/src/main/java/com/cyksj/model/excel/ExcelInvoiceData.java

@@ -20,7 +20,8 @@ import java.util.Date;
 @Getter
 @Setter
 @SearchBean(tables = "user_invoice_apply_record uar inner join user_invoice_order_relate uor on uor.record_id = uar.id" +
-		" inner join order_don o on o.id = uor.order_id"
+		" left join order_don o on o.id = uor.order_id and uor.type = 1" +
+		" left join upgrade_order_don uod on uod.id = uor.oder_id and uor.type = 2"
 		, groupBy = "uar.id,uar.user_id,uar.money,uar.zfb_payment,uar.head,uar.tax_no,uar.bank,uar.bank_no,uar.email,uar.status,uar.invoice_img,uar.created_time,uar.update_time")
 @ExcelIgnoreUnannotated
 public class ExcelInvoiceData {

+ 2 - 1
netflix-dao/src/main/java/com/cyksj/model/request/UserInvoiceOrderReq.java

@@ -1,5 +1,6 @@
 package com.cyksj.model.request;
 
+import com.cyksj.model.dto.InvoiceOrderDto;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -14,7 +15,7 @@ import java.util.List;
 @Getter
 @Setter
 public class UserInvoiceOrderReq {
-	private List<Long> orderIds;
+	private List<InvoiceOrderDto> orderDons;
 
 	private Long userId;
 

+ 3 - 2
netflix-dao/src/main/java/com/cyksj/model/views/UserInvoiceApplyRecordView.java

@@ -17,7 +17,8 @@ import java.util.Date;
 @Getter
 @Setter
 @SearchBean(tables = "user_invoice_apply_record uar inner join user_invoice_order_relate uor on uor.record_id = uar.id" +
-		" inner join order_don o on o.id = uor.order_id"
+		" left join order_don o on o.id = uor.order_id and uor.type = 1" +
+		" left join upgrade_order_don uod on uod.id = uor.order_id and uor.type = 2"
 		, groupBy = "uar.id,uar.user_id,uar.money,uar.zfb_payment,uar.head,uar.tax_no,uar.bank,uar.bank_no,uar.email,uar.status,uar.invoice_img,uar.created_time,uar.update_time")
 public class UserInvoiceApplyRecordView {
 
@@ -78,7 +79,7 @@ public class UserInvoiceApplyRecordView {
 	@DbField("uar.invoice_img")
 	private String invoiceImg;
 
-	@DbField("group_concat(o.order_no)")
+	@DbField("group_concat(ifnull(o.order_no,uod.order_no))")
 	private String orderNoStr;
 
 	@DbField("uar.created_time")

+ 8 - 2
netflix-dao/src/main/java/com/cyksj/model/views/UserInvoiceChoseOrderViews.java

@@ -17,11 +17,11 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@SearchBean(tables = " order_don o left join user_invoice_order_relate uor on uor.order_id = o.id" +
+@SearchBean(tables = " (:uq: (select id,goods_id,sku_id,order_no,money,user_id,pay_time,shop_id,created_time,1 as type from order_don where money > 0 and status not in ('close','noPayment','refund') and type = 'ALI_PAY')) o left join user_invoice_order_relate uor on uor.order_id = o.id" +
 		" inner join goods_don g on g.id = o.goods_id and (g.id in (select goods_id from goods_don_category_relate where category = 1) or g.id = 40)" +
 		" inner join goods_don_sku sku on sku.id = o.sku_id" +
 		" inner join shop_config sc on sc.app_id = o.shop_id",
-		where = "o.money > 0 and uor.id is null and o.status not in ('close','noPayment','refund') and o.type = 'ALI_PAY' :dc:",
+		where = " uor.id is null :dc:",
 		orderBy = "o.id desc")
 public class UserInvoiceChoseOrderViews {
 
@@ -55,4 +55,10 @@ public class UserInvoiceChoseOrderViews {
 	@DbField("o.shop_id")
 	@JsonIgnore
 	private Long shopId;
+
+	/**
+	 * 普通订单
+	 */
+	@DbField("o.type")
+	private Integer type;
 }

+ 7 - 6
netflix-dao/src/main/java/com/cyksj/model/views/UserInvoiceOrderViews.java

@@ -16,18 +16,19 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@SearchBean(tables = "user_invoice_order_relate uor inner join order_don o on o.id = uor.order_id" +
-		" inner join goods_don g on g.id = o.goods_id" +
-		" inner join goods_don_sku sku on sku.id = o.sku_id")
+@SearchBean(tables = "user_invoice_order_relate uor left join order_don o on o.id = uor.order_id and uor.type = 1" +
+		" left join upgrade_order_don uod on uod.id = uor.order_id and uor.type = 2" +
+		" inner join goods_don g on (g.id = o.goods_id or g.id = uod.goods_id)" +
+		" inner join goods_don_sku sku on (sku.id = o.sku_id or sku.id = uod.sku_id)")
 public class UserInvoiceOrderViews {
 
 	@DbField("uor.record_id")
 	private Long recordId;
 
-	@DbField("o.order_no")
+	@DbField("ifnull(o.order_no,uod.order_no)")
 	private String orderNo;
 
-	@DbField("o.money")
+	@DbField("ifnull(o.money,uod.money)")
 	private BigDecimal money;
 
 	@DbField("g.title")
@@ -39,6 +40,6 @@ public class UserInvoiceOrderViews {
 	@DbField("g.logo")
 	private String logo;
 
-	@DbField("o.pay_time")
+	@DbField("ifnull(o.pay_time,uod.pay_time)")
 	private Date payTime;
 }

+ 3 - 3
netflix-dao/src/main/resources/mapper/UserInvoiceOrderRelateMapper.xml

@@ -5,9 +5,9 @@
 
 
     <insert id="batchInsert">
-        insert into user_invoice_order_relate(`user_id`,`record_id`,`order_id`,`created_time`,`update_time`) values
-        <foreach collection="orderIds" item="orderId" separator=",">
-            (#{userId},#{recordId},#{orderId},now(),now())
+        insert into user_invoice_order_relate(`user_id`,`record_id`,`order_id`,`type`,`created_time`,`update_time`) values
+        <foreach collection="orders" item="item" separator=",">
+            (#{userId},#{recordId},#{item.orderId},#{item.type},now(),now())
         </foreach>
     </insert>
 

+ 51 - 28
netflix-service/src/main/java/com/cyksj/service/invoice/impl/UserInvoiceApplyRecordServiceImpl.java

@@ -3,15 +3,15 @@ package com.cyksj.service.invoice.impl;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.mapper.OrderDonMapper;
+import com.cyksj.mapper.UpgradeOrderDonMapper;
 import com.cyksj.mapper.UserInvoiceApplyRecordMapper;
 import com.cyksj.mapper.UserInvoiceOrderRelateMapper;
 import com.cyksj.mapper.channel.ShopConfigMapper;
-import com.cyksj.model.entity.OrderDon;
-import com.cyksj.model.entity.ShopConfig;
-import com.cyksj.model.entity.UserInvoiceApplyRecord;
-import com.cyksj.model.entity.UserInvoiceOrderRelate;
+import com.cyksj.model.dto.InvoiceOrderDto;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.request.UserInvoiceOrderReq;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.invoice.UserInvoiceApplyRecordService;
@@ -23,7 +23,9 @@ import org.springframework.transaction.annotation.Transactional;
 import java.math.BigDecimal;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * 项目名: yhlxj
@@ -46,14 +48,16 @@ public class UserInvoiceApplyRecordServiceImpl implements UserInvoiceApplyRecord
 
 	private final RedisService redisService;
 
+	private final UpgradeOrderDonMapper upgradeOrderDonMapper;
+
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	public Long applyOrderInvoice(UserInvoiceOrderReq req) {
 		Long userId = req.getUserId();
 		String key = "invoice:key:" + userId;
 		try {
-			List<Long> orderIds = req.getOrderIds();
-			if (CollUtil.isEmpty(orderIds)) {
+			List<InvoiceOrderDto> orderDons = req.getOrderDons();
+			if (CollUtil.isEmpty(orderDons)) {
 				throw BusinessRuntimeException.getInstance("请选择对应订单");
 			}
 			String head = req.getHead();
@@ -68,31 +72,51 @@ public class UserInvoiceApplyRecordServiceImpl implements UserInvoiceApplyRecord
 				throw BusinessRuntimeException.getInstance("正在提交中,请勿重复提交");
 			}
 			List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
-			//订单里是否存在开过发票
-			Integer selectCount = userInvoiceOrderRelateMapper.selectCount(Wrappers.lambdaQuery(UserInvoiceOrderRelate.class)
-					.in(UserInvoiceOrderRelate::getOrderId, orderIds));
-			if (selectCount > 0) {
-				throw BusinessRuntimeException.getInstance("您选择的订单存在开过发票,请刷新页面重新选择");
-			}
-			//是否是自己订单
-			List<OrderDon> orderDonList = orderDonMapper.selectList(Wrappers.lambdaQuery(OrderDon.class)
-					.in(OrderDon::getId, orderIds)
-					.in(OrderDon::getUserId, userIdList)
-					.select(OrderDon::getId, OrderDon::getMoney, OrderDon::getShopId));
-			if (orderDonList.size() != orderIds.size()) {
-				throw BusinessRuntimeException.getInstance("订单选择错误,请刷新页面重新选择");
-			}
+			Map<Integer, List<InvoiceOrderDto>> ordersByType = orderDons.stream().collect(Collectors.groupingBy(InvoiceOrderDto::getType));
 			Set<String> shopIdSet = new HashSet<>();
-			BigDecimal money = BigDecimal.ZERO;
-			for (OrderDon orderDon : orderDonList) {
-				shopIdSet.add(orderDon.getShopId());
-				money = money.add(orderDon.getMoney());
-			}
+			UserInvoiceApplyRecord invoiceApplyRecord = new UserInvoiceApplyRecord();
+			invoiceApplyRecord.setMoney(BigDecimal.ZERO);
+			ordersByType.forEach((type, orders) -> {
+				List<Long> orderIds = orders.stream().map(InvoiceOrderDto::getOrderId).collect(Collectors.toList());
+				//订单里是否存在开过发票
+				Integer selectCount = userInvoiceOrderRelateMapper.selectCount(Wrappers.lambdaQuery(UserInvoiceOrderRelate.class)
+						.in(UserInvoiceOrderRelate::getOrderId, orderIds));
+				if (selectCount > 0) {
+					throw BusinessRuntimeException.getInstance("您选择的订单存在开过发票,请刷新页面重新选择");
+				}
+				Integer selfOrderIdSize;
+				if (type == 1) {
+					//是否是自己订单
+					List<OrderDon> orderDonList = orderDonMapper.selectList(Wrappers.lambdaQuery(OrderDon.class)
+							.in(OrderDon::getId, orderIds)
+							.in(OrderDon::getUserId, userIdList)
+							.notIn(OrderDon::getStatus, Constant.noOrderAllStatus)
+							.select(OrderDon::getId, OrderDon::getMoney, OrderDon::getShopId));
+					for (OrderDon o : orderDonList) {
+						invoiceApplyRecord.setMoney(invoiceApplyRecord.getMoney().add(o.getMoney()));
+						shopIdSet.add(o.getShopId());
+					}
+					selfOrderIdSize = orderDonList.size();
+				}else {
+					List<UpgradeOrderDon> upgradeOrderDons = upgradeOrderDonMapper.selectList(Wrappers.lambdaQuery(UpgradeOrderDon.class)
+							.in(UpgradeOrderDon::getId, orderIds)
+							.in(UpgradeOrderDon::getUserId, userIdList)
+							.notIn(UpgradeOrderDon::getStatus, Constant.noOrderAllStatus)
+							.select(UpgradeOrderDon::getId, UpgradeOrderDon::getMoney, UpgradeOrderDon::getShopId));
+					for (UpgradeOrderDon o : upgradeOrderDons) {
+						invoiceApplyRecord.setMoney(invoiceApplyRecord.getMoney().add(o.getMoney()));
+						shopIdSet.add(o.getShopId());
+					}
+					selfOrderIdSize = upgradeOrderDons.size();
+				}
+				if (selfOrderIdSize != orderIds.size()) {
+					throw BusinessRuntimeException.getInstance("订单选择错误,请刷新页面重新选择");
+				}
+			});
 			//是否是统一主体
 			if (shopIdSet.size() > 1) {
 				throw BusinessRuntimeException.getInstance("所选订单的支付主体不一致,请重新选择)");
 			}
-			UserInvoiceApplyRecord invoiceApplyRecord = new UserInvoiceApplyRecord();
 			invoiceApplyRecord.setHead(head);
 			invoiceApplyRecord.setTaxNo(taxNo);
 			invoiceApplyRecord.setUserId(userId);
@@ -105,13 +129,12 @@ public class UserInvoiceApplyRecordServiceImpl implements UserInvoiceApplyRecord
 				throw BusinessRuntimeException.getInstance("申请发票错误,请联系客服处理");
 			}
 			invoiceApplyRecord.setZfbPayment(shopConfig.getPayment());
-			invoiceApplyRecord.setMoney(money);
 			invoiceApplyRecord.setEmail(email);
 			userInvoiceApplyRecordMapper.insert(invoiceApplyRecord);
 
 			//关联记录id
 			Long recordId = invoiceApplyRecord.getId();
-			userInvoiceOrderRelateMapper.batchInsert(recordId, userId, orderIds);
+			userInvoiceOrderRelateMapper.batchInsert(recordId, userId, orderDons);
 			return invoiceApplyRecord.getId();
 		} finally {
 			redisService.del(key);

+ 13 - 0
netflix-web/src/main/java/com/cyksj/web/controller/invoice/UserInvoiceFrontController.java

@@ -2,8 +2,12 @@ package com.cyksj.web.controller.invoice;
 
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.constant.Constant;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.UpgradeOrderDonMapper;
+import com.cyksj.model.entity.UpgradeOrderDon;
 import com.cyksj.model.request.UserInvoiceOrderReq;
 import com.cyksj.model.views.UserInvoiceChoseOrderViews;
 import com.cyksj.model.views.UserInvoiceFrontView;
@@ -44,6 +48,8 @@ public class UserInvoiceFrontController {
 
 	private final UserBindRelationService userBindRelationService;
 
+	private final UpgradeOrderDonMapper upgradeOrderDonMapper;
+
 	/**
 	 * 发票 用户可选AI车票订单
 	 */
@@ -67,6 +73,13 @@ public class UserInvoiceFrontController {
 		if (now.isAfter(DateUtil.parse("2025-02-01"))) {
 			appIds.add("2021003171697073");
 		}
+		String upgrade_sql = "(select id,goods_id,sku_id,order_no,money,user_id,pay_time,shop_id,created_time,2 as type from upgrade_order_don where goods_id = 26 and money > 0 and status not in ('close','noPayment','refund') and type = 'ALI_PAY') union all ";
+		Integer upgradeOrders = upgradeOrderDonMapper.selectCount(Wrappers.lambdaQuery(UpgradeOrderDon.class)
+				.in(UpgradeOrderDon::getUserId, userIdList)
+				.notIn(UpgradeOrderDon::getStatus, Constant.noOrderAllStatus));
+		if (upgradeOrders > 0) {
+			builder.put("uq", upgrade_sql);
+		}
 		builder.field(UserInvoiceChoseOrderViews::getShopId, appIds).op(Operator.NotIn);
 		SearchResult<UserInvoiceChoseOrderViews> search = beanSearcher.search(UserInvoiceChoseOrderViews.class, builder
 				.put("dc", dateCondition)