Procházet zdrojové kódy

Merge branch 'exchange_code_multi'

zoujiajian před 1 rokem
rodič
revize
aa25eb1dc3

+ 7 - 0
netflix-dao/src/main/java/com/cyksj/mapper/GoodsDonSkuMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cyksj.model.dto.OriSkuDto;
 import com.cyksj.model.entity.GoodsDonSku;
 import com.cyksj.model.entity.YhShopGoodsSku;
+import com.cyksj.model.views.GoodsDonSkuDetailView;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -27,4 +28,10 @@ public interface GoodsDonSkuMapper  extends BaseMapper<GoodsDonSku> {
 	GoodsDonSku checkAndReturnMinPriceUserOwnsSku(@Param("goodsId") Long goodsId, @Param("dsUserId") Long dsUserId);
 
 	OriSkuDto selectRenewOriSku(Long skuId);
+
+	String selectExchangeTitle(@Param("ids") List<Long> ids);
+
+	List<Long> selectGIdsBySkuIds(@Param("ids") List<Long> ids);
+
+	List<GoodsDonSkuDetailView> selectExchangeTitleSkus(@Param("ids") List<Long> skuIds);
 }

+ 9 - 4
netflix-dao/src/main/java/com/cyksj/model/entity/ExchangeCode.java

@@ -17,14 +17,14 @@ public class ExchangeCode extends BaseEntity{
 	private String code;
 
 	/**
-	 * 平台id
+	 * 平台ids
 	 */
-	private Long goodsId;
+	private String goodsIds;
 
 	/**
-	 * 规格id
+	 * 规格ids
 	 */
-	private Long skuId;
+	private String skuIds;
 
 	/**
 	 * 使用状态
@@ -51,5 +51,10 @@ public class ExchangeCode extends BaseEntity{
 	 */
 	private Integer type;
 
+	/**
+	 * 兑换形式 1兑换码 2兑换链接
+	 */
+	private Integer codeType;
+
 	private String operator;
 }

+ 22 - 18
netflix-dao/src/main/java/com/cyksj/model/excel/ExcelExchangeCodeData.java

