Browse Source

Merge remote-tracking branch 'origin/dev' into dev

baolei 6 months ago
parent
commit
9f4cd40276
17 changed files with 636 additions and 86 deletions
  1. 61 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/ProdInventory/controller/ProdInventoryController.java
  2. 27 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/ProdInventory/domain/ProdInventoryVo.java
  3. 44 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/ProdInventory/mapper/ProdInventoryVoMapper.java
  4. 37 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/ProdInventory/service/IProdInventoryVoService.java
  5. 132 0
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/ProdInventory/service/impl/ProdInventoryVoServiceImpl.java
  6. 12 3
      08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/master/merchant/controller/MerchantProdController.java
  7. 0 70
      08.src/Xingxi/xingxi-admin/src/main/resources/mapper/MechantProdVoMapper.xml
  8. 2 2
      08.src/Xingxi/xingxi-admin/src/main/resources/mapper/MerchantProdVoMapper.xml
  9. 79 0
      08.src/Xingxi/xingxi-admin/src/main/resources/mapper/ProdInventoryVoMapper.xml
  10. 157 0
      08.src/Xingxi/xingxi-admin/src/main/resources/templates/business/prodInventory/prodInventory.html
  11. 16 1
      08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/merchant/merchant.html
  12. 1 1
      08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/merchant/prod/edit.html
  13. 0 6
      08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/product/prodPic/editPic.html
  14. 30 0
      08.src/Xingxi/xingxi-common/src/main/java/com/xingxi/common/enums/EInventoryIoFlag.java
  15. 35 0
      08.src/Xingxi/xingxi-common/src/main/java/com/xingxi/common/enums/EInventoryIoType.java
  16. 2 2
      08.src/Xingxi/xingxi-system/src/main/java/com/xingxi/business/ProdInventory/domain/ProdInventory.java
  17. 1 1
      08.src/Xingxi/xingxi-system/src/main/java/com/xingxi/business/ProdInventory/domain/ProdInventoryBill.java

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

