Browse Source

make relevant products(tour) for destination
refactor code to make skugroup use the first image url as cover

fengchang 1 year ago
parent
commit
a2780590f2
14 changed files with 373 additions and 458 deletions
  1. 10 97
      hichina-admin-backend/src/main/java/com/hichina/admin/hichinaadminbackend/controller/ProductSkuController.java
  2. 29 2
      hichina-admin-backend/src/main/java/com/hichina/admin/hichinaadminbackend/mapper/ProductSkuGroupMapper.java
  3. 4 0
      hichina-admin-backend/src/main/java/com/hichina/admin/hichinaadminbackend/model/ProductSkuGroup.java
  4. 143 0
      hichina-admin-backend/src/main/java/com/hichina/admin/hichinaadminbackend/service/ProductSkuService.java
  5. 8 0
      hichina-admin-backend/src/main/resources/db/changelog/liquibase-changeLog.xml
  6. 8 0
      hichina-admin-backend/src/main/resources/db/changelog/liquibase-changeLogProd.xml
  7. 49 101
      hichina-admin-front/src/components/ProductEditorDialog.vue
  8. 13 11
      hichina-admin-front/src/pages/ProductSkuPage.vue
  9. 19 4
      hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/controller/PublicDestinationController.java
  10. 22 235
      hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/mapper/HichinaProductMapper.java
  11. 22 0
      hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/mapper/ProductSkuGroupDestinationMappingMapper.java
  12. 1 2
      hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/model/DTO/HichinaProductListDTO.java
  13. 11 0
      hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/model/ProductSkuGroupDestinationMapping.java
  14. 34 6
      hichina-main-front/src/views/destination/detail.vue

+ 10 - 97
hichina-admin-backend/src/main/java/com/hichina/admin/hichinaadminbackend/controller/ProductSkuController.java

@@ -4,9 +4,9 @@ import com.github.pagehelper.PageHelper;
 import com.hichina.admin.hichinaadminbackend.mapper.*;
 import com.hichina.admin.hichinaadminbackend.model.*;
 import com.hichina.admin.hichinaadminbackend.model.DTO.*;
+import com.hichina.admin.hichinaadminbackend.service.ProductSkuService;
 import com.hichina.admin.hichinaadminbackend.util.UserUtil;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
@@ -34,6 +34,8 @@ public class ProductSkuController {
     @Autowired
     private ProductSkuVarcharAttributeMappingMapper productSkuVarcharAttributeMappingMapper;
 
+    @Autowired
+    private ProductSkuService productSkuService;
     @Autowired
     private ProductSkuIntAttributeMappingMapper productSkuIntAttributeMappingMapper;
 
@@ -180,24 +182,6 @@ public class ProductSkuController {
         return ret;
     }
 
-    /**
-     * whether exist or not, return the group id, if not exist, insert first
-     * @param productName
-     * @param productTypeId
-     * @return
-     */
-    private String checkProductGroupExistence(String productName, String productTypeId){
-        List<ProductSkuGroup> productSkuGroups = productSkuGroupMapper.findByNameAndProductTypeId(productName, productTypeId);
-        String productSkuGroupId;
-        if(productSkuGroups.isEmpty()){
-            productSkuGroupId = java.util.UUID.randomUUID().toString();
-            productSkuGroupMapper.insert(new ProductSkuGroup(productSkuGroupId, productName, productTypeId , new Date(), true));
-        }else{
-            productSkuGroupId = productSkuGroups.get(0).getSkuGroupId();
-        }
-        return productSkuGroupId;
-    }
-
     private String insertProductSkuInTransaction(ProductSkuCreateDTO request){
         HichinaProduct product = new HichinaProduct();
         product.setProductName(request.getProductName());
@@ -207,7 +191,7 @@ public class ProductSkuController {
         product.setCreatedTime(new Date());
         product.setCreatedBy(userUtil.currentUserName());
         // check if sku group of name request.getProductName() and request.getProductTypeId() exist, if not, insert new sku group, and set corresponding sku_group_id in product
-        String productSkuGroupId = checkProductGroupExistence(request.getProductName(), request.getProductTypeId());
+        String productSkuGroupId = productSkuService.checkProductGroupExistence(request.getProductName(), request.getProductTypeId());
         product.setSkuGroupId(productSkuGroupId);
         // insert common attribute
         hichinaProductMapper.insert(product);
@@ -250,6 +234,7 @@ public class ProductSkuController {
                 throw new RuntimeException("Not supported data type!");
             }
         }
+        productSkuGroupMapper.updateMinPriceAndImage(productSkuGroupId);
         return product.getSkuId();
     }
     @PostMapping
@@ -267,97 +252,25 @@ public class ProductSkuController {
     }
 
     @PutMapping("/withpropertybags/{skuId}")
-    @Transactional
     public HichinaResponse updateProductWithAllProperties(@PathVariable("skuId") String skuId ,@RequestBody ProductSkuUpdateDTO request){
         HichinaResponse ret = new HichinaResponse();
-
-        List<HichinaProduct> hichinaProducts = hichinaProductMapper.findRawBySkuId(skuId);
-        if(hichinaProducts.isEmpty()){
-            throw new RuntimeException("Nothing to update");
-        }
-        HichinaProduct toUpdate = hichinaProducts.get(0);
-        if(!request.getProductName().equals(toUpdate.getProductName())){
-            // indicating name change, so must update sku group id
-            String skuGroupId = checkProductGroupExistence(request.getProductName(), toUpdate.getProductTypeId());
-            toUpdate.setSkuGroupId(skuGroupId);
-        }
-        toUpdate.setProductName(request.getProductName());
-        toUpdate.setProductContent(request.getProductContent());
-        // update basic info
-        hichinaProductMapper.updateBySkuId(toUpdate);
-
-        productSkuGroupMapper.deleteUnreferenced();
-
-        // update property bags
-        List<ProductPropertyBag> propertyBags = request.getPropertyBags();
-
-        updatePropertyBagsBySkuId(skuId, propertyBags);
-
+        HichinaProduct toUpdate = productSkuService.updateProducts(skuId, request);
+        productSkuService.postProcessSkuGroup(toUpdate);
         ret.setOk(true);
         ret.setData(skuId);
         ret.setMessage("成功更新skuId:"+skuId+"的产品");
-
         return ret;
     }
 
     @DeleteMapping("/batch")
-    @Transactional
     public HichinaResponse deleteProductSkus(@RequestBody ProductSkuBatchDeleteRequest req){
-
-        // delete all related custom properties
-        productSkuTimestampAttributeMappingMapper.batchDelete(req.getToDelete());
-        productSkuIntAttributeMappingMapper.batchDelete(req.getToDelete());
-        productSkuVarcharAttributeMappingMapper.batchDelete(req.getToDelete());
-        // delete base product record
-        hichinaProductMapper.batchDelete(req.getToDelete());
-        // remove unreferenced group
-        productSkuGroupMapper.deleteUnreferenced();
-
+        List<String> affectedSkuGroupIds = productSkuGroupMapper.findSkuGroupIdsBySkuIds(req.getToDelete());
+        productSkuService.deleteProductSkus(req.getToDelete());
+        productSkuService.postProcessSkuGroupV2(affectedSkuGroupIds);
         HichinaResponse ret = new HichinaResponse();
         ret.setOk(true);
         ret.setData(req.getToDelete());
         ret.setMessage("成功批量删除product sku");
-
         return ret;
     }
-
-    private void updatePropertyBagsBySkuId(String skuId, List<ProductPropertyBag> propertyBags){
-        // first filter out those propertybag with no value
-        List<ProductPropertyBag> nonEmptyPropertyBag  = propertyBags.stream().filter(r -> !Strings.isEmpty(r.getAttributeValue())).collect(Collectors.toList());
-
-        for(ProductPropertyBag item: nonEmptyPropertyBag){
-            if("integer".equals(item.getDataType())){
-                ProductSkuIntAttributeMapping upsertObj = new ProductSkuIntAttributeMapping();
-                upsertObj.setAttributeId(item.getAttributeId());
-                upsertObj.setSkuId(skuId);
-                upsertObj.setDataType(item.getDataType());
-                upsertObj.setAttributeValue(Integer.parseInt(item.getAttributeValue()));
-                productSkuIntAttributeMappingMapper.upsertBySkuIdAndAttributeId(upsertObj);
-            }else if("string".equals(item.getDataType()) || "image".equals(item.getDataType()) || "datestring".equals(item.getDataType())){
-                ProductSkuVarcharAttributeMapping upsertObj = new ProductSkuVarcharAttributeMapping();
-                upsertObj.setAttributeId(item.getAttributeId());
-                upsertObj.setSkuId(skuId);
-                upsertObj.setDataType(item.getDataType());
-                upsertObj.setAttributeValue(item.getAttributeValue());
-                productSkuVarcharAttributeMappingMapper.upsertBySkuIdAndAttributeId(upsertObj);
-            }else if("date".equals(item.getDataType())){
-                ProductSkuTimestampAttributeMapping upsertObj = new ProductSkuTimestampAttributeMapping();
-                upsertObj.setAttributeId(item.getAttributeId());
-                upsertObj.setSkuId(skuId);
-                upsertObj.setDataType(item.getDataType());
-
-                SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd", Locale.ENGLISH);
-                Date date = null;
-                try {
-                    date = formatter.parse(item.getAttributeValue());
-                    upsertObj.setAttributeValue(date);
-                    productSkuTimestampAttributeMappingMapper.upsertBySkuIdAndAttributeId(upsertObj);
-                }catch (ParseException e) {
-                    throw new RuntimeException("Invalid date format");
-                }
-            }else{
-                // do nothing
-            }
-        }
-    }
 }