@@ -4,6 +4,7 @@ import com.alibaba.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
@@ -18,9 +19,8 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@SearchBean(tables = "exchange_code ec left join user u on u.id = ec.user_id" +
-		" left join goods_don gd on ec.goods_id = gd.id" +
-		" left join goods_don_sku gdk on gdk.id = ec.sku_id")
+@SearchBean(tables = "exchange_code ec left join user u on u.id = ec.user_id",
+		where = "1=1 :condition:")
 public class ExcelExchangeCodeData {
 
 	/**
@@ -30,28 +30,17 @@ public class ExcelExchangeCodeData {
 	@DbField("ec.created_time")
 	private Date createdTime;
 
-	@ExcelProperty("兑换码")
+	@ExcelProperty("兑换码/链接")
 	@DbField("ec.code")
 	private String code;
 
-	@ExcelIgnore
-	@DbField("ec.goods_id")
-	private Long goodsId;
-
 	/**
-	 * 平台名称
+	 * 平台规格
 	 */
-	@ExcelProperty("平台")
-	@DbField("gd.title")
+	@ExcelProperty("平台规格")
+	@DbIgnore
 	private String title;
 
-	/**
-	 * 规格名称,金额
-	 */
-	@ExcelProperty("规格名称")
-	@DbField("concat(gdk.spec_val,'',cast(gdk.price/100 as decimal(10,2)))")
-	private String specVal;
-
 	/**
 	 * 使用状态str
 	 */
@@ -87,4 +76,19 @@ public class ExcelExchangeCodeData {
 	@ExcelProperty("用户id")
 	@DbField("u.id")
 	private Long userId;
+
+	@DbField("ec.operator")
+	@ExcelIgnore
+	private String operator;
+
+	@ExcelIgnore
+	@DbField("ec.code_type")
+	private Integer codeType;
+
+	public String getCode() {
+		if (codeType == 2) {
+			return "https://nf.video/exchange?code=" + code;
+		}
+		return code;
+	}
 }

+ 9 - 6
netflix-dao/src/main/java/com/cyksj/model/request/ExchangeCodeReq.java

@@ -12,15 +12,13 @@ import lombok.Setter;
 @Getter
 @Setter
 public class ExchangeCodeReq {
-	/**
-	 * 平台id
-	 */
-	private Long goodsId;
+
+	private Long goodsIds;
 
 	/**
-	 * 规格id
+	 * 规格ids
 	 */
-	private Long skuId;
+	private String skuIds;
 
 	/**
 	 * 数量
@@ -32,5 +30,10 @@ public class ExchangeCodeReq {
 	 */
 	private Integer type;
 
+	/**
+	 * 兑换形式 1兑换码 2兑换链接
+	 */
+	private Integer codeType;
+
 	private String operator;
 }

+ 48 - 0
netflix-dao/src/main/java/com/cyksj/model/views/ExchangeCodeDetailView.java

@@ -0,0 +1,48 @@
+package com.cyksj.model.views;
+
+import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 项目名: yhlxj
+ * 文件名: ExchangeCodeDetailView
+ * 创建者: JavaZou
+ * 创建时间:2024/12/11 15:38
+ */
+@Getter
+@Setter
+@SearchBean(tables = "exchange_code ec")
+public class ExchangeCodeDetailView {
+	@DbField("ec.code")
+	private String code;
+
+	@DbField("ec.sku_ids")
+	private String skuIds;
+
+	@DbIgnore
+	private List<GoodsDonSkuDetailView> skuDetails;
+
+	/**
+	 * 使用状态
+	 */
+	@DbField("ec.use_status")
+	private Boolean useStatus;
+
+	/**
+	 * 使用时间
+	 */
+	@DbField("ec.use_time")
+	private Date useTime;
+
+	/**
+	 * 兑换形式 1兑换码 2兑换链接
+	 */
+	@DbField("ec.code_type")
+	private Integer codeType;
+}

+ 16 - 17
netflix-dao/src/main/java/com/cyksj/model/views/ExchangeCodeView.java

@@ -1,6 +1,7 @@
 package com.cyksj.model.views;
 
 import com.ejlchina.searcher.bean.DbField;
+import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
@@ -15,10 +16,8 @@ import java.util.Date;
  */
 @Getter
 @Setter
-@SearchBean(tables = "exchange_code ec left join user u on u.id = ec.user_id" +
-		" left join goods_don gd on ec.goods_id = gd.id" +
-		" left join goods_don_sku gdk on gdk.id = ec.sku_id",
-where = "ec.type = 0")
+@SearchBean(tables = "exchange_code ec left join user u on u.id = ec.user_id",
+		where = "ec.type = 0 :condition:")
 public class ExchangeCodeView {
 	@DbField("ec.id")
 	private Long id;
@@ -26,24 +25,15 @@ public class ExchangeCodeView {
 	@DbField("ec.code")
 	private String code;
 
-	@DbField("ec.goods_id")
-	private Long goodsId;
-
-	@DbField("ec.sku_id")
-	private Long skuId;
+	@DbField("ec.sku_ids")
+	private String skuIds;
 
 	/**
-	 * 平台名称
+	 * 平台规格
 	 */
-	@DbField("gd.title")
+	@DbIgnore
 	private String title;
 
-	/**
-	 * 规格名称,金额
-	 */
-	@DbField("concat(gdk.spec_val,'',cast(gdk.price/100 as decimal(10,2)))")
-	private String specVal;
-
 	/**
 	 * 使用状态
 	 */
@@ -71,6 +61,15 @@ public class ExchangeCodeView {
 	@DbField("u.nickname")
 	private String nickName;
 
+	/**
+	 * 兑换形式 1兑换码 2兑换链接
+	 */
+	@DbField("ec.code_type")
+	private Integer codeType;
+
+	@DbIgnore
+	private Long orderId;
+
 	/**
 	 * 生成日期
 	 */

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuDetailView.java

@@ -19,6 +19,9 @@ public class GoodsDonSkuDetailView {
 	@DbField("g.id")
 	private Long goodsId;
 
+	@DbField("g.logo")
+	private String logo;
+
 	@DbField("g.title")
 	private String title;
 

+ 24 - 0
netflix-dao/src/main/resources/mapper/GoodsDonSkuMapper.xml

@@ -55,4 +55,28 @@
         where id = #{skuId}
         limit 1
     </select>
+
+    <select id="selectExchangeTitle" resultType="java.lang.String">
+        select GROUP_CONCAT(g.title, ifnull(sku.spec_val,''),cast(sku.price/100 as decimal(10,2))) from goods_don_sku sku inner join goods_don g on g.id = sku.goods_id
+        where sku.id in
+        <foreach collection="ids" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
+
+    <select id="selectGIdsBySkuIds" resultType="java.lang.Long">
+        select distinct sku.goods_id from goods_don_sku sku
+        where sku.id in
+        <foreach collection="ids" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
+
+    <select id="selectExchangeTitleSkus" resultType="com.cyksj.model.views.GoodsDonSkuDetailView">
+        select g.id as goods_id,g.title,sku.id as sku_id,sku.spec_val,g.logo from goods_don_sku sku inner join goods_don g on g.id = sku.goods_id
+        where sku.id in
+        <foreach collection="ids" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
 </mapper>

+ 2 - 2
netflix-service/src/main/java/com/cyksj/service/exchange/ExchangeCodeService.java

@@ -22,12 +22,12 @@ public interface ExchangeCodeService extends IService<ExchangeCode> {
 	/**
 	 * 生成兑换码
 	 */
-	List<ExcelExchangeCodeData> createExchangeCode(ExchangeCodeReq exchangeCodeReq);
+	List<ExcelExchangeCodeData> createExchangeCode(ExchangeCodeReq exchangeCodeReq) throws Exception;
 
 	/**
 	 * 兑换码兑换
 	 */
-	Result<String> getTicketByExchangeCode(ExchangeCodeTicket exchangeCodeTicket, Long userId);
+	Result<String> getTicketByExchangeCode(ExchangeCodeTicket exchangeCodeTicket, Long userId) throws Exception;
 
 	/**
 	 * 获取兑换码

+ 26 - 26
netflix-service/src/main/java/com/cyksj/service/exchange/impl/ExchangeCodeServiceImpl.java

@@ -93,43 +93,40 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
-	public List<ExcelExchangeCodeData> createExchangeCode(ExchangeCodeReq exchangeCodeReq) {
-		GoodsDon goodsDon = goodsDonMapper.selectById(exchangeCodeReq.getGoodsId());
-		if (goodsDon == null) {
-			throw BusinessRuntimeException.getInstance("所选平台已被删除");
-		}
-		if (Constant.realGoodsType.contains(goodsDon.getType())) {
-			throw BusinessRuntimeException.getInstance("该类商品不支持生成兑换码");
+	public List<ExcelExchangeCodeData> createExchangeCode(ExchangeCodeReq exchangeCodeReq) throws Exception {
+		String skuIds = exchangeCodeReq.getSkuIds();
+		if (StrUtil.isEmpty(skuIds)) {
+			throw BusinessRuntimeException.getInstance("请选择对应规格");
 		}
-		GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(exchangeCodeReq.getSkuId());
-		if (goodsDonSku == null) {
+		List<Long> skuList = Jsons.parseList(skuIds, Long.class);
+		Integer skuCount = goodsDonSkuMapper.selectCount(Wrappers.lambdaQuery(GoodsDonSku.class)
+				.in(GoodsDonSku::getId, skuList));
+		if (skuCount != skuList.size()) {
 			throw BusinessRuntimeException.getInstance("所选规格已被删除");
 		}
-		if (!goodsDonSku.getGoodsId().equals(exchangeCodeReq.getGoodsId())) {
-			throw BusinessRuntimeException.getInstance("规格与平台不匹配");
-		}
+		String goodsIds = goodsDonSkuMapper.selectGIdsBySkuIds(skuList).toString();
 		List<ExcelExchangeCodeData> data = new ArrayList<>(exchangeCodeReq.getNumber());
+		GoodsDonSku sku = goodsDonSkuMapper.selectById(skuList.get(0));
 		for (int i = 0; i < exchangeCodeReq.getNumber(); i++) {
 			StringBuilder sb = new StringBuilder(32);
-			sb.append(goodsDon.getSecondType() == 1 ? "YQ" : "FY");
-			sb.append(getFillByGoodsId(exchangeCodeReq.getGoodsId()));
-			sb.append(getFillByMonth(exchangeCodeReq.getSkuId()));
+			sb.append("YH");
+			sb.append(getFillByGoodsId(sku.getGoodsId()));
+			sb.append(getFillByMonth(sku.getMonths()));
 			//随即补充12位随即数,组成20位兑换码
 			StringUtil.getRandomStr(sb, 12);
 			ExchangeCode exchangeCode = new ExchangeCode();
-			exchangeCode.setGoodsId(exchangeCodeReq.getGoodsId());
-			exchangeCode.setSkuId(exchangeCodeReq.getSkuId());
+			exchangeCode.setSkuIds(exchangeCodeReq.getSkuIds());
+			exchangeCode.setGoodsIds(goodsIds);
 			exchangeCode.setCode(sb.toString());
 			exchangeCode.setUseStatus(false);
 			exchangeCode.setType(exchangeCodeReq.getType());
 			exchangeCode.setOperator(exchangeCodeReq.getOperator());
+			exchangeCode.setCodeType(exchangeCodeReq.getCodeType());
 			exchangeCodeMapper.insert(exchangeCode);
 			ExcelExchangeCodeData excelExchangeCodeData = new ExcelExchangeCodeData();
 			BeanUtils.copyProperties(exchangeCode, excelExchangeCodeData);
-			excelExchangeCodeData.setTitle(goodsDon.getTitle());
-			String specVal = goodsDonSku.getSpecVal();
-			BigDecimal price = goodsDonSku.getPrice();
-			excelExchangeCodeData.setSpecVal(String.format("%s%s", specVal, price.divide(BigDecimal.valueOf(100))));
+			String title = goodsDonSkuMapper.selectExchangeTitle(skuList);
+			excelExchangeCodeData.setTitle(title);
 			excelExchangeCodeData.setUseStatusStr(exchangeCode.getUseStatus() ? "已使用" : "未使用");
 			data.add(excelExchangeCodeData);
 		}
@@ -139,7 +136,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	@NoSubmit
-	public Result<String> getTicketByExchangeCode(ExchangeCodeTicket exchangeCodeTicket, Long userId) {
+	public Result<String> getTicketByExchangeCode(ExchangeCodeTicket exchangeCodeTicket, Long userId) throws Exception {
 		if (StrUtil.isEmpty(exchangeCodeTicket.getCode())) {
 			throw BusinessRuntimeException.getInstance("兑换码有误,请使用正确的兑换码");
 		}
@@ -233,8 +230,11 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 		if (orderDon != null && orderDon.getStatus() == OrderDon.Status.refund) {
 			throw BusinessRuntimeException.getInstance("您的订单已退款,无法使用该兑换码");
 		}
+		List<Long> skuIds = Jsons.parseList(exchangeCode.getSkuIds(), Long.class);
+		skuIds.forEach(skuId -> {
+			getGroupTripsTicket(yhsId, goodsDonSkuMapper.selectById(skuId), userId, orderDon, OrderDon.Type.EX_CODE, exchangeCodeTicket.getCode());
+		});
 		//生成车票订单
-		getGroupTripsTicket(yhsId, goodsDonSkuMapper.selectById(exchangeCode.getSkuId()), userId, orderDon, OrderDon.Type.EX_CODE, exchangeCodeTicket.getCode());
 		log.info("用户:{}通过兑换码:{}兑换成功", userId, exchangeCodeTicket.getCode());
 		if (exchangeCode.getType() == 1) {
 			luckyDrawRecordMapper.updateExCodeStatus(userId, exchangeCode.getCode());
@@ -246,8 +246,8 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 	public String getExCode(Long goodsId, Long skuId, Integer type) {
 		ExchangeCodeReq exchangeCodeReq = new ExchangeCodeReq();
 		exchangeCodeReq.setNumber(1);
-		exchangeCodeReq.setGoodsId(goodsId);
-		exchangeCodeReq.setSkuId(skuId);
+//		exchangeCodeReq.setGoodsId(goodsId);
+		exchangeCodeReq.setSkuIds(List.of(skuId).toString());
 		if (type != null) {
 			exchangeCodeReq.setType(type);
 		}
@@ -280,7 +280,7 @@ public class ExchangeCodeServiceImpl extends ServiceImpl<ExchangeCodeMapper, Exc
 	/**
 	 * 根据月份长度获取填充的字符串
 	 */
-	private String getFillByMonth(Long skuMonth) {
+	private String getFillByMonth(Integer skuMonth) {
 		String goodsIdStr = String.valueOf(skuMonth);
 		if (goodsIdStr.length() == 1) {
 			return String.format("%s%s%s", 0, 0, skuMonth);

+ 7 - 4
netflix-web/src/main/java/com/cyksj/web/controller/external/ExternalController.java

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.constant.Constant;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsDonMapper;
@@ -30,6 +31,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 
 /**
  * 项目名: yhlxj
@@ -77,7 +79,7 @@ public class ExternalController {
 	 */
 	@PutMapping("/refund/{id}")
 	@Transactional(rollbackFor = Throwable.class)
-	public Result<String> refund(@PathVariable Long id) {
+	public Result<String> refund(@PathVariable Long id) throws Exception {
 		ExchangeCode exchangeCode = exchangeCodeMapper.selectById(id);
 		Assert.notNull(exchangeCode, "系统异常");
 		if (!exchangeCode.getUseStatus()) {
@@ -89,6 +91,8 @@ public class ExternalController {
 		if (StrUtil.equals(exchangeCode.getOrderStatus(), "refund")) {
 			throw BusinessRuntimeException.getInstance("兑换码已退");
 		}
+		String skuIds = exchangeCode.getSkuIds();
+		List<Long> skuIdList = Jsons.parseList(skuIds, Long.class);
 		OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
 				.eq(OrderDon::getExCode, exchangeCode.getCode())
 				.notIn(OrderDon::getStatus, Constant.noOrderAllStatus)
@@ -97,7 +101,7 @@ public class ExternalController {
 			orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
 					.eq(OrderDon::getUserId, exchangeCode.getUserId())
 					.eq(OrderDon::getType, OrderDon.Type.EX_CODE)
-					.eq(OrderDon::getSkuId, exchangeCode.getSkuId())
+					.eq(OrderDon::getSkuId, skuIdList.get(0))
 					.notIn(OrderDon::getStatus, Constant.noOrderAllStatus)
 					.last("limit 1"));
 		}
@@ -123,8 +127,7 @@ public class ExternalController {
 				//重新生成兑换码
 				ExchangeCodeReq exchangeCodeReq = new ExchangeCodeReq();
 				exchangeCodeReq.setNumber(1);
-				exchangeCodeReq.setGoodsId(orderDon.getGoodsId());
-				exchangeCodeReq.setSkuId(orderDon.getSkuId());
+				exchangeCodeReq.setSkuIds(List.of(orderDon.getSkuId()).toString());
 				exchangeCodeService.createExchangeCode(exchangeCodeReq);
 			} catch (Exception e) {
 			}

+ 67 - 7
netflix-web/src/main/java/com/cyksj/web/controller/manage/exchange/ExchangeCodeController.java

@@ -3,21 +3,29 @@ package com.cyksj.web.controller.manage.exchange;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.excel.support.ExcelTypeEnum;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.annotation.Log;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.BusinessType;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.GoodsDonSkuMapper;
+import com.cyksj.mapper.OrderDonMapper;
 import com.cyksj.mapper.manage.cms.CmsUserMapper;
 import com.cyksj.model.entity.CmsUser;
+import com.cyksj.model.entity.OrderDon;
 import com.cyksj.model.excel.ExcelExchangeCodeData;
 import com.cyksj.model.request.ExchangeCodeReq;
 import com.cyksj.model.views.ExchangeCodeView;
 import com.cyksj.service.exchange.ExchangeCodeService;
+import com.cyksj.service.mange.cms.service.CmsUserService;
 import com.cyksj.web.util.EasyExcelUtils;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
+import com.ejlchina.searcher.util.MapBuilder;
 import com.ejlchina.searcher.util.MapUtils;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -27,6 +35,7 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.util.List;
+import java.util.Optional;
 
 /*
  *项目名: netflix
@@ -47,14 +56,20 @@ public class ExchangeCodeController {
 
 	private final CmsUserMapper cmsUserMapper;
 
+	private final GoodsDonSkuMapper skuMapper;
+
+	private final OrderDonMapper orderDonMapper;
+
+	private final CmsUserService cmsUserService;
+
 	/**
 	 * 生成兑换码 并导出
 	 */
 	@GetMapping("/createAndExport")
 	@SaCheckPermission("exchangeCode:add")
 	@Log(module = "兑换码/生成兑换码", businessType = BusinessType.POST, isSaveRequestData = true)
-	public void createAndExportCode(ExchangeCodeReq exchangeCodeReq, HttpServletResponse response) {
-		if (ObjectUtil.hasEmpty(exchangeCodeReq.getGoodsId(), exchangeCodeReq.getSkuId(), exchangeCodeReq.getNumber())) {
+	public void createAndExportCode(ExchangeCodeReq exchangeCodeReq, HttpServletResponse response) throws Exception {
+		if (ObjectUtil.hasEmpty(exchangeCodeReq.getSkuIds(), exchangeCodeReq.getNumber())) {
 			throw BusinessRuntimeException.getInstance("必填项为空");
 		}
 		long adminId = StpUtil.getLoginIdAsLong();
@@ -69,8 +84,37 @@ public class ExchangeCodeController {
 	 */
 	@GetMapping("/get")
 	@SaCheckPermission("exchangeCode:view")
-	public Result<SearchResult<ExchangeCodeView>> getExchangeCodeView() {
-		return GatewayResponse.SUCCESS.newBuilder().toResult(beanSearcher.search(ExchangeCodeView.class, MapUtils.flat(request.getParameterMap())));
+	public Result<SearchResult<ExchangeCodeView>> getExchangeCodeView(Long goodsId, Long skuId) {
+		long adminId = StpUtil.getLoginIdAsLong();
+		String condition = StrUtil.EMPTY;
+		if (goodsId != null) {
+			condition = String.format(" and JSON_CONTAINS(goods_ids,'%s')", goodsId);
+		}
+		if (skuId != null) {
+			condition += String.format(" and JSON_CONTAINS(sku_ids,'%s')", skuId);
+		}
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		if (StrUtil.isNotEmpty(condition)) {
+			builder.put("condition", condition);
+		}
+		if (!cmsUserService.isRootRole(adminId)) {
+			CmsUser cmsUser = cmsUserMapper.selectById(adminId);
+			builder.field(ExchangeCodeView::getOperator, cmsUser.getNickname());
+		}
+		SearchResult<ExchangeCodeView> search = beanSearcher.search(ExchangeCodeView.class, builder.build());
+		search.getDataList().forEach(data -> {
+			try {
+				List<Long> skuIds = Jsons.parseList(data.getSkuIds(), Long.class);
+				data.setTitle(skuMapper.selectExchangeTitle(skuIds));
+				if (data.getUseStatus()) {
+					Optional.ofNullable(orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
+							.eq(OrderDon::getExCode, data.getCode())
+							.last("limit 1"))).ifPresent(exCodeOrder -> data.setOrderId(exCodeOrder.getId()));
+				}
+			} catch (Exception e) {
+			}
+		});
+		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 
 	/**
@@ -78,8 +122,24 @@ public class ExchangeCodeController {
 	 */
 	@GetMapping("/export")
 	@SaCheckPermission("exchangeCode:export")
-	public void exportExchangeCode(HttpServletResponse response) {
-		List<ExcelExchangeCodeData> data = beanSearcher.searchAll(ExcelExchangeCodeData.class, MapUtils.flat(request.getParameterMap()));
-		EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, ExcelExchangeCodeData.class, data, "银河兑换码","银河兑换码", ExcelTypeEnum.XLSX, null);
+	public void exportExchangeCode(HttpServletResponse response, Long goodsId, Long skuId) {
+		long adminId = StpUtil.getLoginIdAsLong();
+		String condition = StrUtil.EMPTY;
+		if (goodsId != null) {
+			condition = String.format(" and JSON_CONTAINS(goods_ids,'%s')", goodsId);
+		}
+		if (skuId != null) {
+			condition += String.format(" and JSON_CONTAINS(sku_ids,'%s')", skuId);
+		}
+		MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
+		if (StrUtil.isNotEmpty(condition)) {
+			builder.put("condition", condition);
+		}
+		if (!cmsUserService.isRootRole(adminId)) {
+			CmsUser cmsUser = cmsUserMapper.selectById(adminId);
+			builder.field(ExchangeCodeView::getOperator, cmsUser.getNickname());
+		}
+		List<ExcelExchangeCodeData> data = beanSearcher.searchAll(ExcelExchangeCodeData.class, builder.build());
+		EasyExcelUtils.createExcelStreamMutilByEasyExcel(response, ExcelExchangeCodeData.class, data, "银河兑换码", "银河兑换码", ExcelTypeEnum.XLSX, null);
 	}
 }

+ 16 - 1
netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java

@@ -6,6 +6,7 @@ import cn.hutool.extra.servlet.ServletUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.annotation.NoSubmit;
 import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayApiCode;
 import com.cyksj.enums.GatewayResponse;
@@ -115,11 +116,25 @@ public class UserController {
      * 兑换码兑换车票
      */
     @PostMapping("/get/ticket")
-    public Result<String> getTicketByExchangeCode(@RequestBody ExchangeCodeTicket exchangeCodeTicket) {
+    public Result<String> getTicketByExchangeCode(@RequestBody ExchangeCodeTicket exchangeCodeTicket) throws Exception {
         Long userId = StpUserUtil.getLoginIdAsLong();
         return exchangeCodeService.getTicketByExchangeCode(exchangeCodeTicket, userId);
     }
 
+    /**
+     * 车票兑换码详情
+     */
+    @GetMapping("/get/ticket/code/detail")
+    public Result<ExchangeCodeDetailView> getTicketCodeDetail(String code) throws Exception {
+        ExchangeCodeDetailView exchangeCodeDetailView = beanSearcher.searchFirst(ExchangeCodeDetailView.class, MapUtils.flatBuilder(request.getParameterMap()).field(ExchangeCodeDetailView::getCode, code).build());
+        if (exchangeCodeDetailView == null) {
+            throw BusinessRuntimeException.getInstance("错误兑换码");
+        }
+        List<Long> skuIds = Jsons.parseList(exchangeCodeDetailView.getSkuIds(), Long.class);
+        exchangeCodeDetailView.setSkuDetails(skuMapper.selectExchangeTitleSkus(skuIds));
+        return GatewayResponse.SUCCESS.newBuilder().toResult(exchangeCodeDetailView);
+    }
+
     /**
      * 个人中心详情
      */