@@ -0,0 +1,61 @@
+package com.xingxi.web.controller.business.ProdInventory.controller;
+
+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.web.controller.business.ProdInventory.domain.ProdInventoryVo;
+import com.xingxi.web.controller.business.ProdInventory.service.IProdInventoryVoService;
+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/prodInventory")
+public class ProdInventoryController extends BaseController {
+    private String prefix = "business/prodInventory";
+
+    @Resource
+    private IProdInventoryVoService prodInventoryVoService;
+
+    @RequiresPermissions("business:product:inventory:view")
+    @GetMapping("/{mercId}")
+    public String inventory(@PathVariable("mercId") Long mercId, ModelMap mmap) {
+        mmap.put("mercId", mercId);
+        return prefix + "/prodInventory";
+    }
+
+    /**
+     * 查询商品库存列表
+     */
+    @RequiresPermissions("business:prodInventory:list")
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(ProdInventoryVo prodInventoryVo) {
+        startPage();
+        List<ProdInventoryVo> list = prodInventoryVoService.selectProdInventoryVoList(prodInventoryVo);
+        return getDataTable(list);
+    }
+
+    /**
+     * 新增保存商品库存
+     */
+    @RequiresPermissions("business:prodInventory:add")
+    @Log(title = "商品库存", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(ProdInventoryVo prodInventoryVo) {
+        return toAjax(prodInventoryVoService.insertProdInventoryVo(prodInventoryVo));
+    }
+}

+ 27 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/ProdInventory/domain/ProdInventoryVo.java

@@ -0,0 +1,27 @@
+package com.xingxi.web.controller.business.ProdInventory.domain;
+
+import com.xingxi.business.ProdInventory.domain.ProdInventory;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ * 商品库存表 t_prod_inventory
+ *
+ * @author xingxi
+ * @date 2025-03-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString
+public class ProdInventoryVo extends ProdInventory {
+    private static final long serialVersionUID = 1L;
+    // 店铺名称
+    private String mercName;
+    // 商品名称
+    private String prodName;
+    // 商品属性名称
+    private String attrName;
+    // 添加商品库存数量
+    private Long addInvQty;
+}

+ 44 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/ProdInventory/mapper/ProdInventoryVoMapper.java

@@ -0,0 +1,44 @@
+package com.xingxi.web.controller.business.ProdInventory.mapper;
+
+import com.xingxi.web.controller.business.ProdInventory.domain.ProdInventoryVo;
+
+import java.util.List;
+
+/**
+ * 商品库存Vo Mapper接口
+ *
+ * @author xingxi
+ * @date 2025-03-06
+ */
+public interface ProdInventoryVoMapper {
+    /**
+     * 查询商品库存Vo
+     *
+     * @param mercId 店铺ID
+     * @return 商品库存Vo
+     */
+    ProdInventoryVo selectProdInventoryVoByMercId(Long mercId);
+    /**
+     * 查询商品库存Vo
+     *
+     * @param prodInventoryId 商品库存主键
+     * @return 商品库存Vo
+     */
+    ProdInventoryVo selectProdInventoryVoByProdInventoryId(Long prodInventoryId);
+
+    /**
+     * 查询商品库存Vo列表
+     *
+     * @param prodInventoryVo 商品库存Vo
+     * @return 商品库存Vo集合
+     */
+    List<ProdInventoryVo> selectProdInventoryVoList(ProdInventoryVo prodInventoryVo);
+
+    /**
+     * 修改商品库存
+     *
+     * @param prodInventoryVo 商品库存Vo
+     * @return 结果
+     */
+    int updateProdInventoryVo(ProdInventoryVo prodInventoryVo);
+}

+ 37 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/ProdInventory/service/IProdInventoryVoService.java

@@ -0,0 +1,37 @@
+package com.xingxi.web.controller.business.ProdInventory.service;
+
+import com.xingxi.web.controller.business.ProdInventory.domain.ProdInventoryVo;
+
+import java.util.List;
+
+/**
+ * 商品库存Service接口
+ *
+ * @author xingxi
+ * @date 2025-03-06
+ */
+public interface IProdInventoryVoService {
+    /**
+     * 查询商品库存Vo
+     *
+     * @param prodInventoryId 商品库存主键
+     * @return 商品库存Vo
+     */
+    ProdInventoryVo selectProdInventoryVoByProdInventoryId(Long prodInventoryId);
+
+    /**
+     * 查询商品库存Vo列表
+     *
+     * @param prodInventoryVo 商品库存Vo
+     * @return 商品库存Vo集合
+     */
+    List<ProdInventoryVo> selectProdInventoryVoList(ProdInventoryVo prodInventoryVo);
+
+    /**
+     * 新增商品库存
+     *
+     * @param prodInventoryVo 商品库存Vo
+     * @return 结果
+     */
+    int insertProdInventoryVo(ProdInventoryVo prodInventoryVo);
+}

+ 132 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/business/ProdInventory/service/impl/ProdInventoryVoServiceImpl.java

@@ -0,0 +1,132 @@
+package com.xingxi.web.controller.business.ProdInventory.service.impl;
+
+import com.xingxi.business.ProdInventory.domain.ProdInventory;
+import com.xingxi.business.ProdInventory.domain.ProdInventoryBill;
+import com.xingxi.business.ProdInventory.domain.ProdInventoryOrder;
+import com.xingxi.business.ProdInventory.domain.ProdInventoryOrderDetail;
+import com.xingxi.business.ProdInventory.mapper.ProdInventoryBillMapper;
+import com.xingxi.business.ProdInventory.mapper.ProdInventoryMapper;
+import com.xingxi.business.ProdInventory.mapper.ProdInventoryOrderDetailMapper;
+import com.xingxi.business.ProdInventory.mapper.ProdInventoryOrderMapper;
+import com.xingxi.business.ProdInventory.service.impl.ProdInventoryServiceImpl;
+import com.xingxi.common.enums.EDelFlag;
+import com.xingxi.common.enums.EInventoryBillType;
+import com.xingxi.common.enums.EInventoryIoFlag;
+import com.xingxi.common.enums.EInventoryIoType;
+import com.xingxi.common.utils.DateUtils;
+import com.xingxi.common.utils.ShiroUtils;
+import com.xingxi.common.utils.bean.BeanUtils;
+import com.xingxi.web.controller.business.ProdInventory.domain.ProdInventoryVo;
+import com.xingxi.web.controller.business.ProdInventory.mapper.ProdInventoryVoMapper;
+import com.xingxi.web.controller.business.ProdInventory.service.IProdInventoryVoService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 商品库存Service业务层处理
+ *
+ * @author xingxi
+ * @date 2025-03-06
+ */
+@Service
+public class ProdInventoryVoServiceImpl extends ProdInventoryServiceImpl implements IProdInventoryVoService {
+    @Resource
+    private ProdInventoryMapper prodInventoryMapper;
+    @Resource
+    private ProdInventoryVoMapper prodInventoryVoMapper;
+    @Resource
+    private ProdInventoryBillMapper prodInventoryBillMapper;
+    @Resource
+    private ProdInventoryOrderMapper prodInventoryOrderMapper;
+    @Resource
+    private ProdInventoryOrderDetailMapper prodInventoryOrderDetailMapper;
+
+    /**
+     * 查询商品库存
+     *
+     * @param prodInventoryId 商品库存主键
+     * @return 商品库存
+     */
+    @Override
+    public ProdInventoryVo selectProdInventoryVoByProdInventoryId(Long prodInventoryId) {
+        return prodInventoryVoMapper.selectProdInventoryVoByProdInventoryId(prodInventoryId);
+    }
+
+    /**
+     * 查询商品库存列表
+     *
+     * @param prodInventoryVo 商品库存
+     * @return 商品库存
+     */
+    @Override
+    public List<ProdInventoryVo> selectProdInventoryVoList(ProdInventoryVo prodInventoryVo) {
+        return prodInventoryVoMapper.selectProdInventoryVoList(prodInventoryVo);
+    }
+
+    /**
+     * 新增商品库存
+     *
+     * @param prodInventoryVo 商品库存Vo
+     * @return 结果
+     */
+    @Override
+    public int insertProdInventoryVo(ProdInventoryVo prodInventoryVo) {
+        int effectRows;
+        Long addInvQty = prodInventoryVo.getAddInvQty();
+        Date nowDate = DateUtils.getNowDate();
+        // 更新商品库存表
+        if (prodInventoryVo.getProdInventoryId() != null) {
+            prodInventoryVo = prodInventoryVoMapper.selectProdInventoryVoByProdInventoryId(prodInventoryVo.getProdInventoryId());
+            prodInventoryVo.setAddInvQty(addInvQty);
+            prodInventoryVo.setUpdateUser(ShiroUtils.getLoginName());
+            prodInventoryVo.setUpdateTime(nowDate);
+            effectRows = prodInventoryVoMapper.updateProdInventoryVo(prodInventoryVo);
+        } else {
+            ProdInventory prodInventory = new ProdInventory();
+            BeanUtils.copyBeanProp(prodInventory, prodInventoryVo);
+            prodInventory.setQuantity(addInvQty);
+            prodInventory.setAvailQty(addInvQty);
+            prodInventory.setDelFlag(EDelFlag.NO.getVal());
+            prodInventory.setCreateUser(ShiroUtils.getLoginName());
+            prodInventory.setCreateTime(nowDate);
+            effectRows = prodInventoryMapper.insertProdInventory(prodInventory);
+            prodInventoryVo = prodInventoryVoMapper.selectProdInventoryVoByProdInventoryId(prodInventoryVo.getProdInventoryId());
+        }
+        // 更新商品出入库单
+        ProdInventoryOrder prodInventoryOrder = new ProdInventoryOrder();
+        prodInventoryOrder.setIoFlag(EInventoryIoFlag.IN.getVal());
+        prodInventoryOrder.setIotype(EInventoryIoType.IN_PURCHASE.getVal());
+        prodInventoryOrder.setInId(prodInventoryVo.getMercId());
+        prodInventoryOrder.setDelFlag(EDelFlag.NO.getVal());
+        prodInventoryOrder.setCreateUser(ShiroUtils.getLoginName());
+        prodInventoryOrder.setCreateTime(nowDate);
+        effectRows += prodInventoryOrderMapper.insertProdInventoryOrder(prodInventoryOrder);
+        // 更新商品出入库明细单
+        ProdInventoryOrderDetail prodInventoryOrderDetail = new ProdInventoryOrderDetail();
+        prodInventoryOrderDetail.setInventoryOrderId(prodInventoryOrder.getInventoryOrderId());
+        prodInventoryOrderDetail.setProdId(prodInventoryVo.getProdId());
+        prodInventoryOrderDetail.setProdName(prodInventoryVo.getProdName());
+        prodInventoryOrderDetail.setProdAttrId(prodInventoryVo.getProdAttrId());
+        prodInventoryOrderDetail.setProdAttrName(prodInventoryVo.getAttrName());
+        prodInventoryOrderDetail.setQuantity(addInvQty);
+        prodInventoryOrderDetail.setDelFlag(EDelFlag.NO.getVal());
+        prodInventoryOrderDetail.setCreateUser(ShiroUtils.getLoginName());
+        prodInventoryOrderDetail.setCreateTime(nowDate);
+        effectRows += prodInventoryOrderDetailMapper.insertProdInventoryOrderDetail(prodInventoryOrderDetail);
+        // 更新商品出入库单
+        ProdInventoryBill prodInventoryBill = new ProdInventoryBill();
+        prodInventoryBill.setBillTime(nowDate);
+        prodInventoryBill.setBillType(EInventoryBillType.STOCKIN.getVal());
+        prodInventoryBill.setInventoryId(prodInventoryVo.getProdInventoryId());
+        prodInventoryBill.setQuantity(addInvQty);
+        prodInventoryBill.setDelFlag(EDelFlag.NO.getVal());
+        prodInventoryBill.setCreateUser(ShiroUtils.getLoginName());
+        prodInventoryBill.setCreateTime(nowDate);
+        effectRows += prodInventoryBillMapper.insertProdInventoryBill(prodInventoryBill);
+
+        return effectRows;
+    }
+}

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

@@ -6,9 +6,6 @@ import com.xingxi.common.core.domain.AjaxResult;
 import com.xingxi.common.core.page.TableDataInfo;
 import com.xingxi.common.core.text.Convert;
 import com.xingxi.common.enums.BusinessType;
-import com.xingxi.common.utils.poi.ExcelUtil;
-import com.xingxi.master.merchant.domain.MerchantProd;
-import com.xingxi.master.merchant.service.IMerchantProdService;
 import com.xingxi.web.controller.master.merchant.domain.MerchantProdVo;
 import com.xingxi.web.controller.master.merchant.service.IMerchantProdVoService;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -89,4 +86,16 @@ public class MerchantProdController extends BaseController {
             return toAjax(merchantProdVoService.logicDeleteMerchantProdByMercProdId(Long.parseLong(ids)));
         }
     }
