大大的豆芽 3 months ago
parent
commit
03c6f3bf34

+ 0 - 203
hs_err_pid25312.log

@@ -1,203 +0,0 @@
-#
-# There is insufficient memory for the Java Runtime Environment to continue.
-# Native memory allocation (mmap) failed to map 268435456 bytes for Failed to commit area from 0x0000000701c00000 to 0x0000000711c00000 of length 268435456.
-# Possible reasons:
-#   The system is out of physical RAM or swap space
-#   The process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap
-# Possible solutions:
-#   Reduce memory load on the system
-#   Increase physical memory or swap space
-#   Check if swap backing store is full
-#   Decrease Java heap size (-Xmx/-Xms)
-#   Decrease number of Java threads
-#   Decrease Java thread stack sizes (-Xss)
-#   Set larger code cache with -XX:ReservedCodeCacheSize=
-# This output file may be truncated or incomplete.
-#
-#  Out of Memory Error (./src/hotspot/os/windows/os_windows.cpp:3521), pid=25312, tid=604
-#
-# JRE version:  (11.0.12+7) (build )
-# Java VM: OpenJDK 64-Bit Server VM (11.0.12+7-b1504.40, mixed mode, sharing, tiered, compressed oops, g1 gc, windows-amd64)
-# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
-#
-
----------------  S U M M A R Y ------------
-
-Command Line: git4idea.http.GitAskPassApp Username for 'http://101.37.21.97:3000': 
-
-Host: Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz, 8 cores, 15G,  Windows 10 , 64 bit Build 19041 (10.0.19041.4717)
-Time: Wed Aug 28 16:28:22 2024 中国标准时间 elapsed time: 0.026736 seconds (0d 0h 0m 0s)
-
----------------  T H R E A D  ---------------
-
-Current thread (0x0000019c63468000):  JavaThread "Unknown thread" [_thread_in_vm, id=604, stack(0x0000000ea4600000,0x0000000ea4700000)]
-
-Stack: [0x0000000ea4600000,0x0000000ea4700000]
-Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
-V  [jvm.dll+0x5ff40a]
-V  [jvm.dll+0x783b65]
-V  [jvm.dll+0x78517d]
-V  [jvm.dll+0x785833]
-V  [jvm.dll+0x249408]
-V  [jvm.dll+0x5fc7f4]
-V  [jvm.dll+0x5f13c5]
-V  [jvm.dll+0x3076bb]
-V  [jvm.dll+0x30762a]
-V  [jvm.dll+0x307502]
-V  [jvm.dll+0x30c466]
-V  [jvm.dll+0x355543]
-V  [jvm.dll+0x355c46]
-V  [jvm.dll+0x355643]
-V  [jvm.dll+0x2e2018]
-V  [jvm.dll+0x2e31c7]
-V  [jvm.dll+0x761f57]
-V  [jvm.dll+0x76374c]
-V  [jvm.dll+0x362ab9]
-V  [jvm.dll+0x7455be]
-V  [jvm.dll+0x3cb673]
-V  [jvm.dll+0x3cda21]
-C  [jli.dll+0x536b]
-C  [ucrtbase.dll+0x21bb2]
-C  [KERNEL32.DLL+0x17374]
-C  [ntdll.dll+0x4cc91]
-
-
----------------  P R O C E S S  ---------------
-
-Threads class SMR info:
-_java_thread_list=0x0000019c61a00a20, length=0, elements={
-}
-
-Java Threads: ( => current thread )
-
-Other Threads:
-  0x0000019c6347f000 GCTaskThread "GC Thread#0" [stack: 0x0000000ea4700000,0x0000000ea4800000] [id=22924]
-  0x0000019c634dc800 ConcurrentGCThread "G1 Main Marker" [stack: 0x0000000ea4800000,0x0000000ea4900000] [id=29196]
-  0x0000019c634de000 ConcurrentGCThread "G1 Conc#0" [stack: 0x0000000ea4900000,0x0000000ea4a00000] [id=29592]
-
-[error occurred during error reporting (printing all threads), id 0xc0000005, EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ff819c227a7]
-
-VM state:not at safepoint (not fully initialized)
-
-VM Mutex/Monitor currently owned by a thread:  ([mutex/lock_event])
-[0x0000019c63466c70] Heap_lock - owner thread: 0x0000019c63468000
-
-Heap address: 0x0000000701c00000, size: 4068 MB, Compressed Oops mode: Non-zero based: 0x0000000701c00000
-Narrow klass base: 0x0000000000000000, Narrow klass shift: 0
-
-GC Heap History (0 events):
-No events
-
-Deoptimization events (0 events):
-No events
-
-Classes redefined (0 events):
-No events
-
-Internal exceptions (0 events):
-No events
-
-Events (1 events):
-Event: 0.016 Loaded shared library E:\idea\IntelliJ IDEA 2021.2.3\jbr\bin\zip.dll
-
-
-Dynamic libraries:
-0x00007ff7f2870000 - 0x00007ff7f287a000 	E:\idea\IntelliJ IDEA 2021.2.3\jbr\bin\java.exe
-0x00007ff884e30000 - 0x00007ff885028000 	C:\WINDOWS\SYSTEM32\ntdll.dll
-0x00007ff8845a0000 - 0x00007ff884661000 	C:\WINDOWS\System32\KERNEL32.DLL
-0x00007ff8824e0000 - 0x00007ff8827dd000 	C:\WINDOWS\System32\KERNELBASE.dll
-0x00007ff882c90000 - 0x00007ff882d90000 	C:\WINDOWS\System32\ucrtbase.dll
-0x00007ff85ae70000 - 0x00007ff85ae89000 	E:\idea\IntelliJ IDEA 2021.2.3\jbr\bin\jli.dll
-0x00007ff868870000 - 0x00007ff868887000 	E:\idea\IntelliJ IDEA 2021.2.3\jbr\bin\VCRUNTIME140.dll
-0x00007ff882e60000 - 0x00007ff882ffd000 	C:\WINDOWS\System32\USER32.dll
-0x00007ff882d90000 - 0x00007ff882db2000 	C:\WINDOWS\System32\win32u.dll
-0x00007ff86b790000 - 0x00007ff86ba2a000 	C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.4355_none_60b8b9eb71f62e16\COMCTL32.dll
-0x00007ff883f40000 - 0x00007ff883f6b000 	C:\WINDOWS\System32\GDI32.dll
-0x00007ff883380000 - 0x00007ff88341e000 	C:\WINDOWS\System32\msvcrt.dll
-0x00007ff8827e0000 - 0x00007ff8828f7000 	C:\WINDOWS\System32\gdi32full.dll
-0x00007ff882bf0000 - 0x00007ff882c8d000 	C:\WINDOWS\System32\msvcp_win.dll
-0x00007ff884c90000 - 0x00007ff884cbf000 	C:\WINDOWS\System32\IMM32.DLL
-0x0000000063b10000 - 0x0000000063b1d000 	C:\Program Files (x86)\360\360Safe\safemon\SafeWrapper.dll
-0x00007ff883e90000 - 0x00007ff883f40000 	C:\WINDOWS\System32\ADVAPI32.dll
-0x00007ff883420000 - 0x00007ff8834c0000 	C:\WINDOWS\System32\sechost.dll
-0x00007ff8835f0000 - 0x00007ff883713000 	C:\WINDOWS\System32\RPCRT4.dll
-0x00007ff882dc0000 - 0x00007ff882de7000 	C:\WINDOWS\System32\bcrypt.dll
-0x00007ff86a080000 - 0x00007ff86a183000 	C:\Program Files (x86)\360\360Safe\safemon\libzdtp64.dll
-0x00007ff883720000 - 0x00007ff883e8f000 	C:\WINDOWS\System32\SHELL32.dll
-0x00007ff883150000 - 0x00007ff8831a5000 	C:\WINDOWS\System32\SHLWAPI.dll
-0x00007ff882030000 - 0x00007ff88203a000 	C:\WINDOWS\SYSTEM32\VERSION.dll
-0x00007ff84a9b0000 - 0x00007ff84aa4d000 	E:\idea\IntelliJ IDEA 2021.2.3\jbr\bin\msvcp140.dll
-0x00007ff819930000 - 0x00007ff81a488000 	E:\idea\IntelliJ IDEA 2021.2.3\jbr\bin\server\jvm.dll
-0x00007ff883580000 - 0x00007ff883588000 	C:\WINDOWS\System32\PSAPI.DLL
-0x00007ff87abe0000 - 0x00007ff87abe9000 	C:\WINDOWS\SYSTEM32\WSOCK32.dll
-0x00007ff86a470000 - 0x00007ff86a497000 	C:\WINDOWS\SYSTEM32\WINMM.dll
-0x00007ff884020000 - 0x00007ff88408b000 	C:\WINDOWS\System32\WS2_32.dll
-0x00007ff880cd0000 - 0x00007ff880ce2000 	C:\WINDOWS\SYSTEM32\kernel.appcore.dll
-0x00007ff878530000 - 0x00007ff878541000 	E:\idea\IntelliJ IDEA 2021.2.3\jbr\bin\verify.dll
-0x00007ff8807e0000 - 0x00007ff8809c4000 	C:\WINDOWS\SYSTEM32\DBGHELP.DLL
-0x00007ff85b990000 - 0x00007ff85b9c4000 	C:\WINDOWS\SYSTEM32\dbgcore.DLL
-0x00007ff882ab0000 - 0x00007ff882b32000 	C:\WINDOWS\System32\bcryptPrimitives.dll
-0x00007ff86bba0000 - 0x00007ff86bbc9000 	E:\idea\IntelliJ IDEA 2021.2.3\jbr\bin\java.dll
-0x00007ff878520000 - 0x00007ff87852b000 	E:\idea\IntelliJ IDEA 2021.2.3\jbr\bin\jimage.dll
-0x00007ff85ae20000 - 0x00007ff85ae38000 	E:\idea\IntelliJ IDEA 2021.2.3\jbr\bin\zip.dll
-
-dbghelp: loaded successfully - version: 4.0.5 - missing functions: none
-symbol engine: initialized successfully - sym options: 0x614 - pdb path: .;E:\idea\IntelliJ IDEA 2021.2.3\jbr\bin;C:\WINDOWS\SYSTEM32;C:\WINDOWS\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.19041.4355_none_60b8b9eb71f62e16;C:\Program Files (x86)\360\360Safe\safemon;E:\idea\IntelliJ IDEA 2021.2.3\jbr\bin\server
-
-VM Arguments:
-java_command: git4idea.http.GitAskPassApp Username for 'http://101.37.21.97:3000': 
-java_class_path (initial): E:/idea/IntelliJ IDEA 2021.2.3/plugins/git4idea/lib/git4idea-rt.jar;E:/idea/IntelliJ IDEA 2021.2.3/lib/3rd-party.jar
-Launcher Type: SUN_STANDARD
-
-[Global flags]
-     intx CICompilerCount                          = 4                                         {product} {ergonomic}
-     uint ConcGCThreads                            = 2                                         {product} {ergonomic}
-     uint G1ConcRefinementThreads                  = 8                                         {product} {ergonomic}
-   size_t G1HeapRegionSize                         = 1048576                                   {product} {ergonomic}
-    uintx GCDrainStackTargetSize                   = 64                                        {product} {ergonomic}
-   size_t InitialHeapSize                          = 268435456                                 {product} {ergonomic}
-   size_t MarkStackSize                            = 4194304                                   {product} {ergonomic}
-   size_t MaxHeapSize                              = 4265607168                                {product} {ergonomic}
-   size_t MinHeapDeltaBytes                        = 1048576                                   {product} {ergonomic}
-    uintx NonNMethodCodeHeapSize                   = 5836300                                {pd product} {ergonomic}
-    uintx NonProfiledCodeHeapSize                  = 122910970                              {pd product} {ergonomic}
-    uintx ProfiledCodeHeapSize                     = 122910970                              {pd product} {ergonomic}
-    uintx ReservedCodeCacheSize                    = 251658240                              {pd product} {ergonomic}
-     bool SegmentedCodeCache                       = true                                      {product} {ergonomic}
-     bool UseCompressedClassPointers               = true                                 {lp64_product} {ergonomic}
-     bool UseCompressedOops                        = true                                 {lp64_product} {ergonomic}
-     bool UseG1GC                                  = true                                      {product} {ergonomic}
-     bool UseLargePagesIndividualAllocation        = false                                  {pd product} {ergonomic}
-
-Logging:
-Log output configuration:
- #0: stdout all=warning uptime,level,tags
- #1: stderr all=off uptime,level,tags
-
-Environment Variables:
-JAVA_HOME=E:\java\jdk8
-CLASSPATH=.;E:\java\jdk8\lib\dt.jar;E:\java\jdk8\lib\tools.jar;
-PATH=E:\java\Git\mingw64\libexec\git-core;E:\java\Git\mingw64\libexec\git-core;E:\java\Git\mingw64\bin;E:\java\Git\usr\bin;C:\Users\douya\bin;D:\app\douya\product\11.2.0\dbhome_1\bin;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;E:\java\jdk8\bin;E:\java\jdk8\jre\bin;E:\java\gradle-3.0-rc-2\bin;E:\java\apache-tomcat-8.5.32\bi;E:\java\apache-tomcat-8.5.32\lib";C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\WINDOWS\System32\OpenSSH;E:\java\apache-maven-3.5.4\bin;E:\java\apache-maven-3.5.4\bin;node_global;C:\Program Files\Intel\WiFi\bin;E:\java\python;D:\rtmp\ffmpeg\bin;E:\java\xftp;E:\java\xsheel;E:\java\Git\cmd;E:\java\openssl-0.9.8k_X64\bin;C:\Users\douya\AppData\Roaming\nvm;C:\Program Files\nodejs;C:\Users\douya\AppData\Local\Microsoft\WindowsApps;E:\java\Microsoft VS Code\bin;E:\java\ieda\IntelliJ IDEA 2019.3.1\bin;D:\fiddler;E:\【批量下载】烧写驱动等\产品规格书光盘资料\K7G10光盘资料\PhoenixSuitLSB;C:\Users\douya\AppData\Local\Microsoft\WindowsApps;E:\idea\IntelliJ IDEA 2021.2.3\bin;C:\program files\esafenet\cobra docguard client;C:\Users\douya\AppData\Roaming\npm;C:\Users\douya\AppData\Roaming\nvm;C:\Program Files\nodejs
-USERNAME=douya
-DISPLAY=:0.0
-LC_ALL=en_US.UTF-8
-OS=Windows_NT
-PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 142 Stepping 10, GenuineIntel
-
-
-
----------------  S Y S T E M  ---------------
-
-OS: Windows 10 , 64 bit Build 19041 (10.0.19041.4717)
-OS uptime: 2 days 7:04 hours
-
-CPU:total 8 (initial active 8) (4 cores per cpu, 2 threads per core) family 6 model 142 stepping 10 microcode 0xb4, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, avx, avx2, aes, clmul, erms, 3dnowpref, lzcnt, ht, tsc, tscinvbit, bmi1, bmi2, adx, fma
-
-Memory: 4k page, system-wide physical 16266M (568M free)
-TotalPageFile size 29239M (AvailPageFile size 109M)
-current process WorkingSet (physical memory assigned to process): 12M, peak: 12M
-current process commit charge ("private bytes"): 61M, peak: 317M
-
-vm_info: OpenJDK 64-Bit Server VM (11.0.12+7-b1504.40) for windows-amd64 JRE (11.0.12+7-b1504.40), built on Sep 23 2021 14:38:03 by "" with MS VC++ 14.0 (VS2015)
-
-END.

