xgb пре 1 недеља
родитељ
комит
e37dee6516

+ 0 - 140
fs-admin/src/main/java/com/fs/admin/controller/ProductAdminController.java

@@ -1,140 +0,0 @@
-package com.fs.admin.controller;
-
-import java.util.*;
-
-import com.fs.admin.helper.AdminCrossTenantHelper;
-import com.fs.common.annotation.Excel;
-import com.fs.common.annotation.Log;
-import com.fs.common.core.controller.BaseController;
-import com.fs.common.core.domain.AjaxResult;
-import com.fs.common.core.page.TableDataInfo;
-import com.fs.common.enums.BusinessType;
-import com.fs.common.utils.poi.ExcelUtil;
-import lombok.Data;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
-
-/**
- * 总后台商品审核控制器
- * 遍历所有租户库查询 fs_store_product 数据
- */
-@RestController
-@RequestMapping("/admin/product")
-public class ProductAdminController extends BaseController {
-
-    @Autowired
-    private AdminCrossTenantHelper crossTenantHelper;
-
-    private String str(Object o) { return o == null ? "" : o.toString(); }
-
-    @Data
-    public static class ProductExportVO {
-        @Excel(name = "租户名称") private String companyName;
-        @Excel(name = "商品名称") private String productName;
-        @Excel(name = "分类") private String categoryName;
-        @Excel(name = "价格") private String price;
-        @Excel(name = "库存") private String stock;
-        @Excel(name = "状态") private String status;
-        @Excel(name = "创建时间") private String createTime;
-    }
-
-    @Log(title = "导出商品", businessType = BusinessType.EXPORT)
-    @PreAuthorize("@ss.hasPermi('admin:product:list')")
-    @GetMapping("/export")
-    public AjaxResult export(@RequestParam(required = false) String productName,
-                             @RequestParam(required = false) Long companyId,
-                             @RequestParam(required = false) String companyName) {
-        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
-                companyId, companyName, (tenant, jdbc) -> {
-                    StringBuilder sql = new StringBuilder(
-                            "SELECT p.product_id, p.product_name, p.product_image, p.category_name, " +
-                            "p.price, p.stock, p.create_time, p.status " +
-                            "FROM fs_store_product p WHERE 1=1");
-                    List<Object> params = new ArrayList<>();
-                    if (productName != null && !productName.isEmpty()) {
-                        sql.append(" AND p.product_name LIKE ?");
-                        params.add("%" + productName + "%");
-                    }
-                    sql.append(" ORDER BY p.create_time DESC");
-                    return params.isEmpty()
-                            ? jdbc.queryForList(sql.toString())
-                            : jdbc.queryForList(sql.toString(), params.toArray());
-                });
-        List<ProductExportVO> voList = new ArrayList<>();
-        for (Map<String, Object> m : allList) {
-            ProductExportVO vo = new ProductExportVO();
-            vo.setCompanyName(str(m.get("company_name")));
-            vo.setProductName(str(m.get("product_name")));
-            vo.setCategoryName(str(m.get("category_name")));
-            vo.setPrice(str(m.get("price")));
-            vo.setStock(str(m.get("stock")));
-            vo.setStatus(str(m.get("status")));
-            vo.setCreateTime(str(m.get("create_time")));
-            voList.add(vo);
-        }
-        ExcelUtil<ProductExportVO> util = new ExcelUtil<>(ProductExportVO.class);
-        return util.exportExcel(voList, "商品数据");
-    }
-
-    /**
-     * 查询所有租户的商品列表
-     */
-    @PreAuthorize("@ss.hasPermi('admin:product:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(@RequestParam(required = false) String productName,
-                              @RequestParam(required = false) Long companyId,
-                              @RequestParam(required = false) String companyName) {
-        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
-                companyId, companyName, (tenant, jdbc) -> {
-                    StringBuilder sql = new StringBuilder(
-                            "SELECT p.product_id, p.product_name, p.product_image, p.category_name, " +
-                            "p.price, p.stock, p.create_time, p.status " +
-                            "FROM fs_store_product p WHERE 1=1");
-                    List<Object> params = new ArrayList<>();
-                    if (productName != null && !productName.isEmpty()) {
-                        sql.append(" AND p.product_name LIKE ?");
-                        params.add("%" + productName + "%");
-                    }
-                    sql.append(" ORDER BY p.create_time DESC LIMIT 200");
-                    return params.isEmpty()
-                            ? jdbc.queryForList(sql.toString())
-                            : jdbc.queryForList(sql.toString(), params.toArray());
-                });
-        return getDataTable(allList);
-    }
-
-    /**
-     * 查询待审核商品列表
-     */
-    @PreAuthorize("@ss.hasPermi('admin:product:list')")
-    @GetMapping("/pending")
-    public TableDataInfo pendingList(@RequestParam(required = false) Long companyId,
-                                     @RequestParam(required = false) String companyName) {
-        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
-                companyId, companyName, (tenant, jdbc) ->
-                        jdbc.queryForList(
-                                "SELECT p.product_id, p.product_name, p.product_image, p.category_name, " +
-                                "p.price, p.stock, p.create_time, p.status " +
-                                "FROM fs_store_product p WHERE p.status = 0 ORDER BY p.create_time DESC LIMIT 200"));
-        return getDataTable(allList);
-    }
-
-    /**
-     * 商品统计信息
-     */
-    @PreAuthorize("@ss.hasPermi('admin:product:query')")
-    @GetMapping("/statistics")
-    public AjaxResult statistics(@RequestParam(required = false) Long companyId,
-                                 @RequestParam(required = false) String companyName) {
-        List<Map<String, Object>> allList = crossTenantHelper.queryAcrossTenants(
-                companyId, companyName, (tenant, jdbc) ->
-                        jdbc.queryForList("SELECT product_id, status FROM fs_store_product"));
-        Map<String, Object> result = new HashMap<>();
-        result.put("totalCount", allList.size());
-        result.put("pendingCount", allList.stream().filter(r -> "0".equals(String.valueOf(r.get("status")))).count());
-        result.put("onlineCount", allList.stream().filter(r -> "1".equals(String.valueOf(r.get("status")))).count());
-        result.put("rejectedCount", allList.stream().filter(r -> "2".equals(String.valueOf(r.get("status")))).count());
-        return AjaxResult.success(result);
-    }
-}