+
+    @RequiresPermissions("master:merchant:prod:view")
+    @GetMapping("/checkMercProd")
+    @ResponseBody
+    public AjaxResult checkMercProd(Long mercId) {
+        List<MerchantProdVo> checkResult = merchantProdVoService.selectMerchantProdVoByMercId(mercId);
+        if (checkResult.size() == 0) {
+            return new AjaxResult(AjaxResult.Type.ERROR, "尚未分配商品,请先分配商品后再分配商品库存!");
+        } else {
+            return new AjaxResult(AjaxResult.Type.SUCCESS, "Success");
+        }
+    }
 }

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

@@ -1,70 +0,0 @@
-<?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>

+ 2 - 2
08.src/Xingxi/xingxi-admin/src/main/resources/mapper/MerchantProdVoMapper.xml

@@ -14,7 +14,7 @@
         <result property="updateUser"   column="updateUser"     />
         <result property="updateTime"   column="updateTime"     />
         <result property="prodName"     column="prodName"       />
-        <result property="attrName"     column="AttrName"       />
+        <result property="attrName"     column="attrName"       />
     </resultMap>
 
     <sql id="selectMerchantProdVo">
@@ -42,7 +42,7 @@
     <select id="selectMerchantProdVoList" parameterType="MerchantProdVo" resultMap="MerchantProdResult">
         <include refid="selectMerchantProdVo"/>
         <where>