+ 3 - 2
yiqi-admin/src/main/java/com/yiqi/admin/controller/core/GoodsInfoController.java

@@ -17,6 +17,7 @@ import com.yiqi.common.utils.poi.ExcelUtil;
 import com.yiqi.core.domain.GoodsInfo;
 import com.yiqi.core.domain.GoodsSku;
 import com.yiqi.core.domain.GoodsSkuSpec;
+import com.yiqi.core.domain.dto.GoodsInfoDto;
 import com.yiqi.core.domain.dto.GoodsInfoQueryByCommentDTO;
 import com.yiqi.core.domain.dto.GoodsSkuQueryByCommentDTO;
 import com.yiqi.core.domain.vo.GoodsInfoQueryVO;
@@ -103,7 +104,7 @@ public class GoodsInfoController extends BaseController {
     @Log(title = "商品管理", businessType = BusinessType.INSERT)
     @PostMapping
     @ApiOperation(value = "新增商品管理")
-    public AjaxResult add(@RequestBody GoodsInfo goods) {
+    public AjaxResult add(@RequestBody GoodsInfoDto goods) {
         return toAjax(goodsService.insertGoods(goods));
     }
 
@@ -114,7 +115,7 @@ public class GoodsInfoController extends BaseController {
     @Log(title = "商品管理", businessType = BusinessType.UPDATE)
     @PutMapping
     @ApiOperation(value = "修改商品管理")
-    public AjaxResult edit(@RequestBody GoodsInfo goods) {
+    public AjaxResult edit(@RequestBody GoodsInfoDto goods) {
         goods.setUpdateById(getUserId());
         goods.setUpdateBy(getUsername());
         return toAjax(goodsService.updateGoods(goods));

+ 7 - 0
yiqi-common/src/main/java/com/yiqi/core/domain/GoodsInfo.java

@@ -45,6 +45,13 @@ public class GoodsInfo extends BaseEntity {
     @ApiModelProperty("商品类别")
     private String goodsType;
 
+    /**
+     * 规格类型 0-单规格 1-多规格
+     */
+    @Excel(name = "规格类型")
+    @ApiModelProperty("规格类型")
+    private Integer skuType;
+
     /**
      * 商品分类
      */

+ 40 - 1
yiqi-common/src/main/java/com/yiqi/core/domain/GoodsSku.java

@@ -11,9 +11,10 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 /**
- * 物料明细对象 goods_sku
+ * 物料明细对象 goods_sku (里面的价格属于总部的价格)
  *
  * @author ruoyi
  * @date 2023-08-21
@@ -40,6 +41,44 @@ public class GoodsSku extends BaseEntity {
     @JsonSerialize(using = ToStringSerializer.class)
     private Long goodsId;
 
+    /**
+     * 商品零售价
+     */
+    @Excel(name = "零售价")
+    @ApiModelProperty("零售价")
+    private BigDecimal salePrice;
+
+    /**
+     * 总部批发价
+     */
+    @Excel(name = "批发价")
+    @ApiModelProperty("批发价")
+    private BigDecimal wholesalePrice;
+
+    /**
+     * 商品进货价
+     */
+    @Excel(name = "进货价")
+    @ApiModelProperty("进货价")
+    private BigDecimal purchasePrice;
+
+    /**
+     * 库存
+     */
+    @Excel(name = "库存")
+    @ApiModelProperty("库存")
+    private Integer stock;
+
+
+    /**
+     * 规格值组合
+     */
+    private String specs;
+
+
+    @TableField(exist = false)
+    private List<String> specValLists;
+
     /**
      * 来源类型
      */

+ 49 - 0
yiqi-common/src/main/java/com/yiqi/core/domain/GoodsSpec.java

@@ -0,0 +1,49 @@
+package com.yiqi.core.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.yiqi.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * 商品规格项
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("goods_spec")
+public class GoodsSpec extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 规格ID
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 商品ID
+     */
+    private Long goodsId;
+
+    /**
+     * 规格名称
+     */
+    private String name;
+
+    /**
+     * 规格名称
+     */
+    private String vals;
+
+    /**
+     * 规格值列表
+     */
+    @TableField(exist = false)
+    private List<String> specValues;
+}

+ 56 - 0
yiqi-common/src/main/java/com/yiqi/core/domain/dto/GoodsInfoDto.java

@@ -0,0 +1,56 @@
+package com.yiqi.core.domain.dto;
+
+import com.yiqi.common.annotation.Excel;
+import com.yiqi.core.domain.GoodsInfo;
+import com.yiqi.core.domain.GoodsSku;
+import com.yiqi.core.domain.GoodsSpec;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author douya
+ * @description
+ * @date 2025/3/8
+ */
+@Data
+public class GoodsInfoDto extends GoodsInfo {
+    private static final long serialVersionUID = 1L;
+
+    /** 规格列表 */
+    private List<GoodsSpec> specList;
+
+    /** SKU列表 */
+    private List<GoodsSku> skuList;
+
+    /**
+     * 商品零售价
+     */
+    @Excel(name = "零售价")
+    @ApiModelProperty("零售价")
+    private BigDecimal singleSkuPrice;
+
+    /**
+     * 总部批发价
+     */
+    @Excel(name = "批发价")
+    @ApiModelProperty("批发价")
+    private BigDecimal singleSkuWholesalePrice;
+
+    /**
+     * 商品进货价
+     */
+    @Excel(name = "进货价")
+    @ApiModelProperty("进货价")
+    private BigDecimal singleSkuPurchasePrice;
+
+    /**
+     * 库存
+     */
+    @Excel(name = "库存")
+    @ApiModelProperty("库存")
+    private Integer singleSkuStock;
+
+}

+ 1 - 0
yiqi-common/src/main/java/com/yiqi/core/domain/dto/GoodsSkuDTO.java

@@ -24,6 +24,7 @@ public class GoodsSkuDTO {
     private Long goodsSkuId;
 
     private Long storeId;
+
     private Long factoryId;
     /**
      * 来源类型

+ 6 - 1
yiqi-common/src/main/java/com/yiqi/core/domain/vo/GoodsSkuQueryVO.java

@@ -22,7 +22,7 @@ import java.util.Map;
  */
 @ApiModel("物料明细")
 @Data
-public class GoodsSkuQueryVO  {
+public class GoodsSkuQueryVO {
 
     private static final long serialVersionUID = 1L;
 
@@ -63,6 +63,11 @@ public class GoodsSkuQueryVO  {
     @ApiModelProperty("组织id")
     private Long targetId;
 
+    /**
+     * 规格值组合
+     */
+    private List<String> specs;
+
     /**
      * 来源类型
      */

+ 4 - 3
yiqi-common/src/main/java/com/yiqi/core/service/IGoodsInfoService.java

@@ -5,6 +5,7 @@ import java.util.Map;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yiqi.core.domain.GoodsInfo;
+import com.yiqi.core.domain.dto.GoodsInfoDto;
 import com.yiqi.core.domain.dto.GoodsUpdateSalesDTO;
 import com.yiqi.core.domain.dto.weapp.WeAppGoodsInfoQueryDTO;
 import com.yiqi.core.domain.vo.GoodsInfoAddVO;
@@ -29,7 +30,7 @@ public interface IGoodsInfoService extends IService<GoodsInfo> {
      * @param id 商品管理主键
      * @return 商品管理
      */
-    public GoodsInfo selectGoodsById(Long id);
+    public GoodsInfoDto selectGoodsById(Long id);
 
     /**
      * 查询商品管理列表
@@ -45,7 +46,7 @@ public interface IGoodsInfoService extends IService<GoodsInfo> {
      * @param goods 商品管理
      * @return 结果
      */
-    public int insertGoods(GoodsInfo goods);
+    public int insertGoods(GoodsInfoDto goods);
 
     /**
      * 修改商品管理
@@ -53,7 +54,7 @@ public interface IGoodsInfoService extends IService<GoodsInfo> {
      * @param goods 商品管理
      * @return 结果
      */
-    public int updateGoods(GoodsInfo goods);
+    public int updateGoods(GoodsInfoDto goods);
 
     /**
      * 批量删除商品管理

+ 21 - 0
yiqi-common/src/main/java/com/yiqi/core/service/IGoodsSpecService.java

@@ -0,0 +1,21 @@
+package com.yiqi.core.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yiqi.core.domain.GoodsSpec;
+
+import java.util.List;
+
+/**
+ * 商品管理Service接口
+ *
+ * @author ruoyi
+ * @date 2023-08-21
+ */
+public interface IGoodsSpecService extends IService<GoodsSpec> {
+
+    /**
+     * 查询商品规格列表
+     */
+    List<GoodsSpec> selectByGoodsId(Long goodsId);
+
+}

+ 7 - 0
yiqi-core/src/main/java/com/yiqi/core/mapper/GoodsSkuMapper.java

@@ -148,4 +148,11 @@ public interface GoodsSkuMapper extends BaseMapper<GoodsSku> {
      * @return 结果
      */
     public Long getGoodsSkuNumsByGoodsId(@Param("goodsId") Long goodsId);
+
+    /**
+     *
+     * @param id
+     * @return
+     */
+    List<GoodsSku> selectGoodsSkuListByGoodsId(@Param("goodsId") Long goodsId);
 }

+ 28 - 0
yiqi-core/src/main/java/com/yiqi/core/mapper/GoodsSpecMapper.java

@@ -0,0 +1,28 @@
+package com.yiqi.core.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yiqi.core.domain.GoodsSkuStore;
+import com.yiqi.core.domain.GoodsSpec;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface GoodsSpecMapper extends BaseMapper<GoodsSpec> {
+
+    /**
+     * 批量新增商品规格
+     */
+    int batchInsert(@Param("goodsId") Long goodsId, @Param("specList") List<GoodsSpec> specList);
+
+    /**
+     * 根据商品ID删除规格
+     */
+    int deleteByGoodsId(Long goodsId);
+
+    /**
+     * 查询商品规格列表
+     */
+    List<GoodsSpec> selectByGoodsId(Long goodsId);
+}

+ 184 - 15
yiqi-core/src/main/java/com/yiqi/core/service/impl/GoodsInfoServiceImpl.java

@@ -1,6 +1,7 @@
 package com.yiqi.core.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.yiqi.common.exception.ServiceException;
@@ -8,23 +9,33 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yiqi.common.enums.SourceType;
 import com.yiqi.common.utils.DateUtils;
 import com.yiqi.common.utils.SecurityUtils;
+import com.yiqi.common.utils.StringUtils;
+import com.yiqi.common.utils.bean.BeanUtils;
 import com.yiqi.core.domain.GoodsInfo;
+import com.yiqi.core.domain.GoodsSku;
+import com.yiqi.core.domain.GoodsSpec;
 import com.yiqi.core.domain.GoodsStore;
+import com.yiqi.core.domain.dto.GoodsInfoDto;
 import com.yiqi.core.domain.dto.GoodsUpdateSalesDTO;
 import com.yiqi.core.domain.dto.weapp.WeAppGoodsInfoQueryDTO;
 import com.yiqi.core.domain.vo.GoodsInfoQueryVO;
 import com.yiqi.core.domain.vo.weapp.WeAppGoodsInfoQueryVO;
 import com.yiqi.core.mapper.GoodsInfoMapper;
 import com.yiqi.core.mapper.GoodsSkuMapper;
+import com.yiqi.core.mapper.GoodsSpecMapper;
 import com.yiqi.core.service.IGoodsInfoService;
+import com.yiqi.core.service.IGoodsSpecService;
 import com.yiqi.core.service.IGoodsStoreService;
 import com.yiqi.order.domain.dto.RetailQueryGoodsDTO;
 import com.yiqi.order.domain.vo.OrderGoodsSkuInfoVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 商品管理Service业务层处理
@@ -39,6 +50,10 @@ public class GoodsInfoServiceImpl extends ServiceImpl<GoodsInfoMapper, GoodsInfo
     IGoodsStoreService goodsStoreService;
     @Autowired
     GoodsSkuMapper goodsSkuMapper;
+    @Autowired
+    GoodsSpecMapper goodsSpecMapper;
+    @Autowired
+    IGoodsSpecService goodsSpecService;
 
     @Override
     public List<WeAppGoodsInfoQueryVO> findPage(WeAppGoodsInfoQueryDTO weAppGoodsInfoQueryDTO) {
@@ -46,14 +61,34 @@ public class GoodsInfoServiceImpl extends ServiceImpl<GoodsInfoMapper, GoodsInfo
     }
 
     /**
-     * 查询商品管理
+     * 查询商品管理(总部)
      *
      * @param id 商品管理主键
      * @return 商品管理
      */
     @Override
-    public GoodsInfo selectGoodsById(Long id) {
-        return baseMapper.selectGoodsById(id);
+    public GoodsInfoDto selectGoodsById(Long id) {
+        GoodsInfo goodsInfo = baseMapper.selectById(id);
+        GoodsInfoDto goodsInfoDto = new GoodsInfoDto();
+        BeanUtils.copyProperties(goodsInfo, goodsInfoDto);
+        List<GoodsSku> goodsSkuList = goodsSkuMapper.selectGoodsSkuListByGoodsId(id);
+        // 设置规格值
+        goodsSkuList.forEach(goodsSku -> {
+            //values字符串数组转List
+            if (StringUtils.isNotBlank(goodsSku.getSpecs())) {
+                goodsSku.setSpecValLists(JSONUtil.toList(JSONUtil.parseArray(goodsSku.getSpecs()), String.class));
+            }
+        });
+        goodsInfoDto.setSkuList(goodsSkuList);
+        List<GoodsSpec> goodsSpecList = goodsSpecService.selectByGoodsId(id);
+        goodsInfoDto.setSpecList(goodsSpecList);
+        if(goodsInfoDto.getSkuType() == 0){
+            goodsInfoDto.setSingleSkuPrice(goodsInfoDto.getSkuList().get(0).getSalePrice());
+            goodsInfoDto.setSingleSkuWholesalePrice(goodsInfoDto.getSkuList().get(0).getWholesalePrice());
+            goodsInfoDto.setSingleSkuPurchasePrice(goodsInfoDto.getSkuList().get(0).getPurchasePrice());
+            goodsInfoDto.setSingleSkuStock(goodsInfoDto.getSkuList().get(0).getStock());
+        }
+        return goodsInfoDto;
     }
 
     /**
@@ -65,7 +100,7 @@ public class GoodsInfoServiceImpl extends ServiceImpl<GoodsInfoMapper, GoodsInfo
     @Override
     public List<GoodsInfoQueryVO> selectGoodsList(GoodsInfoQueryVO goodsInfoQueryVO) {
         List<GoodsInfoQueryVO> goodsInfoQueryVOList = baseMapper.selectGoodsList(goodsInfoQueryVO);
-        for(GoodsInfoQueryVO goodsInfoQuery : goodsInfoQueryVOList){
+        for (GoodsInfoQueryVO goodsInfoQuery : goodsInfoQueryVOList) {
             goodsInfoQuery.setGoodsItemNum(goodsSkuMapper.getGoodsSkuNumsByGoodsId(goodsInfoQuery.getId()));
         }
         return goodsInfoQueryVOList;
@@ -78,12 +113,46 @@ public class GoodsInfoServiceImpl extends ServiceImpl<GoodsInfoMapper, GoodsInfo
      * @return 结果
      */
     @Override
-    public int insertGoods(GoodsInfo goods) {
+    @Transactional(rollbackFor = Exception.class)
+    public int insertGoods(GoodsInfoDto goods) {
         goods.buildCreateData();
         goods.setSellNum(0);
         goods.setGoodComment(BigDecimal.ZERO);
+        goods.setDelFlag("0");
         int i = baseMapper.insertGoods(goods);
 
+        //如果是单规格
+        if (goods.getSkuType() == 0) {
+            GoodsSku goodsSku = new GoodsSku();
+            goodsSku.setSalePrice(goods.getSingleSkuPrice());
+            goodsSku.setWholesalePrice(goods.getSingleSkuWholesalePrice());
+            goodsSku.setPurchasePrice(goods.getSingleSkuPurchasePrice());
+            goodsSku.setStock(goods.getSingleSkuStock());
+            goodsSku.setSourceType(SourceType.MANAGER.getCode());
+            goodsSku.setStatus("0");
+            goodsSku.setDelFlag("0");
+            goodsSku.setSpecs(JSONUtil.toJsonStr(new ArrayList<>()));
+            goodsSku.setCreateTime(DateUtils.getNowDate());
+            goodsSku.setCreateById(SecurityUtils.getUserId());
+            goodsSku.setCreateBy(SecurityUtils.getUsername());
+            goodsSku.setGoodsId(goods.getId());
+            goodsSkuMapper.insert(goodsSku);
+        } else {
+            //新增规格
+            goods.getSpecList().forEach(goodsSpec -> {
+                goodsSpec.setVals(JSONUtil.toJsonStr(goodsSpec.getSpecValues()));
+                goodsSpec.setGoodsId(goods.getId());
+                goodsSpec.buildCreateData();
+                goodsSpecService.save(goodsSpec);
+            });
+            //新增SKU
+            goods.getSkuList().forEach(goodsSku -> {
+                goodsSku.setSpecs(JSONUtil.toJsonStr(goodsSku.getSpecValLists()));
+                goodsSku.setGoodsId(goods.getId());
+                goodsSku.buildCreateData();
+                goodsSkuMapper.insert(goodsSku);
+            });
+        }
         // 新增商品总部关系
         GoodsStore goodsStore = new GoodsStore();
         goodsStore.setSourceType(SourceType.MANAGER.getCode());
@@ -91,12 +160,10 @@ public class GoodsInfoServiceImpl extends ServiceImpl<GoodsInfoMapper, GoodsInfo
         goodsStore.setStatus("0");
         goodsStore.buildCreateData();
         goodsStoreService.insertGoodsStore(goodsStore);
-
         // 新增商品工厂关系
         goodsStoreService.insertGoodsToAllFactory(goodsStore);
         // 新增商品门店关系
         goodsStoreService.insertGoodsToAllStore(goodsStore);
-
         return i;
     }
 
@@ -107,9 +174,108 @@ public class GoodsInfoServiceImpl extends ServiceImpl<GoodsInfoMapper, GoodsInfo
      * @return 结果
      */
     @Override
-    public int updateGoods(GoodsInfo goods) {
+    @Transactional(rollbackFor = Exception.class)
+    public int updateGoods(GoodsInfoDto goods) {
+        if (goods.getId() == null) {
+            throw new ServiceException("商品ID不能为空");
+        }
         goods.setUpdateTime(DateUtils.getNowDate());
-        return baseMapper.updateGoods(goods);
+        //获取原商品的规格属性,如果商品的规格发生变更,则清除历史规格
+        GoodsInfo origin = baseMapper.selectById(goods.getId());
+        if (origin.getSkuType() != goods.getSkuType()) {
+            goodsSkuMapper.delete(new QueryWrapper<GoodsSku>().eq("goods_id", goods.getId()));
+            goodsSpecMapper.delete(new QueryWrapper<GoodsSpec>().eq("goods_id", goods.getId()));
+        }
+        //多规格处理
+        if (goods.getSkuType() == 1) {
+            if (CollUtil.isEmpty(goods.getSkuList())) {
+                throw new ServiceException("规格类型为多规格时,规格不能为空");
+            }
+            // 获取原规格列表
+            List<GoodsSpec> originalSpecList = goodsSpecService.selectByGoodsId(goods.getId());
+
+            // 创建新规格ID集合
+            List<Long> newSpecIds = goods.getSpecList().stream().map(GoodsSpec::getId).filter(id -> id != null).collect(Collectors.toList());
+
+            // 找出需要删除的规格
+            List<GoodsSpec> specsToDelete = originalSpecList.stream()
+                    .filter(originalSpec -> !newSpecIds.contains(originalSpec.getId()))
+                    .collect(Collectors.toList());
+
+            // 删除多余的规格
+            specsToDelete.forEach(specToDelete -> goodsSpecService.removeById(specToDelete.getId()));
+
+            // 更新或新增规格
+            goods.getSpecList().forEach(goodsSpec -> {
+                goodsSpec.setVals(JSONUtil.toJsonStr(goodsSpec.getSpecValues()));
+                if (goodsSpec.getId() != null) {
+                    goodsSpec.buildUpdateData();
+                    goodsSpecService.updateById(goodsSpec);
+                } else {
+                    goodsSpec.setGoodsId(goods.getId());
+                    goodsSpec.buildCreateData();
+                    goodsSpecService.save(goodsSpec);
+                }
+            });
+
+            // 获取原SKU列表
+            List<GoodsSku> originalSkuList = goodsSkuMapper.selectGoodsSkuListByGoodsId(goods.getId());
+
+            // 创建新SKU ID集合
+            List<Long> newSkuIds = goods.getSkuList().stream().map(GoodsSku::getId).filter(id -> id != null).collect(Collectors.toList());
+
+            // 找出需要删除的SKU
+            List<GoodsSku> skusToDelete = originalSkuList.stream()
+                    .filter(originalSku -> !newSkuIds.contains(originalSku.getId()))
+                    .collect(Collectors.toList());
+
+            // 删除多余的SKU
+            skusToDelete.forEach(skuToDelete -> goodsSkuMapper.deleteById(skuToDelete.getId()));
+
+            // 更新或新增SKU
+            goods.getSkuList().forEach(goodsSku -> {
+                goodsSku.setSpecs(JSONUtil.toJsonStr(goodsSku.getSpecValLists()));
+                if (goodsSku.getId() != null) {
+                    goodsSku.buildUpdateData();
+                    goodsSkuMapper.updateById(goodsSku);
+                } else {
+                    goodsSku.setSourceType(SourceType.MANAGER.getCode());
+                    goodsSku.setStatus("0");
+                    goodsSku.setDelFlag("0");
+                    goodsSku.setGoodsId(goods.getId());
+                    goodsSku.buildCreateData();
+                    goodsSkuMapper.insert(goodsSku);
+                }
+            });
+        } else {
+            //单规格处理,找到默认规格,更新默认规格,新增其他规格
+            GoodsSku oriSku = null;
+            List<GoodsSku> originalSkuList = goodsSkuMapper.selectGoodsSkuListByGoodsId(goods.getId());
+            if (originalSkuList == null) {
+                oriSku.setSalePrice(goods.getSingleSkuPrice());
+                oriSku.setWholesalePrice(goods.getSingleSkuWholesalePrice());
+                oriSku.setPurchasePrice(goods.getSingleSkuPurchasePrice());
+                oriSku.setStock(goods.getSingleSkuStock());
+                oriSku.setSourceType(SourceType.MANAGER.getCode());
+                oriSku.setStatus("0");
+                oriSku.setDelFlag("0");
+                oriSku.setSpecs(JSONUtil.toJsonStr(new ArrayList<>()));
+                oriSku.setCreateTime(DateUtils.getNowDate());
+                oriSku.setCreateById(SecurityUtils.getUserId());
+                oriSku.setCreateBy(SecurityUtils.getUsername());
+                oriSku.setGoodsId(goods.getId());
+                goodsSkuMapper.insert(oriSku);
+            }else {
+                oriSku = originalSkuList.get(0);
+                oriSku.setSalePrice(goods.getSingleSkuPrice());
+                oriSku.setWholesalePrice(goods.getSingleSkuWholesalePrice());
+                oriSku.setPurchasePrice(goods.getSingleSkuPurchasePrice());
+                oriSku.setStock(goods.getSingleSkuStock());
+                goodsSkuMapper.updateById(oriSku);
+            }
+        }
+        baseMapper.updateGoods(goods);
+        return 1; // 返回结果
     }
 
     /**
@@ -179,28 +345,30 @@ public class GoodsInfoServiceImpl extends ServiceImpl<GoodsInfoMapper, GoodsInfo
 
     /**
      * 处理商品销量
+     *
      * @param goodsUpdateSales
-     * @param isAdd  是否增加销售
+     * @param isAdd            是否增加销售
      * @return
      */
     @Override
     public int handleGoodsSellNum(List<GoodsUpdateSalesDTO> goodsUpdateSales, boolean isAdd) {
-        if (isAdd){
+        if (isAdd) {
             return baseMapper.addGoodsSaleNumber(goodsUpdateSales);
-        }else {
+        } else {
             return baseMapper.minusGoodsSaleNumber(goodsUpdateSales);
         }
     }
 
     /**
      * 直接更新虚拟销售的值
+     *
      * @param goodsId
      * @param virtualSellNum
      * @return
      */
     @Override
     public int updateGoodsVirtualSellNum(Long goodsId, Integer virtualSellNum) {
-         this.update(new UpdateWrapper<GoodsInfo>().lambda()
+        this.update(new UpdateWrapper<GoodsInfo>().lambda()
                 .set(GoodsInfo::getVirtualSellNum, virtualSellNum)
                 .eq(GoodsInfo::getId, goodsId));
         return 1;
@@ -208,16 +376,17 @@ public class GoodsInfoServiceImpl extends ServiceImpl<GoodsInfoMapper, GoodsInfo
 
     /**
      * 获取商品物料信息,通过物料id
+     *
      * @param skuIdList
      * @param sourceType
      * @return
      */
     @Override
     public List<OrderGoodsSkuInfoVO> getSkuInfoList(List<Long> skuIdList, String sourceType) {
-        if (SourceType.MANAGER.getCode().equals(sourceType)){
+        if (SourceType.MANAGER.getCode().equals(sourceType)) {
             return baseMapper.getSkuInfoListByApp(skuIdList);
         }
-        if (SourceType.STORE.getCode().equals(sourceType)){
+        if (SourceType.STORE.getCode().equals(sourceType)) {
             return baseMapper.getSkuInfoListByStore(skuIdList, SecurityUtils.getLoginUser().getSourceType(), SecurityUtils.getLoginUser().getOrgId());
         }
         return null;

+ 1 - 1
yiqi-core/src/main/java/com/yiqi/core/service/impl/GoodsSkuServiceImpl.java

@@ -224,7 +224,7 @@ public class GoodsSkuServiceImpl extends ServiceImpl<GoodsSkuMapper, GoodsSku> i
         goodsSku.setCreateTime(DateUtils.getNowDate());
         goodsSku.setStatus("0");
         goodsSku.setDelFlag("0");
-        baseMapper.insertGoodsSku(goodsSku);
+        baseMapper.insert(goodsSku);
         return goodsSku;
     }
 

+ 45 - 0
yiqi-core/src/main/java/com/yiqi/core/service/impl/GoodsSpecServiceImpl.java

@@ -0,0 +1,45 @@
+package com.yiqi.core.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.yiqi.common.utils.StringUtils;
+import com.yiqi.core.domain.GoodsSpec;
+import com.yiqi.core.mapper.GoodsSpecMapper;
+import com.yiqi.core.service.IGoodsSpecService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 商品管理Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2023-08-21
+ */
+@Service
+public class GoodsSpecServiceImpl extends ServiceImpl<GoodsSpecMapper, GoodsSpec> implements IGoodsSpecService {
+
+    private final ObjectMapper objectMapper = new ObjectMapper();
+
+    @Override
+    public List<GoodsSpec> selectByGoodsId(Long goodsId) {
+        List<GoodsSpec> goodsSpecList = baseMapper.selectByGoodsId(goodsId);
+        // 设置规格值
+        goodsSpecList.forEach(goodsSpec -> {
+            //values字符串数组转List
+            if (StringUtils.isNotBlank(goodsSpec.getVals())) {
+                try {
+                    List<String> specValues = objectMapper.readValue(goodsSpec.getVals(), new TypeReference<List<String>>() {});
+                    goodsSpec.setSpecValues(specValues);
+                } catch (Exception e) {
+                    // 处理异常情况
+                    e.printStackTrace();
+                }
+            }
+        });
+        return goodsSpecList;
+    }
+
+}
+

+ 0 - 13
yiqi-core/src/main/java/com/yiqi/recharge/service/impl/RechargePasswordCardServiceImpl.java

@@ -214,19 +214,6 @@ public class RechargePasswordCardServiceImpl extends ServiceImpl<RechargePasswor
                 appUserBillMstrs.add(buildBillMstr(consumeOrderDTO, rechargePasswordCard, rechargeAmount, giveAmount, welfareAmount));
                 break;
             }
-
-//            if (rechargePasswordCard.getWelfareBalance() != null
-//                    && rechargePasswordCard.getWelfareBalance().doubleValue() > 0) {
-//                if (rechargePasswordCard.getWelfareBalance().doubleValue() >= amount.doubleValue()) {
-//                    rechargePasswordCard.setWelfareBalance(rechargePasswordCard.getWelfareBalance().subtract(amount));
-//                    welfareAmount = welfareAmount.add(amount);
-//                    amount = BigDecimal.ZERO;
-//                } else {
-//                    amount = amount.subtract(rechargePasswordCard.getWelfareBalance());
-//                    welfareAmount = welfareAmount.add(rechargePasswordCard.getWelfareBalance());
-//                    rechargePasswordCard.setWelfareBalance(BigDecimal.ZERO);
-//                }
-//            }
             updateList.add(rechargePasswordCard);
             appUserBillMstrs.add(buildBillMstr(consumeOrderDTO, rechargePasswordCard, rechargeAmount, giveAmount, welfareAmount));
             if (amount.doubleValue() == 0) {//扣款完成

+ 7 - 5
yiqi-core/src/main/resources/mapper/core/GoodsSkuMapper.xml

@@ -239,7 +239,7 @@
         c.wholesale_price as purchasePrice, c.stock as stock
         from goods_sku a
         left join goods_info e on e.id = a.goods_id
-        left join goods_sku_store c on c.goods_sku_id = a.id and c.source_type = '00'
+        left join goods_sku_store c on c.goods_sku_id = a.id and c.source_type = '01' and c.target_id = #{factoryId}
         where a.del_flag = 0 and a.status = 0
         <if test="goodsIdList != null">
             and a.goods_id in
@@ -255,7 +255,7 @@
         c.wholesale_price as purchasePrice, c.stock as stock
         from goods_sku a
         left join goods_info e on e.id = a.goods_id
-        left join goods_sku_store c on c.goods_sku_id = a.id and c.source_type = '00'
+        left join goods_sku_store c on c.goods_sku_id = a.id and c.source_type = '02' and c.target_id = #{storeId}
         where a.del_flag = 0 and a.status = 0
         <if test="goodsIdList != null">
             and a.goods_id in
@@ -275,10 +275,7 @@
         left join goods_info e on e.id = a.goods_id
         left join goods_sku_store c on c.goods_sku_id = a.id and c.source_type = '00'
         where a.del_flag = 0 and a.status = 0
-
         and a.goods_id = #{goodsId}
-
-
     </select>
 
     <select id="selectRetailGoodsSkuInfoByFactory" resultType="com.yiqi.core.domain.vo.GoodsSkuQueryVO">
@@ -311,4 +308,9 @@
     <select id="getGoodsSkuNumsByGoodsId" resultType="java.lang.Long" parameterType="java.lang.Long">
         select count(1) from goods_sku where goods_id = #{goodsId} and del_flag = 0
     </select>
+
+    <select id="selectGoodsSkuListByGoodsId" resultType="com.yiqi.core.domain.GoodsSku">
+        select * from goods_sku where goods_id = #{goodsId} and del_flag = 0
+    </select>
+
 </mapper>

+ 26 - 0
yiqi-core/src/main/resources/mapper/core/GoodsSpecMapper.xml

@@ -0,0 +1,26 @@
+<?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.yiqi.core.mapper.GoodsSpecMapper">
+
+    <insert id="batchInsert">
+        insert into goods_spec (
+        goods_id, name, values,
+        create_by, create_time, update_by, update_time, remark
+        ) values
+        <foreach collection="specList" item="spec" separator=",">
+            (
+            #{goodsId}, #{spec.name}, #{spec.values},
+            #{spec.createBy}, sysdate(), #{spec.updateBy}, sysdate(), #{spec.remark}
+            )
+        </foreach>
+    </insert>
+
+    <delete id="deleteByGoodsId">
+        delete from goods_spec where goods_id = #{goodsId}
+    </delete>
+
+    <select id="selectByGoodsId" resultType="com.yiqi.core.domain.GoodsSpec">
+        select * from goods_spec where goods_id = #{goodsId}
+    </select>
+
+</mapper>