7 ماه پیش
والد
کامیت
a80202a96b
23فایلهای تغییر یافته به همراه1332 افزوده شده و 165 حذف شده
  1. 61 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/MerchantWxpay/controller/MerchantWxpayController.java
  2. 19 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/MerchantWxpay/domain/MerchantWxpayVo.java
  3. 19 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/MerchantWxpay/mapper/MerchantWxpayVoMapper.java
  4. 22 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/MerchantWxpay/service/IMerchantWxpayVoService.java
  5. 31 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/MerchantWxpay/service/impl/MerchantWxpayVoServiceImpl.java
  6. 31 10
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/master/merchant/controller/MerchantController.java
  7. 2 2
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/master/merchant/controller/MerchantProdController.java
  8. 48 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/master/merchant/mapper/MerchantProdVoMapper.java
  9. 7 20
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/master/vendor/controller/VendorController.java
  10. 6 4
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/service/ISysDictTypeVoService.java
  11. 4 21
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/service/impl/SysDictTypeVoServiceImpl.java
  12. 70 0
      08.src/Xingxi/xingxi-admin/src/main/resources/mapper/MechantProdVoMapper.xml
  13. 203 0
      08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/merchant/add.html
  14. 204 0
      08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/merchant/edit.html
  15. 182 0
      08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/merchant/merchant.html
  16. 156 0
      08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/merchant/product/merchantProd.html
  17. 179 0
      08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/merchant/wxpay/wxPay.html
  18. 7 7
      08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/vendor/add.html
  19. 5 5
      08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/vendor/edit.html
  20. 6 8
      08.src/Xingxi/xingxi-framework/src/main/java/com/xingxi/framework/web/service/DictService.java
  21. 35 43
      08.src/Xingxi/xingxi-system/src/main/java/com/xingxi/business/Order/domain/Order.java
  22. 30 45
      08.src/Xingxi/xingxi-system/src/main/java/com/xingxi/business/Order/domain/OrderDetail.java
  23. 5 0
      08.src/Xingxi/xingxi-system/src/main/java/com/xingxi/master/merchant/service/impl/MerchantServiceImpl.java

+ 61 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/MerchantWxpay/controller/MerchantWxpayController.java

