zoujiajian 1 год назад
Родитель
Сommit
7040e4a873
15 измененных файлов с 713 добавлено и 54 удалено
  1. 17 0
      netflix-dao/src/main/java/com/cyksj/mapper/BackInfoTranslationsMapper.java
  2. 26 0
      netflix-dao/src/main/java/com/cyksj/model/dto/TranslationsDto.java
  3. 53 0
      netflix-dao/src/main/java/com/cyksj/model/entity/BackInfoTranslations.java
  4. 47 0
      netflix-dao/src/main/java/com/cyksj/model/entity/UserPageLanguage.java
  5. 3 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/GoodsDonViewer.java
  6. 16 0
      netflix-dao/src/main/resources/mapper/BackInfoTranslationsMapper.xml
  7. 69 11
      netflix-service/src/main/java/com/cyksj/service/mange/goods/CmsGoodsDonSpecServiceImpl.java
  8. 45 0
      netflix-service/src/main/java/com/cyksj/service/translations/BackInfoTranslationsFrontService.java
  9. 17 0
      netflix-service/src/main/java/com/cyksj/service/translations/BackInfoTranslationsService.java
  10. 220 0
      netflix-service/src/main/java/com/cyksj/service/translations/impl/BackInfoTranslationsFrontServiceImpl.java
  11. 70 0
      netflix-service/src/main/java/com/cyksj/service/translations/impl/BackInfoTranslationsServiceImpl.java
  12. 49 10
      netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java
  13. 23 5
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonCategoryController.java
  14. 23 6
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonController.java
  15. 35 22
      netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonSkuController.java

+ 17 - 0
netflix-dao/src/main/java/com/cyksj/mapper/BackInfoTranslationsMapper.java

@@ -0,0 +1,17 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.BackInfoTranslations;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: BackInfoTranslationsMapper
+ * 创建者: JavaZou
+ * 创建时间:2024/7/16 14:18
+ */
+public interface BackInfoTranslationsMapper extends BaseMapper<BackInfoTranslations> {
+	void batchInsertOrUpdate(@Param("funcId") Long funcId, @Param("type") Integer type, @Param("list") List<BackInfoTranslations> fields, @Param("lang") String lang);
+}

+ 26 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/TranslationsDto.java

@@ -0,0 +1,26 @@
+package com.cyksj.model.dto;
+
+import com.cyksj.model.entity.BackInfoTranslations;
+import com.cyksj.model.entity.UserPageLanguage;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: TranslationsDto
+ * 创建者: JavaZou
+ * 创建时间:2024/7/16 14:38
+ */
+@Getter
+@Setter
+public class TranslationsDto {
+	private Long funcId;
+
+	private String lang = UserPageLanguage.Language.en_US.name();
+
+	private BackInfoTranslations.Type type;
+
+	private List<BackInfoTranslations> fields;
+}

+ 53 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/BackInfoTranslations.java

@@ -0,0 +1,53 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: BackInfoTranslations
+ * 创建者: JavaZou
+ * 创建时间:2024/7/16 14:13
+ */
+@Getter
+@Setter
+public class BackInfoTranslations extends BaseEntity{
+	/**
+	 * 字段名
+	 */
+	private String fieldName;
+
+	/**
+	 * 类型主键id 如平台id
+	 */
+	private Long funcId;
+
+	/**
+	 * 类型
+	 */
+	private Integer type;
+
+	private String lang;
+
+	/**
+	 * 英文表述
+	 */
+	private String desp;
+
+
+	@Getter
+	public enum Type {
+		goods("商品"),
+		sku("规格"),
+		spec("一级规格"),
+		coupon("优惠券"),
+		coupon_classification("优惠券分类"),
+		goods_category("平台分类")
+		;
+		String remark;
+
+		Type(String remark) {
+			this.remark = remark;
+		}
+	}
+}

+ 47 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/UserPageLanguage.java

@@ -0,0 +1,47 @@
+package com.cyksj.model.entity;
+
+import cn.hutool.core.util.StrUtil;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.stream.Stream;
+
+/*
+ *项目名: netflix
+ *文件名: UserPageLanguage
+ *创建者: JavaZou
+ *创建时间:2022/12/7 17:41
+ */
+@Getter
+@Setter
+public class UserPageLanguage extends BaseEntity {
+
+	private Long userId;
+
+
+	private Language language;
+
+	@Getter
+	public enum Language {
+		zh_CN("中文"),
+		zh_HK("中文香港繁体"),
+		ja_JP("日语"),
+		ko_KR("韩语"),
+		en_US("英文");
+
+		String desc;
+
+		Language(String desc) {
+			this.desc = desc;
+		}
+
+		public static Boolean checkLanguage(String language) {
+			if (StrUtil.isEmpty(language)) {
+				return false;
+			}
+			return Stream.of(Language.values())
+					.filter(value -> value.name().equals(language))
+					.findFirst().isPresent();
+		}
+	}
+}

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