+ 113 - 0
fs-admin/src/main/java/com/fs/admin/controller/audit/ProductAdminController.java

@@ -0,0 +1,113 @@
+package com.fs.admin.controller.audit;
+
+import java.util.*;
+
+import com.fs.admin.service.IAdminProductService;
+import com.fs.common.annotation.Excel;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import com.fs.common.enums.BusinessType;
+import com.fs.common.utils.poi.ExcelUtil;
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/admin/product")
+public class ProductAdminController extends BaseController {
+
+    @Autowired
+    private IAdminProductService adminProductService;
+
+    private String str(Object o) { return o == null ? "" : o.toString(); }
+
+    @Data
+    public static class ProductExportVO {
+        @Excel(name = "租户名称") private String companyName;
+        @Excel(name = "商品名称") private String productName;
+        @Excel(name = "分类") private String categoryName;
+        @Excel(name = "价格") private String price;
+        @Excel(name = "库存") private String stock;
+        @Excel(name = "状态") private String status;
+        @Excel(name = "创建时间") private String createTime;
+    }
+
+    @Log(title = "导出商品", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('admin:product:list')")
+    @GetMapping("/export")
+    public AjaxResult export(@RequestParam(required = false) String productName,
+                             @RequestParam(required = false) Integer status) {
+        List<Map<String, Object>> allList = adminProductService.selectProductListForExport(productName, status);
+        List<ProductExportVO> voList = new ArrayList<>();
+        for (Map<String, Object> m : allList) {
+            ProductExportVO vo = new ProductExportVO();
+            vo.setCompanyName(str(m.get("companyName")));
+            vo.setProductName(str(m.get("productName")));
+            vo.setCategoryName(str(m.get("categoryName")));
+            vo.setPrice(str(m.get("price")));
+            vo.setStock(str(m.get("stock")));
+            vo.setStatus(statusText((String) m.get("status")));
+            vo.setCreateTime(str(m.get("createTime")));
+            voList.add(vo);
+        }
+        ExcelUtil<ProductExportVO> util = new ExcelUtil<>(ProductExportVO.class);
+        return util.exportExcel(voList, "商品数据");
+    }
+
+    @PreAuthorize("@ss.hasPermi('admin:product:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(@RequestParam(required = false) String productName,
+                              @RequestParam(required = false) Integer status) {
+        List<Map<String, Object>> allList = adminProductService.selectProductList(productName, status);
+        return getDataTable(allList);
+    }
+
+    @PreAuthorize("@ss.hasPermi('admin:product:list')")
+    @GetMapping("/pending")
+    public TableDataInfo pendingList() {
+        List<Map<String, Object>> allList = adminProductService.selectProductPendingList();
+        return getDataTable(allList);
+    }
+
+    @PreAuthorize("@ss.hasPermi('admin:product:query')")
+    @GetMapping("/{productId}")
+    public AjaxResult getInfo(@PathVariable Long productId) {
+        Map<String, Object> data = adminProductService.selectProductById(productId);
+        if (data == null) return AjaxResult.error("商品不存在");
+        return AjaxResult.success(data);
+    }
+
+    @PreAuthorize("@ss.hasPermi('admin:product:audit')")
+    @PutMapping("/audit/{productId}")
+    public AjaxResult audit(@PathVariable Long productId,
+                            @RequestParam Integer status,
+                            @RequestParam(required = false) String auditRemark) {
+        int rows = adminProductService.auditProduct(productId, status);
+        return rows > 0 ? AjaxResult.success("操作成功") : AjaxResult.error("操作失败");
+    }
+
+    @PreAuthorize("@ss.hasPermi('admin:product:query')")
+    @GetMapping("/statistics")
+    public AjaxResult statistics() {
+        List<Map<String, Object>> allList = adminProductService.selectProductListForStatistics();
+        Map<String, Object> result = new HashMap<>();
+        result.put("totalCount", allList.size());
+        result.put("pendingCount", allList.stream().filter(r -> "0".equals(str(r.get("status")))).count());
+        result.put("onlineCount", allList.stream().filter(r -> "1".equals(str(r.get("status")))).count());
+        result.put("rejectedCount", allList.stream().filter(r -> "2".equals(str(r.get("status")))).count());
+        return AjaxResult.success(result);
+    }
+
+    private String statusText(String status) {
+        if (status == null) return "";
+        switch (status) {
+            case "0": return "待审核";
+            case "1": return "已上架";
+            case "2": return "已拒绝";
+            default: return status;
+        }
+    }
+}

+ 19 - 0
fs-service/src/main/java/com/fs/admin/mapper/AdminProductMapper.java

@@ -0,0 +1,19 @@
+package com.fs.admin.mapper;
+
+import com.fs.admin.vo.AdminProductVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface AdminProductMapper {
+
+    List<AdminProductVO> selectProductList(@Param("productName") String productName);
+
+    List<AdminProductVO> selectProductListByStatus(@Param("productName") String productName,
+                                                    @Param("status") Integer status);
+
+    AdminProductVO selectProductById(@Param("productId") Long productId);
+
+    int updateAuditStatus(@Param("productId") Long productId,
+                          @Param("status") Integer status);
+}

+ 19 - 0
fs-service/src/main/java/com/fs/admin/service/IAdminProductService.java

@@ -0,0 +1,19 @@
+package com.fs.admin.service;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IAdminProductService {
+
+    List<Map<String, Object>> selectProductList(String productName, Integer status);
+
+    List<Map<String, Object>> selectProductListForExport(String productName, Integer status);
+
+    List<Map<String, Object>> selectProductPendingList();
+
+    List<Map<String, Object>> selectProductListForStatistics();
+
+    Map<String, Object> selectProductById(Long productId);
+
+    int auditProduct(Long productId, Integer status);
+}

+ 74 - 0
fs-service/src/main/java/com/fs/admin/service/impl/AdminProductServiceImpl.java

@@ -0,0 +1,74 @@
+package com.fs.admin.service.impl;
+
+import com.fs.admin.mapper.AdminProductMapper;
+import com.fs.admin.service.IAdminProductService;
+import com.fs.admin.vo.AdminProductVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class AdminProductServiceImpl implements IAdminProductService {
+
+    @Autowired
+    private AdminProductMapper adminProductMapper;
+
+    @Override
+    public List<Map<String, Object>> selectProductList(String productName, Integer status) {
+        return toMapList(adminProductMapper.selectProductListByStatus(productName, status));
+    }
+
+    @Override
+    public List<Map<String, Object>> selectProductListForExport(String productName, Integer status) {
+        return toMapList(adminProductMapper.selectProductListByStatus(productName, status));
+    }
+
+    @Override
+    public List<Map<String, Object>> selectProductPendingList() {
+        return toMapList(adminProductMapper.selectProductListByStatus(null, 0));
+    }
+
+    @Override
+    public List<Map<String, Object>> selectProductListForStatistics() {
+        return toMapList(adminProductMapper.selectProductList(null));
+    }
+
+    @Override
+    public Map<String, Object> selectProductById(Long productId) {
+        AdminProductVO vo = adminProductMapper.selectProductById(productId);
+        if (vo == null) return null;
+        return toMap(vo);
+    }
+
+    @Override
+    public int auditProduct(Long productId, Integer status) {
+        return adminProductMapper.updateAuditStatus(productId, status);
+    }
+
+    private Map<String, Object> toMap(AdminProductVO vo) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("productId", vo.getProductId());
+        map.put("productName", vo.getProductName());
+        map.put("productImage", vo.getImgUrl());
+        map.put("imgUrl", vo.getImgUrl());
+        map.put("price", vo.getPrice());
+        map.put("stock", vo.getStock());
+        map.put("isShow", vo.getIsShow());
+        map.put("status", String.valueOf(vo.getIsShow()));
+        map.put("createTime", vo.getCreateTime());
+        map.put("sales", vo.getSales());
+        map.put("cateId", vo.getCateId());
+        map.put("isDel", vo.getIsDel());
+        map.put("brand", vo.getBrand());
+        map.put("companyName", vo.getCompanyName());
+        map.put("tenantCode", vo.getTenantCode());
+        return map;
+    }
+
+    private List<Map<String, Object>> toMapList(List<AdminProductVO> voList) {
+        return voList.stream().map(this::toMap).collect(java.util.stream.Collectors.toList());
+    }
+}