@@ -0,0 +1,61 @@
+package com.xingxi.web.controller.business.MerchantWxpay.controller;
+
+import com.xingxi.business.MerchantWxpay.domain.MerchantWxpay;
+import com.xingxi.business.MerchantWxpay.service.IMerchantWxpayService;
+import com.xingxi.common.annotation.Log;
+import com.xingxi.common.core.controller.BaseController;
+import com.xingxi.common.core.domain.AjaxResult;
+import com.xingxi.common.core.page.TableDataInfo;
+import com.xingxi.common.enums.BusinessType;
+import com.xingxi.common.utils.poi.ExcelUtil;
+import com.xingxi.web.controller.business.MerchantWxpay.domain.MerchantWxpayVo;
+import com.xingxi.web.controller.business.MerchantWxpay.service.IMerchantWxpayVoService;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 店铺微信支付信息Controller
+ *
+ * @author ruoyi
+ * @date 2025-03-09
+ */
+@Controller
+@RequestMapping("/business/merchant/wxpay")
+public class MerchantWxpayController extends BaseController {
+    private String prefix = "business/merchant/wxpay";
+
+    @Resource
+    private IMerchantWxpayService merchantWxpayService;
+    @Resource
+    private IMerchantWxpayVoService merchantWxpayVoService;
+
+    /**
+     * 修改店铺微信支付信息
+     */
+    @RequiresPermissions("business:merchant:wxpay:edit")
+    @GetMapping("/edit/{mercId}")
+    public String edit(@PathVariable("mercId") Long mercId, ModelMap mmap) {
+        MerchantWxpayVo merchantWxpayVo = merchantWxpayVoService.selectMerchantWxpayVoByMercId(mercId);
+        if (merchantWxpayVo == null) {
+            merchantWxpayVo = new MerchantWxpayVo();
+        }
+        mmap.put("merchantWxpay", merchantWxpayVo);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存店铺微信支付信息
+     */
+    @RequiresPermissions("business:merchant:wxpay:edit")
+    @Log(title = "店铺微信支付信息", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(MerchantWxpay merchantWxpay) {
+        return toAjax(merchantWxpayService.updateMerchantWxpay(merchantWxpay));
+    }
+}

+ 19 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/MerchantWxpay/domain/MerchantWxpayVo.java

@@ -0,0 +1,19 @@
+package com.xingxi.web.controller.business.MerchantWxpay.domain;
+
+import com.xingxi.business.MerchantWxpay.domain.MerchantWxpay;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ * 店铺微信支付信息对象 t_merchant_wxpay
+ *
+ * @author xingxi
+ * @date 2025-03-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class MerchantWxpayVo extends MerchantWxpay {
+    private static final long serialVersionUID = 1L;
+}

+ 19 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/MerchantWxpay/mapper/MerchantWxpayVoMapper.java

@@ -0,0 +1,19 @@
+package com.xingxi.web.controller.business.MerchantWxpay.mapper;
+
+import com.xingxi.web.controller.business.MerchantWxpay.domain.MerchantWxpayVo;
+
+/**
+ * 店铺微信支付信息Mapper接口
+ *
+ * @author xingxi
+ * @date 2025-03-06
+ */
+public interface MerchantWxpayVoMapper {
+    /**
+     * 查询店铺微信支付信息
+     *
+     * @param mercId 商户ID
+     * @return 店铺微信支付信息
+     */
+    MerchantWxpayVo selectMerchantWxpayVoByMercId(Long mercId);
+}

+ 22 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/MerchantWxpay/service/IMerchantWxpayVoService.java

@@ -0,0 +1,22 @@
+package com.xingxi.web.controller.business.MerchantWxpay.service;
+
+import com.xingxi.business.MerchantWxpay.domain.MerchantWxpay;
+import com.xingxi.web.controller.business.MerchantWxpay.domain.MerchantWxpayVo;
+
+import java.util.List;
+
+/**
+ * 店铺微信支付信息Service接口
+ *
+ * @author xingxi
+ * @date 2025-03-06
+ */
+public interface IMerchantWxpayVoService {
+    /**
+     * 查询店铺微信支付信息
+     *
+     * @param mercId 店铺ID
+     * @return 店铺微信支付信息
+     */
+    MerchantWxpayVo selectMerchantWxpayVoByMercId(Long mercId);
+}

+ 31 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/MerchantWxpay/service/impl/MerchantWxpayVoServiceImpl.java

@@ -0,0 +1,31 @@
+package com.xingxi.web.controller.business.MerchantWxpay.service.impl;
+
+import com.xingxi.web.controller.business.MerchantWxpay.domain.MerchantWxpayVo;
+import com.xingxi.web.controller.business.MerchantWxpay.mapper.MerchantWxpayVoMapper;
+import com.xingxi.web.controller.business.MerchantWxpay.service.IMerchantWxpayVoService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+ * 店铺微信支付信息Service业务层处理
+ *
+ * @author xingxi
+ * @date 2025-03-06
+ */
+@Service
+public class MerchantWxpayVoServiceImpl implements IMerchantWxpayVoService {
+    @Resource
+    private MerchantWxpayVoMapper merchantWxpayVoMapper;
+
+    /**
+     * 查询店铺微信支付信息
+     *
+     * @param mercId 商户ID
+     * @return 店铺微信支付信息
+     */
+    @Override
+    public MerchantWxpayVo selectMerchantWxpayVoByMercId(Long mercId) {
+        return merchantWxpayVoMapper.selectMerchantWxpayVoByMercId(mercId);
+    }
+}

+ 31 - 10
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/master/merchant/controller/MerchantController.java

@@ -5,6 +5,8 @@ import com.xingxi.common.core.controller.BaseController;
 import com.xingxi.common.core.domain.AjaxResult;
 import com.xingxi.common.core.page.TableDataInfo;
 import com.xingxi.common.enums.BusinessType;
+import com.xingxi.common.enums.EDelFlag;
+import com.xingxi.common.exception.BusinessException;
 import com.xingxi.common.utils.poi.ExcelUtil;
 import com.xingxi.master.merchant.domain.Merchant;
 import com.xingxi.master.merchant.service.IMerchantService;
@@ -23,14 +25,14 @@ import java.util.List;
  * @date 2025-03-09
  */
 @Controller
-@RequestMapping("/system/merchant")
+@RequestMapping("/master/merchant")
 public class MerchantController extends BaseController {
-    private final String prefix = "system/merchant";
+    private final String prefix = "master/merchant";
 
     @Resource
     private IMerchantService merchantService;
 
-    @RequiresPermissions("system:merchant:view")
+    @RequiresPermissions("master:merchant:view")
     @GetMapping()
     public String merchant() {
         return prefix + "/merchant";
@@ -39,11 +41,12 @@ public class MerchantController extends BaseController {
     /**
      * 查询商户列表
      */
-    @RequiresPermissions("system:merchant:list")
+    @RequiresPermissions("master:merchant:list")
     @PostMapping("/list")
     @ResponseBody
     public TableDataInfo list(Merchant merchant) {
         startPage();
+        merchant.setDelFlag(EDelFlag.NO.getVal());
         List<Merchant> list = merchantService.selectMerchantList(merchant);
         return getDataTable(list);
     }
@@ -51,7 +54,7 @@ public class MerchantController extends BaseController {
     /**
      * 导出商户列表
      */
-    @RequiresPermissions("system:merchant:export")
+    @RequiresPermissions("master:merchant:export")
     @Log(title = "商户", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     @ResponseBody
@@ -72,18 +75,27 @@ public class MerchantController extends BaseController {
     /**
      * 新增保存商户
      */
-    @RequiresPermissions("system:merchant:add")
+    @RequiresPermissions("master:merchant:add")
     @Log(title = "商户", businessType = BusinessType.INSERT)
     @PostMapping("/add")
     @ResponseBody
     public AjaxResult addSave(Merchant merchant) {
+        Merchant cond;
+        List<Merchant> checkResult;
+        cond = new Merchant();
+        cond.setMercName(merchant.getMercName());
+        cond.setDelFlag(EDelFlag.NO.getVal());
+        checkResult = merchantService.selectMerchantList(cond);
+        if (checkResult.size() > 0) {
+            throw new BusinessException("商户名已存在!");
+        }
         return toAjax(merchantService.insertMerchant(merchant));
     }
 
     /**
      * 修改商户
      */
-    @RequiresPermissions("system:merchant:edit")
+    @RequiresPermissions("master:merchant:edit")
     @GetMapping("/edit/{merchantId}")
     public String edit(@PathVariable("merchantId") Long merchantId, ModelMap mMap) {
         Merchant merchant = merchantService.selectMerchantByMercId(merchantId);
@@ -94,22 +106,31 @@ public class MerchantController extends BaseController {
     /**
      * 修改保存商户
      */
-    @RequiresPermissions("system:merchant:edit")
+    @RequiresPermissions("master:merchant:edit")
     @Log(title = "商户", businessType = BusinessType.UPDATE)
     @PostMapping("/edit")
     @ResponseBody
     public AjaxResult editSave(Merchant merchant) {
+        Merchant cond;
+        List<Merchant> checkResult;
+        cond = new Merchant();
+        cond.setMercName(merchant.getMercName());
+        cond.setDelFlag(EDelFlag.NO.getVal());
+        checkResult = merchantService.selectMerchantList(cond);
+        if (checkResult.size() > 0) {
+            throw new BusinessException("商户名已存在!");
+        }
         return toAjax(merchantService.updateMerchant(merchant));
     }
 
     /**
      * 删除商户
      */
-    @RequiresPermissions("system:merchant:remove")
+    @RequiresPermissions("master:merchant:remove")
     @Log(title = "商户", businessType = BusinessType.DELETE)
     @PostMapping("/remove")
     @ResponseBody
     public AjaxResult remove(String ids) {
-        return toAjax(merchantService.deleteMerchantByMercIds(ids));
+        return toAjax(merchantService.logicDeleteMerchantByMercId(Long.parseLong(ids)));
     }
 }

+ 2 - 2
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/master/merchant/controller/MerchantProdController.java

@@ -23,9 +23,9 @@ import java.util.List;
  * @date 2025-03-09
  */
 @Controller
-@RequestMapping("/system/merchant/product")
+@RequestMapping("/master/merchant/product")
 public class MerchantProdController extends BaseController {
-    private final String prefix = "system/merchant/product";
+    private final String prefix = "master/merchant/product";
 
     @Resource
     private IMerchantProdService merchantProdService;

+ 48 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/master/merchant/mapper/MerchantProdVoMapper.java

@@ -0,0 +1,48 @@
+package com.xingxi.web.controller.master.merchant.mapper;
+
+import com.xingxi.master.designer.domain.Designer;
+import com.xingxi.master.product.domain.ProdClass;
+import com.xingxi.master.product.mapper.ProdMapper;
+import com.xingxi.web.controller.master.product.domain.ProdVo;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * 商品Mapper接口
+ *
+ * @author xingxi
+ * @date 2025-03-06
+ */
+@Repository
+public interface MerchantProdVoMapper extends ProdMapper {
+    /**
+     * 查询商品
+     *
+     * @param id 商品主键
+     * @return 商品
+     */
+    ProdVo selectProdVoById(Long id);
+
+    /**
+     * 查询商品列表
+     *
+     * @param prodVo 商品
+     * @return 商品集合
+     */
+    List<ProdVo> selectProdVoList(ProdVo prodVo);
+
+    /**
+     * 查询商品分类列表
+     *
+     * @return 商品分类列表
+     */
+    List<ProdClass> selectProdClassList();
+
+    /**
+     * 查询设计师列表
+     *
+     * @return 设计师列表
+     */
+    List<Designer> selectDesignerList();
+}

+ 7 - 20
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/master/vendor/controller/VendorController.java

@@ -5,6 +5,7 @@ import com.xingxi.common.core.controller.BaseController;
 import com.xingxi.common.core.domain.AjaxResult;
 import com.xingxi.common.core.page.TableDataInfo;
 import com.xingxi.common.enums.BusinessType;
+import com.xingxi.common.enums.EDelFlag;
 import com.xingxi.common.exception.BusinessException;
 import com.xingxi.common.utils.poi.ExcelUtil;
 import com.xingxi.master.vendor.domain.Vendor;
@@ -78,17 +79,10 @@ public class VendorController extends BaseController {
     @PostMapping("/add")
     @ResponseBody
     public AjaxResult addSave(Vendor vendor) {
-        Vendor cond;
-        List<Vendor> checkResult;
-        cond = new Vendor();
-        cond.setMobile(vendor.getMobile());
-        checkResult = vendorService.selectVendorList(cond);
-        if (checkResult.size() > 0) {
-            throw new BusinessException("已添加过的供应商手机号!");
-        }
-        cond = new Vendor();
+        Vendor cond = new Vendor();
         cond.setVendorName(vendor.getVendorName());
-        checkResult = vendorService.selectVendorList(cond);
+        cond.setDelFlag(EDelFlag.NO.getVal());
+        List<Vendor> checkResult = vendorService.selectVendorList(cond);
         if (checkResult.size() > 0) {
             throw new BusinessException("已添加过的供应商!");
         }
@@ -114,17 +108,10 @@ public class VendorController extends BaseController {
     @PostMapping("/edit")
     @ResponseBody
     public AjaxResult editSave(Vendor vendor) {
-        Vendor cond;
-        List<Vendor> checkResult;
-        cond = new Vendor();
-        cond.setMobile(vendor.getMobile());
-        checkResult = vendorService.selectVendorList(cond);
-        if (checkResult.size() > 0) {
-            throw new BusinessException("已添加过的供应商手机号!");
-        }
-        cond = new Vendor();
+        Vendor cond = new Vendor();
         cond.setVendorName(vendor.getVendorName());
-        checkResult = vendorService.selectVendorList(cond);
+        cond.setDelFlag(EDelFlag.NO.getVal());
+        List<Vendor> checkResult = vendorService.selectVendorList(cond);
         if (checkResult.size() > 0) {
             throw new BusinessException("已添加过的供应商!");
         }

+ 6 - 4
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/service/ISysDictTypeVoService.java

@@ -1,13 +1,15 @@
 package com.xingxi.web.controller.system.service;
 
+import com.xingxi.common.core.domain.Ztree;
+import com.xingxi.common.core.domain.entity.SysDictData;
+import com.xingxi.common.core.domain.entity.SysDictType;
+
+import java.util.List;
+
 /**
  * 字典 业务层
  *
  * @author xingxi
  */
 public interface ISysDictTypeVoService {
-    /**
-     * 加载字典缓存数据
-     */
-    void loadingDictCache();
 }

+ 4 - 21
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/system/service/impl/SysDictTypeVoServiceImpl.java

@@ -1,17 +1,13 @@
 package com.xingxi.web.controller.system.service.impl;
 
-import com.xingxi.common.core.domain.entity.SysDictData;
-import com.xingxi.common.utils.DictUtils;
 import com.xingxi.system.mapper.SysDictDataMapper;
+import com.xingxi.system.service.ISysDictTypeService;
+import com.xingxi.system.service.impl.SysDictTypeServiceImpl;
 import com.xingxi.web.controller.system.service.ISysDictTypeVoService;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * 字典 业务层处理
@@ -21,26 +17,13 @@ import java.util.stream.Collectors;
 @Service
 public class SysDictTypeVoServiceImpl implements ISysDictTypeVoService {
     @Resource
-    private SysDictDataMapper dictDataMapper;
+    private ISysDictTypeService sysDictTypeService;
 
     /**
      * 项目启动时,初始化字典到缓存
      */
     @PostConstruct
     public void init() {
-        loadingDictCache();
-    }
-
-    /**
-     * 加载字典缓存数据
-     */
-    @Override
-    public void loadingDictCache() {
-        SysDictData dictData = new SysDictData();
-        dictData.setStatus("0");
-        Map<String, List<SysDictData>> dictDataMap = dictDataMapper.selectDictDataList(dictData).stream().collect(Collectors.groupingBy(SysDictData::getDictType));
-        for (Map.Entry<String, List<SysDictData>> entry : dictDataMap.entrySet()) {
-            DictUtils.setDictCache(entry.getKey(), entry.getValue().stream().sorted(Comparator.comparing(SysDictData::getDictSort)).collect(Collectors.toList()));
-        }
+        sysDictTypeService.loadingDictCache();
     }
 }

+ 70 - 0
08.src/Xingxi/xingxi-admin/src/main/resources/mapper/MechantProdVoMapper.xml

@@ -0,0 +1,70 @@
+<?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.xingxi.web.controller.master.merchant.mapper.MerchantProdVoMapper">
+    <resultMap type="ProdVo" id="ProdResult">
+        <result property="id"                   column="id"                 />
+        <result property="prodClassId"          column="prodClassId"        />
+        <result property="prodName"             column="prodName"           />
+        <result property="ipId"                 column="ipId"               />
+        <result property="designerId"           column="designerId"         />
+        <result property="description"          column="description"        />
+        <result property="prodStatus"           column="prodStatus"         />
+        <result property="thirdIdConfirmFlag"   column="thirdIdConfirmFlag" />
+        <result property="delFlag"              column="delFlag"            />
+        <result property="createUser"           column="createUser"         />
+        <result property="createTime"           column="createTime"         />
+        <result property="updateUser"           column="updateUser"         />
+        <result property="updateTime"           column="updateTime"         />
+        <result property="prodClass"            column="className"          />
+        <result property="ipName"               column="ipName"             />
+        <result property="designerName"         column="designerName"       />
+    </resultMap>
+
+    <sql id="selectProdVo">
+        select m_prod.id
+             , m_prod.prodClassId
+             , m_prod.prodName
+             , m_prod.ipId
+             , m_prod.designerId
+             , m_prod.description
+             , m_prod.prodStatus
+             , m_prod.thirdIdConfirmFlag
+             , m_prod_class.className
+             , m_designer.designerName
+             , m_ipinfo.ipName
+        from m_prod
+        inner join m_prod_class on m_prod.prodClassId = m_prod_class.prodClassId
+        inner join m_designer on m_prod.designerId = m_designer.id
+        inner join m_ipinfo on m_prod.ipId = m_ipinfo.ipId
+    </sql>
+
+    <select id="selectProdVoList" parameterType="ProdVo" resultMap="ProdResult">
+        <include refid="selectProdVo"/>
+        <where>
+            <if test="prodClassId != null "> and m_prod.prodClassId = #{prodClassId}</if>
+            <if test="prodName != null  and prodName != ''"> and m_prod.prodName like concat('%', #{prodName}, '%')</if>
+            <if test="ipId != null "> and ipId = #{ipId}</if>
+            <if test="designerId != null "> and m_prod.designerId = #{designerId}</if>
+            <if test="description != null  and description != ''"> and m_prod.description = #{description}</if>
+            <if test="prodStatus != null  and prodStatus != ''"> and m_prod.prodStatus = #{prodStatus}</if>
+            <if test="thirdIdConfirmFlag != null  and thirdIdConfirmFlag != ''"> and m_prod.thirdIdConfirmFlag = #{thirdIdConfirmFlag}</if>
+            <if test="delFlag != null  and delFlag != ''"> and m_prod.delFlag = #{delFlag}</if>
+            <if test="prodClass != null  and prodClass != ''"> and m_prod_class.className like concat('%', #{prodClass}, '%')</if>
+            <if test="designerName != null  and designerName != ''"> and m_designer.designerName like concat('%', #{designerName}, '%')</if>
+            <if test="ipName != null  and ipName != ''"> and m_ipinfo.ipName like concat('%', #{ipName}, '%')</if>
+        </where>
+    </select>
+    
+    <select id="selectProdVoById" parameterType="Long" resultMap="ProdResult">
+        <include refid="selectProdVo"/>
+        where m_prod.id = #{id}
+    </select>
+
+    <select id="selectProdClassList" parameterType="String" resultType="ProdClass">
+        select * from m_prod_class where delFlag = '0'
+    </select>
+
+    <select id="selectDesignerList" parameterType="String" resultType="Designer">
+        select * from m_designer where delFlag = '0'
+    </select>
+</mapper>

+ 203 - 0
08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/merchant/add.html

@@ -0,0 +1,203 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('新增商户')" />
+    <th:block th:include="include :: select2-css" />
+    <th:block th:include="include :: bootstrap-select-css" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-merchant-add">
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">商户名称:</label>
+                    <div class="col-sm-8">
+                        <input name="mercName" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">商户状态:</label>
+                    <div class="col-sm-8">
+                        <select name="mercStatus" class="form-control m-b" th:with="type=${@dict.getType('merc_status')}">
+                            <option value="">-</option>
+                            <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">商户类型:</label>
+                    <div class="col-sm-8">
+                        <select name="mercType" class="form-control m-b" th:with="type=${@dict.getType('merc_type')}">
+                            <option value="">-</option>
+                            <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">联系人:</label>
+                    <div class="col-sm-8">
+                        <input name="contact" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">联系信箱:</label>
+                    <div class="col-sm-8">
+                        <input name="mail" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">手机号:</label>
+                    <div class="col-sm-8">
+                        <input name="mobile" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">通信地址:</label>
+                    <div class="col-sm-8">
+                        <input name="address" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">个人名字:</label>
+                    <div class="col-sm-8">
+                        <input name="personName" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">身份证号:</label>
+                    <div class="col-sm-8">
+                        <input name="idNumber" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">公司名称:</label>
+                    <div class="col-sm-8">
+                        <input name="companyName" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">纳税人识别号:</label>
+                    <div class="col-sm-8">
+                        <input name="companyCode" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: select2-js" />
+    <th:block th:include="include :: bootstrap-select-js" />
+    <script th:inline="javascript">
+        var prefix = ctx + "master/merchant"
+        $("#form-merchant-add").validate({
+            rules: {
+                mercName: {
+                    required: true,
+                },
+                mercStatus: {
+                    required: true,
+                },
+                mercType: {
+                    required: true,
+                },
+                contact: {
+                    required: true,
+                },
+                mail: {
+                    required: true,
+                    email: true,
+                },
+                mobile: {
+                    required: true,
+                    isPhone: true,
+                },
+                address: {
+                    required: true,
+                },
+                personName: {
+                    required: true,
+                },
+                idNumber: {
+                    required: true,
+                    isIdentity: true,
+                },
+                companyName: {
+                    required: true,
+                },
+                companyCode: {
+                    required: true,
+                    minlength:15,
+                    maxlength:18,
+                },
+            },
+            messages: {
+                mercName: {
+                    required: icon + "请输入商户名称",
+                },
+                mercStatus: {
+                    required: icon + "请选择商户状态",
+                },
+                mercType: {
+                    required: icon + "请选择商户类型",
+                },
+                contact: {
+                    required: icon + "请输入联系人",
+                },
+                mail: {
+                    required: icon + "请输入联系信箱",
+                    email: icon + "请填写正确的邮箱格式",
+                },
+                mobile: {
+                    required: icon + "请输入手机号",
+                    isPhone: icon + "请填写正确的11位手机号",
+                },
+                address: {
+                    required: icon + "请输入通信地址",
+                },
+                personName: {
+                    required: icon + "请输入个人名字",
+                },
+                idNumber: {
+                    required: icon + "请输入身份证号",
+                    isIdentity: icon + "请输入正确的身份证号,末尾若为X请大写",
+                },
+                companyName: {
+                    required: icon + "请输入公司名称",
+                },
+                companyCode: {
+                    required: icon + "请输入纳税人识别号",
+                    minlength: icon + "纳税人识别号最小长度为15位",
+                    maxlength: icon + "纳税人识别号最大长度为18位",
+                },
+            },
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/add", $('#form-merchant-add').serialize());
+            }
+        }
+    </script>
+</body>
+</html>

+ 204 - 0
08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/merchant/edit.html

@@ -0,0 +1,204 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('修改商户')" />
+    <th:block th:include="include :: select2-css" />
+    <th:block th:include="include :: bootstrap-select-css" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-merchant-edit" th:object="${merchant}">
+            <input name="mercId" th:field="*{mercId}" type="hidden">
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">商户名称:</label>
+                    <div class="col-sm-8">
+                        <input name="mercName" th:field="*{mercName}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">商户状态:</label>
+                    <div class="col-sm-8">
+                        <select name="mercStatus" class="form-control m-b" th:with="type=${@dict.getType('merc_status')}" th:field="*{mercStatus}">
+                            <option value="">-</option>
+                            <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">商户类型:</label>
+                    <div class="col-sm-8">
+                        <select name="mercType" class="form-control m-b" th:with="type=${@dict.getType('merc_type')}" th:field="*{mercType}">
+                            <option value="">-</option>
+                            <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">联系人:</label>
+                    <div class="col-sm-8">
+                        <input name="contact" th:field="*{contact}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">联系信箱:</label>
+                    <div class="col-sm-8">
+                        <input name="mail" th:field="*{mail}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">手机号:</label>
+                    <div class="col-sm-8">
+                        <input name="mobile" th:field="*{mobile}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">通信地址:</label>
+                    <div class="col-sm-8">
+                        <input name="address" th:field="*{address}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">个人名字:</label>
+                    <div class="col-sm-8">
+                        <input name="personName" th:field="*{personName}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">身份证号:</label>
+                    <div class="col-sm-8">
+                        <input name="idNumber" th:field="*{idNumber}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">公司名称:</label>
+                    <div class="col-sm-8">
+                        <input name="companyName" th:field="*{companyName}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">纳税人识别号:</label>
+                    <div class="col-sm-8">
+                        <input name="companyCode" th:field="*{companyCode}" class="form-control" type="text">
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: select2-js" />
+    <th:block th:include="include :: bootstrap-select-js" />
+    <script th:inline="javascript">
+        var prefix = ctx + "master/merchant";
+        $("#form-merchant-edit").validate({
+            rules: {
+                mercName: {
+                    required: true,
+                },
+                mercStatus: {
+                    required: true,
+                },
+                mercType: {
+                    required: true,
+                },
+                contact: {
+                    required: true,
+                },
+                mail: {
+                    required: true,
+                    email: true,
+                },
+                mobile: {
+                    required: true,
+                    isPhone: true,
+                },
+                address: {
+                    required: true,
+                },
+                personName: {
+                    required: true,
+                },
+                idNumber: {
+                    required: true,
+                    isIdentity: true,
+                },
+                companyName: {
+                    required: true,
+                },
+                companyCode: {
+                    required: true,
+                    minlength:15,
+                    maxlength:18,
+                },
+            },
+            messages: {
+                mercName: {
+                    required: icon + "请输入商户名称",
+                },
+                mercStatus: {
+                    required: icon + "请选择商户状态",
+                },
+                mercType: {
+                    required: icon + "请选择商户类型",
+                },
+                contact: {
+                    required: icon + "请输入联系人",
+                },
+                mail: {
+                    required: icon + "请输入联系信箱",
+                    email: icon + "请填写正确的邮箱格式",
+                },
+                mobile: {
+                    required: icon + "请输入手机号",
+                    isPhone: icon + "请填写正确的11位手机号",
+                },
+                address: {
+                    required: icon + "请输入通信地址",
+                },
+                personName: {
+                    required: icon + "请输入个人名字",
+                },
+                idNumber: {
+                    required: icon + "请输入身份证号",
+                    isIdentity: icon + "请输入正确的身份证号,末尾若为X请大写",
+                },
+                companyName: {
+                    required: icon + "请输入公司名称",
+                },
+                companyCode: {
+                    required: icon + "请输入纳税人识别号",
+                    minlength: icon + "纳税人识别号最小长度为15位",
+                    maxlength: icon + "纳税人识别号最大长度为18位",
+                },
+            },
+            focusCleanup: true
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/edit", $('#form-merchant-edit').serialize());
+            }
+        }
+    </script>
+</body>
+</html>

+ 182 - 0
08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/merchant/merchant.html

@@ -0,0 +1,182 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('商户列表')" />
+    <th:block th:include="include :: select2-css" />
+    <th:block th:include="include :: bootstrap-select-css" />
+</head>
+<body class="gray-bg">
+    <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <label>商户名称:</label>
+                                <input type="text" name="mercName"/>
+                            </li>
+                            <li>
+                                <label>商户状态:</label>
+                                <select name="mercStatus" class="form-control m-b" th:with="type=${@dict.getType('merc_status')}">
+                                    <option value="">所有</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <label>商户类型:</label>
+                                <select name="mercStatus" class="form-control m-b" th:with="type=${@dict.getType('merc_status')}">
+                                    <option value="">所有</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <label>联系人:</label>
+                                <input type="text" name="contact"/>
+                            </li>
+                            <li>
+                                <label>联系信箱:</label>
+                                <input type="text" name="mail"/>
+                            </li>
+                            <li>
+                                <label>手机号:</label>
+                                <input type="text" name="mobile"/>
+                            </li>
+                            <li>
+                                <label>通信地址:</label>
+                                <input type="text" name="address"/>
+                            </li>
+                            <li>
+                                <label>个人名字:</label>
+                                <input type="text" name="personName"/>
+                            </li>
+                            <li>
+                                <label>身份证号:</label>
+                                <input type="text" name="idNumber"/>
+                            </li>
+                            <li>
+                                <label>公司名称:</label>
+                                <input type="text" name="companyName"/>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="master:merchant:add">
+                    <i class="fa fa-plus"></i> 添加
+                </a>
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: select2-js" />
+    <th:block th:include="include :: bootstrap-select-js" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('master:merchant:edit')}]];
+        var allocProdFlag = [[${@permission.hasPermi('master:merchant:allocProd')}]];
+        var setPayInfoFlag = [[${@permission.hasPermi('master:merchant:setPayInfo')}]];
+        var setInvFlag = [[${@permission.hasPermi('master:merchant:setInv')}]];
+        var removeFlag = [[${@permission.hasPermi('master:merchant:remove')}]];
+        var mercStatuses = [[${@dict.getType('merchant_status')}]];
+        var mercTypes = [[${@dict.getType('merchant_type')}]];
+
+        var prefix = ctx + "master/merchant";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                modalName: "商户",
+                columns: [
+                {
+                    field: 'mercId',
+                    title: '主键',
+                    visible: false
+                },
+                {
+                    field: 'mercName',
+                    title: '商户名称'
+                },
+                {
+                    field: 'mercStatus',
+                    title: '商户状态',
+                    formatter: function (value, row, index) {
+                        return $.table.selectDictLabel(mercStatuses, value);
+                    }
+                },
+                {
+                    field: 'mercType',
+                    title: '商户类型',
+                    formatter: function (value, row, index) {
+                        return $.table.selectDictLabel(mercTypes, value);
+                    }
+                },
+                {
+                    field: 'contact',
+                    title: '联系人'
+                },
+                {
+                    field: 'mail',
+                    title: '联系信箱'
+                },
+                {
+                    field: 'mobile',
+                    title: '手机号'
+                },
+                {
+                    field: 'address',
+                    title: '通信地址'
+                },
+                {
+                    field: 'personName',
+                    title: '个人名字'
+                },
+                {
+                    field: 'idNumber',
+                    title: '身份证号'
+                },
+                {
+                    field: 'companyName',
+                    title: '公司名称'
+                },
+                {
+                    field: 'companyCode',
+                    title: '纳税人识别号'
+                },
+                {
+                    title: '操作',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var actions = [];
+                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.mercId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+                        // actions.push('<a class="btn btn-info btn-xs ' + setPayInfoFlag + '" href="javascript:void(0)" onclick="setPayInfo(\'' + row.mercId + '\')"><i class="fa fa-info"></i>支付信息设置</a> ');
+                        actions.push('<a class="btn btn-warning btn-xs ' + allocProdFlag + '" href="javascript:void(0)" onclick="allocProd(\'' + row.mercId + '\')"><i class="fa fa-product-hunt"></i>分配商品</a> ');
+                        actions.push('<a class="btn btn-primary btn-xs ' + setInvFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.mercId + '\')"><i class="fa fa-cubes"></i>商品库存设置</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.mercId + '\')"><i class="fa fa-remove"></i>删除</a>');
+                        return actions.join('');
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+        function setPayInfo(mercId) {
+            $.modal.openTab("支付信息",ctx + "business/merchant/wxpay/edit/" + mercId);
+        }
+        function allocProd(mercId) {
+            $.modal.openTab("分配商品",ctx + "business/merchant/allocProd/edit/" + mercId);
+        }
+    </script>
+</body>
+</html>

+ 156 - 0
08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/merchant/product/merchantProd.html

@@ -0,0 +1,156 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('推荐商品列表')" />
+</head>
+<body class="gray-bg">
+     <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId" class="form-horizontal m-t">
+                    <div class="form-group">
+                        <div style="margin-left: 15px; width: 100px; float: left;">
+                            <label class="control-label">商品名称:</label>
+                        </div>
+                        <div style="width: 150px; float: left;">
+                            <input type="text" class="form-control" name="prodName" placeholder="商品名称">
+                        </div>
+                        <div style="margin-left: 15px; width: 100px; float: left;">
+                            <label class="control-label">商品属性:</label>
+                        </div>
+                        <div style="width: 150px; float: left;">
+                            <input type="text" class="form-control" name="attrName" placeholder="商品属性">
+                        </div>
+                        <div style="margin-left: 15px; width: 100px; float: left;">
+                            <label class="control-label">上架状态:</label>
+                        </div>
+                        <div style="width: 150px; float: left;">
+                            <select name="shelf_flag" class="form-control m-b" th:with="type=${@dict.getType('shelf_flag')}">
+                                <option value="">所有</option>
+                                <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                            </select>
+                        </div>
+                        <div style="margin-left: 15px; width: 100px; float: left;">
+                            <label class="control-label">上架时间:</label>
+                        </div>
+                        <div style="width: 150px; float: left;">
+                            <input type="text" class="time-input" placeholder="开始时间" id="shelfTimeFrom" name="params[shelfTimeFrom]"/>
+                            <span>-</span>
+                            <input type="text" class="time-input" placeholder="结束时间" id="shelfTimeTo" name="params[shelfTimeTo]"/>
+                        </div>
+                        <div style="margin-left: 15px; float: left;">
+                            <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+                            <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+                        </div>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="master:product:prod:add">
+                    <i class="fa fa-plus"></i> 添加
+                </a>
+                <a class="btn btn-primary single disabled" onclick="$.operate.edit()" shiro:hasPermission="master:product:prod:edit">
+                    <i class="fa fa-edit"></i> 修改
+                </a>
+                <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()" shiro:hasPermission="master:product:prod:remove">
+                    <i class="fa fa-remove"></i> 删除
+                </a>
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('master:product:prod:edit')}]];
+        var removeFlag = [[${@permission.hasPermi('master:product:prod:remove')}]];
+        var approveFlag = [[${@permission.hasPermi('master:product:prod:approve')}]];
+        var editAttrFlag = [[${@permission.hasPermi('master:product:prod:viewAttrs')}]];
+        var editTagFlag = [[${@permission.hasPermi('master:product:prod:editTag')}]];
+        var prefix = ctx + "master/product/prod";
+        var prodStatuses = [[${@dict.getType('prod_status')}]];
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                modalName: "推荐商品",
+                columns: [
+                    {
+                        field: 'prodName',
+                        title: '商品名称'
+                    },
+                    {
+                        field: 'prodClass',
+                        title: '商品分类'
+                    },
+                    {
+                        field: 'ipName',
+                        title: '文创品牌'
+                    },
+                    {
+                        field: 'designerName',
+                        title: '设计师名称'
+                    },
+                    {
+                        field: 'prodStatus',
+                        title: '商品状态',
+                        formatter: function (value, row, index) {
+                            return $.table.selectDictLabel(prodStatuses, value);
+                        }
+                    },
+                    {
+                        title: '操作',
+                        align: 'center',
+                        formatter: function(value, row, index) {
+                            var actions = [];
+                            if (row.prodStatus === 'SAVED') {
+                                actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.id + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+                                actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>删除</a> ');
+                                actions.push('<a class="btn btn-warning btn-xs ' + editAttrFlag + '" href="javascript:void(0)" onclick="editAttr(\'' + row.id + '\')"><i class="fa fa-at"></i>编辑属性</a> ');
+                                actions.push('<a class="btn btn-info btn-xs ' + editTagFlag + '" href="javascript:void(0)" onclick="editTag(\'' + row.id + '\')"><i class="fa fa-info"></i>编辑标签</a> ');
+                                actions.push('<a class="btn btn-primary btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="editPic(\'' + row.id + '\')"><i class="fa fa-file-picture-o"></i>商品图片</a> ');
+                            }
+                            if (row.prodStatus === 'SUBMITTED') {
+                                actions.push('<a class="btn btn-warning btn-xs ' + approveFlag + '" href="javascript:void(0)" onclick="approve(\'' + row.id + '\')"><i class="fa fa-thumbs-o-up"></i>审核</a> ');
+                                actions.push('<a class="btn btn-warning btn-xs ' + approveFlag + '" href="javascript:void(0)" onclick="reject(\'' + row.id + '\')"><i class="fa fa-thumbs-o-down"></i>驳回</a>');
+                            }
+                            return actions.join('');
+                        }
+                    }
+                ]
+            };
+            $.table.init(options);
+        });
+
+        function editAttr(id) {
+            $.modal.openTab("商品属性信息",ctx + "master/product/prodAttr/" + id);
+        }
+
+        function editTag(id) {
+            $.modal.openTab("商品标签信息", ctx + "master/product/prodTag/editTag/" + id);
+        }
+
+        function editPic(id) {
+            $.modal.openTab("商品图片信息", ctx + "master/product/prodPic/editPic/" + id);
+        }
+
+        function approve(id) {
+            $.modal.confirm("确认同意该商品的申请吗?", function() {
+                $.operate.post(prefix + "/approve", {"id": id});
+            });
+        }
+
+        function reject(id) {
+            $.modal.confirm("确认驳回该商品的申请吗?", function() {
+                $.operate.post(prefix + "/reject/", {"id": id});
+            });
+        }
+    </script>
+</body>
+</html>

+ 179 - 0
08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/merchant/wxpay/wxPay.html

@@ -0,0 +1,179 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('商户列表')" />
+    <th:block th:include="include :: select2-css" />
+    <th:block th:include="include :: bootstrap-select-css" />
+</head>
+<body class="gray-bg">
+    <div class="container-div">
+        <div class="row">
+            <div class="col-sm-12 search-collapse">
+                <form id="formId">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <label>商户名称:</label>
+                                <input type="text" name="mercName"/>
+                            </li>
+                            <li>
+                                <label>商户状态:</label>
+                                <select name="mercStatus" class="form-control m-b" th:with="type=${@dict.getType('merc_status')}">
+                                    <option value="">所有</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <label>商户类型:</label>
+                                <select name="mercStatus" class="form-control m-b" th:with="type=${@dict.getType('merc_status')}">
+                                    <option value="">所有</option>
+                                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                                </select>
+                            </li>
+                            <li>
+                                <label>联系人:</label>
+                                <input type="text" name="contact"/>
+                            </li>
+                            <li>
+                                <label>联系信箱:</label>
+                                <input type="text" name="mail"/>
+                            </li>
+                            <li>
+                                <label>手机号:</label>
+                                <input type="text" name="mobile"/>
+                            </li>
+                            <li>
+                                <label>通信地址:</label>
+                                <input type="text" name="address"/>
+                            </li>
+                            <li>
+                                <label>个人名字:</label>
+                                <input type="text" name="personName"/>
+                            </li>
+                            <li>
+                                <label>身份证号:</label>
+                                <input type="text" name="idNumber"/>
+                            </li>
+                            <li>
+                                <label>公司名称:</label>
+                                <input type="text" name="companyName"/>
+                            </li>
+                            <li>
+                                <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i class="fa fa-search"></i>&nbsp;搜索</a>
+                                <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i class="fa fa-refresh"></i>&nbsp;重置</a>
+                            </li>
+                        </ul>
+                    </div>
+                </form>
+            </div>
+
+            <div class="btn-group-sm" id="toolbar" role="group">
+                <a class="btn btn-success" onclick="$.operate.add()" shiro:hasPermission="master:merchant:add">
+                    <i class="fa fa-plus"></i> 添加
+                </a>
+            </div>
+            <div class="col-sm-12 select-table table-striped">
+                <table id="bootstrap-table"></table>
+            </div>
+        </div>
+    </div>
+    <th:block th:include="include :: footer" />
+    <th:block th:include="include :: select2-js" />
+    <th:block th:include="include :: bootstrap-select-js" />
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('master:merchant:edit')}]];
+        var allocProdFlag = [[${@permission.hasPermi('master:merchant:allocProd')}]];
+        var setPayInfoFlag = [[${@permission.hasPermi('master:merchant:setPayInfo')}]];
+        var setInvFlag = [[${@permission.hasPermi('master:merchant:setInv')}]];
+        var removeFlag = [[${@permission.hasPermi('master:merchant:remove')}]];
+        var mercStatuses = [[${@dict.getType('merchant_status')}]];
+        var mercTypes = [[${@dict.getType('merchant_type')}]];
+
+        var prefix = ctx + "master/merchant";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                updateUrl: prefix + "/edit/{id}",
+                removeUrl: prefix + "/remove",
+                exportUrl: prefix + "/export",
+                modalName: "商户",
+                columns: [
+                {
+                    field: 'mercId',
+                    title: '主键',
+                    visible: false
+                },
+                {
+                    field: 'mercName',
+                    title: '商户名称'
+                },
+                {
+                    field: 'mercStatus',
+                    title: '商户状态',
+                    formatter: function (value, row, index) {
+                        return $.table.selectDictLabel(mercStatuses, value);
+                    }
+                },
+                {
+                    field: 'mercType',
+                    title: '商户类型',
+                    formatter: function (value, row, index) {
+                        return $.table.selectDictLabel(mercTypes, value);
+                    }
+                },
+                {
+                    field: 'contact',
+                    title: '联系人'
+                },
+                {
+                    field: 'mail',
+                    title: '联系信箱'
+                },
+                {
+                    field: 'mobile',
+                    title: '手机号'
+                },
+                {
+                    field: 'address',
+                    title: '通信地址'
+                },
+                {
+                    field: 'personName',
+                    title: '个人名字'
+                },
+                {
+                    field: 'idNumber',
+                    title: '身份证号'
+                },
+                {
+                    field: 'companyName',
+                    title: '公司名称'
+                },
+                {
+                    field: 'companyCode',
+                    title: '纳税人识别号'
+                },
+                {
+                    title: '操作',
+                    align: 'center',
+                    formatter: function(value, row, index) {
+                        var actions = [];
+                        actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.mercId + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-info btn-xs ' + setPayInfoFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.mercId + '\')"><i class="fa fa-info"></i>支付信息设置</a> ');
+                        actions.push('<a class="btn btn-warning btn-xs ' + allocProdFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.mercId + '\')"><i class="fa fa-product-hunt"></i>分配商品</a> ');
+                        actions.push('<a class="btn btn-primary btn-xs ' + setInvFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.mercId + '\')"><i class="fa fa-cubes"></i>商品库存设置</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.mercId + '\')"><i class="fa fa-remove"></i>删除</a>');
+                        return actions.join('');
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+        function setPayInfo(mercId) {
+            $.modal.openTab("支付信息",ctx + "business/product/prodAttr/" + id);
+        }
+    </script>
+</body>
+</html>

+ 7 - 7
08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/vendor/add.html

@@ -107,22 +107,22 @@
             },
             messages: {
                 vendorName: icon + "请输入供应商名称",
-                contact: icon + "请选择联系人",
+                contact: icon + "请输入联系人",
                 mobile: {
                     required: icon + "请输入手机号",
-                    isPhone: icon + "请输入正确的手机号",
+                    isPhone: icon + "请填写正确的11位手机号",
                 },
                 mail: {
                     required: icon + "请输入邮箱",
-                    email: icon + "请输入正确的邮箱",
+                    email: icon + "请填写正确的邮箱格式",
                 },
-                address: icon + "请选择通信地址",
-                refundContact: icon + "请选择退货收件人",
+                address: icon + "请输入通信地址",
+                refundContact: icon + "请输入退货收件人",
                 refundMobile: {
                     required: icon + "请输入退货手机号",
-                    isPhone: icon + "请输入正确的退货手机号",
+                    isPhone: icon + "请填写正确的11位手机号",
                 },
-                refundAddress: icon + "请选择退货地址",
+                refundAddress: icon + "请输入退货地址",
             },
             focusCleanup: true
         });

+ 5 - 5
08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/vendor/edit.html

@@ -108,22 +108,22 @@
             },
             messages: {
                 vendorName: icon + "请输入供应商名称",
-                contact: icon + "请选择联系人",
+                contact: icon + "请输入联系人",
                 mobile: {
                     required: icon + "请输入手机号",
                     isPhone: icon + "请输入正确的手机号",
                 },
                 mail: {
                     required: icon + "请输入邮箱",
-                    email: icon + "请输入正确的邮箱",
+                    email: icon + "请填写正确的邮箱格式",
                 },
-                address: icon + "请选择通信地址",
-                refundContact: icon + "请选择退货收件人",
+                address: icon + "请输入通信地址",
+                refundContact: icon + "请输入退货收件人",
                 refundMobile: {
                     required: icon + "请输入退货手机号",
                     isPhone: icon + "请输入正确的退货手机号",
                 },
-                refundAddress: icon + "请选择退货地址",
+                refundAddress: icon + "请输入退货地址",
             },
             focusCleanup: true
         });

+ 6 - 8
08.src/Xingxi/xingxi-framework/src/main/java/com/xingxi/framework/web/service/DictService.java

@@ -10,7 +10,7 @@ import java.util.List;
 
 /**
  * RuoYi首创 html调用 thymeleaf 实现字典读取
- * 
+ *
  * @author xingxi
  */
 @Service("dict")
@@ -23,24 +23,22 @@ public class DictService {
 
     /**
      * 根据字典类型查询字典数据信息
-     * 
+     *
      * @param dictType 字典类型
      * @return 参数键值
      */
-    public List<SysDictData> getType(String dictType)
-    {
+    public List<SysDictData> getType(String dictType) {
         return dictTypeService.selectDictDataByType(dictType);
     }
 
     /**
      * 根据字典类型和字典键值查询字典数据信息
-     * 
-     * @param dictType 字典类型
+     *
+     * @param dictType  字典类型
      * @param dictValue 字典键值
      * @return 字典标签
      */
-    public String getLabel(String dictType, String dictValue)
-    {
+    public String getLabel(String dictType, String dictValue) {
         return dictDataService.selectDictLabel(dictType, dictValue);
     }
 }

+ 35 - 43
08.src/Xingxi/xingxi-system/src/main/java/com/xingxi/business/Order/domain/Order.java

@@ -7,7 +7,6 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
 
-import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -22,84 +21,77 @@ import java.util.Date;
 public class Order extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
-    // 订单ID
+    /** 主键 */
     private Long orderId;
 
-    // 订单号
+    /** 订单号 */
     @Excel(name = "订单号")
     private String orderNo;
 
-    // 订单时间
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @Excel(name = "订单时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    /** 下单时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "下单时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date orderTime;
 
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @Excel(name = "订单时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
-    private Date payTime;
+    /** 支付时间 */
+    @Excel(name = "支付时间")
+    private String payTime;
 
-    // 订单状态
-    @Excel(name = "订单状态", dictType = "orderStatus")
+    /** 订单状态 */
+    @Excel(name = "订单状态")
     private String orderStatus;
 
-    // 订单总额
+    /** 订单总额 */
     @Excel(name = "订单总额")
-    private BigDecimal orderAmount;
+    private Long orderAmount;
 
-    // 支付金额
+    /** 支付金额 */
     @Excel(name = "支付金额")
-    private BigDecimal payAmount;
+    private Long payAmount;
 
-    // 商品数量
-    @Excel(name = "商品数量")
-    private Integer prodQuantity;
-
-    // 购方用户ID
-    @Excel(name = "购方用户ID")
+    /** 采购方ID */
+    @Excel(name = "采购方ID")
     private Long buyerId;
 
-    // 销方用户ID
-    @Excel(name = "销方用户ID")
+    /** 销售方ID */
+    @Excel(name = "销售方ID")
     private Long sellerId;
 
-    // 取消时间
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @Excel(name = "取消时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    /** 取消时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "取消时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date cancelTime;
 
-    // 完成时间
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @Excel(name = "完成时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    /** 完成时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "完成时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date finishTime;
 
-    // 收件人省名称
-    @Excel(name = "收件人省名称")
+    /** 收件人省 */
+    @Excel(name = "收件人省")
     private String recProv;
 
-    // 收件人市名称
-    @Excel(name = "收件人市名称")
+    /** 收件人市 */
+    @Excel(name = "收件人市")
     private String recCity;
 
-    // 收件人区名称
-    @Excel(name = "收件人区名称")
+    /** 收件人区 */
+    @Excel(name = "收件人区")
     private String recDistrict;
 
-    // 收件人地址
+    /** 收件人地址 */
     @Excel(name = "收件人地址")
     private String recAddress;
 
-    // 收件人姓名
+    /** 收件人姓名 */
     @Excel(name = "收件人姓名")
     private String recName;
 
-    // 收件人联系方式
+    /** 收件人联系方式 */
     @Excel(name = "收件人联系方式")
     private String recMobile;
 
-    @Excel(name = "备注")
-    private String remark;
-
-    // 删除标志(0代表存在 2代表删除)
-    @Excel(name = "删除标志", readConverterExp = "0=代表存在,1=代表删除")
+    /** 删除标志 */
+    @Excel(name = "删除标志")
     private String delFlag;
 }

+ 30 - 45
08.src/Xingxi/xingxi-system/src/main/java/com/xingxi/business/Order/domain/OrderDetail.java

@@ -1,15 +1,11 @@
 package com.xingxi.business.Order.domain;
 
-import com.fasterxml.jackson.annotation.JsonFormat;
 import com.xingxi.common.annotation.Excel;
 import com.xingxi.common.core.domain.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
 
-import java.math.BigDecimal;
-import java.util.Date;
-
 /**
  * 订单明细对象 t_order_detail
  *
@@ -22,73 +18,62 @@ import java.util.Date;
 public class OrderDetail extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
-    // 订单明细ID
+    /** 主键 */
     private Long orderDetailId;
 
-    // 订单ID
+    /** 订单ID */
     @Excel(name = "订单ID")
     private Long orderId;
 
-    // 订单明细状态
-    @Excel(name = "订单明细状态")
+    /** 订单详情状态 */
+    @Excel(name = "订单详情状态")
     private String orderDetailStatus;
 
-    // 商品ID
+    /** 商品ID */
     @Excel(name = "商品ID")
     private Long prodId;
 
-    // 商品名
-    @Excel(name = "商品名")
+    /** 商品名称 */
+    @Excel(name = "商品名")
     private String prodName;
 
-    // 属性组合编号
-    @Excel(name = "属性组合编号")
+    /** 商品属性ID */
+    @Excel(name = "商品属性ID")
     private Long prodAttrId;
 
-    // 属性组合名称
-    @Excel(name = "属性组合名称")
+    /** 商品属性名称 */
+    @Excel(name = "商品属性名称")
     private String prodAttrName;
 
-    // 供应商ID
+    /** 供应商ID */
     @Excel(name = "供应商ID")
     private Long vendorId;
 
-    // 购买数量
-    @Excel(name = "购买数量")
-    private Integer quantity;
+    /** 数量 */
+    @Excel(name = "数量")
+    private Long quantity;
 
-    // 售后中数量
-    @Excel(name = "售后数量")
-    private Integer afterQty;
+    /** 售后数量 */
+    @Excel(name = "售后数量")
+    private Long afterSalesQty;
 
-    // 已退货数量
-    @Excel(name = "退货数量")
-    private Integer returnQty;
+    /** 退货数量 */
+    @Excel(name = "退货数量")
+    private Long refundQty;
 
-    // 购买单价
-    @Excel(name = "购买单价")
-    private BigDecimal price;
+    /** 单价 */
+    @Excel(name = "单价")
+    private Long price;
 
-    // 总金额
+    /** 总金额 */
     @Excel(name = "总金额")
-    private BigDecimal orderAmount;
+    private Long orderAmount;
 
-    // 支付金额
+    /** 支付金额 */
     @Excel(name = "支付金额")
-    private BigDecimal payAmount;
-
-    // 确认收货时间
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @Excel(name = "确认收货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
-    private Date confirmTime;
+    private Long payAmount;
 
-    // 完成时间
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @Excel(name = "完成时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
-    private Date finishTime;
-
-    // 删除标志(0代表存在 1代表删除)
-    @Excel(name = "删除标志", readConverterExp = "0=代表存在,1=代表删除")
+    /** 删除标志 */
+    @Excel(name = "删除标志")
     private String delFlag;
-
 }

+ 5 - 0
08.src/Xingxi/xingxi-system/src/main/java/com/xingxi/master/merchant/service/impl/MerchantServiceImpl.java

@@ -1,7 +1,9 @@
 package com.xingxi.master.merchant.service.impl;
 
 import com.xingxi.common.core.text.Convert;
+import com.xingxi.common.enums.EDelFlag;
 import com.xingxi.common.utils.DateUtils;
+import com.xingxi.common.utils.ShiroUtils;
 import com.xingxi.master.merchant.domain.Merchant;
 import com.xingxi.master.merchant.mapper.MerchantMapper;
 import com.xingxi.master.merchant.service.IMerchantService;
@@ -51,6 +53,8 @@ public class MerchantServiceImpl implements IMerchantService {
      */
     @Override
     public int insertMerchant(Merchant merchant) {
+        merchant.setDelFlag(EDelFlag.NO.getVal());
+        merchant.setCreateUser(ShiroUtils.getLoginName());
         merchant.setCreateTime(DateUtils.getNowDate());
         return merchantMapper.insertMerchant(merchant);
     }
@@ -74,6 +78,7 @@ public class MerchantServiceImpl implements IMerchantService {
      */
     @Override
     public int updateMerchant(Merchant merchant) {
+        merchant.setUpdateUser(ShiroUtils.getLoginName());
         merchant.setUpdateTime(DateUtils.getNowDate());
         return merchantMapper.updateMerchant(merchant);
     }