-            <if test="mercProdId != null "> and m_merchant_prod.prodClassId = #{prodClassId}</if>
+            <if test="mercProdId != null "> and m_merchant_prod.mercProdId = #{mercProdId}</if>
             <if test="mercId != null "> and m_merchant_prod.mercId = #{mercId}</if>
             <if test="prodId != null "> and m_merchant_prod.prodId = #{prodId}</if>
             <if test="prodAttrId != null "> and m_merchant_prod.prodAttrId = #{prodAttrId}</if>

+ 79 - 0
08.src/Xingxi/xingxi-admin/src/main/resources/mapper/ProdInventoryVoMapper.xml

@@ -0,0 +1,79 @@
+<?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.business.ProdInventory.mapper.ProdInventoryVoMapper">
+    <resultMap type="ProdInventoryVo"    id="ProdInventoryVoResult">
+        <result property="mercProdId"   column="mercProdId"     />
+        <result property="mercId"       column="mercId"         />
+        <result property="prodId"       column="prodId"         />
+        <result property="prodAttrId"   column="prodAttrId"     />
+        <result property="shelfTime"    column="shelfTime"      />
+        <result property="shelfFlag"    column="shelfFlag"      />
+        <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="prodName"     column="prodName"       />
+        <result property="attrName"     column="attrName"       />
+    </resultMap>
+
+    <sql id="selectProdInventoryVo">
+        select t_prod_inventory.prodInventoryId
+             , m_merchant_prod.prodId
+             , m_merchant_prod.prodAttrId
+             , m_merchant_prod.mercId
+             , ifnull(t_prod_inventory.quantity, 0) as quantity
+             , ifnull(t_prod_inventory.availQty, 0) as availQty
+             , m_prod.prodName
+             , m_prod_attr.attrName
+        from m_merchant
+        inner join m_merchant_prod on m_merchant_prod.mercId = m_merchant.mercId
+        inner join m_prod on m_prod.id = m_merchant_prod.prodId
+        inner join m_prod_attr on m_prod_attr.prodId = m_merchant_prod.prodId and m_prod_attr.prodAttrId = m_merchant_prod.prodAttrId
+        left join t_prod_inventory on t_prod_inventory.mercId = m_merchant.mercId and t_prod_inventory.prodId = m_merchant_prod.prodId and t_prod_inventory.prodAttrId = m_merchant_prod.prodAttrId
+    </sql>
+
+    <select id="selectProdInventoryVoByMercId" parameterType="Long" resultMap="ProdInventoryVoResult">
+        <include refid="selectProdInventoryVo"/>
+        <where>
+            and t_prod_inventory.delFlag = 0
+            and t_prod_inventory.mercId = #{mercId}
+        </where>
+    </select>
+
+    <select id="selectProdInventoryVoByProdInventoryId" parameterType="Long" resultMap="ProdInventoryVoResult">
+        <include refid="selectProdInventoryVo"/>
+        <where>
+            and t_prod_inventory.delFlag = 0
+            and t_prod_inventory.prodInventoryId = #{prodInventoryId}
+        </where>
+    </select>
+
+    <select id="selectProdInventoryVoList" parameterType="ProdInventoryVo" resultMap="ProdInventoryVoResult">
+        <include refid="selectProdInventoryVo"/>
+        <where>
+            <if test="prodInventoryId != null "> and t_prod_inventory.prodInventoryId = #{prodInventoryId}</if>
+            <if test="prodId != null "> and m_merchant_prod.prodId = #{prodId}</if>
+            <if test="prodAttrId != null "> and m_merchant_prod.prodAttrId = #{prodAttrId}</if>
+            <if test="mercId != null "> and m_merchant_prod.mercId = #{mercId}</if>
+            <if test="delFlag != null and delFlag != ''"> and t_prod_inventory.delFlag = #{delFlag}</if>
+            <if test="mercName != null and mercName != ''"> and m_merchant.mercName like concat('%', #{mercName}, '%')</if>
+            <if test="prodName != null and prodName != ''"> and m_prod.prodName like concat('%', #{prodName}, '%')</if>
+            <if test="attrName != null  and attrName != ''"> and m_prod_attr.attrName like concat('%', #{attrName}, '%')</if>
+        </where>
+    </select>
+
+    <update id="updateProdInventoryVo" parameterType="ProdInventoryVo">
+        update t_prod_inventory
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="prodId != null">prodId = #{prodId},</if>
+            <if test="prodAttrId != null">prodAttrId = #{prodAttrId},</if>
+            <if test="mercId != null">mercId = #{mercId},</if>
+            <if test="addInvQty != null">quantity = quantity + #{addInvQty},</if>
+            <if test="addInvQty != null">availQty = availQty + #{addInvQty},</if>
+            <if test="updateUser != null">updateUser = #{updateUser},</if>
+            <if test="updateTime != null">updateTime = #{updateTime},</if>
+        </trim>
+        where prodInventoryId = #{prodInventoryId}
+    </update>
+</mapper>

+ 157 - 0
08.src/Xingxi/xingxi-admin/src/main/resources/templates/business/prodInventory/prodInventory.html

@@ -0,0 +1,157 @@
+<!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">
+                    <input id="mercId" name="mercId" type="hidden" th:value="${mercId}">
+                    <div class="select-list">
+                        <ul>
+                            <li>
+                                <label>商品名称:</label>
+                                <input type="text" name="prodName"/>
+                            </li>
+                            <li>
+                                <label>属性名称:</label>
+                                <input type="text" name="attrName"/>
+                            </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">
+            </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 id="addInventoryDiv" type="text/template">
+         <div class="col-xs-offset-1">
+             <form id="formAddInventory">
+                 <div class="select-list col-sm-12" style="margin-top: 10px; display: inline-block;">
+                     <div style="float: left; width: 100px; line-height: 30px">
+                         <label>库存数量:</label>
+                     </div>
+                     <div style="float: left; width: 200px;">
+                         <input type="text" class="form-control" id="quantity" readonly/>
+                     </div>
+                     <div style="float: left; width: 100px; line-height: 30px; margin-left: 20px;">
+                         <label>可售数量:</label>
+                     </div>
+                     <div style="float: left; width: 200px">
+                         <input type="text" class="form-control" id="availQty" readonly/>
+                     </div>
+                 </div>
+                 <div class="col-sm-12 select-list" style="margin-top: 10px; display: inline-block;">
+                     <div style="float: left; width: 100px; line-height: 30px">
+                        <label>增加库存数量:</label>
+                     </div>
+                     <div style="float: left; width: 200px">
+                         <input type="text" class="form-control" id="addInvQty" name="quantity"/>
+                     </div>
+                 </div>
+             </form>
+         </div>
+     </script>
+    <script th:inline="javascript">
+        var editFlag = [[${@permission.hasPermi('business:prodInventory:edit')}]];
+        var prefix = ctx + "business/prodInventory";
+
+        $(function() {
+            var options = {
+                url: prefix + "/list",
+                createUrl: prefix + "/add",
+                removeUrl: prefix + "/remove",
+                modalName: "商品库存",
+                columns: [
+                {
+                    field: 'prodName',
+                    title: '商品名称'
+                },
+                {
+                    field: 'attrName',
+                    title: '属性名称'
+                },
+                {
+                    field: 'quantity',
+                    title: '库存数量'
+                },
+                {
+                    field: 'availQty',
+                    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="addInventory(' + row.prodInventoryId + ',' + row.prodId + ',' + row.prodAttrId + ',' + row.quantity + ',' + row.availQty + ')"><i class="fa fa-edit"></i>配置库存</a>');
+                        return actions.join('');
+                    }
+                }]
+            };
+            $.table.init(options);
+        });
+
+        function addInventory(prodInventoryId, prodId, prodAttrId, quantity, availQty) {
+            var content = $('#addInventoryDiv').html();
+            layer.open({
+                type: 1,
+                fix: false,
+                maxmin: false,
+                shade: 0.3,
+                area: ['800px', '480px'],
+                title: '添加标签',
+                // 弹层外区域关闭
+                shadeClose: true,
+                success: function(layero, index) {
+                    layero.find('#quantity').val(quantity);
+                    layero.find('#availQty').val(availQty);
+                },
+                content: content,
+                btn: ['<i class="fa fa-check"></i> 确定', '<i class="fa fa-remove"></i> 关闭'],
+                btn1: function() {
+                    var addInvQty = $("#addInvQty").val();
+                    var url = prefix + "/add";
+                    var data = {
+                        "prodInventoryId": prodInventoryId,
+                        "mercId": $("#mercId").val(),
+                        "prodId": prodId,
+                        "prodAttrId": prodAttrId,
+                        "addInvQty": addInvQty,
+                    };
+                    $.post(url, data, function(result) {
+                        if (result.code === web_status.SUCCESS) {
+                            $.modal.closeAll();
+                            $.modal.enable();
+                            $.modal.alertSuccess("添加成功。");
+                            refreshTab();
+                        } else if (result.code === web_status.WARNING) {
+                            $.modal.closeAll();
+                            $.modal.enable();
+                            $.modal.alertWarning(result.msg)
+                        } else {
+                            $.modal.closeAll();
+                            $.modal.enable();
+                            $.modal.alertError(result.msg);
+                        }
+                    });
+                    layer.closeAll();
+                }
+            });
+        }
+    </script>
+</body>
+</html>

+ 16 - 1
08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/merchant/merchant.html

@@ -163,7 +163,7 @@
                         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-primary btn-xs ' + setInvFlag + '" href="javascript:void(0)" onclick="setInventory(\'' + 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('');
                     }
@@ -177,6 +177,21 @@
         function allocProd(mercId) {
             $.modal.openTab("分配商品",ctx + "master/merchant/prod/view/" + mercId);
         }
+        function setInventory(mercId) {
+            $.ajax({
+                url: ctx + "master/merchant/prod/checkMercProd",
+                type: "get",
+                dataType: "json",
+                data: {"mercId":  mercId},
+                success: function(result) {
+                    if (result.code === 500) {
+                        $.modal.alertError(result.msg);
+                    } else if (result.code === 0) {
+                        $.modal.openTab("商品库存",ctx + "business/prodInventory/" + mercId);
+                    }
+                }
+            });
+        }
     </script>
 </body>
 </html>

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

@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <html lang="zh" xmlns:th="http://www.thymeleaf.org" >
 <head>
-    <th:block th:include="include :: header('新增商户')" />
+    <th:block th:include="include :: header('配置商户商品')" />
 </head>
 <body class="white-bg">
     <div class="wrapper wrapper-content animated fadeInRight ibox-content">

+ 0 - 6
08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/product/prodPic/editPic.html

@@ -19,12 +19,6 @@
             <input type="hidden" id="picCount" />
         </div>
     </div>
-    <!-- 设置快递单类型区域 -->
-    <script id="addNewPicDiv" type="text/template">
-        <div class="col-sm-12 select-table table-striped">
-            <table id="newPic-table"></table>
-        </div>
-    </script>
     <th:block th:include="include :: footer" />
     <script th:inline="javascript">
         var prefix = ctx + "master/product/prodPic";

+ 30 - 0
08.src/Xingxi/xingxi-common/src/main/java/com/xingxi/common/enums/EInventoryIoFlag.java

@@ -0,0 +1,30 @@
+package com.xingxi.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @program: gululuq
+ * @description: 入出库标志
+ * @author: 金
+ * @create: 2025-03-16
+ */
+@AllArgsConstructor
+@Getter
+public enum EInventoryIoFlag {
+    IN("1", "入库"),
+    OUT("0", "出库");
+
+    private String val;
+    private String desc;
+
+    // 解析
+    public static EInventoryIoFlag parseByVal(String val) {
+        for (EInventoryIoFlag type : EInventoryIoFlag.values()) {
+            if (type.getVal().equalsIgnoreCase(val)) {
+                return type;
+            }
+        }
+        return EInventoryIoFlag.IN;
+    }
+}

+ 35 - 0
08.src/Xingxi/xingxi-common/src/main/java/com/xingxi/common/enums/EInventoryIoType.java

@@ -0,0 +1,35 @@
+package com.xingxi.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @program: gululuq
+ * @description: 入出库标志
+ * @author: 金
+ * @create: 2025-03-16
+ */
+@AllArgsConstructor
+@Getter
+public enum EInventoryIoType {
+    IN_PURCHASE("IN_PURCHASE", "采购入库"),
+    IN_RETURN("IN_RETURN", "退货入库"),
+    IN_CHANGE("IN_CHANGE", "换货入库"),
+    IN_CANCEL("IN_CANCEL", "取消入库"),
+    OUT_SALE("OUT_SALE", "销售出库"),
+    OUT_CHANGE("OUT_CHANGE", "换货出库"),
+    OTHER("OTHER", "其它");
+
+    private String val;
+    private String desc;
+
+    /** 解析 */
+    public static EInventoryIoType parseByVal(String val) {
+        for(EInventoryIoType value : EInventoryIoType.values()) {
+            if(value.getVal().equalsIgnoreCase(val)) {
+                return value;
+            }
+        }
+        return EInventoryIoType.OTHER;
+    }
+}

+ 2 - 2
08.src/Xingxi/xingxi-system/src/main/java/com/xingxi/business/ProdInventory/domain/ProdInventory.java

@@ -35,11 +35,11 @@ public class ProdInventory extends BaseEntity {
 
     // 库存数量
     @Excel(name = "库存数量")
-    private Integer quantity;
+    private Long quantity;
 
     // 可售数
     @Excel(name = "可售数")
-    private Integer availQty;
+    private Long availQty;
 
     // 删除标志
     @Excel(name = "删除标志")

+ 1 - 1
08.src/Xingxi/xingxi-system/src/main/java/com/xingxi/business/ProdInventory/domain/ProdInventoryBill.java

@@ -39,7 +39,7 @@ public class ProdInventoryBill extends BaseEntity {
 
     // 数量
     @Excel(name = "数量")
-    private Integer quantity;
+    private Long quantity;
 
     // 订单ID
     @Excel(name = "订单ID")