@@ -79,6 +79,9 @@ public class GoodsDonViewer {
     @DbField("g.deleted")
     @DbField("g.deleted")
     private Boolean deleted;
     private Boolean deleted;
 
 
+    @DbField("gs.id")
+    private Long specId;
+
     @DbField("gs.goods_id")
     @DbField("gs.goods_id")
     private Long goodsId;
     private Long goodsId;
 
 

+ 16 - 0
netflix-dao/src/main/resources/mapper/BackInfoTranslationsMapper.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.cyksj.mapper.BackInfoTranslationsMapper">
+
+
+    <insert id="batchInsertOrUpdate">
+        insert into `back_info_translations`(`type`,`func_id`,`field_name`,`desp`,`lang`,`created_time`,`update_time`)
+        values
+        <foreach collection="list" item="item" separator=",">
+            (#{type},#{funcId},#{item.fieldName},#{item.desp},#{lang},now(),now())
+        </foreach>
+        ON DUPLICATE KEY UPDATE `desp` = VALUES(`desp`),
+        update_time = VALUES(update_time)
+    </insert>
+</mapper>

+ 69 - 11
netflix-service/src/main/java/com/cyksj/service/mange/goods/CmsGoodsDonSpecServiceImpl.java

@@ -11,15 +11,13 @@ import com.cyksj.mapper.DistributeGoodsSkuAlertMapper;
 import com.cyksj.mapper.GoodsDonMapper;
 import com.cyksj.mapper.GoodsDonMapper;
 import com.cyksj.mapper.GoodsDonSkuMapper;
 import com.cyksj.mapper.GoodsDonSkuMapper;
 import com.cyksj.mapper.GoodsDonSpecMapper;
 import com.cyksj.mapper.GoodsDonSpecMapper;
-import com.cyksj.model.entity.DistributeGoodsSkuAlert;
-import com.cyksj.model.entity.GoodsDon;
-import com.cyksj.model.entity.GoodsDonSku;
-import com.cyksj.model.entity.GoodsDonSpec;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.request.ReqGoodsSkuInsert;
 import com.cyksj.model.manage.request.ReqGoodsSkuInsert;
 import com.cyksj.model.manage.request.ReqGoodsSkuSpec;
 import com.cyksj.model.manage.request.ReqGoodsSkuSpec;
 import com.cyksj.model.manage.request.ReqGoodsSpecSingle;
 import com.cyksj.model.manage.request.ReqGoodsSpecSingle;
 import com.cyksj.model.request.CombinationSkuReq;
 import com.cyksj.model.request.CombinationSkuReq;
 import com.cyksj.service.mange.CmsGoodsDonSpecService;
 import com.cyksj.service.mange.CmsGoodsDonSpecService;
+import com.cyksj.service.translations.BackInfoTranslationsService;
 import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.JavaType;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
@@ -27,6 +25,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
+import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentHashMap;
@@ -47,6 +46,10 @@ public class CmsGoodsDonSpecServiceImpl extends ServiceImpl<GoodsDonSpecMapper,
 
 
 	private final DistributeGoodsSkuAlertMapper distributeGoodsSkuAlertMapper;
 	private final DistributeGoodsSkuAlertMapper distributeGoodsSkuAlertMapper;
 
 
+	private final BackInfoTranslationsService backInfoTranslationsService;
+
+	private final HttpServletRequest request;
+
 	@Override
 	@Override
 	@Transactional(rollbackFor = Throwable.class)
 	@Transactional(rollbackFor = Throwable.class)
 	public void insertOrUpdateSkuSpec(ReqGoodsSkuInsert insert, Boolean isUpdate) throws Exception {
 	public void insertOrUpdateSkuSpec(ReqGoodsSkuInsert insert, Boolean isUpdate) throws Exception {
@@ -54,6 +57,7 @@ public class CmsGoodsDonSpecServiceImpl extends ServiceImpl<GoodsDonSpecMapper,
 		if (null == goods) {
 		if (null == goods) {
 			throw new RuntimeException("找不到商品spu.");
 			throw new RuntimeException("找不到商品spu.");
 		}
 		}
+		String lang = request.getHeader("lang");
 		GoodsDonSpec loveSpec = this.getOne(Wrappers.lambdaQuery(GoodsDonSpec.class).eq(GoodsDonSpec::getGoodsId, insert.getGoodsId()));
 		GoodsDonSpec loveSpec = this.getOne(Wrappers.lambdaQuery(GoodsDonSpec.class).eq(GoodsDonSpec::getGoodsId, insert.getGoodsId()));
 		Map<String, List<ReqGoodsSkuSpec>> dbSpecMap = null;
 		Map<String, List<ReqGoodsSkuSpec>> dbSpecMap = null;
 		Map<Integer, ReqGoodsSkuSpec.Node> dbNodeMap = null;
 		Map<Integer, ReqGoodsSkuSpec.Node> dbNodeMap = null;
@@ -118,7 +122,7 @@ public class CmsGoodsDonSpecServiceImpl extends ServiceImpl<GoodsDonSpecMapper,
 					Set<GoodsDonSku> benefitsSkuIds = Jsons.parseSet(benefitsList, GoodsDonSku.class);
 					Set<GoodsDonSku> benefitsSkuIds = Jsons.parseSet(benefitsList, GoodsDonSku.class);
 					e.setBenefitsList(Jsons.toJson(benefitsSkuIds));
 					e.setBenefitsList(Jsons.toJson(benefitsSkuIds));
 				}
 				}
-				syncSpecNodeSku(goods.getId(), dbNodeMap, e);
+				syncSpecNodeSku(goods.getId(), dbNodeMap, e, lang);
 
 
 				ReqGoodsSpecSingle single = new ReqGoodsSpecSingle();
 				ReqGoodsSpecSingle single = new ReqGoodsSpecSingle();
 				single.setId(e.getId());
 				single.setId(e.getId());
@@ -139,11 +143,21 @@ public class CmsGoodsDonSpecServiceImpl extends ServiceImpl<GoodsDonSpecMapper,
 		spec.setSpecsJson(Jsons.toJson(specs));
 		spec.setSpecsJson(Jsons.toJson(specs));
 		spec.setSpecNumber(specNumber);
 		spec.setSpecNumber(specNumber);
 		spec.setSpecMapping(Jsons.toJson(map));
 		spec.setSpecMapping(Jsons.toJson(map));
-		if (insert.getId() != null) {
-			this.updateById(spec);
-			return;
+		if (!StrUtil.equals(UserPageLanguage.Language.zh_CN.name(), lang)) {
+			//spec
+			backInfoTranslationsService.saveOrUpdateBackInfoTranslations(BackInfoTranslations.Type.spec, spec.getId(), spec, lang);
+			//sku
+			List<GoodsDonSku> goodsDonSkus = goodsDonSkuMapper.selectList(Wrappers.lambdaQuery(GoodsDonSku.class)
+					.eq(GoodsDonSku::getGoodsId, goods.getId()));
+			List<GoodsDonSku> resetSkuSpec = resetSkuSpec(goodsDonSkus, spec);
+			resetSkuSpec.stream().forEach(sku -> backInfoTranslationsService.saveOrUpdateBackInfoTranslations(BackInfoTranslations.Type.sku, sku.getId(), sku, lang));
+		}else {
+			if (insert.getId() != null) {
+				this.updateById(spec);
+				return;
+			}
+			this.save(spec);
 		}
 		}
-		this.save(spec);
 	}
 	}
 
 
 	@Override
 	@Override
@@ -454,7 +468,7 @@ public class CmsGoodsDonSpecServiceImpl extends ServiceImpl<GoodsDonSpecMapper,
 	/**
 	/**
 	 * 更新二级分类标题价格等 同步库中sku
 	 * 更新二级分类标题价格等 同步库中sku
 	 */
 	 */
-	public void syncSpecNodeSku(Long goodsId, Map<Integer, ReqGoodsSkuSpec.Node> dbNodeMap, ReqGoodsSkuSpec.Node e) {
+	public void syncSpecNodeSku(Long goodsId, Map<Integer, ReqGoodsSkuSpec.Node> dbNodeMap, ReqGoodsSkuSpec.Node e, String lang) {
 		if (CollUtil.isNotEmpty(dbNodeMap)) {
 		if (CollUtil.isNotEmpty(dbNodeMap)) {
 			ReqGoodsSkuSpec.Node dbNode = dbNodeMap.get(e.getId());
 			ReqGoodsSkuSpec.Node dbNode = dbNodeMap.get(e.getId());
 			if (dbNode == null) {
 			if (dbNode == null) {
@@ -504,7 +518,9 @@ public class CmsGoodsDonSpecServiceImpl extends ServiceImpl<GoodsDonSpecMapper,
 									}
 									}
 								}
 								}
 							}
 							}
-							goodsDonSkuMapper.updateById(sku);
+							if (StrUtil.equals(UserPageLanguage.Language.zh_CN.name(), lang)) {
+								goodsDonSkuMapper.updateById(sku);
+							}
 						}
 						}
 					} catch (Exception exception) {
 					} catch (Exception exception) {
 					}
 					}
@@ -512,4 +528,46 @@ public class CmsGoodsDonSpecServiceImpl extends ServiceImpl<GoodsDonSpecMapper,
 			}
 			}
 		}
 		}
 	}
 	}