+ 56 - 0
fs-service/src/main/java/com/fs/admin/vo/AdminProductVO.java

@@ -0,0 +1,56 @@
+package com.fs.admin.vo;
+
+import lombok.Data;
+import java.math.BigDecimal;
+
+@Data
+public class AdminProductVO {
+
+    private Long productId;
+    private Long storeId;
+    private String imgUrl;
+    private String images;
+    private String videoUrl;
+    private String productName;
+    private String productIntroduce;
+    private String keyword;
+    private String barCode;
+    private Long cateId;
+    private BigDecimal price;
+    private BigDecimal otPrice;
+    private String unitName;
+    private Integer sort;
+    private Integer sales;
+    private Integer stock;
+    private Integer isShow;
+    private Integer isHot;
+    private Integer isBenefit;
+    private Integer isBest;
+    private Integer isNew;
+    private String desc;
+    private String createTime;
+    private String updateTime;
+    private Integer isPostage;
+    private Integer isDel;
+    private BigDecimal giveIntegral;
+    private Integer isGood;
+    private BigDecimal costPrice;
+    private Integer views;
+    private String codeUrl;
+    private Integer specType;
+    private Integer productType;
+    private String prescribeCode;
+    private String prescribeSpec;
+    private String prescribeFactory;
+    private String prescribeName;
+    private Integer isDisplay;
+    private Integer tempId;
+    private BigDecimal doctorBrokerage;
+    private Integer isPrescribe;
+    private Integer isDrug;
+    private String companyIds;
+    private String brand;
+
+    private String companyName;
+    private String tenantCode;
+}