+ 29 - 2
hichina-admin-backend/src/main/java/com/hichina/admin/hichinaadminbackend/mapper/ProductSkuGroupMapper.java

@@ -12,10 +12,37 @@ import java.util.List;
 @Mapper
 @Component(value = "productSkuGroupMapper")
 public interface ProductSkuGroupMapper {
-    @Insert("INSERT INTO product_sku_group(sku_group_id, sku_group_name, product_type_id, created_date) VALUES(#{skuGroupId},#{skuGroupName}, #{productTypeId}, #{createdDate})")
+    @Insert("INSERT INTO product_sku_group(sku_group_id, sku_group_name, product_type_id, created_date, enabled, image_url, min_price) VALUES(#{skuGroupId},#{skuGroupName}, #{productTypeId}, #{createdDate}, #{enabled}, #{imageUrl}, #{minPrice})")
     void insert(ProductSkuGroup productSkuGroup);
 
-    @Update("update product_sku_group SET sku_group_name=#{skuGroupName}, product_type_id=#{productTypeId}, created_date=#{createdDate}, enabled=#{enabled} where sku_group_id=#{skuGroupId}")
+    @Update("update product_sku_group set min_price = (\n" +
+            "select min(psiam.attribute_value) as min_price from hichina_product hp \n" +
+            "inner join product_sku_int_attribute_mapping psiam on psiam.sku_id = hp.sku_id \n" +
+            "where \n" +
+            "hp.sku_group_id = #{skuGroupId} \n" +
+            "and psiam.attribute_id in ('e16df480-b17d-4442-91c2-d6c30d0d7ab0', 'e228b843-e054-41f8-91dd-19663460df54')\n" +
+            "), \n" +
+            "image_url = (\n" +
+            "select psiam.attribute_value as image_url from hichina_product hp \n" +
+            "inner join product_sku_varchar_attribute_mapping psiam on psiam.sku_id = hp.sku_id \n" +
+            "where \n" +
+            "hp.sku_group_id = #{skuGroupId} \n" +
+            "and psiam.attribute_id='2dea54f4-9b9c-413a-8b3a-0caf273283d2'\n" +
+            "order by hp.created_time\n" +
+            "limit 1\n" +
+            ")\n" +
+            "where sku_group_id = #{skuGroupId}")
+    void updateMinPriceAndImage(String skuGroupId);
+
+    @Select("<script>" +
+            "select sku_group_id FROM hichina_product WHERE sku_id in \n" +
+            "    <foreach item='item' collection='skuIds' open='(' separator=',' close=')'>\n" +
+            "    #{item}" +
+            "    </foreach>" +
+            "</script>")
+    List<String> findSkuGroupIdsBySkuIds(List<String> skuIds);
+
+    @Update("update product_sku_group SET sku_group_name=#{skuGroupName}, product_type_id=#{productTypeId}, created_date=#{createdDate}, enabled=#{enabled}, image_url=#{imageUrl}, min_price=#{minPrice} where sku_group_id=#{skuGroupId}")
     void update(ProductSkuGroup group);
 
     @Select("select * from product_sku_group where sku_group_name=#{name} and product_type_id=#{productTypeId}")

+ 4 - 0
hichina-admin-backend/src/main/java/com/hichina/admin/hichinaadminbackend/model/ProductSkuGroup.java

@@ -19,4 +19,8 @@ public class ProductSkuGroup {
     private Date createdDate;
 
     private Boolean enabled;
+
+    private String imageUrl;
+
+    private Integer minPrice;
 }

+ 143 - 0
hichina-admin-backend/src/main/java/com/hichina/admin/hichinaadminbackend/service/ProductSkuService.java

@@ -0,0 +1,143 @@
+package com.hichina.admin.hichinaadminbackend.service;
+
+import com.hichina.admin.hichinaadminbackend.mapper.*;
+import com.hichina.admin.hichinaadminbackend.model.*;
+import com.hichina.admin.hichinaadminbackend.model.DTO.ProductPropertyBag;
+import com.hichina.admin.hichinaadminbackend.model.DTO.ProductSkuUpdateDTO;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.stream.Collectors;
+
+@Service
+public class ProductSkuService {
+
+    @Autowired
+    private ProductSkuIntAttributeMappingMapper productSkuIntAttributeMappingMapper;
+
+    @Autowired
+    private ProductSkuVarcharAttributeMappingMapper productSkuVarcharAttributeMappingMapper;
+
+    @Autowired
+    private HichinaProductMapper hichinaProductMapper;
+
+    @Autowired
+    private ProductSkuTimestampAttributeMappingMapper productSkuTimestampAttributeMappingMapper;
+
+    @Autowired
+    ProductSkuGroupMapper productSkuGroupMapper;
+
+    @Transactional
+    public void postProcessSkuGroup(HichinaProduct toUpdate){
+        productSkuGroupMapper.updateMinPriceAndImage(toUpdate.getSkuGroupId());
+        productSkuGroupMapper.deleteUnreferenced();
+    }
+
+    @Transactional
+    public void postProcessSkuGroupV2(List<String> skuGroupIds){
+        for(String affectedSkuGroupId: skuGroupIds){
+            productSkuGroupMapper.updateMinPriceAndImage(affectedSkuGroupId);
+        }
+        productSkuGroupMapper.deleteUnreferenced();
+    }
+
+    @Transactional
+    public void deleteProductSkus(List<String> skuIds){
+        // delete all related custom properties
+        productSkuTimestampAttributeMappingMapper.batchDelete(skuIds);
+        productSkuIntAttributeMappingMapper.batchDelete(skuIds);
+        productSkuVarcharAttributeMappingMapper.batchDelete(skuIds);
+        // delete base product record
+        hichinaProductMapper.batchDelete(skuIds);
+    }
+
+    @Transactional
+    public HichinaProduct updateProducts(String skuId , ProductSkuUpdateDTO request){
+        List<HichinaProduct> hichinaProducts = hichinaProductMapper.findRawBySkuId(skuId);
+        if(hichinaProducts.isEmpty()){
+            throw new RuntimeException("Nothing to update");
+        }
+        HichinaProduct toUpdate = hichinaProducts.get(0);
+        if(!request.getProductName().equals(toUpdate.getProductName())){
+            // indicating name change, so must update sku group id
+            String skuGroupId = checkProductGroupExistence(request.getProductName(), toUpdate.getProductTypeId());
+            toUpdate.setSkuGroupId(skuGroupId);
+            productSkuGroupMapper.updateMinPriceAndImage(skuGroupId);
+        }
+        toUpdate.setProductName(request.getProductName());
+        toUpdate.setProductContent(request.getProductContent());
+        // update basic info
+        hichinaProductMapper.updateBySkuId(toUpdate);
+        // update property bags
+        List<ProductPropertyBag> propertyBags = request.getPropertyBags();
+        updatePropertyBagsBySkuId(skuId, propertyBags);
+
+        return toUpdate;
+    }
+
+    /**
+     * whether exist or not, return the group id, if not exist, insert first
+     * @param productName
+     * @param productTypeId
+     * @return
+     */
+    public String checkProductGroupExistence(String productName, String productTypeId){
+        List<ProductSkuGroup> productSkuGroups = productSkuGroupMapper.findByNameAndProductTypeId(productName, productTypeId);
+        String productSkuGroupId;
+        if(productSkuGroups.isEmpty()){
+            productSkuGroupId = java.util.UUID.randomUUID().toString();
+            productSkuGroupMapper.insert(new ProductSkuGroup(productSkuGroupId, productName, productTypeId , new Date(), true, "", 0));
+        }else{
+            ProductSkuGroup existingSkuGroup = productSkuGroups.get(0);
+            productSkuGroupId = existingSkuGroup.getSkuGroupId();
+        }
+        return productSkuGroupId;
+    }
+
+    private void updatePropertyBagsBySkuId(String skuId, List<ProductPropertyBag> propertyBags){
+        // first filter out those propertybag with no value
+        List<ProductPropertyBag> nonEmptyPropertyBag  = propertyBags.stream().filter(r -> !Strings.isEmpty(r.getAttributeValue())).collect(Collectors.toList());
+
+        for(ProductPropertyBag item: nonEmptyPropertyBag){
+            if("integer".equals(item.getDataType())){
+                ProductSkuIntAttributeMapping upsertObj = new ProductSkuIntAttributeMapping();
+                upsertObj.setAttributeId(item.getAttributeId());
+                upsertObj.setSkuId(skuId);
+                upsertObj.setDataType(item.getDataType());
+                upsertObj.setAttributeValue(Integer.parseInt(item.getAttributeValue()));
+                productSkuIntAttributeMappingMapper.upsertBySkuIdAndAttributeId(upsertObj);
+            }else if("string".equals(item.getDataType()) || "image".equals(item.getDataType()) || "datestring".equals(item.getDataType())){
+                ProductSkuVarcharAttributeMapping upsertObj = new ProductSkuVarcharAttributeMapping();
+                upsertObj.setAttributeId(item.getAttributeId());
+                upsertObj.setSkuId(skuId);
+                upsertObj.setDataType(item.getDataType());
+                upsertObj.setAttributeValue(item.getAttributeValue());
+                productSkuVarcharAttributeMappingMapper.upsertBySkuIdAndAttributeId(upsertObj);
+            }else if("date".equals(item.getDataType())){
+                ProductSkuTimestampAttributeMapping upsertObj = new ProductSkuTimestampAttributeMapping();
+                upsertObj.setAttributeId(item.getAttributeId());
+                upsertObj.setSkuId(skuId);
+                upsertObj.setDataType(item.getDataType());
+
+                SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd", Locale.ENGLISH);
+                Date date = null;
+                try {
+                    date = formatter.parse(item.getAttributeValue());
+                    upsertObj.setAttributeValue(date);
+                    productSkuTimestampAttributeMappingMapper.upsertBySkuIdAndAttributeId(upsertObj);
+                }catch (ParseException e) {
+                    throw new RuntimeException("Invalid date format");
+                }
+            }else{
+                // do nothing
+            }
+        }
+    }
+}

+ 8 - 0
hichina-admin-backend/src/main/resources/db/changelog/liquibase-changeLog.xml

@@ -489,4 +489,12 @@
     <changeSet author="xiefengchang (generated)" id="16d83x2dgds107g80495-27">
         <addUniqueConstraint columnNames="product_sku_group_id, destination_id" constraintName="uniquebindingofskugroupidanddestinationid" tableName="product_sku_group_destination_mapping"/>
     </changeSet>
+    <changeSet author="liquibase-docs" id="add-addminpriceandfirstimageurl-skugroup">
+        <addColumn tableName="product_sku_group">
+            <column name="image_url"
+                    type="varchar(500)"/>
+            <column name="min_price"
+                    type="INT"/>
+        </addColumn>
+    </changeSet>
 </databaseChangeLog>

+ 8 - 0
hichina-admin-backend/src/main/resources/db/changelog/liquibase-changeLogProd.xml

@@ -489,4 +489,12 @@
     <changeSet author="xiefengchang (generated)" id="16d83x2dgds107g80495-27">
         <addUniqueConstraint columnNames="product_sku_group_id, destination_id" constraintName="uniquebindingofskugroupidanddestinationid" tableName="product_sku_group_destination_mapping"/>
     </changeSet>
+    <changeSet author="liquibase-docs" id="add-addminpriceandfirstimageurl-skugroup">
+        <addColumn tableName="product_sku_group">
+            <column name="image_url"
+                    type="varchar(500)"/>
+            <column name="min_price"
+                    type="INT"/>
+        </addColumn>
+    </changeSet>
 </databaseChangeLog>

+ 49 - 101
hichina-admin-front/src/components/ProductEditorDialog.vue

@@ -136,98 +136,6 @@
                 toolbar="full"
                 :modules="combineModule"
               />
-              <!-- <q-editor
-                v-model="editSkuDialogDescription"
-                ref="editDialogEditor"
-                :definitions="definitions"
-                @paste="pasteCapture"
-                @drop="(evt) => dropCapture(evt)"
-                :toolbar="[
-                  ['insert_img', 'insert_video'],
-                  [
-                    {
-                      label: $q.lang.editor.align,
-                      icon: $q.iconSet.editor.align,
-                      fixedLabel: true,
-                      options: ['left', 'center', 'right', 'justify'],
-                    },
-                  ],
-                  [
-                    'bold',
-                    'italic',
-                    'strike',
-                    'underline',
-                    'subscript',
-                    'superscript',
-                  ],
-                  ['token', 'hr', 'link', 'custom_btn'],
-                  [
-                    {
-                      label: $q.lang.editor.formatting,
-                      icon: $q.iconSet.editor.formatting,
-                      list: 'no-icons',
-                      options: [
-                        'p',
-                        'h1',
-                        'h2',
-                        'h3',
-                        'h4',
-                        'h5',
-                        'h6',
-                        'code',
-                      ],
-                    },
-                    {
-                      label: $q.lang.editor.fontSize,
-                      icon: $q.iconSet.editor.fontSize,
-                      fixedLabel: true,
-                      fixedIcon: true,
-                      list: 'no-icons',
-                      options: [
-                        'size-1',
-                        'size-2',
-                        'size-3',
-                        'size-4',
-                        'size-5',
-                        'size-6',
-                        'size-7',
-                      ],
-                    },
-                    {
-                      label: $q.lang.editor.defaultFont,
-                      icon: $q.iconSet.editor.font,
-                      fixedIcon: true,
-                      list: 'no-icons',
-                      options: [
-                        'default_font',
-                        'arial',
-                        'arial_black',
-                        'comic_sans',
-                        'courier_new',
-                        'impact',
-                        'lucida_grande',
-                        'times_new_roman',
-                        'verdana',
-                      ],
-                    },
-                    'removeFormat',
-                  ],
-                  ['quote', 'unordered', 'ordered', 'outdent', 'indent'],
-
-                  ['undo', 'redo'],
-                  ['viewsource'],
-                ]"
-                :fonts="{
-                  arial: 'Arial',
-                  arial_black: 'Arial Black',
-                  comic_sans: 'Comic Sans MS',
-                  courier_new: 'Courier New',
-                  impact: 'Impact',
-                  lucida_grande: 'Lucida Grande',
-                  times_new_roman: 'Times New Roman',
-                  verdana: 'Verdana',
-                }"
-              /> -->
             </div>
           </div>
         </q-card-section>