+
+	//多语言设置sku
+	public List<GoodsDonSku> resetSkuSpec(List<GoodsDonSku> skus, GoodsDonSpec loveSpec) throws Exception {
+		StringBuilder builder = new StringBuilder();
+		List<ReqGoodsSpecSingle> specList = null;
+		JavaType type = Jsons.javaType().constructMapType(HashMap.class, Integer.class, ReqGoodsSpecSingle.class);
+		Map<Integer, ReqGoodsSpecSingle> map = Jsons.parseObject(loveSpec.getSpecMapping(), type);
+		int specNumber = loveSpec.getSpecNumber();
+		List<GoodsDonSku> reSkuList = new ArrayList<>();
+		GoodsDonSku reSku = null;
+		for (GoodsDonSku sku : skus) {
+			final String specIds = sku.getSpecIds();
+			if (StringUtils.isBlank(specIds)) {
+				throw new RuntimeException("请选择商品的规格.");
+			}
+			int[] ids = Jsons.parseObject(specIds, int[].class);
+
+			// init
+			builder.delete(0, builder.length());
+			if (null == specList) {
+				specList = new ArrayList<>(specNumber);
+			} else {
+				specList.clear();
+			}
+			for (int id : ids) {
+				ReqGoodsSpecSingle single = map.get(id);
+				if (null == single) {
+					throw new RuntimeException("总规格属性id中 不存在 sku中的id.");
+				}
+				builder.append(single.getName()).append(';');
+				specList.add(single);
+			}
+			reSku = new GoodsDonSku();
+			String specVal = builder.toString();
+			String specJson = Jsons.toJson(specList);
+			reSku.setId(sku.getId());
+			reSku.setSpecVal(specVal);
+			reSku.setSpecJson(specJson);
+			reSkuList.add(reSku);
+		}
+		return reSkuList;
+	}
 }
 }

+ 45 - 0
netflix-service/src/main/java/com/cyksj/service/translations/BackInfoTranslationsFrontService.java

@@ -0,0 +1,45 @@
+package com.cyksj.service.translations;
+
+import com.cyksj.model.entity.GoodsDonSku;
+import com.cyksj.model.manage.views.GoodsDonViewer;
+import com.cyksj.model.views.CouponView;
+import com.cyksj.model.views.GoodsDonCategoryFrontView;
+import com.cyksj.model.views.GoodsFrontListCategoryView;
+import com.cyksj.model.views.GoodsFrontListView;
+
+import java.util.List;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: BackInfoTranslationsFrontService
+ * 创建者: JavaZou
+ * 创建时间:2024/7/16 15:07
+ */
+public interface BackInfoTranslationsFrontService {
+	void setGoodsDetailLanguage(GoodsFrontListView views, String lang);
+
+	void setCategoryGoodsLanguage(GoodsFrontListCategoryView data, String lang);
+
+	String setLanguagePayTitle(Long goodsId, Long skuId, String language);
+
+	void setGoodsBackLanguage(GoodsDonViewer goodsDonViewer, String lang);
+
+	void setSkuBackLanguage(List<GoodsDonSku> goodsDonSkus, String lang);
+
+	String setSpecVal(Long skuId, String lang);
+
+	String setGoodsTitle(Long goodsId, String lang);
+
+	void setCouponLanguage(CouponView couponView, String lang);
+
+	void setFieldLanguage(Class<?> tclass, Object obj, Integer type, Long funcId, String lang);
+
+	/**
+	 * 设置优惠券规格展示多语言
+	 */
+	String setCouponGoodsSkuStrLanguage(Long couponId, String lang);
+
+	void setListCategoryNameLanguage(List<GoodsDonCategoryFrontView> list, String lang);
+
+	String getCategoryNameLanguage(Long category, String lang);
+}

+ 17 - 0
netflix-service/src/main/java/com/cyksj/service/translations/BackInfoTranslationsService.java

@@ -0,0 +1,17 @@
+package com.cyksj.service.translations;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.dto.TranslationsDto;
+import com.cyksj.model.entity.BackInfoTranslations;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: BackInfoTranslationsService
+ * 创建者: JavaZou
+ * 创建时间:2024/7/16 14:19
+ */
+public interface BackInfoTranslationsService extends IService<BackInfoTranslations> {
+	void saveOrUpdateTranslations(TranslationsDto dto);
+
+	void saveOrUpdateBackInfoTranslations(BackInfoTranslations.Type type, Long funcId, Object obj, String lang);
+}

+ 220 - 0
netflix-service/src/main/java/com/cyksj/service/translations/impl/BackInfoTranslationsFrontServiceImpl.java