+ 103 - 0
fs-service/src/main/resources/mapper/admin/AdminProductMapper.xml

@@ -0,0 +1,103 @@
+<?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.fs.admin.mapper.AdminProductMapper">
+
+    <resultMap type="com.fs.admin.vo.AdminProductVO" id="AdminProductVOResult">
+        <id     property="productId"       column="product_id"        />
+        <result property="storeId"         column="store_id"          />
+        <result property="imgUrl"          column="img_url"           />
+        <result property="images"          column="images"            />
+        <result property="videoUrl"        column="video_url"         />
+        <result property="productName"     column="product_name"      />
+        <result property="productIntroduce" column="product_introduce"/>
+        <result property="keyword"         column="keyword"           />
+        <result property="barCode"         column="bar_code"          />
+        <result property="cateId"          column="cate_id"           />
+        <result property="price"           column="price"             />
+        <result property="otPrice"         column="ot_price"          />
+        <result property="unitName"        column="unit_name"         />
+        <result property="sort"            column="sort"              />
+        <result property="sales"           column="sales"             />
+        <result property="stock"           column="stock"             />
+        <result property="isShow"          column="is_show"           />
+        <result property="isHot"           column="is_hot"            />
+        <result property="isBenefit"       column="is_benefit"        />
+        <result property="isBest"          column="is_best"           />
+        <result property="isNew"           column="is_new"            />
+        <result property="desc"            column="desc"              />
+        <result property="createTime"      column="create_time"       />
+        <result property="updateTime"      column="update_time"       />
+        <result property="isPostage"       column="is_postage"        />
+        <result property="isDel"           column="is_del"            />
+        <result property="giveIntegral"    column="give_integral"     />
+        <result property="isGood"          column="is_good"           />
+        <result property="costPrice"       column="cost_price"        />
+        <result property="views"           column="views"             />
+        <result property="codeUrl"         column="code_url"          />
+        <result property="specType"        column="spec_type"         />
+        <result property="productType"     column="product_type"      />
+        <result property="prescribeCode"   column="prescribe_code"    />
+        <result property="prescribeSpec"   column="prescribe_spec"    />
+        <result property="prescribeFactory" column="prescribe_factory"/>
+        <result property="prescribeName"   column="prescribe_name"    />
+        <result property="isDisplay"       column="is_display"        />
+        <result property="tempId"          column="temp_id"           />
+        <result property="doctorBrokerage" column="doctor_brokerage"  />
+        <result property="isPrescribe"     column="is_prescribe"      />
+        <result property="isDrug"          column="is_drug"           />
+        <result property="companyIds"      column="company_ids"       />
+        <result property="brand"           column="brand"             />
+    </resultMap>
+
+    <sql id="selectAdminProductVo">
+        SELECT p.product_id, p.store_id, p.img_url, p.images, p.video_url,
+               p.product_name, p.product_introduce, p.keyword, p.bar_code,
+               p.cate_id, p.price, p.ot_price, p.unit_name, p.sort,
+               p.sales, p.stock, p.is_show, p.is_hot, p.is_benefit,
+               p.is_best, p.is_new, p.desc, p.create_time, p.update_time,
+               p.is_postage, p.is_del, p.give_integral, p.is_good,
+               p.cost_price, p.views, p.code_url, p.spec_type,
+               p.product_type, p.prescribe_code, p.prescribe_spec,
+               p.prescribe_factory, p.prescribe_name, p.is_display,
+               p.temp_id, p.doctor_brokerage, p.is_prescribe, p.is_drug,
+               p.company_ids, p.brand
+        FROM fs_store_product p
+    </sql>
+
+    <select id="selectProductList" resultMap="AdminProductVOResult">
+        <include refid="selectAdminProductVo"/>
+        <where>
+            <if test="productName != null and productName != ''">
+                AND p.product_name LIKE CONCAT('%', #{productName}, '%')
+            </if>
+        </where>
+        ORDER BY p.create_time DESC
+    </select>
+
+    <select id="selectProductListByStatus" resultMap="AdminProductVOResult">
+        <include refid="selectAdminProductVo"/>
+        <where>
+            <if test="productName != null and productName != ''">
+                AND p.product_name LIKE CONCAT('%', #{productName}, '%')
+            </if>
+            <if test="status != null">
+                AND p.is_show = #{status}
+            </if>
+        </where>
+        ORDER BY p.create_time DESC
+    </select>
+
+    <select id="selectProductById" resultMap="AdminProductVOResult">
+        <include refid="selectAdminProductVo"/>
+        WHERE p.product_id = #{productId}
+    </select>
+
+    <update id="updateAuditStatus">
+        UPDATE fs_store_product
+        SET is_show = #{status}, update_time = NOW()
+        WHERE product_id = #{productId}
+    </update>
+
+</mapper>