@@ -275,11 +183,12 @@
               <hichina-date-picker
                 multi-dates
                 inline
+                :clearable="true"
                 multi-calendars
                 :min-date="new Date()"
                 :month-change-on-scroll="false"
                 @update:model-value="handleDate(item.attributeId)"
-                :format="format"
+                :format="formatAndSaveTempDateString"
                 v-model="item.attributeValue"
               />
             </div>
@@ -364,10 +273,11 @@
                 inline
                 multi-dates
                 multi-calendars
+                :clearable="true"
                 :min-date="new Date()"
                 :month-change-on-scroll="false"
                 @update:model-value="handleDate(item.attributeId)"
-                :format="format"
+                :format="formatAndSaveTempDateString"
                 v-model="
                   new_sku_dialog_customPropertyBag[
                     '[datestring]' + item.attributeId
@@ -566,7 +476,7 @@ export default {
     this.loadAllProductTypes();
   },
   methods: {
-    format(dateArray) {
+    formatAndSaveTempDateString(dateArray) {
       this.tempDateString = this.dateArray2String(dateArray);
       return this.tempDateString;
     },
@@ -594,6 +504,12 @@ export default {
       return null;
     },
     handleDate(val1) {
+      console.log(
+        "setting dataLabel with key: " +
+          val1 +
+          " with value " +
+          this.tempDateString
+      );
       this.dateLabel[val1] = this.tempDateString;
 
       // console.log(this.rawPropertyBags);
@@ -671,14 +587,45 @@ export default {
       }
       return rawPropertyBag;
     },
-    formatDateStringInCreate(propertyBag) {
-      for (var prop in propertyBag) {
+    deepClone(object) {
+      if (object === null || typeof object !== "object") {
+        return object;
+      }
+
+      console.log("object type");
+      console.log(typeof object);
+
+      if (object instanceof Date) {
+        return new Date(object);
+      }
+
+      const clonedObject = Array.isArray(object) ? [] : {};
+
+      for (let key in object) {
+        clonedObject[key] = this.deepClone(object[key]);
+      }
+
+      return clonedObject;
+    },
+    formatDateStringInCreateWithDeepClone(propertyBag) {
+      console.log("before deep clone property bag");
+      console.log(propertyBag);
+      var deepClonedPropertyBag = this.deepClone(propertyBag);
+
+      console.log("deep cloned: deepClonedPropertyBag");
+      console.log(deepClonedPropertyBag);
+
+      for (var prop in deepClonedPropertyBag) {
         if (prop.startsWith("[datestring]")) {
           // assume it's a date array input
-          var formatedString = this.format(propertyBag[prop]);
-          propertyBag[prop] = formatedString;
+          var formatedString = this.formatAndSaveTempDateString(
+            deepClonedPropertyBag[prop]
+          );
+          deepClonedPropertyBag[prop] = formatedString;
         }
       }
+
+      return deepClonedPropertyBag;
     },
     submitWithPropertyBag(isCopyCreate) {
       if (!isCopyCreate) {
@@ -705,8 +652,9 @@ export default {
       } else {
         params.productTypeId = this.editSkuDialogProductTypeId;
       }
-      this.formatDateStringInCreate(this.new_sku_dialog_customPropertyBag);
-      params.customPropertyBag = this.new_sku_dialog_customPropertyBag;
+      params.customPropertyBag = this.formatDateStringInCreateWithDeepClone(
+        this.new_sku_dialog_customPropertyBag
+      );
       api
         .post("/api/v1/productsku", params)
         .then((response) => {

+ 13 - 11
hichina-admin-front/src/pages/ProductSkuPage.vue

@@ -1,6 +1,6 @@
 <template>
   <q-page padding>
-    <my-upload
+    <!-- <my-upload
       field="imageFile"
       @crop-success="cropSuccess"
       @crop-upload-success="cropUploadSuccess"
@@ -14,7 +14,7 @@
       :withCredentials="true"
       img-format="jpg"
     >
-    </my-upload>
+    </my-upload> -->
     <q-dialog v-model="confirmDelete" persistent>
       <q-card>
         <q-card-section class="row items-center">
@@ -315,7 +315,7 @@
 
     <div class="row justify-center q-pa-md">
       <q-table
-        ref="tableRef"
+        ref="productSkuTableRef"
         style="max-width: 98%; min-width: 90%"
         title="产品细项(具体产品上架)"
         :rows="productskus"
@@ -394,17 +394,17 @@
 <script>
 import { api } from "boot/axios";
 import { useQuasar } from "quasar";
-import myUpload from "vue-image-crop-upload";
+// import myUpload from "vue-image-crop-upload";
 import ProductEditorDialog from "components/ProductEditorDialog.vue";
-import UploadImage from "v-upload-image";
+// import UploadImage from "v-upload-image";
 import { myMixin } from "boot/commonFunc";
 export default {
   name: "ProductSkuPages",
   mixins: [myMixin],
   components: {
     ProductEditorDialog,
-    "upload-image": UploadImage,
-    "my-upload": myUpload,
+    // "upload-image": UploadImage,
+    // "my-upload": myUpload,
   },
   setup() {
     const $q = useQuasar();
@@ -459,7 +459,9 @@ export default {
       }
     },
     refreshTable() {
-      this.$refs.tableRef.requestServerInteraction();
+      console.log("post create refresh...");
+      this.$refs.productSkuTableRef.requestServerInteraction();
+      console.log("ppppppp");
     },
     cropUploadFail(status, field) {
       console.log("-------- upload fail --------");
@@ -550,7 +552,7 @@ export default {
         .delete("/api/v1/productsku/batch", { data: params })
         .then((response) => {
           this.showNotifyMessageSucceed(response.data.message);
-          this.$refs.tableRef.requestServerInteraction();
+          this.$refs.productSkuTableRef.requestServerInteraction();
         })
         .catch((e) => {
           this.showNotifyMessageFail(e.toString());
@@ -564,7 +566,7 @@ export default {
       this.confirmDelete = true;
     },
     pageProductTypeChange() {
-      this.$refs.tableRef.requestServerInteraction();
+      this.$refs.productSkuTableRef.requestServerInteraction();
     },
     onRequest(props) {
       const { page, rowsPerPage } = props.pagination;
@@ -672,7 +674,7 @@ export default {
   },
   mounted() {
     this.getRestBase();
-    this.$refs.tableRef.requestServerInteraction();
+    this.$refs.productSkuTableRef.requestServerInteraction();
     this.loadAllProductTypes();
   },
   data() {

+ 19 - 4
hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/controller/PublicDestinationController.java

@@ -4,10 +4,8 @@ import com.aliyuncs.utils.StringUtils;
 import com.github.pagehelper.PageHelper;
 import com.hichina.main.back.hichinamainback.config.EnableHichinaAutoLog;
 import com.hichina.main.back.hichinamainback.mapper.DestinationMapper;
-import com.hichina.main.back.hichinamainback.model.DTO.DestinationProfileDTO;
-import com.hichina.main.back.hichinamainback.model.DTO.DestinationWithGuidebook;
-import com.hichina.main.back.hichinamainback.model.DTO.HichinaResponse;
-import com.hichina.main.back.hichinamainback.model.DTO.PaginationWrapper;
+import com.hichina.main.back.hichinamainback.mapper.ProductSkuGroupDestinationMappingMapper;
+import com.hichina.main.back.hichinamainback.model.DTO.*;
 import com.hichina.main.back.hichinamainback.model.Destination;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -22,6 +20,23 @@ public class PublicDestinationController {
     @Autowired
     private DestinationMapper destinationMapper;
 
+    @Autowired
+    private ProductSkuGroupDestinationMappingMapper productSkuGroupDestinationMappingMapper;
+
+    @GetMapping("/relavanttourproduct/{destinationId}")
+    @EnableHichinaAutoLog(description = "Get relavant tours by destinationId")
+    public HichinaResponse getRelavantToursByDestinationId(@PathVariable("destinationId") String destinationId){
+
+        HichinaResponse ret = new HichinaResponse();
+        List<HichinaProductListDTO> productListDTOS = productSkuGroupDestinationMappingMapper.findRelatedTourProductByDestinationId(destinationId);
+
+        ret.setOk(true);
+        ret.setData(productListDTOS);
+        ret.setMessage("Succeed getting relevant tours by destinationId");
+
+        return ret;
+    }
+
     @GetMapping("/{destinationId}")
     @EnableHichinaAutoLog(description = "Get destination with guidebook by id")
     public HichinaResponse getByDestinationWithGuidebookById(@PathVariable("destinationId") String destinationId){

+ 22 - 235
hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/mapper/HichinaProductMapper.java

@@ -15,256 +15,43 @@ public interface HichinaProductMapper {
     @Select("select sku_id, product_type_name, t.product_type_id, product_name, product_content, created_time from hichina_product p inner join hichina_product_type t on p.product_type_id=t.product_type_id  where p.sku_group_id=#{skuGroupId} ")
     List<HichinaProductBasicDTO> findBySkuGroupId(String skuGroupId);
 
-    @Select("select aa.sku_id, aa.sku_group_id , aa.sku_group_name, aa.product_type_id,aa.product_type_name, aa.price, aa.image_url from\n" +
-            "(\n" +
-            "select row_number() over (order by  pim.attribute_value desc) rn, g.created_date, g.sku_group_name ,p.product_type_id, hpt.product_type_name  , p.sku_id, g.sku_group_id, pim.attribute_value as price, psvam.attribute_value as image_url from product_sku_group g \n" +
-            "inner join hichina_product p on p.sku_group_id = g.sku_group_id \n" +
-            "inner join hichina_product_type hpt on hpt.product_type_id = p.product_type_id \n" +
-            "inner join product_sku_int_attribute_mapping pim on pim.sku_id = p.sku_id  \n" +
-            "inner join product_sku_varchar_attribute_mapping psvam on psvam.sku_id = p.sku_id \n" +
-            "where g.enabled = 1 \n" +
-            "and pim.attribute_id in ('e16df480-b17d-4442-91c2-d6c30d0d7ab0','e228b843-e054-41f8-91dd-19663460df54')\n" +
-            "and psvam.attribute_id = '2dea54f4-9b9c-413a-8b3a-0caf273283d2'\t\n" +
-            ") aa\n" +
-            "inner join\n" +
-            "(\n" +
-            "select max(rn) as rn, sku_group_id from\n" +
-            "(\n" +
-            "select row_number() over (order by  pim.attribute_value desc) as rn,  g.sku_group_id, pim.attribute_value as price from product_sku_group g \n" +
-            "inner join hichina_product p on p.sku_group_id = g.sku_group_id \n" +
-            "inner join hichina_product_type hpt on hpt.product_type_id = p.product_type_id \n" +
-            "inner join product_sku_int_attribute_mapping pim on pim.sku_id = p.sku_id  \n" +
-            "inner join product_sku_varchar_attribute_mapping psvam on psvam.sku_id = p.sku_id \n" +
-            "where g.enabled = 1 \n" +
-            "and pim.attribute_id in ('e16df480-b17d-4442-91c2-d6c30d0d7ab0','e228b843-e054-41f8-91dd-19663460df54')\n" +
-            "and psvam.attribute_id = '2dea54f4-9b9c-413a-8b3a-0caf273283d2'\t\n" +
-            ") cc\n" +
-            "group by sku_group_id\n" +
-            ") bb\n" +
-            "on aa.rn=bb.rn\n" +
-            "order by aa.created_date desc")
+    @Select("select sku_group_id, sku_group_name, g.product_type_id , t.product_type_name, g.min_price, g.image_url  \n" +
+            "from product_sku_group g inner join hichina_product_type t on t.product_type_id = g.product_type_id where g.enabled=1 order by g.created_date desc")
     List<HichinaProductListDTO> getAllProductList();
 
-    @Select("select aa.sku_id, aa.sku_group_id , aa.sku_group_name, aa.product_type_id,aa.product_type_name, aa.price, aa.image_url from\n" +
-            "(\n" +
-            "select row_number() over (order by  pim.attribute_value desc) rn, g.created_date, g.sku_group_name ,p.product_type_id, hpt.product_type_name  , p.sku_id, g.sku_group_id, pim.attribute_value as price, psvam.attribute_value as image_url from product_sku_group g \n" +
-            "inner join hichina_product p on p.sku_group_id = g.sku_group_id \n" +
-            "inner join hichina_product_type hpt on hpt.product_type_id = p.product_type_id \n" +
-            "inner join product_sku_int_attribute_mapping pim on pim.sku_id = p.sku_id  \n" +
-            "inner join product_sku_varchar_attribute_mapping psvam on psvam.sku_id = p.sku_id \n" +
-            "where g.enabled = 1 \n" +
-            "and pim.attribute_id in ('e16df480-b17d-4442-91c2-d6c30d0d7ab0','e228b843-e054-41f8-91dd-19663460df54')\n" +
-            "and psvam.attribute_id = '2dea54f4-9b9c-413a-8b3a-0caf273283d2' and hpt.product_type_id=#{productTypeId}\t\n" +
-            ") aa\n" +
-            "inner join\n" +
-            "(\n" +
-            "select max(rn) as rn, sku_group_id from\n" +
-            "(\n" +
-            "select row_number() over (order by  pim.attribute_value desc) as rn,  g.sku_group_id, pim.attribute_value as price from product_sku_group g \n" +
-            "inner join hichina_product p on p.sku_group_id = g.sku_group_id \n" +
-            "inner join hichina_product_type hpt on hpt.product_type_id = p.product_type_id \n" +
-            "inner join product_sku_int_attribute_mapping pim on pim.sku_id = p.sku_id  \n" +
-            "inner join product_sku_varchar_attribute_mapping psvam on psvam.sku_id = p.sku_id \n" +
-            "where g.enabled = 1 \n" +
-            "and pim.attribute_id in ('e16df480-b17d-4442-91c2-d6c30d0d7ab0','e228b843-e054-41f8-91dd-19663460df54')\n" +
-            "and psvam.attribute_id = '2dea54f4-9b9c-413a-8b3a-0caf273283d2' and hpt.product_type_id=#{productTypeId}\t\n" +
-            ") cc\n" +
-            "group by sku_group_id\n" +
-            ") bb\n" +
-            "on aa.rn=bb.rn\n" +
-            "order by aa.created_date desc")
+    @Select("select sku_group_id, sku_group_name, g.product_type_id , t.product_type_name, g.min_price, g.image_url  \n" +
+            "from product_sku_group g inner join hichina_product_type t on t.product_type_id = g.product_type_id\n" +
+            "where g.enabled=1 and g.product_type_id=#{productTypeId} order by g.created_date desc")
     List<HichinaProductListDTO> getAllProductListByProductTypeId(String productTypeId);
 
-    @Select("select aa.sku_id, aa.sku_group_id , aa.sku_group_name, aa.product_type_id,aa.product_type_name, aa.price, aa.image_url from\n" +
-            "(\n" +
-            "select row_number() over (order by  pim.attribute_value desc) rn, g.created_date, g.sku_group_name ,p.product_type_id, hpt.product_type_name  , p.sku_id, g.sku_group_id, pim.attribute_value as price, psvam.attribute_value as image_url from product_sku_group g \n" +
-            "inner join hichina_product p on p.sku_group_id = g.sku_group_id \n" +
-            "inner join hichina_product_type hpt on hpt.product_type_id = p.product_type_id \n" +
-            "inner join product_sku_int_attribute_mapping pim on pim.sku_id = p.sku_id  \n" +
-            "inner join product_sku_varchar_attribute_mapping psvam on psvam.sku_id = p.sku_id \n" +
-            "where g.enabled = 1 \n" +
-            "and pim.attribute_id in ('e16df480-b17d-4442-91c2-d6c30d0d7ab0','e228b843-e054-41f8-91dd-19663460df54')\n" +
-            "and psvam.attribute_id = '2dea54f4-9b9c-413a-8b3a-0caf273283d2' and g.sku_group_name like CONCAT('%',CONCAT(#{query},'%')) and hpt.product_type_id=#{productTypeId}\t\n" +
-            ") aa\n" +
-            "inner join\n" +
-            "(\n" +
-            "select max(rn) as rn, sku_group_id from\n" +
-            "(\n" +
-            "select row_number() over (order by  pim.attribute_value desc) as rn,  g.sku_group_id, pim.attribute_value as price from product_sku_group g \n" +
-            "inner join hichina_product p on p.sku_group_id = g.sku_group_id \n" +
-            "inner join hichina_product_type hpt on hpt.product_type_id = p.product_type_id \n" +
-            "inner join product_sku_int_attribute_mapping pim on pim.sku_id = p.sku_id  \n" +
-            "inner join product_sku_varchar_attribute_mapping psvam on psvam.sku_id = p.sku_id \n" +
-            "where g.enabled = 1 \n" +
-            "and pim.attribute_id in ('e16df480-b17d-4442-91c2-d6c30d0d7ab0','e228b843-e054-41f8-91dd-19663460df54')\n" +
-            "and psvam.attribute_id = '2dea54f4-9b9c-413a-8b3a-0caf273283d2'\t\n" +
-            ") cc\n" +
-            "group by sku_group_id\n" +
-            ") bb\n" +
-            "on aa.rn=bb.rn\n" +
-            "order by aa.created_date desc")
+    @Select("select sku_group_id, sku_group_name, g.product_type_id , t.product_type_name, g.min_price, g.image_url  \n" +
+            "from product_sku_group g inner join hichina_product_type t on t.product_type_id = g.product_type_id\n" +
+            "where g.enabled=1 and g.product_type_id=#{productTypeId} and sku_group_name like CONCAT('%',CONCAT(#{query},'%')) order by g.created_date desc")
     List<HichinaProductListDTO> getAllProductListByQueryAndProductTypeId(String query, String productTypeId);
 
-    @Select("select count(*) from\n" +
-            "(\n" +
-            "select aa.sku_id, aa.sku_group_id , aa.sku_group_name, aa.product_type_id,aa.product_type_name, aa.price, aa.image_url from\n" +
-            "(\n" +
-            "select row_number() over (order by  pim.attribute_value desc) rn, g.created_date, g.sku_group_name ,p.product_type_id, hpt.product_type_name  , p.sku_id, g.sku_group_id, pim.attribute_value as price, psvam.attribute_value as image_url from product_sku_group g \n" +
-            "inner join hichina_product p on p.sku_group_id = g.sku_group_id \n" +
-            "inner join hichina_product_type hpt on hpt.product_type_id = p.product_type_id \n" +
-            "inner join product_sku_int_attribute_mapping pim on pim.sku_id = p.sku_id  \n" +
-            "inner join product_sku_varchar_attribute_mapping psvam on psvam.sku_id = p.sku_id \n" +
-            "where g.enabled = 1 \n" +
-            "and pim.attribute_id in ('e16df480-b17d-4442-91c2-d6c30d0d7ab0','e228b843-e054-41f8-91dd-19663460df54')\n" +
-            "and psvam.attribute_id = '2dea54f4-9b9c-413a-8b3a-0caf273283d2' and g.sku_group_name like CONCAT('%',CONCAT(#{query},'%')) and  hpt.product_type_id=#{productTypeId}\t\n" +
-            ") aa\n" +
-            "inner join\n" +
-            "(\n" +
-            "select max(rn) as rn, sku_group_id from\n" +
-            "(\n" +
-            "select row_number() over (order by  pim.attribute_value desc) as rn,  g.sku_group_id, pim.attribute_value as price from product_sku_group g \n" +
-            "inner join hichina_product p on p.sku_group_id = g.sku_group_id \n" +
-            "inner join hichina_product_type hpt on hpt.product_type_id = p.product_type_id \n" +
-            "inner join product_sku_int_attribute_mapping pim on pim.sku_id = p.sku_id  \n" +
-            "inner join product_sku_varchar_attribute_mapping psvam on psvam.sku_id = p.sku_id \n" +
-            "where g.enabled = 1 \n" +
-            "and pim.attribute_id in ('e16df480-b17d-4442-91c2-d6c30d0d7ab0','e228b843-e054-41f8-91dd-19663460df54')\n" +
-            "and psvam.attribute_id = '2dea54f4-9b9c-413a-8b3a-0caf273283d2'\t\n" +
-            ") cc\n" +
-            "group by sku_group_id\n" +
-            ") bb\n" +
-            "on aa.rn=bb.rn\n" +
-            ") ccd\n" +
-            "\n")
+    @Select("select count(*) from (select sku_group_id, sku_group_name, g.product_type_id , t.product_type_name, g.min_price, g.image_url  \n" +
+            "from product_sku_group g inner join hichina_product_type t on t.product_type_id = g.product_type_id\n" +
+            "where g.enabled=1 and g.product_type_id=#{productTypeId} and sku_group_name like CONCAT('%',CONCAT(#{query},'%')))")
     Integer countAllProductListByQueryAndProductTypeId(String query, String productTypeId);
 
-    @Select("select count(*) from\n" +
-            "(\n" +
-            "select aa.sku_id, aa.sku_group_id , aa.sku_group_name, aa.product_type_id,aa.product_type_name, aa.price, aa.image_url from\n" +
-            "(\n" +
-            "select row_number() over (order by  pim.attribute_value desc) rn, g.created_date, g.sku_group_name ,p.product_type_id, hpt.product_type_name  , p.sku_id, g.sku_group_id, pim.attribute_value as price, psvam.attribute_value as image_url from product_sku_group g \n" +
-            "inner join hichina_product p on p.sku_group_id = g.sku_group_id \n" +
-            "inner join hichina_product_type hpt on hpt.product_type_id = p.product_type_id \n" +
-            "inner join product_sku_int_attribute_mapping pim on pim.sku_id = p.sku_id  \n" +
-            "inner join product_sku_varchar_attribute_mapping psvam on psvam.sku_id = p.sku_id \n" +
-            "where g.enabled = 1 \n" +
-            "and pim.attribute_id in ('e16df480-b17d-4442-91c2-d6c30d0d7ab0','e228b843-e054-41f8-91dd-19663460df54')\n" +
-            "and psvam.attribute_id = '2dea54f4-9b9c-413a-8b3a-0caf273283d2' and hpt.product_type_id=#{productTypeId}\t\n" +
-            ") aa\n" +
-            "inner join\n" +
-            "(\n" +
-            "select max(rn) as rn, sku_group_id from\n" +
-            "(\n" +
-            "select row_number() over (order by  pim.attribute_value desc) as rn,  g.sku_group_id, pim.attribute_value as price from product_sku_group g \n" +
-            "inner join hichina_product p on p.sku_group_id = g.sku_group_id \n" +
-            "inner join hichina_product_type hpt on hpt.product_type_id = p.product_type_id \n" +
-            "inner join product_sku_int_attribute_mapping pim on pim.sku_id = p.sku_id  \n" +
-            "inner join product_sku_varchar_attribute_mapping psvam on psvam.sku_id = p.sku_id \n" +
-            "where g.enabled = 1 \n" +
-            "and pim.attribute_id in ('e16df480-b17d-4442-91c2-d6c30d0d7ab0','e228b843-e054-41f8-91dd-19663460df54')\n" +
-            "and psvam.attribute_id = '2dea54f4-9b9c-413a-8b3a-0caf273283d2'\t\n" +
-            ") cc\n" +
-            "group by sku_group_id\n" +
-            ") bb\n" +
-            "on aa.rn=bb.rn\n" +
-            ") ccd\n" +
-            "\n")
+    @Select("select count(*) from (select sku_group_id, sku_group_name, g.product_type_id , t.product_type_name, g.min_price, g.image_url  \n" +
+            "from product_sku_group g inner join hichina_product_type t on t.product_type_id = g.product_type_id\n" +
+            "where g.enabled=1 and g.product_type_id=#{productTypeId}) aa")
     Integer countAllProductListByProductTypeId(String productTypeId);
 
-    @Select("select aa.sku_id, aa.sku_group_id , aa.sku_group_name, aa.product_type_id,aa.product_type_name, aa.price, aa.image_url from\n" +
-            "(\n" +
-            "select row_number() over (order by  pim.attribute_value desc) rn, g.created_date, g.sku_group_name ,p.product_type_id, hpt.product_type_name  , p.sku_id, g.sku_group_id, pim.attribute_value as price, psvam.attribute_value as image_url from product_sku_group g \n" +
-            "inner join hichina_product p on p.sku_group_id = g.sku_group_id \n" +
-            "inner join hichina_product_type hpt on hpt.product_type_id = p.product_type_id \n" +
-            "inner join product_sku_int_attribute_mapping pim on pim.sku_id = p.sku_id  \n" +
-            "inner join product_sku_varchar_attribute_mapping psvam on psvam.sku_id = p.sku_id \n" +
-            "where g.enabled = 1 \n" +
-            "and pim.attribute_id in ('e16df480-b17d-4442-91c2-d6c30d0d7ab0','e228b843-e054-41f8-91dd-19663460df54')\n" +
-            "and psvam.attribute_id = '2dea54f4-9b9c-413a-8b3a-0caf273283d2' and g.sku_group_name like CONCAT('%',CONCAT(#{query},'%'))\t\n" +
-            ") aa\n" +
-            "inner join\n" +
-            "(\n" +
-            "select max(rn) as rn, sku_group_id from\n" +
-            "(\n" +
-            "select row_number() over (order by  pim.attribute_value desc) as rn,  g.sku_group_id, pim.attribute_value as price from product_sku_group g \n" +
-            "inner join hichina_product p on p.sku_group_id = g.sku_group_id \n" +
-            "inner join hichina_product_type hpt on hpt.product_type_id = p.product_type_id \n" +
-            "inner join product_sku_int_attribute_mapping pim on pim.sku_id = p.sku_id  \n" +
-            "inner join product_sku_varchar_attribute_mapping psvam on psvam.sku_id = p.sku_id \n" +
-            "where g.enabled = 1 \n" +
-            "and pim.attribute_id in ('e16df480-b17d-4442-91c2-d6c30d0d7ab0','e228b843-e054-41f8-91dd-19663460df54')\n" +
-            "and psvam.attribute_id = '2dea54f4-9b9c-413a-8b3a-0caf273283d2'\t\n" +
-            ") cc\n" +
-            "group by sku_group_id\n" +
-            ") bb\n" +
-            "on aa.rn=bb.rn\n" +
-            "order by aa.created_date desc")
+    @Select("select sku_group_id, sku_group_name, g.product_type_id , t.product_type_name, g.min_price, g.image_url  \n" +
+            "from product_sku_group g inner join hichina_product_type t on t.product_type_id = g.product_type_id\n" +
+            "where g.enabled=1 and sku_group_name like CONCAT('%',CONCAT(#{query},'%')) order by g.created_date desc")
     List<HichinaProductListDTO> getAllProductListByQuery(String query);
 
-    @Select("select count(*) from\n" +
-            "(\n" +
-            "select aa.sku_id, aa.sku_group_id , aa.sku_group_name, aa.product_type_id,aa.product_type_name, aa.price, aa.image_url from\n" +
-            "(\n" +
-            "select row_number() over (order by  pim.attribute_value desc) rn, g.created_date, g.sku_group_name ,p.product_type_id, hpt.product_type_name  , p.sku_id, g.sku_group_id, pim.attribute_value as price, psvam.attribute_value as image_url from product_sku_group g \n" +
-            "inner join hichina_product p on p.sku_group_id = g.sku_group_id \n" +
-            "inner join hichina_product_type hpt on hpt.product_type_id = p.product_type_id \n" +
-            "inner join product_sku_int_attribute_mapping pim on pim.sku_id = p.sku_id  \n" +
-            "inner join product_sku_varchar_attribute_mapping psvam on psvam.sku_id = p.sku_id \n" +
-            "where g.enabled = 1 \n" +
-            "and pim.attribute_id in ('e16df480-b17d-4442-91c2-d6c30d0d7ab0','e228b843-e054-41f8-91dd-19663460df54')\n" +
-            "and psvam.attribute_id = '2dea54f4-9b9c-413a-8b3a-0caf273283d2' and g.sku_group_name like CONCAT('%',CONCAT(#{query},'%'))\t\n" +
-            ") aa\n" +
-            "inner join\n" +
-            "(\n" +
-            "select max(rn) as rn, sku_group_id from\n" +
-            "(\n" +
-            "select row_number() over (order by  pim.attribute_value desc) as rn,  g.sku_group_id, pim.attribute_value as price from product_sku_group g \n" +
-            "inner join hichina_product p on p.sku_group_id = g.sku_group_id \n" +
-            "inner join hichina_product_type hpt on hpt.product_type_id = p.product_type_id \n" +
-            "inner join product_sku_int_attribute_mapping pim on pim.sku_id = p.sku_id  \n" +
-            "inner join product_sku_varchar_attribute_mapping psvam on psvam.sku_id = p.sku_id \n" +
-            "where g.enabled = 1 \n" +
-            "and pim.attribute_id in ('e16df480-b17d-4442-91c2-d6c30d0d7ab0','e228b843-e054-41f8-91dd-19663460df54')\n" +
-            "and psvam.attribute_id = '2dea54f4-9b9c-413a-8b3a-0caf273283d2'\t\n" +
-            ") cc\n" +
-            "group by sku_group_id\n" +
-            ") bb\n" +
-            "on aa.rn=bb.rn\n" +
-            ") ccd\n" +
-            "\n")
+    @Select("select count(*) from (select sku_group_id, sku_group_name, g.product_type_id , t.product_type_name, g.min_price, g.image_url  \n" +
+            "from product_sku_group g inner join hichina_product_type t on t.product_type_id = g.product_type_id\n" +
+            "where g.enabled=1 and sku_group_name like CONCAT('%',CONCAT(#{query},'%')) ) bb ")
     Integer countAllProductListByQuery(String query);
 
 
-    @Select("select count(*) from\n" +
-            "(\n" +
-            "select aa.sku_id, aa.sku_group_id , aa.sku_group_name, aa.product_type_id,aa.product_type_name, aa.price, aa.image_url from\n" +
-            "(\n" +
-            "select row_number() over (order by  pim.attribute_value desc) rn, g.created_date, g.sku_group_name ,p.product_type_id, hpt.product_type_name  , p.sku_id, g.sku_group_id, pim.attribute_value as price, psvam.attribute_value as image_url from product_sku_group g \n" +
-            "inner join hichina_product p on p.sku_group_id = g.sku_group_id \n" +
-            "inner join hichina_product_type hpt on hpt.product_type_id = p.product_type_id \n" +
-            "inner join product_sku_int_attribute_mapping pim on pim.sku_id = p.sku_id  \n" +
-            "inner join product_sku_varchar_attribute_mapping psvam on psvam.sku_id = p.sku_id \n" +
-            "where g.enabled = 1 \n" +
-            "and pim.attribute_id in ('e16df480-b17d-4442-91c2-d6c30d0d7ab0','e228b843-e054-41f8-91dd-19663460df54')\n" +
-            "and psvam.attribute_id = '2dea54f4-9b9c-413a-8b3a-0caf273283d2'\t\n" +
-            ") aa\n" +
-            "inner join\n" +
-            "(\n" +
-            "select max(rn) as rn, sku_group_id from\n" +
-            "(\n" +
-            "select row_number() over (order by  pim.attribute_value desc) as rn,  g.sku_group_id, pim.attribute_value as price from product_sku_group g \n" +
-            "inner join hichina_product p on p.sku_group_id = g.sku_group_id \n" +
-            "inner join hichina_product_type hpt on hpt.product_type_id = p.product_type_id \n" +
-            "inner join product_sku_int_attribute_mapping pim on pim.sku_id = p.sku_id  \n" +
-            "inner join product_sku_varchar_attribute_mapping psvam on psvam.sku_id = p.sku_id \n" +
-            "where g.enabled = 1 \n" +
-            "and pim.attribute_id in ('e16df480-b17d-4442-91c2-d6c30d0d7ab0','e228b843-e054-41f8-91dd-19663460df54')\n" +
-            "and psvam.attribute_id = '2dea54f4-9b9c-413a-8b3a-0caf273283d2'\t\n" +
-            ") cc\n" +
-            "group by sku_group_id\n" +
-            ") bb\n" +
-            "on aa.rn=bb.rn\n" +
-            ") ccd")
+    @Select("select count(*) from (select sku_group_id, sku_group_name, g.product_type_id , t.product_type_name, g.min_price, g.image_url  \n" +
+            "from product_sku_group g inner join hichina_product_type t on t.product_type_id = g.product_type_id where g.enabled=1) aa")
     Integer countAllProductList();
 
     @Select("select pm.attribute_id, a.attribute_name, a.data_type from hichina_product p inner join product_type_attribute_mapping pm on p.product_type_id=pm.product_type_id inner join product_attribute a on a.attribute_id=pm.attribute_id where p.sku_id=#{skuId}")

+ 22 - 0
hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/mapper/ProductSkuGroupDestinationMappingMapper.java

@@ -0,0 +1,22 @@
+package com.hichina.main.back.hichinamainback.mapper;
+
+import com.hichina.main.back.hichinamainback.model.DTO.HichinaProductListDTO;
+import com.hichina.main.back.hichinamainback.model.ProductSkuGroupDestinationMapping;
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Mapper
+@Component(value = "skuGroupDestinationMappingMapper")
+public interface ProductSkuGroupDestinationMappingMapper {
+    @Select("select g.sku_group_id , g.sku_group_name , g.product_type_id , t.product_type_name , g.min_price , g.image_url\n" +
+            "from product_sku_group_destination_mapping m inner join destination d on d.destination_id=m.destination_id \n" +
+            "inner join product_sku_group g on g.sku_group_id = m.product_sku_group_id \n" +
+            "inner join hichina_product_type t on t.product_type_id = g.product_type_id \n" +
+            "where d.destination_id=#{destinationId} and t.product_type_id='3a53caed-b788-4290-896d-7922532ad769' order by g.created_date desc")
+    List<HichinaProductListDTO> findRelatedTourProductByDestinationId(String destinationId);
+}

+ 1 - 2
hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/model/DTO/HichinaProductListDTO.java

@@ -6,11 +6,10 @@ import lombok.NoArgsConstructor;
 @Data
 @NoArgsConstructor
 public class HichinaProductListDTO {
-    private String skuId;
     private String skuGroupId;
     private String skuGroupName;
     private String productTypeId;
     private String productTypeName;
-    private Integer price;
+    private Integer minPrice;
     private String imageUrl;
 }

+ 11 - 0
hichina-main-back/src/main/java/com/hichina/main/back/hichinamainback/model/ProductSkuGroupDestinationMapping.java

@@ -0,0 +1,11 @@
+package com.hichina.main.back.hichinamainback.model;
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class ProductSkuGroupDestinationMapping {
+    private String skuGroupId;
+    private String destinationId;
+}

+ 34 - 6
hichina-main-front/src/views/destination/detail.vue

@@ -32,8 +32,9 @@
 
     <p class="text mt-50">Relevant Tours of {{ destinationName }}</p>
 
-    <div class="list flex-start mt-16">
-      <other-product-item :productSummary="[]" class="product-item" v-for="i in 4" :class="{'no-mar': i % 4 === 0}"/>
+    <div class="list flex-start mt-16" v-for="(item, index) in relevantToursProduct" v-bind:key="index">
+      <!-- <other-product-item :productSummary="[]" class="product-item" v-for="i in 4" :class="{'no-mar': i % 4 === 0}"/> -->
+      <other-product-item :productSummary="item" class="other-item" float/>
     </div>
 
     <p class="text mt-50">Relevant Blogs of Kunming</p>
@@ -57,6 +58,7 @@
   const downloadUrl = ref("")
   const destinationName = ref("")
   const childDestinations = ref([])
+  const relevantToursProduct = ref([])
   function goDownload(){
     if(downloadUrl.value==null || downloadUrl.value=="" ){
       ElNotification({
@@ -70,9 +72,9 @@
     }
   }
 
-  onMounted(() => {
-    console.log("on mounted destination detail page")
-    const route = useRoute()
+  const route = useRoute()
+
+  function loadDestinations(){
     AXIOS.get('/api/public/destination/'+route.params.destinationId).then(response=>{
        console.log("destination detail: ")
        console.log(response.data.data);
@@ -84,7 +86,9 @@
       console.log("get destination detail err")
       console.log(e)
     })
-    // get children destinations:
+  }
+
+  function loadChildrenDestination(){
     AXIOS.get('/api/public/destination/children/'+route.params.destinationId).then(response=>{
        console.log("destination children list: ")
        console.log(response.data.data);
@@ -94,6 +98,30 @@
       console.log("get destination detail err")
       console.log(e)
     })
+  }
+
+  function loadRelatedTours(){
+    AXIOS.get('/api/public/destination/relavanttourproduct/'+route.params.destinationId).then(response=>{
+       console.log("relevant products : ")
+       console.log(response.data)
+       if(response.data.ok===true){
+        relevantToursProduct.value = response.data.data;
+       }else{
+        relevantToursProduct.value = [];
+       }
+    }).catch(e=>{
+      console.log("get relevant tours product err")
+      console.log(e)
+    })
+
+  }
+
+  onMounted(() => {
+    console.log("on mounted destination detail page")
+    loadDestinations()
+    // get children destinations:
+    loadChildrenDestination()
+    loadRelatedTours()
   })
 </script>