@@ -0,0 +1,220 @@
+package com.cyksj.service.translations.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.mapper.BackInfoTranslationsMapper;
+import com.cyksj.mapper.manage.coupon.CouponMapper;
+import com.cyksj.mapper.manage.coupon.CouponSkuMapper;
+import com.cyksj.model.entity.BackInfoTranslations;
+import com.cyksj.model.entity.GoodsDonSku;
+import com.cyksj.model.entity.UserPageLanguage;
+import com.cyksj.model.manage.views.GoodsDonViewer;
+import com.cyksj.model.views.*;
+import com.cyksj.service.translations.BackInfoTranslationsFrontService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: BackInfoTranslationsFrontServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2024/7/16 15:07
+ */
+@Service
+@RequiredArgsConstructor
+public class BackInfoTranslationsFrontServiceImpl implements BackInfoTranslationsFrontService {
+	private final BackInfoTranslationsMapper backInfoTranslationsMapper;
+
+	private final CouponMapper couponMapper;
+
+	private final CouponSkuMapper couponSkuMapper;
+
+	@Override
+	public void setGoodsDetailLanguage(GoodsFrontListView views, String lang) {
+		if (views == null) {
+			return;
+		}
+		//平台
+		setFieldLanguage(views.getClass(), views, BackInfoTranslations.Type.goods.ordinal(), views.getId(), lang);
+		//规格
+		List<GoodsDonSkuFrontView> skuList = views.getSkuList();
+		if (CollUtil.isNotEmpty(skuList)) {
+			skuList.forEach(sku -> setFieldLanguage(sku.getClass(), sku, BackInfoTranslations.Type.sku.ordinal(), sku.getId(), lang));
+		}
+		GoodsDonSpecFrontView specs = views.getSpecs();
+		if (specs != null) {
+			setFieldLanguage(specs.getClass(), specs, BackInfoTranslations.Type.spec.ordinal(), specs.getId(), lang);
+		}
+	}
+
+	@Override
+	public void setCategoryGoodsLanguage(GoodsFrontListCategoryView data, String lang) {
+		if (data == null) {
+			return;
+		}
+		//平台
+		setFieldLanguage(data.getClass(), data, BackInfoTranslations.Type.goods.ordinal(), data.getId(), lang);
+	}
+
+	@Override
+	public String setLanguagePayTitle(Long goodsId, Long skuId, String lang) {
+		if (StrUtil.isEmpty(lang)) {
+			return null;
+		}
+		BackInfoTranslations goodsL = backInfoTranslationsMapper.selectOne(Wrappers.lambdaQuery(BackInfoTranslations.class)
+				.eq(BackInfoTranslations::getType, BackInfoTranslations.Type.goods.ordinal())
+				.eq(BackInfoTranslations::getFuncId, goodsId)
+				.eq(BackInfoTranslations::getLang, lang)
+				.eq(BackInfoTranslations::getFieldName, "title"));
+		BackInfoTranslations skuL = backInfoTranslationsMapper.selectOne(Wrappers.lambdaQuery(BackInfoTranslations.class)
+				.eq(BackInfoTranslations::getType, BackInfoTranslations.Type.sku.ordinal())
+				.eq(BackInfoTranslations::getFuncId, skuId)
+				.eq(BackInfoTranslations::getLang, lang)
+				.eq(BackInfoTranslations::getFieldName, "specVal"));
+		if (goodsL != null && skuL != null) {
+			return new StringBuilder().append(goodsL.getDesp()).append(skuL.getDesp()).toString();
+		}
+		return null;
+	}
+
+	@Override
+	public void setGoodsBackLanguage(GoodsDonViewer goodsDonViewer, String lang) {
+		//sku
+		setFieldLanguage(goodsDonViewer.getClass(), goodsDonViewer, BackInfoTranslations.Type.goods.ordinal(), goodsDonViewer.getId(), lang);
+		//spec
+		setFieldLanguage(goodsDonViewer.getClass(), goodsDonViewer, BackInfoTranslations.Type.spec.ordinal(), goodsDonViewer.getSpecId(), lang);
+	}
+
+	@Override
+	public void setSkuBackLanguage(List<GoodsDonSku> goodsDonSkus, String lang) {
+		goodsDonSkus.forEach(sku -> setFieldLanguage(sku.getClass(), sku, BackInfoTranslations.Type.sku.ordinal(), sku.getId(), lang));
+	}
+
+	@Override
+	public String setSpecVal(Long skuId, String lang) {
+		BackInfoTranslations skuL = backInfoTranslationsMapper.selectOne(Wrappers.lambdaQuery(BackInfoTranslations.class)
+				.eq(BackInfoTranslations::getType, BackInfoTranslations.Type.sku.ordinal())
+				.eq(BackInfoTranslations::getFuncId, skuId)
+				.eq(BackInfoTranslations::getLang, lang)
+				.eq(BackInfoTranslations::getFieldName, "specVal"));
+		if (skuL != null) return skuL.getDesp();
+		return null;
+	}
+
+	@Override
+	public String setGoodsTitle(Long goodsId, String lang) {
+		BackInfoTranslations goodsL = backInfoTranslationsMapper.selectOne(Wrappers.lambdaQuery(BackInfoTranslations.class)
+				.eq(BackInfoTranslations::getType, BackInfoTranslations.Type.goods.ordinal())
+				.eq(BackInfoTranslations::getFuncId, goodsId)
+				.eq(BackInfoTranslations::getLang, lang)
+				.eq(BackInfoTranslations::getFieldName, "title"));
+		if (goodsL != null) return goodsL.getDesp();
+		return null;
+	}
+
+	@Override
+	public void setCouponLanguage(CouponView couponView, String lang) {
+		setFieldLanguage(couponView.getClass(), couponView, BackInfoTranslations.Type.coupon.ordinal(), couponView.getId(), lang);
+		if (couponView.getClassificationId() != null) {
+			BackInfoTranslations classificationTranslation = backInfoTranslationsMapper.selectOne(Wrappers.lambdaQuery(BackInfoTranslations.class)
+					.eq(BackInfoTranslations::getType, BackInfoTranslations.Type.coupon_classification.ordinal())
+					.eq(BackInfoTranslations::getLang, lang)
+					.eq(BackInfoTranslations::getFuncId, couponView.getClassificationId())
+					.eq(BackInfoTranslations::getFieldName, "name"));
+			if (classificationTranslation != null) {
+				couponView.setCouponClassificationName(classificationTranslation.getDesp());
+			}
+		}
+	}
+
+	@Override
+	public void setFieldLanguage(Class<?> tclass, Object obj, Integer type, Long funcId, String lang) {
+		if (StrUtil.isEmpty(lang) || StrUtil.equals(UserPageLanguage.Language.zh_CN.name(), lang)) {
+			return;
+		}
+		List<BackInfoTranslations> backInfoTranslations = backInfoTranslationsMapper.selectList(Wrappers.lambdaQuery(BackInfoTranslations.class)
+				.eq(BackInfoTranslations::getType, type)
+				.eq(BackInfoTranslations::getLang, lang)
+				.eq(BackInfoTranslations::getFuncId, funcId));
+
+		if (CollUtil.isNotEmpty(backInfoTranslations)) {
+			backInfoTranslations.forEach(tanslate -> {
+				String fieldName = tanslate.getFieldName();
+				try {
+					Field declaredField = tclass.getDeclaredField(fieldName);
+					declaredField.setAccessible(true);
+					declaredField.set(obj, tanslate.getDesp());
+				} catch (IllegalAccessException e) {
+				} catch (NoSuchFieldException e) {
+				}
+			});
+		}
+	}
+
+
+	@Override
+	public String setCouponGoodsSkuStrLanguage(Long couponId, String lang) {
+		if (StrUtil.isEmpty(lang) || StrUtil.equals(UserPageLanguage.Language.zh_CN.name(), lang)) {
+			String str = couponSkuMapper.selectGoodsSkuStr(couponId);
+			str = str.replaceAll(",", "/").replaceAll(";", "");
+			return str;
+		}
+
+		List<GoodsDonSku> goodsDonSkus = new ArrayList<>();
+		StringBuilder skuGoodsStrSb = new StringBuilder(128);
+		Map<Long, String> map = new HashMap<>();
+		goodsDonSkus.forEach(sku -> {
+			String title = map.get(sku.getGoodsId());
+			if (StrUtil.isEmpty(title)) {
+				BackInfoTranslations backGoodsInfoTranslations = backInfoTranslationsMapper.selectOne(Wrappers.lambdaQuery(BackInfoTranslations.class)
+						.eq(BackInfoTranslations::getType, BackInfoTranslations.Type.goods.ordinal())
+						.eq(BackInfoTranslations::getLang, lang)
+						.eq(BackInfoTranslations::getFieldName, "title")
+						.eq(BackInfoTranslations::getFuncId, sku.getGoodsId()));
+				if (backGoodsInfoTranslations != null) {
+					title = backGoodsInfoTranslations.getDesp();
+					map.put(sku.getGoodsId(), title);
+				}
+			}
+			BackInfoTranslations backSkuInfoTranslations = backInfoTranslationsMapper.selectOne(Wrappers.lambdaQuery(BackInfoTranslations.class)
+					.eq(BackInfoTranslations::getType, BackInfoTranslations.Type.sku.ordinal())
+					.eq(BackInfoTranslations::getLang, lang)
+					.eq(BackInfoTranslations::getFieldName, "specVal")
+					.eq(BackInfoTranslations::getFuncId, sku.getId()));
+			if (skuGoodsStrSb.length() > 0) {
+				skuGoodsStrSb.append("/");
+			}
+			if (backSkuInfoTranslations != null) {
+				skuGoodsStrSb.append(title).append(" ").append(backSkuInfoTranslations.getDesp());
+			}
+		});
+
+		return skuGoodsStrSb.toString();
+	}
+
+	@Override
+	public void setListCategoryNameLanguage(List<GoodsDonCategoryFrontView> list, String lang) {
+		if (list == null) {
+			return;
+		}
+		list.forEach(category -> setFieldLanguage(category.getClass(), category, BackInfoTranslations.Type.goods_category.ordinal(), category.getId(), lang));
+	}
+
+	@Override
+	public String getCategoryNameLanguage(Long category, String lang) {
+		BackInfoTranslations categoryName = backInfoTranslationsMapper.selectOne(Wrappers.lambdaQuery(BackInfoTranslations.class)
+				.eq(BackInfoTranslations::getType, BackInfoTranslations.Type.goods_category.ordinal())
+				.eq(BackInfoTranslations::getFuncId, category)
+				.eq(BackInfoTranslations::getLang, lang)
+				.eq(BackInfoTranslations::getFieldName, "name"));
+		if (categoryName != null) return categoryName.getDesp();
+		return null;
+	}
+}

+ 70 - 0
netflix-service/src/main/java/com/cyksj/service/translations/impl/BackInfoTranslationsServiceImpl.java

@@ -0,0 +1,70 @@
+package com.cyksj.service.translations.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cyksj.mapper.BackInfoTranslationsMapper;
+import com.cyksj.model.dto.TranslationsDto;
+import com.cyksj.model.entity.BackInfoTranslations;
+import com.cyksj.service.translations.BackInfoTranslationsService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * 项目名: yhlxj2
+ * 文件名: BackInfoTranslationsServiceImpl
+ * 创建者: JavaZou
+ * 创建时间:2024/7/16 14:20
+ */
+@Service
+@RequiredArgsConstructor
+public class BackInfoTranslationsServiceImpl extends ServiceImpl<BackInfoTranslationsMapper, BackInfoTranslations> implements BackInfoTranslationsService {
+	private final BackInfoTranslationsMapper backInfoTranslationsMapper;
+
+	@Override
+	public void saveOrUpdateTranslations(TranslationsDto dto) {
+		List<BackInfoTranslations> fields = dto.getFields();
+		if (CollUtil.isEmpty(fields)) {
+			return;
+		}
+		backInfoTranslationsMapper.batchInsertOrUpdate(dto.getFuncId(), dto.getType().ordinal(), dto.getFields(), dto.getLang());
+	}
+
+	@Override
+	public void saveOrUpdateBackInfoTranslations(BackInfoTranslations.Type type, Long funcId, Object obj, String lang) {
+		if (StrUtil.isEmpty(lang) || funcId == null) {
+			return;
+		}
+		TranslationsDto translationsDto = new TranslationsDto();
+		translationsDto.setType(type);
+		translationsDto.setLang(lang);
+		translationsDto.setFuncId(funcId);
+		List<BackInfoTranslations> fields = new ArrayList<>();
+		for (Field declaredField : obj.getClass().getDeclaredFields()) {
+			try {
+				declaredField.setAccessible(true);
+				Optional.ofNullable(declaredField.get(obj)).ifPresent(val -> {
+					if (val instanceof String) {
+						BackInfoTranslations backInfoTranslations = new BackInfoTranslations();
+						backInfoTranslations.setFieldName(declaredField.getName());
+						backInfoTranslations.setDesp(val.toString());
+						fields.add(backInfoTranslations);
+					}
+				});
+			} catch (IllegalAccessException e) {
+			}
+		}
+		if (CollUtil.isNotEmpty(fields)) {
+			translationsDto.setFields(fields);
+			saveOrUpdateTranslations(translationsDto);
+		} else {
+			backInfoTranslationsMapper.delete(Wrappers.lambdaQuery(BackInfoTranslations.class).eq(BackInfoTranslations::getType, type.ordinal()).eq(BackInfoTranslations::getFuncId, funcId).eq(BackInfoTranslations::getLang, lang));
+		}
+	}
+}

+ 49 - 10
netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java

@@ -26,6 +26,7 @@ import com.cyksj.redis.RedisService;
 import com.cyksj.service.goods.GoodsDonFrontService;
 import com.cyksj.service.goods.GoodsDonFrontService;
 import com.cyksj.service.home.ClickRecordFrontService;
 import com.cyksj.service.home.ClickRecordFrontService;
 import com.cyksj.service.shop.YhShopFrontService;
 import com.cyksj.service.shop.YhShopFrontService;
+import com.cyksj.service.translations.BackInfoTranslationsFrontService;
 import com.cyksj.service.user.UserBindRelationService;
 import com.cyksj.service.user.UserBindRelationService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.web.util.StpUserUtil;
 import com.cyksj.web.util.StpUserUtil;
@@ -87,7 +88,7 @@ public class GoodsDonController {
 
 
 	private final GiftCardGoodsSkuMapper giftCardGoodsSkuMapper;
 	private final GiftCardGoodsSkuMapper giftCardGoodsSkuMapper;
 
 
-	private final GoodsDonCategoryRelateMapper goodsDonCategoryRelateMapper;
+	private final BackInfoTranslationsFrontService backInfoTranslationsFrontService;
 
 
 	/**
 	/**
      * 获取平台商品分类
      * 获取平台商品分类
@@ -102,6 +103,12 @@ public class GoodsDonController {
 	    if (yhsId != null) {
 	    if (yhsId != null) {
 		    key += ":yhShop:" + yhsId;
 		    key += ":yhShop:" + yhsId;
 	    }
 	    }
+	    String lang = request.getHeader("lang");
+	    AtomicBoolean language = new AtomicBoolean(false);
+	    if (UserPageLanguage.Language.en_US.name().equals(lang)) {
+		    key += ":" + lang;
+		    language.set(true);
+	    }
 	    Object o = redisService.get(key);
 	    Object o = redisService.get(key);
 	    List<GoodsDonCategoryFrontView> list;
 	    List<GoodsDonCategoryFrontView> list;
 	    MapBuilder mapBuilder = MapUtils.flatBuilder(request.getParameterMap());
 	    MapBuilder mapBuilder = MapUtils.flatBuilder(request.getParameterMap());
@@ -115,6 +122,10 @@ public class GoodsDonController {
 	    if (o == null) {
 	    if (o == null) {
 		    list = beanSearcher.searchAll(GoodsDonCategoryFrontView.class, mapBuilder
 		    list = beanSearcher.searchAll(GoodsDonCategoryFrontView.class, mapBuilder
 				    .build());
 				    .build());
+		    //多语言
+		    if (language.get()) {
+			    backInfoTranslationsFrontService.setListCategoryNameLanguage(list, lang);
+		    }
 		    redisService.setNx(key, list, 30 * 60l);
 		    redisService.setNx(key, list, 30 * 60l);
 		    o = redisService.get(key);
 		    o = redisService.get(key);
 	    }
 	    }
@@ -357,6 +368,12 @@ public class GoodsDonController {
 		String goodsDetailKey = RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "goods_detail:" + id;
 		String goodsDetailKey = RedisService.key.YH_HOME_PAGHE_CACHE.getName() + "goods_detail:" + id;
 		//List<Long> filter_goodsIds = getFilterGoodsIds();
 		//List<Long> filter_goodsIds = getFilterGoodsIds();
 		List<Long> filter_goodsIds = null;
 		List<Long> filter_goodsIds = null;
+		String lang = request.getHeader("lang");
+		AtomicBoolean language = new AtomicBoolean(false);
+		if (UserPageLanguage.Language.en_US.name().equals(lang)) {
+			goodsDetailKey += ":" + lang;
+			language.set(true);
+		}
 		//存在过滤平台 商品详情不返回
 		//存在过滤平台 商品详情不返回
 		if (CollUtil.isNotEmpty(filter_goodsIds) && filter_goodsIds.contains(id)) {
 		if (CollUtil.isNotEmpty(filter_goodsIds) && filter_goodsIds.contains(id)) {
 			return GatewayResponse.SUCCESS.newBuilder().toResult();
 			return GatewayResponse.SUCCESS.newBuilder().toResult();
@@ -377,6 +394,10 @@ public class GoodsDonController {
 			}
 			}
 			views.setSkuList(beanSearcher.searchAll(GoodsDonSkuFrontView.class, builder.build()));
 			views.setSkuList(beanSearcher.searchAll(GoodsDonSkuFrontView.class, builder.build()));
 			views.setSold(getGoodsSold(views.getId(), views.getSold()));
 			views.setSold(getGoodsSold(views.getId(), views.getSold()));
+			//多语言
+			if (language.get()) {
+				backInfoTranslationsFrontService.setGoodsDetailLanguage(views, lang);
+			}
 			List<Long> gptBuyGids = getGptMirrorGiveawayBuyGids();
 			List<Long> gptBuyGids = getGptMirrorGiveawayBuyGids();
 			if (CollUtil.isNotEmpty(gptBuyGids) && gptBuyGids.contains(views.getId())) {
 			if (CollUtil.isNotEmpty(gptBuyGids) && gptBuyGids.contains(views.getId())) {
 				views.setIsGptGift(true);
 				views.setIsGptGift(true);
@@ -458,9 +479,12 @@ public class GoodsDonController {
 //					});
 //					});
 //				}
 //				}
 //			}
 //			}
-			//设置规格优惠后的价格
-			sku.setChannelDiscount(discount);
-			setUserCouponSkuMoney(fUid, sku);
+
+			if (!UserPageLanguage.Language.en_US.name().equals(lang)) {
+				//设置规格优惠后的价格
+				sku.setChannelDiscount(discount);
+				setUserCouponSkuMoney(fUid, sku);
+			}
 			return true;
 			return true;
 		}).collect(Collectors.toList()));
 		}).collect(Collectors.toList()));
 		return GatewayResponse.SUCCESS.newBuilder().toResult(views);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(views);
@@ -877,6 +901,7 @@ public class GoodsDonController {
 	 */
 	 */
 	public void setHomeManageSpecific(List<HomeManagementFrontView> list, Long fUid, Long dsUserId, BigDecimal discount) {
 	public void setHomeManageSpecific(List<HomeManagementFrontView> list, Long fUid, Long dsUserId, BigDecimal discount) {
 		DateTime now = DateTime.now();
 		DateTime now = DateTime.now();
+		String lang = request.getHeader("lang");
 		list.forEach(data -> {
 		list.forEach(data -> {
 			if (data.getIsSp() != null && data.getIsSp() && fUid != null) {
 			if (data.getIsSp() != null && data.getIsSp() && fUid != null) {
 				//查找所有特定规格最小价格 满足条件
 				//查找所有特定规格最小价格 满足条件
@@ -902,9 +927,11 @@ public class GoodsDonController {
 			}
 			}
 			data.setSold(getGoodsSold(data.getGoodsId(), data.getSold()));
 			data.setSold(getGoodsSold(data.getGoodsId(), data.getSold()));
 			data.setNotifyMsg(getPayMsgTime(data.getGoodsId(), now, 1, null));
 			data.setNotifyMsg(getPayMsgTime(data.getGoodsId(), now, 1, null));
-			//设置用户存在优惠券的优惠商品价格
-			data.setChannelDiscount(discount);
-			setHomeManageUserCouponGoodsMoney(fUid, data);
+			if (!UserPageLanguage.Language.en_US.name().equals(lang)) {
+				//设置用户存在优惠券的优惠商品价格
+				data.setChannelDiscount(discount);
+				setHomeManageUserCouponGoodsMoney(fUid, data);
+			}
 		});
 		});
 	}
 	}
 
 
@@ -1029,6 +1056,12 @@ public class GoodsDonController {
 		if (CollUtil.isNotEmpty(filter_goodsIds)) {
 		if (CollUtil.isNotEmpty(filter_goodsIds)) {
 			categoryGoodsKey += ":hz-ip";
 			categoryGoodsKey += ":hz-ip";
 		}
 		}
+		String lang = request.getHeader("lang");
+		AtomicBoolean language = new AtomicBoolean(false);
+		if (UserPageLanguage.Language.en_US.name().equals(lang)) {
+			categoryGoodsKey += ":" + lang;
+			language.set(true);
+		}
 		Object o = redisService.get(categoryGoodsKey);
 		Object o = redisService.get(categoryGoodsKey);
 		if (o == null) {
 		if (o == null) {
 			DateTime now = DateTime.now();
 			DateTime now = DateTime.now();
@@ -1048,6 +1081,10 @@ public class GoodsDonController {
 				if (CollUtil.isNotEmpty(gptBuyGids) && gptBuyGids.contains(data.getId())) {
 				if (CollUtil.isNotEmpty(gptBuyGids) && gptBuyGids.contains(data.getId())) {
 					data.setIsGptGift(true);
 					data.setIsGptGift(true);
 				}
 				}
+				if (language.get()) {
+					//多语言
+					backInfoTranslationsFrontService.setCategoryGoodsLanguage(data, lang);
+				}
 			});
 			});
 			redisService.setNx(categoryGoodsKey, goodsFrontListViews, RedisService.key.YH_HOME_PAGHE_CACHE.getTimeout() + 10 * 60);
 			redisService.setNx(categoryGoodsKey, goodsFrontListViews, RedisService.key.YH_HOME_PAGHE_CACHE.getTimeout() + 10 * 60);
 			o = redisService.get(categoryGoodsKey);
 			o = redisService.get(categoryGoodsKey);
@@ -1095,9 +1132,11 @@ public class GoodsDonController {
 			}
 			}
 			//设置特定价格
 			//设置特定价格
 			setGcSpecificPrice(data, fUid, dsUserId.get());
 			setGcSpecificPrice(data, fUid, dsUserId.get());
-			//设置用户存在优惠券的优惠商品价格
-			data.setChannelDiscount(discount);
-			setUserCouponGoodsMoney(fUid, data);
+			if (!UserPageLanguage.Language.en_US.name().equals(lang)) {
+				//设置用户存在优惠券的优惠商品价格
+				data.setChannelDiscount(discount);
+				setUserCouponGoodsMoney(fUid, data);
+			}
 			return true;
 			return true;
 		}).collect(Collectors.toList());
 		}).collect(Collectors.toList());
 		return GatewayResponse.SUCCESS.newBuilder().toResult(goodsFrontListViews);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(goodsFrontListViews);

+ 23 - 5
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonCategoryController.java

@@ -2,21 +2,21 @@ package com.cyksj.web.controller.manage.goods;
 
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.lang.Assert;
 import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.dto.Result;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsClickUserRecordMapper;
 import com.cyksj.mapper.GoodsClickUserRecordMapper;
-import com.cyksj.model.entity.GoodsClickUserRecord;
-import com.cyksj.model.entity.GoodsDon;
-import com.cyksj.model.entity.GoodsDonCategory;
-import com.cyksj.model.entity.GoodsDonCategoryRelate;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.views.GoodsDonCategoryGoodsView;
 import com.cyksj.model.views.GoodsDonCategoryGoodsView;
 import com.cyksj.model.views.GoodsDonCategoryView;
 import com.cyksj.model.views.GoodsDonCategoryView;
 import com.cyksj.service.mange.CmsGoodsDonService;
 import com.cyksj.service.mange.CmsGoodsDonService;
 import com.cyksj.service.mange.GoodsDonCategoryRelateService;
 import com.cyksj.service.mange.GoodsDonCategoryRelateService;
 import com.cyksj.service.mange.GoodsDonCategoryService;
 import com.cyksj.service.mange.GoodsDonCategoryService;
 import com.cyksj.service.mange.RefreshCacheService;
 import com.cyksj.service.mange.RefreshCacheService;
+import com.cyksj.service.translations.BackInfoTranslationsFrontService;
+import com.cyksj.service.translations.BackInfoTranslationsService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.util.MapBuilder;
 import com.ejlchina.searcher.util.MapBuilder;
@@ -53,6 +53,10 @@ public class CmsGoodsDonCategoryController {
 
 
 	private final RefreshCacheService refreshCacheService;
 	private final RefreshCacheService refreshCacheService;
 
 
+	private final BackInfoTranslationsService backInfoTranslationsService;
+
+	private final BackInfoTranslationsFrontService backInfoTranslationsFrontService;
+
 	/**
 	/**
 	 * 新增分类
 	 * 新增分类
 	 */
 	 */
@@ -67,7 +71,13 @@ public class CmsGoodsDonCategoryController {
 	 */
 	 */
 	@PutMapping("/put")
 	@PutMapping("/put")
 	public Result<String> updateGoodsDonCategory(@RequestBody List<GoodsDonCategory> categorys) {
 	public Result<String> updateGoodsDonCategory(@RequestBody List<GoodsDonCategory> categorys) {
-		categorys.forEach(category -> goodsDonCategoryService.saveOrUpdateGoods(category));
+		String lang = request.getHeader("lang");
+		//多语言
+		if (!StrUtil.equals(UserPageLanguage.Language.zh_CN.name(), lang)) {
+			categorys.forEach(category -> backInfoTranslationsService.saveOrUpdateBackInfoTranslations(BackInfoTranslations.Type.goods_category, category.getId(), category, lang));
+		} else {
+			categorys.forEach(category -> goodsDonCategoryService.saveOrUpdateGoods(category));
+		}
 		refreshCacheService.refreshYhHomeCategoryPageCache();
 		refreshCacheService.refreshYhHomeCategoryPageCache();
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 		return GatewayResponse.SUCCESS.newBuilder().toResult();
 	}
 	}
@@ -121,11 +131,19 @@ public class CmsGoodsDonCategoryController {
 	 */
 	 */
 	@GetMapping("/get")
 	@GetMapping("/get")
 	public Result<SearchResult<GoodsDonCategoryView>> getCategory() {
 	public Result<SearchResult<GoodsDonCategoryView>> getCategory() {
+		String lang = request.getHeader("lang");
 		SearchResult<GoodsDonCategoryView> search = beanSearcher.search(GoodsDonCategoryView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		SearchResult<GoodsDonCategoryView> search = beanSearcher.search(GoodsDonCategoryView.class, MapUtils.flatBuilder(request.getParameterMap()).build());
 		search.getDataList().forEach(data->{
 		search.getDataList().forEach(data->{
 			Integer count = goodsClickUserRecordMapper.selectCount(Wrappers.lambdaQuery(GoodsClickUserRecord.class)
 			Integer count = goodsClickUserRecordMapper.selectCount(Wrappers.lambdaQuery(GoodsClickUserRecord.class)
 					.eq(GoodsClickUserRecord::getCategory, data.getId()));
 					.eq(GoodsClickUserRecord::getCategory, data.getId()));
 			data.setClick(count);
 			data.setClick(count);
+			//多语言
+			if (!StrUtil.equals(UserPageLanguage.Language.zh_CN.name(), lang)) {
+				String categoryNameLanguage = backInfoTranslationsFrontService.getCategoryNameLanguage(data.getId(), lang);
+				if (StrUtil.isNotBlank(categoryNameLanguage)) {
+					data.setName(categoryNameLanguage);
+				}
+			}
 		});
 		});
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 		return GatewayResponse.SUCCESS.newBuilder().toResult(search);
 	}
 	}

+ 23 - 6
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonController.java

@@ -12,9 +12,7 @@ import com.cyksj.dto.Result;
 import com.cyksj.enums.BusinessType;
 import com.cyksj.enums.BusinessType;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsDonSkuMapper;
 import com.cyksj.mapper.GoodsDonSkuMapper;
-import com.cyksj.model.entity.GoodsDon;
-import com.cyksj.model.entity.GoodsDonCategory;
-import com.cyksj.model.entity.GoodsDonSku;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.request.ReqGoodsSpuInsert;
 import com.cyksj.model.manage.request.ReqGoodsSpuInsert;
 import com.cyksj.model.manage.views.GoodsDonViewer;
 import com.cyksj.model.manage.views.GoodsDonViewer;
 import com.cyksj.model.views.CategoryGoodsCascadeView;
 import com.cyksj.model.views.CategoryGoodsCascadeView;
@@ -23,6 +21,8 @@ import com.cyksj.model.views.GoodsDonCategoryDetailView;
 import com.cyksj.service.mange.CmsGoodsDonService;
 import com.cyksj.service.mange.CmsGoodsDonService;
 import com.cyksj.service.mange.GoodsDonCategoryService;
 import com.cyksj.service.mange.GoodsDonCategoryService;
 import com.cyksj.service.mange.RefreshCacheService;
 import com.cyksj.service.mange.RefreshCacheService;
+import com.cyksj.service.translations.BackInfoTranslationsFrontService;
+import com.cyksj.service.translations.BackInfoTranslationsService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.param.Operator;
@@ -60,6 +60,10 @@ public class CmsGoodsDonController {
 
 
     private final GoodsDonSkuMapper skuMapper;
     private final GoodsDonSkuMapper skuMapper;
 
 
+    private final BackInfoTranslationsFrontService backInfoTranslationsFrontService;
+
+    private final BackInfoTranslationsService backInfoTranslationsService;
+
     @GetMapping("/get")
     @GetMapping("/get")
     public Result<SearchResult<GoodsDonCategoryDetailView>> get(){
     public Result<SearchResult<GoodsDonCategoryDetailView>> get(){
         SearchResult<GoodsDonCategoryDetailView> search = beanSearcher.search(GoodsDonCategoryDetailView.class, MapUtils.flatBuilder(request.getParameterMap())
         SearchResult<GoodsDonCategoryDetailView> search = beanSearcher.search(GoodsDonCategoryDetailView.class, MapUtils.flatBuilder(request.getParameterMap())
@@ -80,6 +84,10 @@ public class CmsGoodsDonController {
         }
         }
         List<GoodsDonCategory> categoryView = goodsDonCategoryService.getCateGoryViewByGoodsId(id);
         List<GoodsDonCategory> categoryView = goodsDonCategoryService.getCateGoryViewByGoodsId(id);
         goodsDonViewer.setCategoryList(categoryView.stream().map(GoodsDonCategory::getId).collect(Collectors.toList()));
         goodsDonViewer.setCategoryList(categoryView.stream().map(GoodsDonCategory::getId).collect(Collectors.toList()));
+        String lang = request.getHeader("lang");
+        if (!StrUtil.equals(UserPageLanguage.Language.zh_CN.name(), lang)) {
+            backInfoTranslationsFrontService.setGoodsBackLanguage(goodsDonViewer, lang);
+        }
         return GatewayResponse.SUCCESS.newBuilder().toResult(goodsDonViewer);
         return GatewayResponse.SUCCESS.newBuilder().toResult(goodsDonViewer);
     }
     }
 
 
@@ -91,6 +99,10 @@ public class CmsGoodsDonController {
         List<GoodsDonSku> goodsDonSkus = beanSearcher.searchAll(GoodsDonSku.class, MapUtils.flatBuilder(request.getParameterMap()).field(GoodsDonSku::getGoodsId, id)
         List<GoodsDonSku> goodsDonSkus = beanSearcher.searchAll(GoodsDonSku.class, MapUtils.flatBuilder(request.getParameterMap()).field(GoodsDonSku::getGoodsId, id)
                 .orderBy(GoodsDonSku::getSorted).asc()
                 .orderBy(GoodsDonSku::getSorted).asc()
                 .build());
                 .build());
+        String lang = request.getHeader("lang");
+        if (!StrUtil.equals(UserPageLanguage.Language.zh_CN.name(), lang)) {
+            backInfoTranslationsFrontService.setSkuBackLanguage(goodsDonSkus, lang);
+        }
         return GatewayResponse.SUCCESS.newBuilder().toResult(goodsDonSkus);
         return GatewayResponse.SUCCESS.newBuilder().toResult(goodsDonSkus);
     }
     }
 
 
@@ -157,9 +169,14 @@ public class CmsGoodsDonController {
             re_goodsIds.remove(spu.getId());
             re_goodsIds.remove(spu.getId());
             goods.setRecommendGoods(Jsons.toJson(re_goodsIds));
             goods.setRecommendGoods(Jsons.toJson(re_goodsIds));
         }
         }
-        //平台 分类关系
-        goodsDonCategoryService.handleGoodsRelate(goods.getId(), spu.getCategoryList());
-        goodsDonService.updateById(goods);
+        String lang = request.getHeader("lang");
+        if (!StrUtil.equals(UserPageLanguage.Language.zh_CN.name(), lang)) {
+            backInfoTranslationsService.saveOrUpdateBackInfoTranslations(BackInfoTranslations.Type.goods, goods.getId(), goods, lang);
+        } else {
+            //平台 分类关系
+            goodsDonCategoryService.handleGoodsRelate(goods.getId(), spu.getCategoryList());
+            goodsDonService.updateById(goods);
+        }
         refreshCacheService.refreshYhHomePageCache();
         refreshCacheService.refreshYhHomePageCache();
         return GatewayResponse.SUCCESS.newBuilder().toResult();
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
     }

+ 35 - 22
netflix-web/src/main/java/com/cyksj/web/controller/manage/goods/CmsGoodsDonSkuController.java

@@ -10,9 +10,7 @@ import com.cyksj.common.util.Jsons;
 import com.cyksj.dto.Result;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.BusinessType;
 import com.cyksj.enums.BusinessType;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.enums.GatewayResponse;
-import com.cyksj.model.entity.GoodsDiscountPlusPurchaseRelation;
-import com.cyksj.model.entity.GoodsDon;
-import com.cyksj.model.entity.GoodsDonSku;
+import com.cyksj.model.entity.*;
 import com.cyksj.model.manage.request.ReqGoodsSkuInsert;
 import com.cyksj.model.manage.request.ReqGoodsSkuInsert;
 import com.cyksj.model.request.CombinationSkuReq;
 import com.cyksj.model.request.CombinationSkuReq;
 import com.cyksj.model.views.DistributeSearchView;
 import com.cyksj.model.views.DistributeSearchView;
@@ -20,6 +18,8 @@ import com.cyksj.service.mange.CmsGoodsDonService;
 import com.cyksj.service.mange.CmsGoodsDonSkuService;
 import com.cyksj.service.mange.CmsGoodsDonSkuService;
 import com.cyksj.service.mange.CmsGoodsDonSpecService;
 import com.cyksj.service.mange.CmsGoodsDonSpecService;
 import com.cyksj.service.mange.RefreshCacheService;
 import com.cyksj.service.mange.RefreshCacheService;
+import com.cyksj.service.translations.BackInfoTranslationsFrontService;
+import com.cyksj.service.translations.BackInfoTranslationsService;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.BeanSearcher;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.SearchResult;
 import com.ejlchina.searcher.param.Operator;
 import com.ejlchina.searcher.param.Operator;
@@ -59,6 +59,10 @@ public class CmsGoodsDonSkuController {
 
 
     private final RefreshCacheService refreshCacheService;
     private final RefreshCacheService refreshCacheService;
 
 
+    private final BackInfoTranslationsService backInfoTranslationsService;
+
+    private final BackInfoTranslationsFrontService backInfoTranslationsFrontService;
+
 
 
     /**
     /**
      * 新增 商品spec & sku
      * 新增 商品spec & sku
@@ -156,26 +160,31 @@ public class CmsGoodsDonSkuController {
                 sku.setUserOwns(userOwnsList.toString());
                 sku.setUserOwns(userOwnsList.toString());
             }
             }
         }
         }
-        //优惠加购
-        goodsDonSkuService.handleDiscountPurchaseGoods(sku, sku.getDpSku());
-
-        String benefitsList = sku.getBenefitsList();
-        if (StrUtil.isNotBlank(benefitsList)) {
-            Set<GoodsDonSku> benefitsSkuIds = Jsons.parseSet(benefitsList, GoodsDonSku.class);
-            sku.setBenefitsList(Jsons.toJson(benefitsSkuIds));
+        //多语言
+        String lang = request.getHeader("lang");
+        if (!StrUtil.equals(UserPageLanguage.Language.zh_CN.name(), lang)) {
+            backInfoTranslationsService.saveOrUpdateBackInfoTranslations(BackInfoTranslations.Type.sku, sku.getId(), sku, lang);
+        } else {
+            //优惠加购
+            goodsDonSkuService.handleDiscountPurchaseGoods(sku, sku.getDpSku());
+            String benefitsList = sku.getBenefitsList();
+            if (StrUtil.isNotBlank(benefitsList)) {
+                Set<GoodsDonSku> benefitsSkuIds = Jsons.parseSet(benefitsList, GoodsDonSku.class);
+                sku.setBenefitsList(Jsons.toJson(benefitsSkuIds));
+            }
+            goodsDonSkuService.updateMirrorCarUserNum(sku);
+            goodsDonSkuService.saveOrUpdate(sku);
+            //给平台更新额外属性
+            goodsDonService.updateGoodsSkuPrice(sku.getGoodsId(), null);
+            //前后两次价格不同 下架店铺低于这个折扣最低价格
+            BigDecimal oldPrice = dbSku.getPrice();
+            BigDecimal newPrice = sku.getPrice();
+            //规格新价 变高
+            //下架店铺低于这个规格价格的品
+            goodsDonSkuService.setBelowPriceShopSkuDown(skuId, newPrice);
+            //套餐包关联规格
+            goodsDonSkuService.handleGptPackageSku(dbSku,sku);
         }
         }
-        goodsDonSkuService.updateMirrorCarUserNum(sku);
-        goodsDonSkuService.saveOrUpdate(sku);
-        //给平台更新额外属性
-        goodsDonService.updateGoodsSkuPrice(sku.getGoodsId(), null);
-        //前后两次价格不同 下架店铺低于这个折扣最低价格
-        BigDecimal oldPrice = dbSku.getPrice();
-        BigDecimal newPrice = sku.getPrice();
-        //规格新价 变高
-        //下架店铺低于这个规格价格的品
-        goodsDonSkuService.setBelowPriceShopSkuDown(skuId, newPrice);
-        //套餐包关联规格
-        goodsDonSkuService.handleGptPackageSku(dbSku,sku);
         refreshCacheService.refreshYhHomePageCache();
         refreshCacheService.refreshYhHomePageCache();
         return GatewayResponse.SUCCESS.newBuilder().toResult();
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
     }
@@ -234,6 +243,10 @@ public class CmsGoodsDonSkuController {
                 }
                 }
             }
             }
         });
         });
+        String lang = request.getHeader("lang");
+        if (!StrUtil.equals(lang, UserPageLanguage.Language.zh_CN.name())) {
+            backInfoTranslationsFrontService.setSkuBackLanguage(skuViewList.getDataList(), lang);
+        }
         return GatewayResponse.SUCCESS.newBuilder().toResult(skuViewList);
         return GatewayResponse.SUCCESS.newBuilder().toResult(skuViewList);
     }
     }