Commit b16632ea410dfa81c79219c005068563ac37b522

Authored by 芋道源码
Committed by Gitee
2 parents 6b1d996b 26f563df

!522 mall seckill

Merge pull request !522 from puhui999/feature/mall_product
Showing 110 changed files with 1903 additions and 1449 deletions

Too many changes.

To preserve performance only 100 of 110 files are displayed.

sql/dm/ruoyi-vue-pro-dm8.sql
@@ -1797,27 +1797,112 @@ INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT" @@ -1797,27 +1797,112 @@ INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT"
1797 INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2046,'满减送活动关闭','promotion:reward-activity:close',3,5,2041,'','','',null,0,1,1,1,'1','2022-11-05 10:42:53','1','2022-11-05 10:42:53',0); 1797 INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2046,'满减送活动关闭','promotion:reward-activity:close',3,5,2041,'','','',null,0,1,1,1,'1','2022-11-05 10:42:53','1','2022-11-05 10:42:53',0);
1798 INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2047,'限时折扣活动','',2,7,2030,'discount-activity','time','mall/promotion/discountActivity/index','PromotionDiscountActivity',0,1,1,1,'','2022-11-05 17:12:15','1','2023-04-08 11:45:44',0); 1798 INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2047,'限时折扣活动','',2,7,2030,'discount-activity','time','mall/promotion/discountActivity/index','PromotionDiscountActivity',0,1,1,1,'','2022-11-05 17:12:15','1','2023-04-08 11:45:44',0);
1799 INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2048,'限时折扣活动查询','promotion:discount-activity:query',3,1,2047,'','','',null,0,1,1,1,'','2022-11-05 17:12:15','','2022-11-05 17:12:15',0); 1799 INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2048,'限时折扣活动查询','promotion:discount-activity:query',3,1,2047,'','','',null,0,1,1,1,'','2022-11-05 17:12:15','','2022-11-05 17:12:15',0);
1800 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2049,'限时折扣活动创建','promotion:discount-activity:create',3,2,2047,'','','',null,0,1,1,1,'','2022-11-05 17:12:15','','2022-11-05 17:12:15',0);  
1801 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2050,'限时折扣活动更新','promotion:discount-activity:update',3,3,2047,'','','',null,0,1,1,1,'','2022-11-05 17:12:16','','2022-11-05 17:12:16',0);  
1802 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2051,'限时折扣活动删除','promotion:discount-activity:delete',3,4,2047,'','','',null,0,1,1,1,'','2022-11-05 17:12:16','','2022-11-05 17:12:16',0);  
1803 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2052,'限时折扣活动关闭','promotion:discount-activity:close',3,5,2047,'','','',null,0,1,1,1,'','2022-11-05 17:12:16','','2022-11-05 17:12:16',0);  
1804 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2059,'秒杀活动管理','',2,0,2030,'seckill-activity','time-range','mall/promotion/seckill/seckillActivity/index','PromotionSeckillActivity',0,1,1,1,'','2022-11-06 22:24:49','1','2023-04-08 11:46:02',0);  
1805 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2060,'秒杀活动查询','promotion:seckill-activity:query',3,1,2059,'','','',null,0,1,1,1,'','2022-11-06 22:24:49','','2022-11-06 22:24:49',0);  
1806 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2061,'秒杀活动创建','promotion:seckill-activity:create',3,2,2059,'','','',null,0,1,1,1,'','2022-11-06 22:24:49','','2022-11-06 22:24:49',0);  
1807 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2062,'秒杀活动更新','promotion:seckill-activity:update',3,3,2059,'','','',null,0,1,1,1,'','2022-11-06 22:24:49','','2022-11-06 22:24:49',0);  
1808 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2063,'秒杀活动删除','promotion:seckill-activity:delete',3,4,2059,'','','',null,0,1,1,1,'','2022-11-06 22:24:49','','2022-11-06 22:24:49',0);  
1809 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2064,'秒杀活动导出','promotion:seckill-activity:export',3,5,2059,'','','',null,0,1,1,1,'','2022-11-06 22:24:49','','2022-11-06 22:24:49',0);  
1810 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2066,'秒杀时段管理','',2,0,2030,'seckill-time','','mall/promotion/seckill/seckillTime/index','PromotionSeckillTime',0,0,1,1,'','2022-11-15 19:46:50','1','2023-04-08 11:46:17',0);  
1811 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2067,'秒杀时段查询','promotion:seckill-time:query',3,1,2066,'','','',null,0,1,1,1,'','2022-11-15 19:46:51','','2022-11-15 19:46:51',0);  
1812 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2068,'秒杀时段创建','promotion:seckill-time:create',3,2,2066,'','','',null,0,1,1,1,'','2022-11-15 19:46:51','','2022-11-15 19:46:51',0);  
1813 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2069,'秒杀时段更新','promotion:seckill-time:update',3,3,2066,'','','',null,0,1,1,1,'','2022-11-15 19:46:51','','2022-11-15 19:46:51',0);  
1814 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2070,'秒杀时段删除','promotion:seckill-time:delete',3,4,2066,'','','',null,0,1,1,1,'','2022-11-15 19:46:51','','2022-11-15 19:46:51',0);  
1815 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2071,'秒杀时段导出','promotion:seckill-time:export',3,5,2066,'','','',null,0,1,1,1,'','2022-11-15 19:46:51','','2022-11-15 19:46:51',0);  
1816 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2072,'订单中心','',1,65,0,'/trade','order',null,null,0,1,1,1,'1','2022-11-19 18:57:19','1','2022-12-10 16:32:57',0);  
1817 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2073,'售后退款','',2,1,2072,'trade/after-sale','education','mall/trade/afterSale/index','TradeAfterSale',0,1,1,1,'','2022-11-19 20:15:32','1','2023-04-08 11:43:19',0);  
1818 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2074,'售后查询','trade:after-sale:query',3,1,2073,'','','',null,0,1,1,1,'','2022-11-19 20:15:33','1','2022-12-10 21:04:29',0);  
1819 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2075,'秒杀活动关闭','promotion:sekill-activity:close',3,6,2059,'','','',null,0,1,1,1,'1','2022-11-28 20:20:15','1','2022-11-28 20:20:15',0);  
1820 -INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2076,'订单列表','',2,0,2072,'trade/order','list','mall/trade/order/index','TradeOrder',0,1,1,1,'1','2022-12-10 21:05:44','1','2023-04-08 11:42:23',0); 1800 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1801 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1802 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1803 +VALUES (2049, '限时折扣活动创建', 'promotion:discount-activity:create', 3, 2, 2047, '', '', '', null, 0, 1, 1, 1, '',
  1804 + '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', 0);
  1805 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1806 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1807 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1808 +VALUES (2050, '限时折扣活动更新', 'promotion:discount-activity:update', 3, 3, 2047, '', '', '', null, 0, 1, 1, 1, '',
  1809 + '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', 0);
  1810 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1811 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1812 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1813 +VALUES (2051, '限时折扣活动删除', 'promotion:discount-activity:delete', 3, 4, 2047, '', '', '', null, 0, 1, 1, 1, '',
  1814 + '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', 0);
  1815 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1816 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1817 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1818 +VALUES (2052, '限时折扣活动关闭', 'promotion:discount-activity:close', 3, 5, 2047, '', '', '', null, 0, 1, 1, 1, '',
  1819 + '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', 0);
  1820 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1821 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1822 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1823 +VALUES (2059, '秒杀活动管理', '', 2, 0, 2030, 'seckill-activity', 'time-range',
  1824 + 'mall/promotion/seckill/seckillActivity/index', 'PromotionSeckillActivity', 0, 1, 1, 1, '',
  1825 + '2022-11-06 22:24:49', '1', '2023-04-08 11:46:02', 0);
  1826 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1827 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1828 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1829 +VALUES (2060, '秒杀活动查询', 'promotion:seckill-activity:query', 3, 1, 2059, '', '', '', null, 0, 1, 1, 1, '',
  1830 + '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', 0);
  1831 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1832 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1833 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1834 +VALUES (2061, '秒杀活动创建', 'promotion:seckill-activity:create', 3, 2, 2059, '', '', '', null, 0, 1, 1, 1, '',
  1835 + '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', 0);
  1836 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1837 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1838 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1839 +VALUES (2062, '秒杀活动更新', 'promotion:seckill-activity:update', 3, 3, 2059, '', '', '', null, 0, 1, 1, 1, '',
  1840 + '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', 0);
  1841 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1842 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1843 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1844 +VALUES (2063, '秒杀活动删除', 'promotion:seckill-activity:delete', 3, 4, 2059, '', '', '', null, 0, 1, 1, 1, '',
  1845 + '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', 0);
  1846 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1847 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1848 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1849 +VALUES (2064, '秒杀活动导出', 'promotion:seckill-activity:export', 3, 5, 2059, '', '', '', null, 0, 1, 1, 1, '',
  1850 + '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', 0);
  1851 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1852 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1853 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1854 +VALUES (2066, '秒杀时段管理', '', 2, 0, 2030, 'seckill-time', '', 'mall/promotion/seckill/SeckillConfig/index',
  1855 + 'PromotionSeckillConfig', 0, 0, 1, 1, '', '2022-11-15 19:46:50', '1', '2023-04-08 11:46:17', 0);
  1856 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1857 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1858 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1859 +VALUES (2067, '秒杀时段查询', 'promotion:seckill-time:query', 3, 1, 2066, '', '', '', null, 0, 1, 1, 1, '',
  1860 + '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', 0);
  1861 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1862 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1863 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1864 +VALUES (2068, '秒杀时段创建', 'promotion:seckill-time:create', 3, 2, 2066, '', '', '', null, 0, 1, 1, 1, '',
  1865 + '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', 0);
  1866 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1867 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1868 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1869 +VALUES (2069, '秒杀时段更新', 'promotion:seckill-time:update', 3, 3, 2066, '', '', '', null, 0, 1, 1, 1, '',
  1870 + '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', 0);
  1871 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1872 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1873 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1874 +VALUES (2070, '秒杀时段删除', 'promotion:seckill-time:delete', 3, 4, 2066, '', '', '', null, 0, 1, 1, 1, '',
  1875 + '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', 0);
  1876 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1877 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1878 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1879 +VALUES (2071, '秒杀时段导出', 'promotion:seckill-time:export', 3, 5, 2066, '', '', '', null, 0, 1, 1, 1, '',
  1880 + '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', 0);
  1881 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1882 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1883 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1884 +VALUES (2072, '订单中心', '', 1, 65, 0, '/trade', 'order', null, null, 0, 1, 1, 1, '1', '2022-11-19 18:57:19', '1',
  1885 + '2022-12-10 16:32:57', 0);
  1886 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1887 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1888 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1889 +VALUES (2073, '售后退款', '', 2, 1, 2072, 'trade/after-sale', 'education', 'mall/trade/afterSale/index',
  1890 + 'TradeAfterSale', 0, 1, 1, 1, '', '2022-11-19 20:15:32', '1', '2023-04-08 11:43:19', 0);
  1891 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1892 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1893 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1894 +VALUES (2074, '售后查询', 'trade:after-sale:query', 3, 1, 2073, '', '', '', null, 0, 1, 1, 1, '', '2022-11-19 20:15:33',
  1895 + '1', '2022-12-10 21:04:29', 0);
  1896 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1897 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1898 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1899 +VALUES (2075, '秒杀活动关闭', 'promotion:sekill-activity:close', 3, 6, 2059, '', '', '', null, 0, 1, 1, 1, '1',
  1900 + '2022-11-28 20:20:15', '1', '2022-11-28 20:20:15', 0);
  1901 +INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID", "NAME", "PERMISSION", "TYPE", "SORT", "PARENT_ID", "PATH", "ICON",
  1902 + "COMPONENT", "COMPONENT_NAME", "STATUS", "VISIBLE", "KEEP_ALIVE",
  1903 + "ALWAYS_SHOW", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED")
  1904 +VALUES (2076, '订单列表', '', 2, 0, 2072, 'trade/order', 'list', 'mall/trade/order/index', 'TradeOrder', 0, 1, 1, 1,
  1905 + '1', '2022-12-10 21:05:44', '1', '2023-04-08 11:42:23', 0);
1821 INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2077,'物流公司管理管理','',2,0,2072,'express-company','','mall/trade/expressCompany/index',null,0,1,1,1,'','2022-12-20 23:27:55','1','2022-12-20 23:36:20',0); 1906 INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2077,'物流公司管理管理','',2,0,2072,'express-company','','mall/trade/expressCompany/index',null,0,1,1,1,'','2022-12-20 23:27:55','1','2022-12-20 23:36:20',0);
1822 INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2078,'物流公司管理查询','trade:express-company:query',3,1,2077,'','','',null,0,1,1,1,'','2022-12-20 23:27:55','','2022-12-20 23:27:55',0); 1907 INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2078,'物流公司管理查询','trade:express-company:query',3,1,2077,'','','',null,0,1,1,1,'','2022-12-20 23:27:55','','2022-12-20 23:27:55',0);
1823 INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2079,'物流公司管理创建','trade:express-company:create',3,2,2077,'','','',null,0,1,1,1,'','2022-12-20 23:27:55','','2022-12-20 23:27:55',0); 1908 INSERT INTO "RUOYI_VUE_PRO"."SYSTEM_MENU"("ID","NAME","PERMISSION","TYPE","SORT","PARENT_ID","PATH","ICON","COMPONENT","COMPONENT_NAME","STATUS","VISIBLE","KEEP_ALIVE","ALWAYS_SHOW","CREATOR","CREATE_TIME","UPDATER","UPDATE_TIME","DELETED") VALUES(2079,'物流公司管理创建','trade:express-company:create',3,2,2077,'','','',null,0,1,1,1,'','2022-12-20 23:27:55','','2022-12-20 23:27:55',0);
sql/mysql/ruoyi-vue-pro.sql
@@ -1980,27 +1980,112 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i @@ -1980,27 +1980,112 @@ INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_i
1980 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2046, '满减送活动关闭', 'promotion:reward-activity:close', 3, 5, 2041, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-11-05 10:42:53', '1', '2022-11-05 10:42:53', b'0'); 1980 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2046, '满减送活动关闭', 'promotion:reward-activity:close', 3, 5, 2041, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-11-05 10:42:53', '1', '2022-11-05 10:42:53', b'0');
1981 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2047, '限时折扣活动', '', 2, 7, 2030, 'discount-activity', 'time', 'mall/promotion/discountActivity/index', 'PromotionDiscountActivity', 0, b'1', b'1', b'1', '', '2022-11-05 17:12:15', '1', '2023-04-08 11:45:44', b'0'); 1981 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2047, '限时折扣活动', '', 2, 7, 2030, 'discount-activity', 'time', 'mall/promotion/discountActivity/index', 'PromotionDiscountActivity', 0, b'1', b'1', b'1', '', '2022-11-05 17:12:15', '1', '2023-04-08 11:45:44', b'0');
1982 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2048, '限时折扣活动查询', 'promotion:discount-activity:query', 3, 1, 2047, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', b'0'); 1982 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2048, '限时折扣活动查询', 'promotion:discount-activity:query', 3, 1, 2047, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', b'0');
1983 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2049, '限时折扣活动创建', 'promotion:discount-activity:create', 3, 2, 2047, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', b'0');  
1984 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2050, '限时折扣活动更新', 'promotion:discount-activity:update', 3, 3, 2047, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', b'0');  
1985 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2051, '限时折扣活动删除', 'promotion:discount-activity:delete', 3, 4, 2047, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', b'0');  
1986 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2052, '限时折扣活动关闭', 'promotion:discount-activity:close', 3, 5, 2047, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', b'0');  
1987 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2059, '秒杀活动管理', '', 2, 0, 2030, 'seckill-activity', 'time-range', 'mall/promotion/seckill/seckillActivity/index', 'PromotionSeckillActivity', 0, b'1', b'1', b'1', '', '2022-11-06 22:24:49', '1', '2023-04-08 11:46:02', b'0');  
1988 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2060, '秒杀活动查询', 'promotion:seckill-activity:query', 3, 1, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');  
1989 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2061, '秒杀活动创建', 'promotion:seckill-activity:create', 3, 2, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');  
1990 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2062, '秒杀活动更新', 'promotion:seckill-activity:update', 3, 3, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');  
1991 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2063, '秒杀活动删除', 'promotion:seckill-activity:delete', 3, 4, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');  
1992 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2064, '秒杀活动导出', 'promotion:seckill-activity:export', 3, 5, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');  
1993 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2066, '秒杀时段管理', '', 2, 0, 2030, 'seckill-time', '', 'mall/promotion/seckill/seckillTime/index', 'PromotionSeckillTime', 0, b'0', b'1', b'1', '', '2022-11-15 19:46:50', '1', '2023-04-08 11:46:17', b'0');  
1994 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2067, '秒杀时段查询', 'promotion:seckill-time:query', 3, 1, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');  
1995 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2068, '秒杀时段创建', 'promotion:seckill-time:create', 3, 2, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');  
1996 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2069, '秒杀时段更新', 'promotion:seckill-time:update', 3, 3, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');  
1997 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2070, '秒杀时段删除', 'promotion:seckill-time:delete', 3, 4, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');  
1998 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2071, '秒杀时段导出', 'promotion:seckill-time:export', 3, 5, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');  
1999 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2072, '订单中心', '', 1, 65, 0, '/trade', 'order', NULL, NULL, 0, b'1', b'1', b'1', '1', '2022-11-19 18:57:19', '1', '2022-12-10 16:32:57', b'0');  
2000 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2073, '售后退款', '', 2, 1, 2072, 'trade/after-sale', 'education', 'mall/trade/afterSale/index', 'TradeAfterSale', 0, b'1', b'1', b'1', '', '2022-11-19 20:15:32', '1', '2023-04-08 11:43:19', b'0');  
2001 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2074, '售后查询', 'trade:after-sale:query', 3, 1, 2073, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-11-19 20:15:33', '1', '2022-12-10 21:04:29', b'0');  
2002 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2075, '秒杀活动关闭', 'promotion:sekill-activity:close', 3, 6, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '1', '2022-11-28 20:20:15', '1', '2022-11-28 20:20:15', b'0');  
2003 -INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2076, '订单列表', '', 2, 0, 2072, 'trade/order', 'list', 'mall/trade/order/index', 'TradeOrder', 0, b'1', b'1', b'1', '1', '2022-12-10 21:05:44', '1', '2023-04-08 11:42:23', b'0'); 1983 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  1984 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  1985 + `updater`, `update_time`, `deleted`)
  1986 +VALUES (2049, '限时折扣活动创建', 'promotion:discount-activity:create', 3, 2, 2047, '', '', '', NULL, 0, b'1', b'1',
  1987 + b'1', '', '2022-11-05 17:12:15', '', '2022-11-05 17:12:15', b'0');
  1988 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  1989 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  1990 + `updater`, `update_time`, `deleted`)
  1991 +VALUES (2050, '限时折扣活动更新', 'promotion:discount-activity:update', 3, 3, 2047, '', '', '', NULL, 0, b'1', b'1',
  1992 + b'1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', b'0');
  1993 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  1994 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  1995 + `updater`, `update_time`, `deleted`)
  1996 +VALUES (2051, '限时折扣活动删除', 'promotion:discount-activity:delete', 3, 4, 2047, '', '', '', NULL, 0, b'1', b'1',
  1997 + b'1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', b'0');
  1998 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  1999 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  2000 + `updater`, `update_time`, `deleted`)
  2001 +VALUES (2052, '限时折扣活动关闭', 'promotion:discount-activity:close', 3, 5, 2047, '', '', '', NULL, 0, b'1', b'1',
  2002 + b'1', '', '2022-11-05 17:12:16', '', '2022-11-05 17:12:16', b'0');
  2003 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  2004 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  2005 + `updater`, `update_time`, `deleted`)
  2006 +VALUES (2059, '秒杀活动管理', '', 2, 0, 2030, 'seckill-activity', 'time-range',
  2007 + 'mall/promotion/seckill/seckillActivity/index', 'PromotionSeckillActivity', 0, b'1', b'1', b'1', '',
  2008 + '2022-11-06 22:24:49', '1', '2023-04-08 11:46:02', b'0');
  2009 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  2010 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  2011 + `updater`, `update_time`, `deleted`)
  2012 +VALUES (2060, '秒杀活动查询', 'promotion:seckill-activity:query', 3, 1, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '',
  2013 + '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');
  2014 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  2015 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  2016 + `updater`, `update_time`, `deleted`)
  2017 +VALUES (2061, '秒杀活动创建', 'promotion:seckill-activity:create', 3, 2, 2059, '', '', '', NULL, 0, b'1', b'1', b'1',
  2018 + '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');
  2019 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  2020 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  2021 + `updater`, `update_time`, `deleted`)
  2022 +VALUES (2062, '秒杀活动更新', 'promotion:seckill-activity:update', 3, 3, 2059, '', '', '', NULL, 0, b'1', b'1', b'1',
  2023 + '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');
  2024 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  2025 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  2026 + `updater`, `update_time`, `deleted`)
  2027 +VALUES (2063, '秒杀活动删除', 'promotion:seckill-activity:delete', 3, 4, 2059, '', '', '', NULL, 0, b'1', b'1', b'1',
  2028 + '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');
  2029 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  2030 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  2031 + `updater`, `update_time`, `deleted`)
  2032 +VALUES (2064, '秒杀活动导出', 'promotion:seckill-activity:export', 3, 5, 2059, '', '', '', NULL, 0, b'1', b'1', b'1',
  2033 + '', '2022-11-06 22:24:49', '', '2022-11-06 22:24:49', b'0');
  2034 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  2035 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  2036 + `updater`, `update_time`, `deleted`)
  2037 +VALUES (2066, '秒杀时段管理', '', 2, 0, 2030, 'seckill-time', '', 'mall/promotion/seckill/SeckillConfig/index',
  2038 + 'PromotionSeckillConfig', 0, b'0', b'1', b'1', '', '2022-11-15 19:46:50', '1', '2023-04-08 11:46:17', b'0');
  2039 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  2040 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  2041 + `updater`, `update_time`, `deleted`)
  2042 +VALUES (2067, '秒杀时段查询', 'promotion:seckill-time:query', 3, 1, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '',
  2043 + '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');
  2044 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  2045 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  2046 + `updater`, `update_time`, `deleted`)
  2047 +VALUES (2068, '秒杀时段创建', 'promotion:seckill-time:create', 3, 2, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '',
  2048 + '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');
  2049 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  2050 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  2051 + `updater`, `update_time`, `deleted`)
  2052 +VALUES (2069, '秒杀时段更新', 'promotion:seckill-time:update', 3, 3, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '',
  2053 + '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');
  2054 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  2055 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  2056 + `updater`, `update_time`, `deleted`)
  2057 +VALUES (2070, '秒杀时段删除', 'promotion:seckill-time:delete', 3, 4, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '',
  2058 + '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');
  2059 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  2060 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  2061 + `updater`, `update_time`, `deleted`)
  2062 +VALUES (2071, '秒杀时段导出', 'promotion:seckill-time:export', 3, 5, 2066, '', '', '', NULL, 0, b'1', b'1', b'1', '',
  2063 + '2022-11-15 19:46:51', '', '2022-11-15 19:46:51', b'0');
  2064 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  2065 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  2066 + `updater`, `update_time`, `deleted`)
  2067 +VALUES (2072, '订单中心', '', 1, 65, 0, '/trade', 'order', NULL, NULL, 0, b'1', b'1', b'1', '1', '2022-11-19 18:57:19',
  2068 + '1', '2022-12-10 16:32:57', b'0');
  2069 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  2070 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  2071 + `updater`, `update_time`, `deleted`)
  2072 +VALUES (2073, '售后退款', '', 2, 1, 2072, 'trade/after-sale', 'education', 'mall/trade/afterSale/index',
  2073 + 'TradeAfterSale', 0, b'1', b'1', b'1', '', '2022-11-19 20:15:32', '1', '2023-04-08 11:43:19', b'0');
  2074 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  2075 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  2076 + `updater`, `update_time`, `deleted`)
  2077 +VALUES (2074, '售后查询', 'trade:after-sale:query', 3, 1, 2073, '', '', '', NULL, 0, b'1', b'1', b'1', '',
  2078 + '2022-11-19 20:15:33', '1', '2022-12-10 21:04:29', b'0');
  2079 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  2080 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  2081 + `updater`, `update_time`, `deleted`)
  2082 +VALUES (2075, '秒杀活动关闭', 'promotion:sekill-activity:close', 3, 6, 2059, '', '', '', NULL, 0, b'1', b'1', b'1', '1',
  2083 + '2022-11-28 20:20:15', '1', '2022-11-28 20:20:15', b'0');
  2084 +INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`,
  2085 + `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`,
  2086 + `updater`, `update_time`, `deleted`)
  2087 +VALUES (2076, '订单列表', '', 2, 0, 2072, 'trade/order', 'list', 'mall/trade/order/index', 'TradeOrder', 0, b'1', b'1',
  2088 + b'1', '1', '2022-12-10 21:05:44', '1', '2023-04-08 11:42:23', b'0');
2004 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2077, '物流公司管理管理', '', 2, 0, 2072, 'express-company', '', 'mall/trade/expressCompany/index', NULL, 0, b'1', b'1', b'1', '', '2022-12-20 23:27:55', '1', '2022-12-20 23:36:20', b'0'); 2089 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2077, '物流公司管理管理', '', 2, 0, 2072, 'express-company', '', 'mall/trade/expressCompany/index', NULL, 0, b'1', b'1', b'1', '', '2022-12-20 23:27:55', '1', '2022-12-20 23:36:20', b'0');
2005 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2078, '物流公司管理查询', 'trade:express-company:query', 3, 1, 2077, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-12-20 23:27:55', '', '2022-12-20 23:27:55', b'0'); 2090 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2078, '物流公司管理查询', 'trade:express-company:query', 3, 1, 2077, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-12-20 23:27:55', '', '2022-12-20 23:27:55', b'0');
2006 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2079, '物流公司管理创建', 'trade:express-company:create', 3, 2, 2077, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-12-20 23:27:55', '', '2022-12-20 23:27:55', b'0'); 2091 INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (2079, '物流公司管理创建', 'trade:express-company:create', 3, 2, 2077, '', '', '', NULL, 0, b'1', b'1', b'1', '', '2022-12-20 23:27:55', '', '2022-12-20 23:27:55', b'0');
yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/api/comment/ProductCommentApi.java
@@ -9,14 +9,12 @@ import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDT @@ -9,14 +9,12 @@ import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDT
9 */ 9 */
10 public interface ProductCommentApi { 10 public interface ProductCommentApi {
11 11
12 - // TODO @puhui:Long orderId 放到 createReqDTO 里噶?  
13 /** 12 /**
14 * 创建评论 13 * 创建评论
15 * 14 *
16 * @param createReqDTO 评论参数 15 * @param createReqDTO 评论参数
17 - * @param orderId 订单 id  
18 * @return 返回评论创建后的 id 16 * @return 返回评论创建后的 id
19 */ 17 */
20 - Long createComment(ProductCommentCreateReqDTO createReqDTO, Long orderId); 18 + Long createComment(ProductCommentCreateReqDTO createReqDTO);
21 19
22 } 20 }
yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/api/comment/dto/ProductCommentCreateReqDTO.java
@@ -17,19 +17,13 @@ public class ProductCommentCreateReqDTO { @@ -17,19 +17,13 @@ public class ProductCommentCreateReqDTO {
17 */ 17 */
18 private Long skuId; 18 private Long skuId;
19 /** 19 /**
20 - * 交易订单项编号  
21 - */  
22 - private Long orderItemId;  
23 -  
24 - // TODO @huihui:spuId、spuName 去查询哇?通过 skuId  
25 - /**  
26 - * 商品 SPU 编号 20 + * 订单编号
27 */ 21 */
28 - private Long spuId; 22 + private Long orderId;
29 /** 23 /**
30 - * 商品 SPU 名称 24 + * 交易订单项编号
31 */ 25 */
32 - private String spuName; 26 + private Long orderItemId;
33 27
34 /** 28 /**
35 * 评分星级 1-5 分 29 * 评分星级 1-5 分
@@ -60,14 +54,6 @@ public class ProductCommentCreateReqDTO { @@ -60,14 +54,6 @@ public class ProductCommentCreateReqDTO {
60 * 评价人 54 * 评价人
61 */ 55 */
62 private Long userId; 56 private Long userId;
63 - // TODO @puhui999:是不是 userNickname、userAvatar 去掉?通过 userId 查询  
64 - /**  
65 - * 评价人名称  
66 - */  
67 - private String userNickname;  
68 - /**  
69 - * 评价人头像  
70 - */  
71 - private String userAvatar; 57 +
72 58
73 } 59 }
yudao-module-mall/yudao-module-product-api/src/main/java/cn/iocoder/yudao/module/product/api/sku/ProductSkuApi.java
1 package cn.iocoder.yudao.module.product.api.sku; 1 package cn.iocoder.yudao.module.product.api.sku;
2 2
3 -import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO;  
4 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO; 3 import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
  4 +import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO;
5 5
6 import java.util.Collection; 6 import java.util.Collection;
7 import java.util.List; 7 import java.util.List;
@@ -31,6 +31,14 @@ public interface ProductSkuApi { @@ -31,6 +31,14 @@ public interface ProductSkuApi {
31 List<ProductSkuRespDTO> getSkuList(Collection<Long> ids); 31 List<ProductSkuRespDTO> getSkuList(Collection<Long> ids);
32 32
33 /** 33 /**
  34 + * 批量查询 SKU 数组
  35 + *
  36 + * @param spuIds SPU 编号列表
  37 + * @return SKU 数组
  38 + */
  39 + List<ProductSkuRespDTO> getSkuListBySpuId(List<Long> spuIds);
  40 +
  41 + /**
34 * 更新 SKU 库存 42 * 更新 SKU 库存
35 * 43 *
36 * @param updateStockReqDTO 更新请求 44 * @param updateStockReqDTO 更新请求
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/api/comment/ProductCommentApiImpl.java
1 package cn.iocoder.yudao.module.product.api.comment; 1 package cn.iocoder.yudao.module.product.api.comment;
2 2
3 import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO; 3 import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO;
4 -import cn.iocoder.yudao.module.product.convert.comment.ProductCommentConvert;  
5 -import cn.iocoder.yudao.module.product.dal.dataobject.comment.ProductCommentDO;  
6 import cn.iocoder.yudao.module.product.service.comment.ProductCommentService; 4 import cn.iocoder.yudao.module.product.service.comment.ProductCommentService;
7 import org.springframework.stereotype.Service; 5 import org.springframework.stereotype.Service;
8 import org.springframework.validation.annotation.Validated; 6 import org.springframework.validation.annotation.Validated;
@@ -22,9 +20,8 @@ public class ProductCommentApiImpl implements ProductCommentApi { @@ -22,9 +20,8 @@ public class ProductCommentApiImpl implements ProductCommentApi {
22 private ProductCommentService productCommentService; 20 private ProductCommentService productCommentService;
23 21
24 @Override 22 @Override
25 - public Long createComment(ProductCommentCreateReqDTO createReqDTO, Long orderId) {  
26 - ProductCommentDO commentDO = ProductCommentConvert.INSTANCE.convert(createReqDTO, orderId);  
27 - return productCommentService.createComment(commentDO); 23 + public Long createComment(ProductCommentCreateReqDTO createReqDTO) {
  24 + return productCommentService.createComment(createReqDTO);
28 } 25 }
29 26
30 } 27 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/api/sku/ProductSkuApiImpl.java
@@ -43,6 +43,15 @@ public class ProductSkuApiImpl implements ProductSkuApi { @@ -43,6 +43,15 @@ public class ProductSkuApiImpl implements ProductSkuApi {
43 } 43 }
44 44
45 @Override 45 @Override
  46 + public List<ProductSkuRespDTO> getSkuListBySpuId(List<Long> spuIds) {
  47 + if (CollUtil.isEmpty(spuIds)) {
  48 + return Collections.emptyList();
  49 + }
  50 + List<ProductSkuDO> skus = productSkuService.getSkuListBySpuId(spuIds);
  51 + return ProductSkuConvert.INSTANCE.convertList04(skus);
  52 + }
  53 +
  54 + @Override
46 public void updateSkuStock(ProductSkuUpdateStockReqDTO updateStockReqDTO) { 55 public void updateSkuStock(ProductSkuUpdateStockReqDTO updateStockReqDTO) {
47 productSkuService.updateSkuStock(updateStockReqDTO); 56 productSkuService.updateSkuStock(updateStockReqDTO);
48 } 57 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/api/spu/ProductSpuApiImpl.java
1 package cn.iocoder.yudao.module.product.api.spu; 1 package cn.iocoder.yudao.module.product.api.spu;
2 2
3 -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 3 +import cn.hutool.core.collection.CollectionUtil;
4 import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO; 4 import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
5 import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert; 5 import cn.iocoder.yudao.module.product.convert.spu.ProductSpuConvert;
6 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; 6 import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
@@ -14,7 +14,7 @@ import java.util.Collections; @@ -14,7 +14,7 @@ import java.util.Collections;
14 import java.util.List; 14 import java.util.List;
15 15
16 /** 16 /**
17 - * TODO LeeYan9: 类注释; 17 + * 商品 SPU API 接口实现类
18 * 18 *
19 * @author LeeYan9 19 * @author LeeYan9
20 * @since 2022-09-06 20 * @since 2022-09-06
@@ -28,11 +28,12 @@ public class ProductSpuApiImpl implements ProductSpuApi { @@ -28,11 +28,12 @@ public class ProductSpuApiImpl implements ProductSpuApi {
28 28
29 @Override 29 @Override
30 public List<ProductSpuRespDTO> getSpuList(Collection<Long> spuIds) { 30 public List<ProductSpuRespDTO> getSpuList(Collection<Long> spuIds) {
31 - // TODO TODO LeeYan9: AllEmpty?  
32 - if (CollectionUtils.isAnyEmpty(spuIds)) { 31 + // TODO 需不需要判断集合中是否有 null 值
  32 + if (CollectionUtil.isEmpty(spuIds)) {
33 return Collections.emptyList(); 33 return Collections.emptyList();
34 } 34 }
35 List<ProductSpuDO> productSpuDOList = productSpuMapper.selectBatchIds(spuIds); 35 List<ProductSpuDO> productSpuDOList = productSpuMapper.selectBatchIds(spuIds);
36 return ProductSpuConvert.INSTANCE.convertList2(productSpuDOList); 36 return ProductSpuConvert.INSTANCE.convertList2(productSpuDOList);
37 } 37 }
  38 +
38 } 39 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/brand/vo/ProductBrandSimpleRespVO.java
@@ -5,17 +5,16 @@ import lombok.AllArgsConstructor; @@ -5,17 +5,16 @@ import lombok.AllArgsConstructor;
5 import lombok.Data; 5 import lombok.Data;
6 import lombok.NoArgsConstructor; 6 import lombok.NoArgsConstructor;
7 7
8 -// TODO @puhui999:class 类的开始和结束,都要有一个空行哈。  
9 @Schema(description = "管理后台 - 品牌精简信息 Response VO") 8 @Schema(description = "管理后台 - 品牌精简信息 Response VO")
10 @Data 9 @Data
11 @NoArgsConstructor 10 @NoArgsConstructor
12 @AllArgsConstructor 11 @AllArgsConstructor
13 public class ProductBrandSimpleRespVO { 12 public class ProductBrandSimpleRespVO {
14 13
15 - @Schema(description = "品牌编号", required = true, example = "1024") 14 + @Schema(description = "品牌编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
16 private Long id; 15 private Long id;
17 16
18 - @Schema(description = "品牌名称", required = true, example = "苹果") 17 + @Schema(description = "品牌名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "苹果")
19 private String name; 18 private String name;
20 19
21 } 20 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/vo/ProductCommentBaseVO.java
@@ -10,43 +10,51 @@ import java.util.List; @@ -10,43 +10,51 @@ import java.util.List;
10 @Data 10 @Data
11 public class ProductCommentBaseVO { 11 public class ProductCommentBaseVO {
12 12
13 - @Schema(description = "评价人名称", required = true, example = "小姑凉") 13 + @Schema(description = "评价人", requiredMode = Schema.RequiredMode.REQUIRED, example = "16868")
  14 + @NotNull(message = "评价人不能为空")
  15 + private Long userId;
  16 +
  17 + @Schema(description = "评价订单项", requiredMode = Schema.RequiredMode.REQUIRED, example = "19292")
  18 + @NotNull(message = "评价订单项不能为空")
  19 + private Long orderItemId;
  20 +
  21 + @Schema(description = "评价人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小姑凉")
14 @NotNull(message = "评价人名称不能为空") 22 @NotNull(message = "评价人名称不能为空")
15 private String userNickname; 23 private String userNickname;
16 24
17 - @Schema(description = "评价人头像", required = true, example = "https://www.iocoder.cn/xx.png") 25 + @Schema(description = "评价人头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png")
18 @NotNull(message = "评价人头像不能为空") 26 @NotNull(message = "评价人头像不能为空")
19 private String userAvatar; 27 private String userAvatar;
20 28
21 - @Schema(description = "商品 SPU 编号", required = true, example = "清凉丝滑透气小短袖") 29 + @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉丝滑透气小短袖")
22 @NotNull(message = "商品 SPU 编号不能为空") 30 @NotNull(message = "商品 SPU 编号不能为空")
23 private Long spuId; 31 private Long spuId;
24 32
25 - @Schema(description = "商品 SPU 名称", required = true, example = "赵六") 33 + @Schema(description = "商品 SPU 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
26 @NotNull(message = "商品 SPU 名称不能为空") 34 @NotNull(message = "商品 SPU 名称不能为空")
27 private String spuName; 35 private String spuName;
28 36
29 - @Schema(description = "商品 SKU 编号", required = true, example = "1") 37 + @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
30 @NotNull(message = "商品 SKU 编号不能为空") 38 @NotNull(message = "商品 SKU 编号不能为空")
31 private Long skuId; 39 private Long skuId;
32 40
33 - @Schema(description = "评分星级 1-5 分", required = true, example = "5") 41 + @Schema(description = "评分星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5")
34 @NotNull(message = "评分星级不能为空") 42 @NotNull(message = "评分星级不能为空")
35 private Integer scores; 43 private Integer scores;
36 44
37 - @Schema(description = "描述星级 1-5 分", required = true, example = "5") 45 + @Schema(description = "描述星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5")
38 @NotNull(message = "描述星级不能为空") 46 @NotNull(message = "描述星级不能为空")
39 private Integer descriptionScores; 47 private Integer descriptionScores;
40 48
41 - @Schema(description = "服务星级 1-5 分", required = true, example = "5") 49 + @Schema(description = "服务星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5")
42 @NotNull(message = "服务星级分不能为空") 50 @NotNull(message = "服务星级分不能为空")
43 private Integer benefitScores; 51 private Integer benefitScores;
44 52
45 - @Schema(description = "评论内容", required = true, example = "穿起来非常丝滑凉快") 53 + @Schema(description = "评论内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "穿起来非常丝滑凉快")
46 @NotNull(message = "评论内容不能为空") 54 @NotNull(message = "评论内容不能为空")
47 private String content; 55 private String content;
48 56
49 - @Schema(description = "评论图片地址数组,以逗号分隔最多上传 9 张", required = true, example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]") 57 + @Schema(description = "评论图片地址数组,以逗号分隔最多上传 9 张", requiredMode = Schema.RequiredMode.REQUIRED, example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]")
50 @Size(max = 9, message = "评论图片地址数组长度不能超过 9 张") 58 @Size(max = 9, message = "评论图片地址数组长度不能超过 9 张")
51 private List<String> picUrls; 59 private List<String> picUrls;
52 60
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/vo/ProductCommentCreateReqVO.java
@@ -5,21 +5,10 @@ import lombok.Data; @@ -5,21 +5,10 @@ import lombok.Data;
5 import lombok.EqualsAndHashCode; 5 import lombok.EqualsAndHashCode;
6 import lombok.ToString; 6 import lombok.ToString;
7 7
8 -import javax.validation.constraints.NotNull;  
9 -  
10 @Schema(description = "管理后台 - 商品评价创建 Request VO") 8 @Schema(description = "管理后台 - 商品评价创建 Request VO")
11 @Data 9 @Data
12 @EqualsAndHashCode(callSuper = true) 10 @EqualsAndHashCode(callSuper = true)
13 @ToString(callSuper = true) 11 @ToString(callSuper = true)
14 public class ProductCommentCreateReqVO extends ProductCommentBaseVO { 12 public class ProductCommentCreateReqVO extends ProductCommentBaseVO {
15 13
16 - // TODO @puhui999:是不是也放到父类里?  
17 - @Schema(description = "评价人", required = true, example = "16868")  
18 - @NotNull(message = "评价人不能为空")  
19 - private Long userId;  
20 -  
21 - @Schema(description = "评价订单项", required = true, example = "19292")  
22 - @NotNull(message = "评价订单项不能为空")  
23 - private Long orderItemId;  
24 -  
25 } 14 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/vo/ProductCommentReplyReqVO.java
@@ -12,11 +12,11 @@ import javax.validation.constraints.NotNull; @@ -12,11 +12,11 @@ import javax.validation.constraints.NotNull;
12 @ToString(callSuper = true) 12 @ToString(callSuper = true)
13 public class ProductCommentReplyReqVO { 13 public class ProductCommentReplyReqVO {
14 14
15 - @Schema(description = "评价编号", required = true, example = "15721") 15 + @Schema(description = "评价编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15721")
16 @NotNull(message = "评价编号不能为空") 16 @NotNull(message = "评价编号不能为空")
17 private Long id; 17 private Long id;
18 18
19 - @Schema(description = "商家回复内容", required = true, example = "谢谢亲") 19 + @Schema(description = "商家回复内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "谢谢亲")
20 @NotEmpty(message = "商家回复内容不能为空") 20 @NotEmpty(message = "商家回复内容不能为空")
21 private String replyContent; 21 private String replyContent;
22 22
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/vo/ProductCommentRespVO.java
@@ -13,37 +13,31 @@ import java.time.LocalDateTime; @@ -13,37 +13,31 @@ import java.time.LocalDateTime;
13 @ToString(callSuper = true) 13 @ToString(callSuper = true)
14 public class ProductCommentRespVO extends ProductCommentBaseVO { 14 public class ProductCommentRespVO extends ProductCommentBaseVO {
15 15
16 - @Schema(description = "订单项编号", required = true, example = "24965") 16 + @Schema(description = "订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24965")
17 private Long id; 17 private Long id;
18 18
19 - @Schema(description = "是否匿名", required = true, example = "false") 19 + @Schema(description = "是否匿名", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
20 private Boolean anonymous; 20 private Boolean anonymous;
21 21
22 - @Schema(description = "交易订单编号", required = true, example = "24428") 22 + @Schema(description = "交易订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24428")
23 private Long orderId; 23 private Long orderId;
24 24
25 - @Schema(description = "评价人 用户编号", required = true, example = "15721")  
26 - private Long userId;  
27 -  
28 - @Schema(description = "交易订单项编号", required = true, example = "8233")  
29 - private Long orderItemId;  
30 -  
31 - @Schema(description = "是否可见:[true:显示 false:隐藏]", required = true) 25 + @Schema(description = "是否可见:[true:显示 false:隐藏]", requiredMode = Schema.RequiredMode.REQUIRED)
32 private Boolean visible; 26 private Boolean visible;
33 27
34 - @Schema(description = "商家是否回复:[1:回复 0:未回复]", required = true) 28 + @Schema(description = "商家是否回复:[1:回复 0:未回复]", requiredMode = Schema.RequiredMode.REQUIRED)
35 private Boolean replyStatus; 29 private Boolean replyStatus;
36 30
37 - @Schema(description = "回复管理员编号", example = "22212") 31 + @Schema(description = "回复管理员编号", example = "9527")
38 private Long replyUserId; 32 private Long replyUserId;
39 33
40 - @Schema(description = "商家回复内容") 34 + @Schema(description = "商家回复内容", example = "感谢好评哦亲(づ ̄3 ̄)づ╭❤~")
41 private String replyContent; 35 private String replyContent;
42 36
43 - @Schema(description = "商家回复时间") 37 + @Schema(description = "商家回复时间", example = "2023-08-08 12:20:55")
44 private LocalDateTime replyTime; 38 private LocalDateTime replyTime;
45 39
46 - @Schema(description = "创建时间", required = true) 40 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
47 private LocalDateTime createTime; 41 private LocalDateTime createTime;
48 42
49 } 43 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/comment/vo/ProductCommentUpdateVisibleReqVO.java
@@ -11,11 +11,11 @@ import javax.validation.constraints.NotNull; @@ -11,11 +11,11 @@ import javax.validation.constraints.NotNull;
11 @ToString(callSuper = true) 11 @ToString(callSuper = true)
12 public class ProductCommentUpdateVisibleReqVO { 12 public class ProductCommentUpdateVisibleReqVO {
13 13
14 - @Schema(description = "评价编号", required = true, example = "15721") 14 + @Schema(description = "评价编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15721")
15 @NotNull(message = "评价编号不能为空") 15 @NotNull(message = "评价编号不能为空")
16 private Long id; 16 private Long id;
17 17
18 - @Schema(description = "是否可见", required = true, example = "false") 18 + @Schema(description = "是否可见", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
19 @NotNull(message = "是否可见不能为空") 19 @NotNull(message = "是否可见不能为空")
20 private Boolean visible; 20 private Boolean visible;
21 21
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSpuDetailRespVO.java
@@ -20,16 +20,16 @@ import java.util.List; @@ -20,16 +20,16 @@ import java.util.List;
20 @ToString(callSuper = true) 20 @ToString(callSuper = true)
21 public class ProductSpuDetailRespVO extends ProductSpuBaseVO { 21 public class ProductSpuDetailRespVO extends ProductSpuBaseVO {
22 22
23 - @Schema(description = "商品 SPU 编号", required = true, example = "1212") 23 + @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1212")
24 private Long id; 24 private Long id;
25 25
26 - @Schema(description = "商品销量", required = true, example = "10000") 26 + @Schema(description = "商品销量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10000")
27 private Integer salesCount; 27 private Integer salesCount;
28 28
29 - @Schema(description = "浏览量", required = true, example = "20000") 29 + @Schema(description = "浏览量", requiredMode = Schema.RequiredMode.REQUIRED, example = "20000")
30 private Integer browseCount; 30 private Integer browseCount;
31 31
32 - @Schema(description = "商品状态", required = true, example = "1") 32 + @Schema(description = "商品状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
33 private Integer status; 33 private Integer status;
34 34
35 // ========== SKU 相关字段 ========= 35 // ========== SKU 相关字段 =========
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSpuPageReqVO.java
1 package cn.iocoder.yudao.module.product.controller.admin.spu.vo; 1 package cn.iocoder.yudao.module.product.controller.admin.spu.vo;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 -import cn.iocoder.yudao.framework.common.validation.InEnum;  
5 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
6 import lombok.Data; 5 import lombok.Data;
7 import lombok.EqualsAndHashCode; 6 import lombok.EqualsAndHashCode;
@@ -51,7 +50,7 @@ public class ProductSpuPageReqVO extends PageParam { @@ -51,7 +50,7 @@ public class ProductSpuPageReqVO extends PageParam {
51 @Schema(description = "商品名称", example = "清凉小短袖") 50 @Schema(description = "商品名称", example = "清凉小短袖")
52 private String name; 51 private String name;
53 52
54 - @Schema(description = "前端请求的tab类型", required = true, example = "1") 53 + @Schema(description = "前端请求的tab类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
55 private Integer tabType; 54 private Integer tabType;
56 55
57 @Schema(description = "商品分类编号", example = "1") 56 @Schema(description = "商品分类编号", example = "1")
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/admin/spu/vo/ProductSpuUpdateStatusReqVO.java
1 package cn.iocoder.yudao.module.product.controller.admin.spu.vo; 1 package cn.iocoder.yudao.module.product.controller.admin.spu.vo;
2 2
3 import cn.iocoder.yudao.framework.common.validation.InEnum; 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 -import cn.iocoder.yudao.module.product.controller.admin.sku.vo.ProductSkuCreateOrUpdateReqVO;  
5 import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum; 4 import cn.iocoder.yudao.module.product.enums.spu.ProductSpuStatusEnum;
6 import io.swagger.v3.oas.annotations.media.Schema; 5 import io.swagger.v3.oas.annotations.media.Schema;
7 import lombok.Data; 6 import lombok.Data;
8 -import lombok.EqualsAndHashCode;  
9 -import lombok.ToString;  
10 7
11 -import javax.validation.Valid;  
12 import javax.validation.constraints.NotNull; 8 import javax.validation.constraints.NotNull;
13 -import java.util.List;  
14 9
15 /** 10 /**
16 * 商品 SPU Status 更新 Request VO 11 * 商品 SPU Status 更新 Request VO
@@ -21,11 +16,11 @@ import java.util.List; @@ -21,11 +16,11 @@ import java.util.List;
21 @Data 16 @Data
22 public class ProductSpuUpdateStatusReqVO{ 17 public class ProductSpuUpdateStatusReqVO{
23 18
24 - @Schema(description = "商品编号", required = true, example = "1") 19 + @Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
25 @NotNull(message = "商品编号不能为空") 20 @NotNull(message = "商品编号不能为空")
26 private Long id; 21 private Long id;
27 22
28 - @Schema(description = "商品状态", required = true, example = "1") 23 + @Schema(description = "商品状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
29 @NotNull(message = "商品状态不能为空") 24 @NotNull(message = "商品状态不能为空")
30 @InEnum(ProductSpuStatusEnum.class) 25 @InEnum(ProductSpuStatusEnum.class)
31 private Integer status; 26 private Integer status;
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/comment/AppProductCommentController.java
1 package cn.iocoder.yudao.module.product.controller.app.comment; 1 package cn.iocoder.yudao.module.product.controller.app.comment;
2 2
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.ObjectUtil;
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 5 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppCommentPageReqVO; 7 import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppCommentPageReqVO;
6 import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppCommentStatisticsRespVO; 8 import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppCommentStatisticsRespVO;
7 import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppProductCommentRespVO; 9 import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppProductCommentRespVO;
8 import cn.iocoder.yudao.module.product.controller.app.property.vo.value.AppProductPropertyValueDetailRespVO; 10 import cn.iocoder.yudao.module.product.controller.app.property.vo.value.AppProductPropertyValueDetailRespVO;
  11 +import cn.iocoder.yudao.module.product.convert.comment.ProductCommentConvert;
  12 +import cn.iocoder.yudao.module.product.dal.dataobject.comment.ProductCommentDO;
  13 +import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
9 import cn.iocoder.yudao.module.product.service.comment.ProductCommentService; 14 import cn.iocoder.yudao.module.product.service.comment.ProductCommentService;
  15 +import cn.iocoder.yudao.module.product.service.sku.ProductSkuService;
10 import io.swagger.v3.oas.annotations.Operation; 16 import io.swagger.v3.oas.annotations.Operation;
11 import io.swagger.v3.oas.annotations.Parameter; 17 import io.swagger.v3.oas.annotations.Parameter;
12 import io.swagger.v3.oas.annotations.Parameters; 18 import io.swagger.v3.oas.annotations.Parameters;
13 import io.swagger.v3.oas.annotations.tags.Tag; 19 import io.swagger.v3.oas.annotations.tags.Tag;
  20 +import org.springframework.context.annotation.Lazy;
14 import org.springframework.validation.annotation.Validated; 21 import org.springframework.validation.annotation.Validated;
15 import org.springframework.web.bind.annotation.GetMapping; 22 import org.springframework.web.bind.annotation.GetMapping;
16 import org.springframework.web.bind.annotation.RequestMapping; 23 import org.springframework.web.bind.annotation.RequestMapping;
@@ -19,11 +26,11 @@ import org.springframework.web.bind.annotation.RestController; @@ -19,11 +26,11 @@ import org.springframework.web.bind.annotation.RestController;
19 26
20 import javax.annotation.Resource; 27 import javax.annotation.Resource;
21 import javax.validation.Valid; 28 import javax.validation.Valid;
22 -import java.time.LocalDateTime;  
23 -import java.util.ArrayList;  
24 -import java.util.Arrays; 29 +import java.util.HashMap;
25 import java.util.List; 30 import java.util.List;
26 -import java.util.Random; 31 +import java.util.Map;
  32 +import java.util.Set;
  33 +import java.util.stream.Collectors;
27 34
28 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 35 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
29 36
@@ -36,7 +43,10 @@ public class AppProductCommentController { @@ -36,7 +43,10 @@ public class AppProductCommentController {
36 @Resource 43 @Resource
37 private ProductCommentService productCommentService; 44 private ProductCommentService productCommentService;
38 45
39 - // TODO @puhui999:可以实现下 46 + @Resource
  47 + @Lazy
  48 + private ProductSkuService productSkuService;
  49 +
40 @GetMapping("/list") 50 @GetMapping("/list")
41 @Operation(summary = "获得最近的 n 条商品评价") 51 @Operation(summary = "获得最近的 n 条商品评价")
42 @Parameters({ 52 @Parameters({
@@ -45,67 +55,38 @@ public class AppProductCommentController { @@ -45,67 +55,38 @@ public class AppProductCommentController {
45 }) 55 })
46 public CommonResult<List<AppProductCommentRespVO>> getCommentList(@RequestParam("spuId") Long spuId, 56 public CommonResult<List<AppProductCommentRespVO>> getCommentList(@RequestParam("spuId") Long spuId,
47 @RequestParam(value = "count", defaultValue = "10") Integer count) { 57 @RequestParam(value = "count", defaultValue = "10") Integer count) {
48 - List<AppProductPropertyValueDetailRespVO> list = new ArrayList<>();  
49 -  
50 - AppProductPropertyValueDetailRespVO item1 = new AppProductPropertyValueDetailRespVO();  
51 - item1.setPropertyId(1L);  
52 - item1.setPropertyName("颜色");  
53 - item1.setValueId(1024L);  
54 - item1.setValueName("红色");  
55 - list.add(item1);  
56 -  
57 - AppProductPropertyValueDetailRespVO item2 = new AppProductPropertyValueDetailRespVO();  
58 - item2.setPropertyId(2L);  
59 - item2.setPropertyName("尺寸");  
60 - item2.setValueId(2048L);  
61 - item2.setValueName("大号");  
62 - list.add(item2);  
63 -  
64 - AppProductPropertyValueDetailRespVO item3 = new AppProductPropertyValueDetailRespVO();  
65 - item3.setPropertyId(3L);  
66 - item3.setPropertyName("重量");  
67 - item3.setValueId(3072L);  
68 - item3.setValueName("500克");  
69 - list.add(item3);  
70 -  
71 - // TODO 生成 mock 的数据  
72 - AppProductCommentRespVO appCommentRespVO = new AppProductCommentRespVO();  
73 - appCommentRespVO.setUserId((long) (new Random().nextInt(100000) + 10000));  
74 - appCommentRespVO.setUserNickname("用户" + new Random().nextInt(100));  
75 - appCommentRespVO.setUserAvatar("https://demo26.crmeb.net/uploads/attach/2021/11/15/a79f5d2ea6bf0c3c11b2127332dfe2df.jpg");  
76 - appCommentRespVO.setId((long) (new Random().nextInt(100000) + 10000));  
77 - appCommentRespVO.setAnonymous(new Random().nextBoolean());  
78 - appCommentRespVO.setOrderId((long) (new Random().nextInt(100000) + 10000));  
79 - appCommentRespVO.setOrderItemId((long) (new Random().nextInt(100000) + 10000));  
80 - appCommentRespVO.setReplyStatus(new Random().nextBoolean());  
81 - appCommentRespVO.setReplyUserId((long) (new Random().nextInt(100000) + 10000));  
82 - appCommentRespVO.setReplyContent("回复内容" + new Random().nextInt(100));  
83 - appCommentRespVO.setReplyTime(LocalDateTime.now().minusDays(new Random().nextInt(30)));  
84 - appCommentRespVO.setCreateTime(LocalDateTime.now().minusDays(new Random().nextInt(30)));  
85 - appCommentRespVO.setSpuId((long) (new Random().nextInt(100000) + 10000));  
86 - appCommentRespVO.setSpuName("商品" + new Random().nextInt(100));  
87 - appCommentRespVO.setSkuId((long) (new Random().nextInt(100000) + 10000));  
88 - appCommentRespVO.setSkuProperties(list);  
89 - appCommentRespVO.setScores(new Random().nextInt(5) + 1);  
90 - appCommentRespVO.setDescriptionScores(new Random().nextInt(5) + 1);  
91 - appCommentRespVO.setBenefitScores(new Random().nextInt(5) + 1);  
92 - appCommentRespVO.setContent("评论内容" + new Random().nextInt(100));  
93 - appCommentRespVO.setPicUrls(Arrays.asList("https://demo26.crmeb.net/uploads/attach/2021/11/15/a79f5d2ea6bf0c3c11b2127332dfe2df.jpg")); 58 + return success(productCommentService.getCommentList(spuId, count));
94 59
95 - return success(Arrays.asList(appCommentRespVO));  
96 } 60 }
97 61
98 @GetMapping("/page") 62 @GetMapping("/page")
99 @Operation(summary = "获得商品评价分页") 63 @Operation(summary = "获得商品评价分页")
100 public CommonResult<PageResult<AppProductCommentRespVO>> getCommentPage(@Valid AppCommentPageReqVO pageVO) { 64 public CommonResult<PageResult<AppProductCommentRespVO>> getCommentPage(@Valid AppCommentPageReqVO pageVO) {
101 - return success(productCommentService.getCommentPage(pageVO, Boolean.TRUE)); 65 + PageResult<AppProductCommentRespVO> page = productCommentService.getCommentPage(pageVO, Boolean.TRUE);
  66 + Set<Long> skuIds = page.getList().stream().map(AppProductCommentRespVO::getSkuId).collect(Collectors.toSet());
  67 + List<ProductSkuDO> skuList = productSkuService.getSkuList(skuIds);
  68 + Map<Long, ProductSkuDO> skuDOMap = new HashMap<>(skuIds.size());
  69 + if (CollUtil.isNotEmpty(skuList)) {
  70 + skuDOMap.putAll(skuList.stream().collect(Collectors.toMap(ProductSkuDO::getId, c -> c)));
  71 + }
  72 + page.getList().forEach(item -> {
  73 + // 判断用户是否选择匿名
  74 + if (ObjectUtil.equal(item.getAnonymous(), true)) {
  75 + item.setUserNickname(ProductCommentDO.NICKNAME_ANONYMOUS);
  76 + }
  77 + ProductSkuDO productSkuDO = skuDOMap.get(item.getSkuId());
  78 + if (productSkuDO != null) {
  79 + List<AppProductPropertyValueDetailRespVO> skuProperties = ProductCommentConvert.INSTANCE.convertList01(productSkuDO.getProperties());
  80 + item.setSkuProperties(skuProperties);
  81 + }
  82 + });
  83 + return success(page);
102 } 84 }
103 85
104 - // TODO @puhui:get-statistics;方法改成 getCommentStatistics;getCommentPageTabsCount 也改掉哈  
105 @GetMapping("/getCommentStatistics") 86 @GetMapping("/getCommentStatistics")
106 @Operation(summary = "获得商品的评价统计") 87 @Operation(summary = "获得商品的评价统计")
107 - public CommonResult<AppCommentStatisticsRespVO> getCommentPage(@Valid @RequestParam("spuId") Long spuId) {  
108 - return success(productCommentService.getCommentPageTabsCount(spuId, Boolean.TRUE)); 88 + public CommonResult<AppCommentStatisticsRespVO> getCommentStatistics(@Valid @RequestParam("spuId") Long spuId) {
  89 + return success(productCommentService.getCommentStatistics(spuId, Boolean.TRUE));
109 } 90 }
110 91
111 } 92 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/comment/vo/AppCommentStatisticsRespVO.java
@@ -9,16 +9,16 @@ import lombok.ToString; @@ -9,16 +9,16 @@ import lombok.ToString;
9 @ToString(callSuper = true) 9 @ToString(callSuper = true)
10 public class AppCommentStatisticsRespVO { 10 public class AppCommentStatisticsRespVO {
11 11
12 - @Schema(description = "所有评论数量", required = true, example = "15721") 12 + @Schema(description = "所有评论数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "15721")
13 private Long allCount; 13 private Long allCount;
14 14
15 - @Schema(description = "好评数量", required = true, example = "15721") 15 + @Schema(description = "好评数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "15721")
16 private Long goodCount; 16 private Long goodCount;
17 17
18 - @Schema(description = "中评数量", required = true, example = "15721") 18 + @Schema(description = "中评数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "15721")
19 private Long mediocreCount; 19 private Long mediocreCount;
20 20
21 - @Schema(description = "差评数量", required = true, example = "15721") 21 + @Schema(description = "差评数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "15721")
22 private Long negativeCount; 22 private Long negativeCount;
23 23
24 } 24 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/comment/vo/AppProductCommentCreateReqVO.java
@@ -13,43 +13,43 @@ import java.util.List; @@ -13,43 +13,43 @@ import java.util.List;
13 @ToString(callSuper = true) 13 @ToString(callSuper = true)
14 public class AppProductCommentCreateReqVO { 14 public class AppProductCommentCreateReqVO {
15 15
16 - @Schema(description = "是否匿名", required = true, example = "true") 16 + @Schema(description = "是否匿名", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
17 @NotNull(message = "是否匿名不能为空") 17 @NotNull(message = "是否匿名不能为空")
18 private Boolean anonymous; 18 private Boolean anonymous;
19 19
20 - @Schema(description = "交易订单项编号", required = true, example = "2312312") 20 + @Schema(description = "交易订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2312312")
21 @NotNull(message = "交易订单项编号不能为空") 21 @NotNull(message = "交易订单项编号不能为空")
22 private Long orderItemId; 22 private Long orderItemId;
23 23
24 - @Schema(description = "商品 SPU 编号", required = true, example = "91192") 24 + @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "91192")
25 @NotNull(message = "商品SPU编号不能为空") 25 @NotNull(message = "商品SPU编号不能为空")
26 private Long spuId; 26 private Long spuId;
27 27
28 - @Schema(description = "商品 SPU 名称", required = true, example = "清凉丝滑小短袖") 28 + @Schema(description = "商品 SPU 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉丝滑小短袖")
29 @NotNull(message = "商品SPU名称不能为空") 29 @NotNull(message = "商品SPU名称不能为空")
30 private String spuName; 30 private String spuName;
31 31
32 - @Schema(description = "商品 SKU 编号", required = true, example = "81192") 32 + @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "81192")
33 @NotNull(message = "商品SKU编号不能为空") 33 @NotNull(message = "商品SKU编号不能为空")
34 private Long skuId; 34 private Long skuId;
35 35
36 - @Schema(description = "评分星级 1-5 分", required = true, example = "5") 36 + @Schema(description = "评分星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5")
37 @NotNull(message = "评分星级 1-5 分不能为空") 37 @NotNull(message = "评分星级 1-5 分不能为空")
38 private Integer scores; 38 private Integer scores;
39 39
40 - @Schema(description = "描述星级 1-5 分", required = true, example = "5") 40 + @Schema(description = "描述星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5")
41 @NotNull(message = "描述星级 1-5 分不能为空") 41 @NotNull(message = "描述星级 1-5 分不能为空")
42 private Integer descriptionScores; 42 private Integer descriptionScores;
43 43
44 - @Schema(description = "服务星级 1-5 分", required = true, example = "5") 44 + @Schema(description = "服务星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5")
45 @NotNull(message = "服务星级 1-5 分不能为空") 45 @NotNull(message = "服务星级 1-5 分不能为空")
46 private Integer benefitScores; 46 private Integer benefitScores;
47 47
48 - @Schema(description = "评论内容", required = true, example = "哇,真的很丝滑凉快诶,好评") 48 + @Schema(description = "评论内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "哇,真的很丝滑凉快诶,好评")
49 @NotNull(message = "评论内容不能为空") 49 @NotNull(message = "评论内容不能为空")
50 private String content; 50 private String content;
51 51
52 - @Schema(description = "评论图片地址数组,以逗号分隔最多上传 9 张", required = true, example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]") 52 + @Schema(description = "评论图片地址数组,以逗号分隔最多上传 9 张", requiredMode = Schema.RequiredMode.REQUIRED, example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]")
53 @Size(max = 9, message = "评论图片地址数组长度不能超过 9 张") 53 @Size(max = 9, message = "评论图片地址数组长度不能超过 9 张")
54 private List<String> picUrls; 54 private List<String> picUrls;
55 55
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/comment/vo/AppProductCommentRespVO.java
@@ -23,28 +23,28 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ @@ -23,28 +23,28 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
23 @ToString(callSuper = true) 23 @ToString(callSuper = true)
24 public class AppProductCommentRespVO { 24 public class AppProductCommentRespVO {
25 25
26 - @Schema(description = "评价人的用户编号", required = true, example = "15721") 26 + @Schema(description = "评价人的用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15721")
27 private Long userId; 27 private Long userId;
28 28
29 - @Schema(description = "评价人名称", required = true, example = "张三") 29 + @Schema(description = "评价人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
30 private String userNickname; 30 private String userNickname;
31 31
32 - @Schema(description = "评价人头像", required = true, example = "https://www.iocoder.cn/xx.png") 32 + @Schema(description = "评价人头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png")
33 private String userAvatar; 33 private String userAvatar;
34 34
35 - @Schema(description = "订单项编号", required = true, example = "24965") 35 + @Schema(description = "订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24965")
36 private Long id; 36 private Long id;
37 37
38 - @Schema(description = "是否匿名", required = true, example = "false") 38 + @Schema(description = "是否匿名", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
39 private Boolean anonymous; 39 private Boolean anonymous;
40 40
41 - @Schema(description = "交易订单编号", required = true, example = "24428") 41 + @Schema(description = "交易订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24428")
42 private Long orderId; 42 private Long orderId;
43 43
44 - @Schema(description = "交易订单项编号", required = true, example = "8233") 44 + @Schema(description = "交易订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8233")
45 private Long orderItemId; 45 private Long orderItemId;
46 46
47 - @Schema(description = "商家是否回复", required = true, example = "true") 47 + @Schema(description = "商家是否回复", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
48 private Boolean replyStatus; 48 private Boolean replyStatus;
49 49
50 @Schema(description = "回复管理员编号", example = "22212") 50 @Schema(description = "回复管理员编号", example = "22212")
@@ -71,38 +71,38 @@ public class AppProductCommentRespVO { @@ -71,38 +71,38 @@ public class AppProductCommentRespVO {
71 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) 71 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
72 private LocalDateTime createTime; 72 private LocalDateTime createTime;
73 73
74 - @Schema(description = "商品SPU编号", required = true, example = "91192") 74 + @Schema(description = "商品SPU编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "91192")
75 @NotNull(message = "商品SPU编号不能为空") 75 @NotNull(message = "商品SPU编号不能为空")
76 private Long spuId; 76 private Long spuId;
77 77
78 - @Schema(description = "商品SPU名称", required = true, example = "清凉丝滑小短袖") 78 + @Schema(description = "商品SPU名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉丝滑小短袖")
79 @NotNull(message = "商品SPU名称不能为空") 79 @NotNull(message = "商品SPU名称不能为空")
80 private String spuName; 80 private String spuName;
81 81
82 - @Schema(description = "商品SKU编号", required = true, example = "81192") 82 + @Schema(description = "商品SKU编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "81192")
83 @NotNull(message = "商品SKU编号不能为空") 83 @NotNull(message = "商品SKU编号不能为空")
84 private Long skuId; 84 private Long skuId;
85 85
86 - @Schema(description = "商品 SKU 属性", required = true) 86 + @Schema(description = "商品 SKU 属性", requiredMode = Schema.RequiredMode.REQUIRED)
87 private List<AppProductPropertyValueDetailRespVO> skuProperties; 87 private List<AppProductPropertyValueDetailRespVO> skuProperties;
88 88
89 - @Schema(description = "评分星级 1-5 分", required = true, example = "5") 89 + @Schema(description = "评分星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5")
90 @NotNull(message = "评分星级 1-5 分不能为空") 90 @NotNull(message = "评分星级 1-5 分不能为空")
91 private Integer scores; 91 private Integer scores;
92 92
93 - @Schema(description = "描述星级 1-5 分", required = true, example = "5") 93 + @Schema(description = "描述星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5")
94 @NotNull(message = "描述星级 1-5 分不能为空") 94 @NotNull(message = "描述星级 1-5 分不能为空")
95 private Integer descriptionScores; 95 private Integer descriptionScores;
96 96
97 - @Schema(description = "服务星级 1-5 分", required = true, example = "5") 97 + @Schema(description = "服务星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5")
98 @NotNull(message = "服务星级 1-5 分不能为空") 98 @NotNull(message = "服务星级 1-5 分不能为空")
99 private Integer benefitScores; 99 private Integer benefitScores;
100 100
101 - @Schema(description = "评论内容", required = true, example = "哇,真的很丝滑凉快诶,好评") 101 + @Schema(description = "评论内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "哇,真的很丝滑凉快诶,好评")
102 @NotNull(message = "评论内容不能为空") 102 @NotNull(message = "评论内容不能为空")
103 private String content; 103 private String content;
104 104
105 - @Schema(description = "评论图片地址数组,以逗号分隔最多上传 9 张", required = true, example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]") 105 + @Schema(description = "评论图片地址数组,以逗号分隔最多上传 9 张", requiredMode = Schema.RequiredMode.REQUIRED, example = "[https://www.iocoder.cn/xx.png, https://www.iocoder.cn/xxx.png]")
106 @Size(max = 9, message = "评论图片地址数组长度不能超过 9 张") 106 @Size(max = 9, message = "评论图片地址数组长度不能超过 9 张")
107 private List<String> picUrls; 107 private List<String> picUrls;
108 108
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/controller/app/spu/vo/AppProductSpuPageRespVO.java
@@ -9,40 +9,40 @@ import java.util.List; @@ -9,40 +9,40 @@ import java.util.List;
9 @Data 9 @Data
10 public class AppProductSpuPageRespVO { 10 public class AppProductSpuPageRespVO {
11 11
12 - @Schema(description = "商品 SPU 编号", required = true, example = "1") 12 + @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
13 private Long id; 13 private Long id;
14 14
15 - @Schema(description = "商品名称", required = true, example = "芋道") 15 + @Schema(description = "商品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道")
16 private String name; 16 private String name;
17 17
18 - @Schema(description = "分类编号", required = true) 18 + @Schema(description = "分类编号", requiredMode = Schema.RequiredMode.REQUIRED)
19 private Long categoryId; 19 private Long categoryId;
20 20
21 - @Schema(description = "商品封面图", required = true) 21 + @Schema(description = "商品封面图", requiredMode = Schema.RequiredMode.REQUIRED)
22 private String picUrl; 22 private String picUrl;
23 23
24 - @Schema(description = "商品轮播图", required = true) 24 + @Schema(description = "商品轮播图", requiredMode = Schema.RequiredMode.REQUIRED)
25 private List<String> sliderPicUrls; 25 private List<String> sliderPicUrls;
26 26
27 // ========== SKU 相关字段 ========= 27 // ========== SKU 相关字段 =========
28 28
29 - @Schema(description = "规格类型", required = true, example = "true") 29 + @Schema(description = "规格类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
30 private Boolean specType; 30 private Boolean specType;
31 31
32 - @Schema(description = "商品价格,单位使用:分", required = true, example = "1024") 32 + @Schema(description = "商品价格,单位使用:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
33 private Integer price; 33 private Integer price;
34 34
35 - @Schema(description = "库存", required = true, example = "666") 35 + @Schema(description = "库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "666")
36 private Integer stock; 36 private Integer stock;
37 37
38 // ========== 营销相关字段 ========= 38 // ========== 营销相关字段 =========
39 39
40 - @Schema(description = "活动排序数组", required = true, example = "1024") 40 + @Schema(description = "活动排序数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
41 private List<Integer> activityOrders; 41 private List<Integer> activityOrders;
42 42
43 // ========== 统计相关字段 ========= 43 // ========== 统计相关字段 =========
44 44
45 - @Schema(description = "商品销量", required = true, example = "1024") 45 + @Schema(description = "商品销量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
46 private Integer salesCount; 46 private Integer salesCount;
47 47
48 } 48 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/convert/comment/ProductCommentConvert.java
1 package cn.iocoder.yudao.module.product.convert.comment; 1 package cn.iocoder.yudao.module.product.convert.comment;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
4 import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO; 5 import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO;
5 import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentCreateReqVO; 6 import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentCreateReqVO;
6 import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentRespVO; 7 import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentRespVO;
@@ -9,6 +10,7 @@ import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppProductComme @@ -9,6 +10,7 @@ import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppProductComme
9 import cn.iocoder.yudao.module.product.controller.app.property.vo.value.AppProductPropertyValueDetailRespVO; 10 import cn.iocoder.yudao.module.product.controller.app.property.vo.value.AppProductPropertyValueDetailRespVO;
10 import cn.iocoder.yudao.module.product.dal.dataobject.comment.ProductCommentDO; 11 import cn.iocoder.yudao.module.product.dal.dataobject.comment.ProductCommentDO;
11 import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; 12 import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
  13 +import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
12 import org.mapstruct.Mapper; 14 import org.mapstruct.Mapper;
13 import org.mapstruct.Mapping; 15 import org.mapstruct.Mapping;
14 import org.mapstruct.Named; 16 import org.mapstruct.Named;
@@ -59,9 +61,18 @@ public interface ProductCommentConvert { @@ -59,9 +61,18 @@ public interface ProductCommentConvert {
59 return divide.intValue(); 61 return divide.intValue();
60 } 62 }
61 63
62 - @Mapping(target = "orderId", source = "orderId") 64 + ProductCommentDO convert(ProductCommentCreateReqDTO createReqDTO);
  65 +
63 @Mapping(target = "scores", expression = "java(convertScores(createReqDTO.getDescriptionScores(), createReqDTO.getBenefitScores()))") 66 @Mapping(target = "scores", expression = "java(convertScores(createReqDTO.getDescriptionScores(), createReqDTO.getBenefitScores()))")
64 - ProductCommentDO convert(ProductCommentCreateReqDTO createReqDTO, Long orderId); 67 + default ProductCommentDO convert(ProductCommentCreateReqDTO createReqDTO, ProductSpuDO spuDO, MemberUserRespDTO user) {
  68 + ProductCommentDO commentDO = convert(createReqDTO);
  69 + commentDO.setUserId(user.getId());
  70 + commentDO.setUserNickname(user.getNickname());
  71 + commentDO.setUserAvatar(user.getAvatar());
  72 + commentDO.setSpuId(spuDO.getId());
  73 + commentDO.setSpuName(spuDO.getName());
  74 + return commentDO;
  75 + }
65 76
66 @Mapping(target = "userId", constant = "0L") 77 @Mapping(target = "userId", constant = "0L")
67 @Mapping(target = "orderId", constant = "0L") 78 @Mapping(target = "orderId", constant = "0L")
@@ -70,4 +81,6 @@ public interface ProductCommentConvert { @@ -70,4 +81,6 @@ public interface ProductCommentConvert {
70 @Mapping(target = "scores", expression = "java(convertScores(createReq.getDescriptionScores(), createReq.getBenefitScores()))") 81 @Mapping(target = "scores", expression = "java(convertScores(createReq.getDescriptionScores(), createReq.getBenefitScores()))")
71 ProductCommentDO convert(ProductCommentCreateReqVO createReq); 82 ProductCommentDO convert(ProductCommentCreateReqVO createReq);
72 83
  84 + List<AppProductCommentRespVO> convertList02(List<ProductCommentDO> list);
  85 +
73 } 86 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/dal/mysql/comment/ProductCommentMapper.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.product.dal.mysql.comment; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.product.dal.mysql.comment;
2 2
3 3
4 import cn.hutool.core.util.ObjectUtil; 4 import cn.hutool.core.util.ObjectUtil;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 7 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
7 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 8 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -25,19 +26,18 @@ public interface ProductCommentMapper extends BaseMapperX&lt;ProductCommentDO&gt; { @@ -25,19 +26,18 @@ public interface ProductCommentMapper extends BaseMapperX&lt;ProductCommentDO&gt; {
25 } 26 }
26 27
27 // TODO 芋艿:在看看这块 28 // TODO 芋艿:在看看这块
28 - // TODO @puhui999:直接使用 scores 来算好评、中评、差评  
29 static void appendTabQuery(LambdaQueryWrapperX<ProductCommentDO> queryWrapper, Integer type) { 29 static void appendTabQuery(LambdaQueryWrapperX<ProductCommentDO> queryWrapper, Integer type) {
30 - // 构建好评查询语句:好评计算 (商品评分星级+服务评分星级) >= 8 30 + // 构建好评查询语句:好评计算 总评 >= 4
31 if (ObjectUtil.equal(type, AppCommentPageReqVO.GOOD_COMMENT)) { 31 if (ObjectUtil.equal(type, AppCommentPageReqVO.GOOD_COMMENT)) {
32 - queryWrapper.apply("(scores + benefit_scores) >= 8"); 32 + queryWrapper.apply("scores >= 4");
33 } 33 }
34 - // 构建中评查询语句:中评计算 (商品评分星级+服务评分星级) > 4 且 (商品评分星级+服务评分星级) < 8 34 + // 构建中评查询语句:中评计算 总评 >= 3 且 总评 < 4
35 if (ObjectUtil.equal(type, AppCommentPageReqVO.MEDIOCRE_COMMENT)) { 35 if (ObjectUtil.equal(type, AppCommentPageReqVO.MEDIOCRE_COMMENT)) {
36 - queryWrapper.apply("(scores + benefit_scores) > 4 and (scores + benefit_scores) < 8"); 36 + queryWrapper.apply("scores >=3 and scores < 4");
37 } 37 }
38 - // 构建差评查询语句:差评计算 (商品评分星级+服务评分星级) <= 4 38 + // 构建差评查询语句:差评计算 总评 < 3
39 if (ObjectUtil.equal(type, AppCommentPageReqVO.NEGATIVE_COMMENT)) { 39 if (ObjectUtil.equal(type, AppCommentPageReqVO.NEGATIVE_COMMENT)) {
40 - queryWrapper.apply("(scores + benefit_scores) <= 4"); 40 + queryWrapper.apply("scores < 3");
41 } 41 }
42 } 42 }
43 43
@@ -52,10 +52,10 @@ public interface ProductCommentMapper extends BaseMapperX&lt;ProductCommentDO&gt; { @@ -52,10 +52,10 @@ public interface ProductCommentMapper extends BaseMapperX&lt;ProductCommentDO&gt; {
52 return selectPage(reqVO, queryWrapper); 52 return selectPage(reqVO, queryWrapper);
53 } 53 }
54 54
55 - default ProductCommentDO selectByUserIdAndOrderIdAndSpuId(Long userId, Long orderId, Long spuId) { 55 + default ProductCommentDO selectByUserIdAndOrderItemIdAndSpuId(Long userId, Long orderItemId, Long spuId) {
56 return selectOne(new LambdaQueryWrapperX<ProductCommentDO>() 56 return selectOne(new LambdaQueryWrapperX<ProductCommentDO>()
57 .eq(ProductCommentDO::getUserId, userId) 57 .eq(ProductCommentDO::getUserId, userId)
58 - .eq(ProductCommentDO::getOrderId, orderId) 58 + .eq(ProductCommentDO::getOrderItemId, orderItemId)
59 .eq(ProductCommentDO::getSpuId, spuId)); 59 .eq(ProductCommentDO::getSpuId, spuId));
60 } 60 }
61 61
@@ -68,4 +68,12 @@ public interface ProductCommentMapper extends BaseMapperX&lt;ProductCommentDO&gt; { @@ -68,4 +68,12 @@ public interface ProductCommentMapper extends BaseMapperX&lt;ProductCommentDO&gt; {
68 return selectCount(queryWrapper); 68 return selectCount(queryWrapper);
69 } 69 }
70 70
  71 + default PageResult<ProductCommentDO> selectCommentList(Long spuId, Integer count) {
  72 + // 构建分页查询条件
  73 + return selectPage(new PageParam().setPageSize(count), new LambdaQueryWrapperX<ProductCommentDO>()
  74 + .eqIfPresent(ProductCommentDO::getSpuId, spuId)
  75 + .orderByDesc(ProductCommentDO::getCreateTime)
  76 + );
  77 + }
  78 +
71 } 79 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/comment/ProductCommentService.java
1 package cn.iocoder.yudao.module.product.service.comment; 1 package cn.iocoder.yudao.module.product.service.comment;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO;
4 import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentCreateReqVO; 5 import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentCreateReqVO;
5 import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentPageReqVO; 6 import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentPageReqVO;
6 import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentReplyReqVO; 7 import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentReplyReqVO;
@@ -12,6 +13,8 @@ import cn.iocoder.yudao.module.product.dal.dataobject.comment.ProductCommentDO; @@ -12,6 +13,8 @@ import cn.iocoder.yudao.module.product.dal.dataobject.comment.ProductCommentDO;
12 import org.springframework.stereotype.Service; 13 import org.springframework.stereotype.Service;
13 import org.springframework.validation.annotation.Validated; 14 import org.springframework.validation.annotation.Validated;
14 15
  16 +import java.util.List;
  17 +
15 /** 18 /**
16 * 商品评论 Service 接口 19 * 商品评论 Service 接口
17 * 20 *
@@ -65,10 +68,10 @@ public interface ProductCommentService { @@ -65,10 +68,10 @@ public interface ProductCommentService {
65 * 创建评论 68 * 创建评论
66 * 创建商品评论 APP 端创建商品评论使用 69 * 创建商品评论 APP 端创建商品评论使用
67 * 70 *
68 - * @param commentDO 评论对象 71 + * @param createReqDTO 创建请求 dto
69 * @return 返回评论 id 72 * @return 返回评论 id
70 */ 73 */
71 - Long createComment(ProductCommentDO commentDO); 74 + Long createComment(ProductCommentCreateReqDTO createReqDTO);
72 75
73 /** 76 /**
74 * 获得商品的评价统计 77 * 获得商品的评价统计
@@ -77,6 +80,15 @@ public interface ProductCommentService { @@ -77,6 +80,15 @@ public interface ProductCommentService {
77 * @param visible 是否可见 80 * @param visible 是否可见
78 * @return 评价统计 81 * @return 评价统计
79 */ 82 */
80 - AppCommentStatisticsRespVO getCommentPageTabsCount(Long spuId, Boolean visible); 83 + AppCommentStatisticsRespVO getCommentStatistics(Long spuId, Boolean visible);
  84 +
  85 + /**
  86 + * 得到评论列表
  87 + *
  88 + * @param spuId 商品 id
  89 + * @param count 数量
  90 + * @return {@link Object}
  91 + */
  92 + List<AppProductCommentRespVO> getCommentList(Long spuId, Integer count);
81 93
82 } 94 }
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/comment/ProductCommentServiceImpl.java
1 package cn.iocoder.yudao.module.product.service.comment; 1 package cn.iocoder.yudao.module.product.service.comment;
2 2
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.hutool.core.util.ObjectUtil;  
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
  5 +import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
  6 +import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO;
6 import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentCreateReqVO; 7 import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentCreateReqVO;
7 import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentPageReqVO; 8 import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentPageReqVO;
8 import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentReplyReqVO; 9 import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommentReplyReqVO;
@@ -10,7 +11,6 @@ import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommen @@ -10,7 +11,6 @@ import cn.iocoder.yudao.module.product.controller.admin.comment.vo.ProductCommen
10 import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppCommentPageReqVO; 11 import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppCommentPageReqVO;
11 import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppCommentStatisticsRespVO; 12 import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppCommentStatisticsRespVO;
12 import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppProductCommentRespVO; 13 import cn.iocoder.yudao.module.product.controller.app.comment.vo.AppProductCommentRespVO;
13 -import cn.iocoder.yudao.module.product.controller.app.property.vo.value.AppProductPropertyValueDetailRespVO;  
14 import cn.iocoder.yudao.module.product.convert.comment.ProductCommentConvert; 14 import cn.iocoder.yudao.module.product.convert.comment.ProductCommentConvert;
15 import cn.iocoder.yudao.module.product.dal.dataobject.comment.ProductCommentDO; 15 import cn.iocoder.yudao.module.product.dal.dataobject.comment.ProductCommentDO;
16 import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO; 16 import cn.iocoder.yudao.module.product.dal.dataobject.sku.ProductSkuDO;
@@ -18,7 +18,6 @@ import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO; @@ -18,7 +18,6 @@ import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
18 import cn.iocoder.yudao.module.product.dal.mysql.comment.ProductCommentMapper; 18 import cn.iocoder.yudao.module.product.dal.mysql.comment.ProductCommentMapper;
19 import cn.iocoder.yudao.module.product.service.sku.ProductSkuService; 19 import cn.iocoder.yudao.module.product.service.sku.ProductSkuService;
20 import cn.iocoder.yudao.module.product.service.spu.ProductSpuService; 20 import cn.iocoder.yudao.module.product.service.spu.ProductSpuService;
21 -import cn.iocoder.yudao.module.trade.api.order.TradeOrderApi;  
22 import org.springframework.context.annotation.Lazy; 21 import org.springframework.context.annotation.Lazy;
23 import org.springframework.stereotype.Service; 22 import org.springframework.stereotype.Service;
24 import org.springframework.transaction.annotation.Transactional; 23 import org.springframework.transaction.annotation.Transactional;
@@ -26,11 +25,7 @@ import org.springframework.validation.annotation.Validated; @@ -26,11 +25,7 @@ import org.springframework.validation.annotation.Validated;
26 25
27 import javax.annotation.Resource; 26 import javax.annotation.Resource;
28 import java.time.LocalDateTime; 27 import java.time.LocalDateTime;
29 -import java.util.HashMap;  
30 import java.util.List; 28 import java.util.List;
31 -import java.util.Map;  
32 -import java.util.Set;  
33 -import java.util.stream.Collectors;  
34 29
35 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 30 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
36 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.*; 31 import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.*;
@@ -48,15 +43,15 @@ public class ProductCommentServiceImpl implements ProductCommentService { @@ -48,15 +43,15 @@ public class ProductCommentServiceImpl implements ProductCommentService {
48 private ProductCommentMapper productCommentMapper; 43 private ProductCommentMapper productCommentMapper;
49 44
50 @Resource 45 @Resource
51 - private TradeOrderApi tradeOrderApi;  
52 -  
53 - @Resource  
54 private ProductSpuService productSpuService; 46 private ProductSpuService productSpuService;
55 47
56 @Resource 48 @Resource
57 @Lazy 49 @Lazy
58 private ProductSkuService productSkuService; 50 private ProductSkuService productSkuService;
59 51
  52 + @Resource
  53 + private MemberUserApi memberUserApi;
  54 +
60 @Override 55 @Override
61 @Transactional(rollbackFor = Exception.class) 56 @Transactional(rollbackFor = Exception.class)
62 public void updateCommentVisible(ProductCommentUpdateVisibleReqVO updateReqVO) { 57 public void updateCommentVisible(ProductCommentUpdateVisibleReqVO updateReqVO) {
@@ -85,11 +80,8 @@ public class ProductCommentServiceImpl implements ProductCommentService { @@ -85,11 +80,8 @@ public class ProductCommentServiceImpl implements ProductCommentService {
85 @Override 80 @Override
86 @Transactional(rollbackFor = Exception.class) 81 @Transactional(rollbackFor = Exception.class)
87 public void createComment(ProductCommentCreateReqVO createReqVO) { 82 public void createComment(ProductCommentCreateReqVO createReqVO) {
88 - // 校验订单  
89 - // TODO @puhui999:不校验哈;尽可能解耦  
90 - Long orderId = tradeOrderApi.validateOrder(createReqVO.getUserId(), createReqVO.getOrderItemId());  
91 // 校验评论 83 // 校验评论
92 - validateComment(createReqVO.getSpuId(), createReqVO.getUserId(), orderId); 84 + validateComment(createReqVO.getSpuId(), createReqVO.getUserId(), createReqVO.getOrderItemId());
93 85
94 ProductCommentDO commentDO = ProductCommentConvert.INSTANCE.convert(createReqVO); 86 ProductCommentDO commentDO = ProductCommentConvert.INSTANCE.convert(createReqVO);
95 productCommentMapper.insert(commentDO); 87 productCommentMapper.insert(commentDO);
@@ -97,26 +89,41 @@ public class ProductCommentServiceImpl implements ProductCommentService { @@ -97,26 +89,41 @@ public class ProductCommentServiceImpl implements ProductCommentService {
97 89
98 @Override 90 @Override
99 @Transactional(rollbackFor = Exception.class) 91 @Transactional(rollbackFor = Exception.class)
100 - public Long createComment(ProductCommentDO commentDO) { 92 + public Long createComment(ProductCommentCreateReqDTO createReqDTO) {
  93 + // 通过 sku ID 拿到 spu 相关信息
  94 + ProductSkuDO sku = productSkuService.getSku(createReqDTO.getSkuId());
  95 + if (sku == null) {
  96 + throw exception(SKU_NOT_EXISTS);
  97 + }
  98 + // 校验 spu 如果存在返回详情
  99 + ProductSpuDO spuDO = validateSpu(sku.getSpuId());
101 // 校验评论 100 // 校验评论
102 - validateComment(commentDO.getSpuId(), commentDO.getUserId(), commentDO.getOrderId()); 101 + validateComment(spuDO.getId(), createReqDTO.getUserId(), createReqDTO.getOrderId());
  102 + // 获取用户详细信息
  103 + MemberUserRespDTO user = memberUserApi.getUser(createReqDTO.getUserId());
103 104
  105 + // 创建评论
  106 + ProductCommentDO commentDO = ProductCommentConvert.INSTANCE.convert(createReqDTO, spuDO, user);
104 productCommentMapper.insert(commentDO); 107 productCommentMapper.insert(commentDO);
105 return commentDO.getId(); 108 return commentDO.getId();
106 } 109 }
107 110
108 - private void validateComment(Long spuId, Long userId, Long orderId) {  
109 - ProductSpuDO spu = productSpuService.getSpu(spuId);  
110 - if (null == spu) {  
111 - throw exception(SPU_NOT_EXISTS);  
112 - } 111 + private void validateComment(Long spuId, Long userId, Long orderItemId) {
113 // 判断当前订单的当前商品用户是否评价过 112 // 判断当前订单的当前商品用户是否评价过
114 - ProductCommentDO exist = productCommentMapper.selectByUserIdAndOrderIdAndSpuId(userId, orderId, spuId); 113 + ProductCommentDO exist = productCommentMapper.selectByUserIdAndOrderItemIdAndSpuId(userId, orderItemId, spuId);
115 if (null != exist) { 114 if (null != exist) {
116 throw exception(ORDER_SPU_COMMENT_EXISTS); 115 throw exception(ORDER_SPU_COMMENT_EXISTS);
117 } 116 }
118 } 117 }
119 118
  119 + private ProductSpuDO validateSpu(Long spuId) {
  120 + ProductSpuDO spu = productSpuService.getSpu(spuId);
  121 + if (null == spu) {
  122 + throw exception(SPU_NOT_EXISTS);
  123 + }
  124 + return spu;
  125 + }
  126 +
120 private ProductCommentDO validateCommentExists(Long id) { 127 private ProductCommentDO validateCommentExists(Long id) {
121 ProductCommentDO productComment = productCommentMapper.selectById(id); 128 ProductCommentDO productComment = productCommentMapper.selectById(id);
122 if (productComment == null) { 129 if (productComment == null) {
@@ -126,7 +133,7 @@ public class ProductCommentServiceImpl implements ProductCommentService { @@ -126,7 +133,7 @@ public class ProductCommentServiceImpl implements ProductCommentService {
126 } 133 }
127 134
128 @Override 135 @Override
129 - public AppCommentStatisticsRespVO getCommentPageTabsCount(Long spuId, Boolean visible) { 136 + public AppCommentStatisticsRespVO getCommentStatistics(Long spuId, Boolean visible) {
130 return ProductCommentConvert.INSTANCE.convert( 137 return ProductCommentConvert.INSTANCE.convert(
131 // 查询商品 id = spuId 的所有评论数量 138 // 查询商品 id = spuId 的所有评论数量
132 productCommentMapper.selectCountBySpuId(spuId, visible, null), 139 productCommentMapper.selectCountBySpuId(spuId, visible, null),
@@ -140,28 +147,17 @@ public class ProductCommentServiceImpl implements ProductCommentService { @@ -140,28 +147,17 @@ public class ProductCommentServiceImpl implements ProductCommentService {
140 } 147 }
141 148
142 @Override 149 @Override
  150 + public List<AppProductCommentRespVO> getCommentList(Long spuId, Integer count) {
  151 + // 校验商品 spu 是否存在
  152 + ProductSpuDO spuDO = validateSpu(spuId);
  153 +
  154 + return ProductCommentConvert.INSTANCE.convertList02(productCommentMapper.selectCommentList(spuDO.getId(), count).getList());
  155 + }
  156 +
  157 + @Override
143 public PageResult<AppProductCommentRespVO> getCommentPage(AppCommentPageReqVO pageVO, Boolean visible) { 158 public PageResult<AppProductCommentRespVO> getCommentPage(AppCommentPageReqVO pageVO, Boolean visible) {
144 - PageResult<AppProductCommentRespVO> result = ProductCommentConvert.INSTANCE.convertPage02( 159 + return ProductCommentConvert.INSTANCE.convertPage02(
145 productCommentMapper.selectPage(pageVO, visible)); 160 productCommentMapper.selectPage(pageVO, visible));
146 - // TODO @puhui999:要不这块放到 controller 里拼接?  
147 - Set<Long> skuIds = result.getList().stream().map(AppProductCommentRespVO::getSkuId).collect(Collectors.toSet());  
148 - List<ProductSkuDO> skuList = productSkuService.getSkuList(skuIds);  
149 - Map<Long, ProductSkuDO> skuDOMap = new HashMap<>(skuIds.size());  
150 - if (CollUtil.isNotEmpty(skuList)) {  
151 - skuDOMap.putAll(skuList.stream().collect(Collectors.toMap(ProductSkuDO::getId, c -> c)));  
152 - }  
153 - result.getList().forEach(item -> {  
154 - // 判断用户是否选择匿名  
155 - if (ObjectUtil.equal(item.getAnonymous(), true)) {  
156 - item.setUserNickname(ProductCommentDO.NICKNAME_ANONYMOUS);  
157 - }  
158 - ProductSkuDO productSkuDO = skuDOMap.get(item.getSkuId());  
159 - if (productSkuDO != null) {  
160 - List<AppProductPropertyValueDetailRespVO> skuProperties = ProductCommentConvert.INSTANCE.convertList01(productSkuDO.getProperties());  
161 - item.setSkuProperties(skuProperties);  
162 - }  
163 - });  
164 - return result;  
165 } 161 }
166 162
167 @Override 163 @Override
yudao-module-mall/yudao-module-product-biz/src/main/java/cn/iocoder/yudao/module/product/service/sku/ProductSkuService.java
@@ -55,7 +55,7 @@ public interface ProductSkuService { @@ -55,7 +55,7 @@ public interface ProductSkuService {
55 * 批量创建 SKU 55 * 批量创建 SKU
56 * 56 *
57 * @param spuId 商品 SPU 编号 57 * @param spuId 商品 SPU 编号
58 - * @param list SKU 对象集合 58 + * @param list SKU 对象集合
59 */ 59 */
60 void createSkuList(Long spuId, List<ProductSkuCreateOrUpdateReqVO> list); 60 void createSkuList(Long spuId, List<ProductSkuCreateOrUpdateReqVO> list);
61 61
@@ -63,13 +63,13 @@ public interface ProductSkuService { @@ -63,13 +63,13 @@ public interface ProductSkuService {
63 * 根据 SPU 编号,批量更新它的 SKU 信息 63 * 根据 SPU 编号,批量更新它的 SKU 信息
64 * 64 *
65 * @param spuId SPU 编码 65 * @param spuId SPU 编码
66 - * @param skus SKU 的集合 66 + * @param skus SKU 的集合
67 */ 67 */
68 void updateSkuList(Long spuId, List<ProductSkuCreateOrUpdateReqVO> skus); 68 void updateSkuList(Long spuId, List<ProductSkuCreateOrUpdateReqVO> skus);
69 69
70 /** 70 /**
71 * 更新 SKU 库存(增量) 71 * 更新 SKU 库存(增量)
72 - * 72 + * <p>
73 * 如果更新的库存不足,会抛出异常 73 * 如果更新的库存不足,会抛出异常
74 * 74 *
75 * @param updateStockReqDTO 更行请求 75 * @param updateStockReqDTO 更行请求
@@ -88,7 +88,7 @@ public interface ProductSkuService { @@ -88,7 +88,7 @@ public interface ProductSkuService {
88 * 获得 spu 对应的 SKU 集合 88 * 获得 spu 对应的 SKU 集合
89 * 89 *
90 * @param spuIds spu 编码集合 90 * @param spuIds spu 编码集合
91 - * @return 商品 sku 集合 91 + * @return 商品 sku 集合
92 */ 92 */
93 List<ProductSkuDO> getSkuListBySpuId(List<Long> spuIds); 93 List<ProductSkuDO> getSkuListBySpuId(List<Long> spuIds);
94 94
@@ -123,4 +123,5 @@ public interface ProductSkuService { @@ -123,4 +123,5 @@ public interface ProductSkuService {
123 * @return int 影响的行数 123 * @return int 影响的行数
124 */ 124 */
125 int updateSkuPropertyValue(Long propertyValueId, String propertyValueName); 125 int updateSkuPropertyValue(Long propertyValueId, String propertyValueName);
  126 +
126 } 127 }
yudao-module-mall/yudao-module-product-biz/src/test/java/cn/iocoder/yudao/module/product/service/comment/ProductCommentServiceImplTest.java
@@ -150,7 +150,7 @@ public class ProductCommentServiceImplTest extends BaseDbUnitTest { @@ -150,7 +150,7 @@ public class ProductCommentServiceImplTest extends BaseDbUnitTest {
150 assertEquals(2, result3.getTotal()); 150 assertEquals(2, result3.getTotal());
151 151
152 // 测试分页 tab count 152 // 测试分页 tab count
153 - AppCommentStatisticsRespVO tabsCount = productCommentService.getCommentPageTabsCount(spuId, Boolean.TRUE); 153 + AppCommentStatisticsRespVO tabsCount = productCommentService.getCommentStatistics(spuId, Boolean.TRUE);
154 assertEquals(6, tabsCount.getAllCount()); 154 assertEquals(6, tabsCount.getAllCount());
155 assertEquals(4, tabsCount.getGoodCount()); 155 assertEquals(4, tabsCount.getGoodCount());
156 assertEquals(2, tabsCount.getMediocreCount()); 156 assertEquals(2, tabsCount.getMediocreCount());
yudao-module-mall/yudao-module-product-biz/src/test/resources/sql/create_tables.sql
@@ -126,82 +126,32 @@ CREATE TABLE IF NOT EXISTS `product_property_value` ( @@ -126,82 +126,32 @@ CREATE TABLE IF NOT EXISTS `product_property_value` (
126 PRIMARY KEY("id") 126 PRIMARY KEY("id")
127 ) COMMENT '规格值'; 127 ) COMMENT '规格值';
128 128
129 --- TODO @puhui999:格式不太对哈  
130 -CREATE TABLE IF NOT EXISTS `product_comment`  
131 -(  
132 - `id`  
133 - bigint  
134 - NOT  
135 - NULL  
136 - AUTO_INCREMENT  
137 - COMMENT  
138 - '评论编号,主键自增',  
139 - `user_id`  
140 - bigint  
141 - DEFAULT  
142 - NULL  
143 - COMMENT  
144 - '评价人的用户编号关联 MemberUserDO 的 id 编号',  
145 - `user_nickname`  
146 - varchar  
147 -(  
148 - 255  
149 -) DEFAULT NULL COMMENT '评价人名称',  
150 - `user_avatar` varchar  
151 -(  
152 - 1024  
153 -) DEFAULT NULL COMMENT '评价人头像',  
154 - `anonymous` bit  
155 -(  
156 - 1  
157 -) DEFAULT NULL COMMENT '是否匿名', 129 +DROP TABLE IF EXISTS `product_comment` (
  130 + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '评论编号,主键自增',
  131 + `user_id` bigint DEFAULT NULL COMMENT '评价人的用户编号关联 MemberUserDO 的 id 编号',
  132 + `user_nickname` varchar(255) DEFAULT NULL COMMENT '评价人名称',
  133 + `user_avatar` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '评价人头像',
  134 + `anonymous` bit(1) DEFAULT NULL COMMENT '是否匿名',
158 `order_id` bigint DEFAULT NULL COMMENT '交易订单编号关联 TradeOrderDO 的 id 编号', 135 `order_id` bigint DEFAULT NULL COMMENT '交易订单编号关联 TradeOrderDO 的 id 编号',
159 `order_item_id` bigint DEFAULT NULL COMMENT '交易订单项编号关联 TradeOrderItemDO 的 id 编号', 136 `order_item_id` bigint DEFAULT NULL COMMENT '交易订单项编号关联 TradeOrderItemDO 的 id 编号',
160 `spu_id` bigint DEFAULT NULL COMMENT '商品 SPU 编号关联 ProductSpuDO 的 id', 137 `spu_id` bigint DEFAULT NULL COMMENT '商品 SPU 编号关联 ProductSpuDO 的 id',
161 - `spu_name` varchar  
162 -(  
163 - 255  
164 -) DEFAULT NULL COMMENT '商品 SPU 名称', 138 + `spu_name` varchar(255) DEFAULT NULL COMMENT '商品 SPU 名称',
165 `sku_id` bigint DEFAULT NULL COMMENT '商品 SKU 编号关联 ProductSkuDO 的 id 编号', 139 `sku_id` bigint DEFAULT NULL COMMENT '商品 SKU 编号关联 ProductSkuDO 的 id 编号',
166 - `visible` bit  
167 -(  
168 - 1  
169 -) DEFAULT NULL COMMENT '是否可见true:显示false:隐藏',  
170 - `scores` tinyint DEFAULT NULL COMMENT '评分星级1-5 分', 140 + `visible` bit(1) DEFAULT NULL COMMENT '是否可见true:显示false:隐藏',
  141 + `scores` tinyint DEFAULT NULL COMMENT '评分星级1-5分',
171 `description_scores` tinyint DEFAULT NULL COMMENT '描述星级1-5 星', 142 `description_scores` tinyint DEFAULT NULL COMMENT '描述星级1-5 星',
172 `benefit_scores` tinyint DEFAULT NULL COMMENT '服务星级1-5 星', 143 `benefit_scores` tinyint DEFAULT NULL COMMENT '服务星级1-5 星',
173 - `content` varchar  
174 -(  
175 - 1024  
176 -) DEFAULT NULL COMMENT '评论内容',  
177 - `pic_urls` varchar  
178 -(  
179 - 4096  
180 -) DEFAULT NULL COMMENT '评论图片地址数组',  
181 - `reply_status` bit  
182 -(  
183 - 1  
184 -) DEFAULT NULL COMMENT '商家是否回复', 144 + `content` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '评论内容',
  145 + `pic_urls` varchar(4096) DEFAULT NULL COMMENT '评论图片地址数组',
  146 + `reply_status` bit(1) DEFAULT NULL COMMENT '商家是否回复',
185 `reply_user_id` bigint DEFAULT NULL COMMENT '回复管理员编号关联 AdminUserDO 的 id 编号', 147 `reply_user_id` bigint DEFAULT NULL COMMENT '回复管理员编号关联 AdminUserDO 的 id 编号',
186 - `reply_content` varchar  
187 -(  
188 - 1024  
189 -) DEFAULT NULL COMMENT '商家回复内容', 148 + `reply_content` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '商家回复内容',
190 `reply_time` datetime DEFAULT NULL COMMENT '商家回复时间', 149 `reply_time` datetime DEFAULT NULL COMMENT '商家回复时间',
191 - `creator` varchar  
192 -(  
193 - 64  
194 -) DEFAULT '' COMMENT '创建者', 150 + `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
195 `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', 151 `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
196 - `updater` varchar  
197 -(  
198 - 64  
199 -) DEFAULT '' COMMENT '更新者', 152 + `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
200 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', 153 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
201 - "deleted" bit NOT NULL DEFAULT FALSE,  
202 - "tenant_id" bigint not null default '0',  
203 - PRIMARY KEY  
204 -(  
205 - `id`  
206 -)  
207 - ) COMMENT '产品评论表'; 154 + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
  155 + `tenant_id` bigint NOT NULL DEFAULT '0' COMMENT '租户编号',
  156 + PRIMARY KEY (`id`) USING BTREE
  157 +) ENGINE = InnoDB AUTO_INCREMENT = 26 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '商品评论';
208 \ No newline at end of file 158 \ No newline at end of file
yudao-module-mall/yudao-module-promotion-api/src/main/java/cn/iocoder/yudao/module/promotion/enums/ErrorCodeConstants.java
@@ -56,5 +56,7 @@ public interface ErrorCodeConstants { @@ -56,5 +56,7 @@ public interface ErrorCodeConstants {
56 // ========== 秒杀时段 1013009000 ========== 56 // ========== 秒杀时段 1013009000 ==========
57 ErrorCode SECKILL_TIME_NOT_EXISTS = new ErrorCode(1013009000, "秒杀时段不存在"); 57 ErrorCode SECKILL_TIME_NOT_EXISTS = new ErrorCode(1013009000, "秒杀时段不存在");
58 ErrorCode SECKILL_TIME_CONFLICTS = new ErrorCode(1013009001, "秒杀时段冲突"); 58 ErrorCode SECKILL_TIME_CONFLICTS = new ErrorCode(1013009001, "秒杀时段冲突");
  59 + ErrorCode SECKILL_TIME_EQUAL = new ErrorCode(1013009002, "秒杀时段开始时间和结束时间不能相等");
  60 + ErrorCode SECKILL_START_TIME_BEFORE_END_TIME = new ErrorCode(1013009003, "秒杀时段开始时间不能在结束时间之后");
59 61
60 } 62 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/SeckillConfigController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.*;
  6 +import cn.iocoder.yudao.module.promotion.convert.seckill.seckillconfig.SeckillConfigConvert;
  7 +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillconfig.SeckillConfigDO;
  8 +import cn.iocoder.yudao.module.promotion.service.seckill.seckillconfig.SeckillConfigService;
  9 +import io.swagger.v3.oas.annotations.Operation;
  10 +import io.swagger.v3.oas.annotations.Parameter;
  11 +import io.swagger.v3.oas.annotations.tags.Tag;
  12 +import org.springframework.security.access.prepost.PreAuthorize;
  13 +import org.springframework.validation.annotation.Validated;
  14 +import org.springframework.web.bind.annotation.*;
  15 +
  16 +import javax.annotation.Resource;
  17 +import javax.validation.Valid;
  18 +import java.util.List;
  19 +
  20 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  21 +
  22 +/**
  23 + * 管理后台 - 秒杀时段相关接口
  24 + *
  25 + * @author HUIHUI
  26 + */
  27 +@Tag(name = "管理后台 - 秒杀时段")
  28 +@RestController
  29 +@RequestMapping("/promotion/seckill-config")
  30 +@Validated
  31 +public class SeckillConfigController {
  32 +
  33 + @Resource
  34 + private SeckillConfigService seckillConfigService;
  35 +
  36 + @PostMapping("/create")
  37 + @Operation(summary = "创建秒杀时段")
  38 + @PreAuthorize("@ss.hasPermission('promotion:seckill-config:create')")
  39 + public CommonResult<Long> createSeckillConfig(@Valid @RequestBody SeckillConfigCreateReqVO createReqVO) {
  40 + return success(seckillConfigService.createSeckillConfig(createReqVO));
  41 + }
  42 +
  43 + @PutMapping("/update")
  44 + @Operation(summary = "更新秒杀时段")
  45 + @PreAuthorize("@ss.hasPermission('promotion:seckill-config:update')")
  46 + public CommonResult<Boolean> updateSeckillConfig(@Valid @RequestBody SeckillConfigUpdateReqVO updateReqVO) {
  47 + seckillConfigService.updateSeckillConfig(updateReqVO);
  48 + return success(true);
  49 + }
  50 +
  51 + @PutMapping("/update-status")
  52 + @Operation(summary = "修改时段配置状态")
  53 + @PreAuthorize("@ss.hasPermission('system:seckill-config:update')")
  54 + public CommonResult<Boolean> updateSeckillConfigStatus(@Valid @RequestBody SeckillConfigUpdateStatusReqVo reqVO) {
  55 + seckillConfigService.updateSeckillConfigStatus(reqVO.getId(), reqVO.getStatus());
  56 + return success(true);
  57 + }
  58 +
  59 + @DeleteMapping("/delete")
  60 + @Operation(summary = "删除秒杀时段")
  61 + @Parameter(name = "id", description = "编号", required = true)
  62 + @PreAuthorize("@ss.hasPermission('promotion:seckill-config:delete')")
  63 + public CommonResult<Boolean> deleteSeckillConfig(@RequestParam("id") Long id) {
  64 + seckillConfigService.deleteSeckillConfig(id);
  65 + return success(true);
  66 + }
  67 +
  68 + @GetMapping("/get")
  69 + @Operation(summary = "获得秒杀时段")
  70 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  71 + @PreAuthorize("@ss.hasPermission('promotion:seckill-config:query')")
  72 + public CommonResult<SeckillConfigRespVO> getSeckillConfig(@RequestParam("id") Long id) {
  73 + SeckillConfigDO seckillConfig = seckillConfigService.getSeckillConfig(id);
  74 + return success(SeckillConfigConvert.INSTANCE.convert(seckillConfig));
  75 + }
  76 +
  77 + @GetMapping("/list")
  78 + @Operation(summary = "获得所有秒杀时段列表")
  79 + @PreAuthorize("@ss.hasPermission('promotion:seckill-config:query')")
  80 + public CommonResult<List<SeckillConfigRespVO>> getSeckillConfigList() {
  81 + List<SeckillConfigDO> list = seckillConfigService.getSeckillConfigList();
  82 + return success(SeckillConfigConvert.INSTANCE.convertList(list));
  83 + }
  84 +
  85 + @GetMapping("/list-all-simple")
  86 + @Operation(summary = "获得所有开启状态的秒杀时段精简列表", description = "主要用于前端的下拉选项")
  87 + public CommonResult<List<SeckillConfigSimpleRespVO>> getListAllSimple() {
  88 + List<SeckillConfigDO> list = seckillConfigService.getListAllSimple();
  89 + return success(SeckillConfigConvert.INSTANCE.convertList1(list));
  90 + }
  91 +
  92 + @GetMapping("/page")
  93 + @Operation(summary = "获得秒杀活动分页")
  94 + @PreAuthorize("@ss.hasPermission('promotion:seckill-config:query')")
  95 + public CommonResult<PageResult<SeckillConfigRespVO>> getSeckillActivityPage(@Valid SeckillConfigPageReqVO pageVO) {
  96 + PageResult<SeckillConfigDO> pageResult = seckillConfigService.getSeckillConfigPage(pageVO);
  97 + return success(SeckillConfigConvert.INSTANCE.convertPage(pageResult));
  98 + }
  99 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/SeckillTimeController.java deleted
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill;  
2 -  
3 -import cn.iocoder.yudao.framework.common.pojo.CommonResult;  
4 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeCreateReqVO;  
5 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeRespVO;  
6 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeUpdateReqVO;  
7 -import cn.iocoder.yudao.module.promotion.convert.seckill.seckilltime.SeckillTimeConvert;  
8 -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO;  
9 -import cn.iocoder.yudao.module.promotion.service.seckill.seckilltime.SeckillTimeService;  
10 -import io.swagger.v3.oas.annotations.Operation;  
11 -import io.swagger.v3.oas.annotations.Parameter;  
12 -import io.swagger.v3.oas.annotations.tags.Tag;  
13 -import org.springframework.security.access.prepost.PreAuthorize;  
14 -import org.springframework.validation.annotation.Validated;  
15 -import org.springframework.web.bind.annotation.*;  
16 -  
17 -import javax.annotation.Resource;  
18 -import javax.validation.Valid;  
19 -import java.util.List;  
20 -  
21 -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;  
22 -  
23 -@Tag(name = "管理后台 - 秒杀时段")  
24 -@RestController  
25 -@RequestMapping("/promotion/seckill-time")  
26 -@Validated  
27 -public class SeckillTimeController {  
28 -  
29 - @Resource  
30 - private SeckillTimeService seckillTimeService;  
31 -  
32 - @PostMapping("/create")  
33 - @Operation(summary = "创建秒杀时段")  
34 - @PreAuthorize("@ss.hasPermission('promotion:seckill-time:create')")  
35 - public CommonResult<Long> createSeckillTime(@Valid @RequestBody SeckillTimeCreateReqVO createReqVO) {  
36 - return success(seckillTimeService.createSeckillTime(createReqVO));  
37 - }  
38 -  
39 - @PutMapping("/update")  
40 - @Operation(summary = "更新秒杀时段")  
41 - @PreAuthorize("@ss.hasPermission('promotion:seckill-time:update')")  
42 - public CommonResult<Boolean> updateSeckillTime(@Valid @RequestBody SeckillTimeUpdateReqVO updateReqVO) {  
43 - seckillTimeService.updateSeckillTime(updateReqVO);  
44 - return success(true);  
45 - }  
46 -  
47 - @DeleteMapping("/delete")  
48 - @Operation(summary = "删除秒杀时段")  
49 - @Parameter(name = "id", description = "编号", required = true)  
50 - @PreAuthorize("@ss.hasPermission('promotion:seckill-time:delete')")  
51 - public CommonResult<Boolean> deleteSeckillTime(@RequestParam("id") Long id) {  
52 - seckillTimeService.deleteSeckillTime(id);  
53 - return success(true);  
54 - }  
55 -  
56 - @GetMapping("/get")  
57 - @Operation(summary = "获得秒杀时段")  
58 - @Parameter(name = "id", description = "编号", required = true, example = "1024")  
59 - @PreAuthorize("@ss.hasPermission('promotion:seckill-time:query')")  
60 - public CommonResult<SeckillTimeRespVO> getSeckillTime(@RequestParam("id") Long id) {  
61 - SeckillTimeDO seckillTime = seckillTimeService.getSeckillTime(id);  
62 - return success(SeckillTimeConvert.INSTANCE.convert(seckillTime));  
63 - }  
64 -  
65 - @GetMapping("/list")  
66 - @Operation(summary = "获得所有秒杀时段列表")  
67 - @PreAuthorize("@ss.hasPermission('promotion:seckill-time:query')")  
68 - public CommonResult<List<SeckillTimeRespVO>> getSeckillTimeList() {  
69 - List<SeckillTimeDO> list = seckillTimeService.getSeckillTimeList();  
70 - return success(SeckillTimeConvert.INSTANCE.convertList(list));  
71 - }  
72 -}  
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityBaseVO.java
1 package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity; 1 package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity;
2 2
3 -import com.fasterxml.jackson.annotation.JsonFormat;  
4 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
5 import lombok.Data; 4 import lombok.Data;
6 import org.springframework.format.annotation.DateTimeFormat; 5 import org.springframework.format.annotation.DateTimeFormat;
7 6
8 -import javax.validation.constraints.Min;  
9 import javax.validation.constraints.NotNull; 7 import javax.validation.constraints.NotNull;
10 import java.time.LocalDateTime; 8 import java.time.LocalDateTime;
  9 +import java.util.List;
11 10
12 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; 11 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
13 -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.TIME_ZONE_DEFAULT;  
14 12
15 /** 13 /**
  14 + * 秒杀活动基地签证官
16 * 秒杀活动 Base VO,提供给添加、修改、详细的子 VO 使用 15 * 秒杀活动 Base VO,提供给添加、修改、详细的子 VO 使用
17 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 16 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  17 + *
  18 + * @author HUIHUI
18 */ 19 */
19 @Data 20 @Data
20 public class SeckillActivityBaseVO { 21 public class SeckillActivityBaseVO {
21 22
22 - @Schema(description = "秒杀活动名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "晚九点限时秒杀") 23 + @Schema(description = "秒杀活动商品id", requiredMode = Schema.RequiredMode.REQUIRED, example = "[121,1212]")
  24 + @NotNull(message = "秒杀活动商品不能为空")
  25 + private List<Long> spuIds;
  26 +
  27 + @Schema(description = "秒杀活动名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "618大促")
23 @NotNull(message = "秒杀活动名称不能为空") 28 @NotNull(message = "秒杀活动名称不能为空")
24 private String name; 29 private String name;
25 30
  31 + @Schema(description = "备注", example = "清仓大甩卖割韭菜")
  32 + private String remark;
  33 +
26 @Schema(description = "活动开始时间", requiredMode = Schema.RequiredMode.REQUIRED) 34 @Schema(description = "活动开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
27 @NotNull(message = "活动开始时间不能为空") 35 @NotNull(message = "活动开始时间不能为空")
28 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) 36 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
29 - @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT)  
30 private LocalDateTime startTime; 37 private LocalDateTime startTime;
31 38
32 @Schema(description = "活动结束时间", requiredMode = Schema.RequiredMode.REQUIRED) 39 @Schema(description = "活动结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
33 @NotNull(message = "活动结束时间不能为空") 40 @NotNull(message = "活动结束时间不能为空")
34 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) 41 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
35 - @JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = TIME_ZONE_DEFAULT)  
36 private LocalDateTime endTime; 42 private LocalDateTime endTime;
37 43
  44 + @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED)
  45 + @NotNull(message = "排序不能为空")
  46 + private Integer sort;
38 47
39 - @Schema(description = "商品")  
40 - @Data  
41 - public static class Product {  
42 -  
43 - @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
44 - @NotNull(message = "商品 SPU 编号不能为空")  
45 - private Long spuId;  
46 -  
47 - @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
48 - @NotNull(message = "商品 SKU 编号不能为空")  
49 - private Long skuId;  
50 -  
51 - @Schema(description = "秒杀金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "12.00")  
52 - @NotNull(message = "秒杀金额不能为空")  
53 - private Integer seckillPrice; 48 + @Schema(description = "秒杀时段id", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1,2,3]")
  49 + @NotNull(message = "秒杀时段不能为空")
  50 + private List<Long> configIds;
54 51
55 - @Schema(description = "秒杀库存", example = "80")  
56 - @Min(value = 0, message = "秒杀库存需要大于等于 0")  
57 - private Integer stock; 52 + @Schema(description = "总限购数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "12877")
  53 + private Integer totalLimitCount;
58 54
59 - @Schema(description = "每人限购", example = "10") // 如果为 0 则不限购  
60 - @Min(value = 0, message = "每人限购需要大于等于 0")  
61 - private Integer limitCount; 55 + @Schema(description = "单次限够数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "31683")
  56 + private Integer singleLimitCount;
62 57
63 - } 58 + @Schema(description = "秒杀总库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
  59 + private Integer totalStock;
64 60
65 } 61 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityCreateReqVO.java
1 package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity; 1 package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity;
2 2
  3 +
  4 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.product.SeckillProductCreateReqVO;
3 import io.swagger.v3.oas.annotations.media.Schema; 5 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 6 import lombok.Data;
5 import lombok.EqualsAndHashCode; 7 import lombok.EqualsAndHashCode;
6 import lombok.ToString; 8 import lombok.ToString;
7 9
8 -import javax.validation.Valid;  
9 -import javax.validation.constraints.NotEmpty;  
10 -import javax.validation.constraints.NotNull;  
11 import java.util.List; 10 import java.util.List;
12 11
  12 +/**
  13 + * 管理后台 - 秒杀活动创建 Request VO
  14 + *
  15 + * @author HUIHUI
  16 + */
13 @Schema(description = "管理后台 - 秒杀活动创建 Request VO") 17 @Schema(description = "管理后台 - 秒杀活动创建 Request VO")
14 @Data 18 @Data
15 @EqualsAndHashCode(callSuper = true) 19 @EqualsAndHashCode(callSuper = true)
16 @ToString(callSuper = true) 20 @ToString(callSuper = true)
17 public class SeckillActivityCreateReqVO extends SeckillActivityBaseVO { 21 public class SeckillActivityCreateReqVO extends SeckillActivityBaseVO {
18 22
19 - @Schema(description = "备注", example = "限时秒杀活动")  
20 - private String remark;  
21 -  
22 - @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
23 - @NotNull(message = "排序不能为空")  
24 - private Integer sort;  
25 -  
26 - @Schema(description = "秒杀时段id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,3")  
27 - @NotEmpty(message = "参与场次不能为空")  
28 - private List<Long> timeIds;  
29 -  
30 - /**  
31 - * 商品列表  
32 - */  
33 - @NotEmpty(message = "商品列表不能为空")  
34 - @Valid  
35 - private List<Product> products; 23 + @Schema(description = "秒杀商品", requiredMode = Schema.RequiredMode.REQUIRED)
  24 + private List<SeckillProductCreateReqVO> products;
36 25
37 } 26 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityDetailRespVO.java
1 package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity; 1 package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity;
2 2
  3 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.product.SeckillProductRespVO;
3 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 5 import lombok.Data;
5 -import lombok.EqualsAndHashCode;  
6 import lombok.ToString; 6 import lombok.ToString;
7 7
8 import java.util.List; 8 import java.util.List;
9 9
  10 +/**
  11 + * 管理后台 - 秒杀活动的详细 Response VO
  12 + *
  13 + * @author HUIHUI
  14 + */
10 @Schema(description = "管理后台 - 秒杀活动的详细 Response VO") 15 @Schema(description = "管理后台 - 秒杀活动的详细 Response VO")
11 @Data 16 @Data
12 -@EqualsAndHashCode(callSuper = true)  
13 @ToString(callSuper = true) 17 @ToString(callSuper = true)
14 -public class SeckillActivityDetailRespVO extends SeckillActivityRespVO { 18 +public class SeckillActivityDetailRespVO extends SeckillActivityBaseVO{
15 19
16 - /**  
17 - * 商品列表  
18 - */  
19 - private List<Product> products; 20 + @Schema(description = "秒杀活动id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  21 + private Long id;
  22 +
  23 + @Schema(description = "秒杀商品", requiredMode = Schema.RequiredMode.REQUIRED)
  24 + private List<SeckillProductRespVO> products;
20 25
21 } 26 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityPageReqVO.java
@@ -26,7 +26,7 @@ public class SeckillActivityPageReqVO extends PageParam { @@ -26,7 +26,7 @@ public class SeckillActivityPageReqVO extends PageParam {
26 private Integer status; 26 private Integer status;
27 27
28 @Schema(description = "秒杀时段id", example = "1") 28 @Schema(description = "秒杀时段id", example = "1")
29 - private Long timeId; 29 + private Long configId;
30 30
31 @Schema(description = "创建时间") 31 @Schema(description = "创建时间")
32 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) 32 @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityRespVO.java
1 package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity; 1 package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity;
2 2
  3 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.product.SeckillProductRespVO;
3 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 5 import lombok.Data;
5 import lombok.EqualsAndHashCode; 6 import lombok.EqualsAndHashCode;
6 import lombok.ToString; 7 import lombok.ToString;
7 8
8 -import java.time.LocalDateTime;  
9 import java.util.List; 9 import java.util.List;
10 10
  11 +/**
  12 + * 管理后台 - 秒杀活动 Response VO
  13 + *
  14 + * @author HUIHUI
  15 + */
11 @Schema(description = "管理后台 - 秒杀活动 Response VO") 16 @Schema(description = "管理后台 - 秒杀活动 Response VO")
12 @Data 17 @Data
13 @EqualsAndHashCode(callSuper = true) 18 @EqualsAndHashCode(callSuper = true)
@@ -17,25 +22,11 @@ public class SeckillActivityRespVO extends SeckillActivityBaseVO { @@ -17,25 +22,11 @@ public class SeckillActivityRespVO extends SeckillActivityBaseVO {
17 @Schema(description = "秒杀活动id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 22 @Schema(description = "秒杀活动id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
18 private Long id; 23 private Long id;
19 24
20 - @Schema(description = "付款订单数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
21 - private Integer orderCount; 25 + @Schema(description = "秒杀商品", requiredMode = Schema.RequiredMode.REQUIRED)
  26 + private List<SeckillProductRespVO> products; // TODO puhui: 考虑是否去除
22 27
23 - @Schema(description = "付款人数", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
24 - private Integer userCount;  
25 -  
26 - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)  
27 - private LocalDateTime createTime;  
28 -  
29 - @Schema(description = "秒杀时段id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,3")  
30 - private List<Long> timeIds;  
31 -  
32 - @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
33 - private Integer sort;  
34 -  
35 - @Schema(description = "备注", example = "限时秒杀活动")  
36 - private String remark;  
37 -  
38 - @Schema(description = "活动状态", example = "进行中") 28 + @Schema(description = "活动状态 开启:0 禁用:1", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
39 private Integer status; 29 private Integer status;
40 30
  31 +
41 } 32 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/activity/SeckillActivityUpdateReqVO.java
1 package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity; 1 package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity;
2 2
  3 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.product.SeckillProductRespVO;
  4 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.product.SeckillProductUpdateReqVO;
3 import io.swagger.v3.oas.annotations.media.Schema; 5 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 6 import lombok.Data;
5 import lombok.EqualsAndHashCode; 7 import lombok.EqualsAndHashCode;
@@ -10,32 +12,22 @@ import javax.validation.constraints.NotEmpty; @@ -10,32 +12,22 @@ import javax.validation.constraints.NotEmpty;
10 import javax.validation.constraints.NotNull; 12 import javax.validation.constraints.NotNull;
11 import java.util.List; 13 import java.util.List;
12 14
  15 +/**
  16 + * 管理后台 - 秒杀活动更新 Request VO
  17 + *
  18 + * @author HUIHUI
  19 + */
13 @Schema(description = "管理后台 - 秒杀活动更新 Request VO") 20 @Schema(description = "管理后台 - 秒杀活动更新 Request VO")
14 @Data 21 @Data
15 @EqualsAndHashCode(callSuper = true) 22 @EqualsAndHashCode(callSuper = true)
16 @ToString(callSuper = true) 23 @ToString(callSuper = true)
17 public class SeckillActivityUpdateReqVO extends SeckillActivityBaseVO { 24 public class SeckillActivityUpdateReqVO extends SeckillActivityBaseVO {
18 25
19 - @Schema(description = "秒杀活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "224")  
20 - @NotNull(message = "秒杀活动编号不能为空") 26 + @Schema(description = "秒杀活动id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
21 private Long id; 27 private Long id;
22 28
23 - @Schema(description = "备注", example = "限时秒杀活动")  
24 - private String remark; 29 + @Schema(description = "秒杀商品", requiredMode = Schema.RequiredMode.REQUIRED)
  30 + private List<SeckillProductUpdateReqVO> products;
25 31
26 - @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")  
27 - @NotNull(message = "排序不能为空")  
28 - private Integer sort;  
29 -  
30 - @Schema(description = "秒杀时段id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,3")  
31 - @NotEmpty(message = "秒杀时段id不能为空")  
32 - private List<Long> timeIds;  
33 -  
34 - /**  
35 - * 商品列表  
36 - */  
37 - @NotEmpty(message = "商品列表不能为空")  
38 - @Valid  
39 - private List<Product> products;  
40 32
41 } 33 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/time/SeckillTimeBaseVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/config/SeckillConfigBaseVO.java
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time; 1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 4 import lombok.Data;
5 5
6 import javax.validation.constraints.NotNull; 6 import javax.validation.constraints.NotNull;
7 -import java.time.LocalTime;  
8 7
9 /** 8 /**
10 * 秒杀时段 Base VO,提供给添加、修改、详细的子 VO 使用 9 * 秒杀时段 Base VO,提供给添加、修改、详细的子 VO 使用
11 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 10 * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  11 + *
  12 + * @author HUIHUI
12 */ 13 */
13 @Data 14 @Data
14 -public class SeckillTimeBaseVO { 15 +public class SeckillConfigBaseVO {
15 16
16 - @Schema(description = "秒杀时段名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "上午场") 17 + @Schema(description = "秒杀时段名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "早上场")
17 @NotNull(message = "秒杀时段名称不能为空") 18 @NotNull(message = "秒杀时段名称不能为空")
18 private String name; 19 private String name;
19 20
20 - @Schema(description = "开始时间点", requiredMode = Schema.RequiredMode.REQUIRED, example = "16:30:40") 21 + @Schema(description = "开始时间点", requiredMode = Schema.RequiredMode.REQUIRED, example = "09:00:00")
21 @NotNull(message = "开始时间点不能为空") 22 @NotNull(message = "开始时间点不能为空")
22 - private LocalTime startTime; 23 + private String startTime;
23 24
24 - @Schema(description = "结束时间点", requiredMode = Schema.RequiredMode.REQUIRED, example = "16:30:40") 25 + @Schema(description = "结束时间点", requiredMode = Schema.RequiredMode.REQUIRED, example = "16:00:00")
25 @NotNull(message = "结束时间点不能为空") 26 @NotNull(message = "结束时间点不能为空")
26 - private LocalTime endTime; 27 + private String endTime;
  28 +
  29 + @Schema(description = "秒杀主图", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
  30 + @NotNull(message = "秒杀主图不能为空")
  31 + private String picUrl;
  32 +
  33 + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
  34 + @NotNull(message = "状态不能为空")
  35 + private Integer status;
27 36
28 } 37 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/time/SeckillTimeCreateReqVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/config/SeckillConfigCreateReqVO.java
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time; 1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 4 import lombok.Data;
5 import lombok.EqualsAndHashCode; 5 import lombok.EqualsAndHashCode;
6 import lombok.ToString; 6 import lombok.ToString;
7 7
  8 +/**
  9 + * 管理后台 秒杀时段创建 Request VO
  10 + *
  11 + * @author HUIHUI
  12 + */
8 @Schema(description = "管理后台 - 秒杀时段创建 Request VO") 13 @Schema(description = "管理后台 - 秒杀时段创建 Request VO")
9 @Data 14 @Data
10 @EqualsAndHashCode(callSuper = true) 15 @EqualsAndHashCode(callSuper = true)
11 @ToString(callSuper = true) 16 @ToString(callSuper = true)
12 -public class SeckillTimeCreateReqVO extends SeckillTimeBaseVO { 17 +public class SeckillConfigCreateReqVO extends SeckillConfigBaseVO {
13 18
14 } 19 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/time/SeckillTimePageReqVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/config/SeckillConfigPageReqVO.java
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time; 1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
5 import lombok.Data; 5 import lombok.Data;
6 import lombok.EqualsAndHashCode; 6 import lombok.EqualsAndHashCode;
7 import lombok.ToString; 7 import lombok.ToString;
8 -import org.springframework.format.annotation.DateTimeFormat;  
9 -  
10 -import java.time.LocalTime;  
11 8
  9 +/**
  10 + * 管理后台 - 秒杀时段分页 Request VO
  11 + *
  12 + * @author HUIHUI
  13 + */
12 @Schema(description = "管理后台 - 秒杀时段分页 Request VO") 14 @Schema(description = "管理后台 - 秒杀时段分页 Request VO")
13 @Data 15 @Data
14 @EqualsAndHashCode(callSuper = true) 16 @EqualsAndHashCode(callSuper = true)
15 @ToString(callSuper = true) 17 @ToString(callSuper = true)
16 -public class SeckillTimePageReqVO extends PageParam { 18 +public class SeckillConfigPageReqVO extends PageParam {
17 19
18 @Schema(description = "秒杀时段名称", example = "上午场") 20 @Schema(description = "秒杀时段名称", example = "上午场")
19 private String name; 21 private String name;
20 22
21 - @Schema(description = "开始时间点", example = "16:30:40")  
22 - @DateTimeFormat(pattern = "HH:mm:ss")  
23 - private LocalTime startTime;  
24 -  
25 - @Schema(description = "结束时间点", example = "16:30:40")  
26 - @DateTimeFormat(pattern = "HH:mm:ss")  
27 - private LocalTime endTime; 23 + @Schema(description = "状态", example = "0")
  24 + private Integer status;
28 25
29 } 26 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/time/SeckillTimeRespVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/config/SeckillConfigRespVO.java
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time; 1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 4 import lombok.Data;
5 import lombok.EqualsAndHashCode; 5 import lombok.EqualsAndHashCode;
6 import lombok.ToString; 6 import lombok.ToString;
  7 +import org.springframework.format.annotation.DateTimeFormat;
7 8
8 import java.time.LocalDateTime; 9 import java.time.LocalDateTime;
9 10
  11 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  12 +
  13 +/**
  14 + * 管理后台 - 秒杀时段 Response VO
  15 + *
  16 + * @author HUIHUI
  17 + */
10 @Schema(description = "管理后台 - 秒杀时段 Response VO") 18 @Schema(description = "管理后台 - 秒杀时段 Response VO")
11 @Data 19 @Data
12 @EqualsAndHashCode(callSuper = true) 20 @EqualsAndHashCode(callSuper = true)
13 @ToString(callSuper = true) 21 @ToString(callSuper = true)
14 -public class SeckillTimeRespVO extends SeckillTimeBaseVO { 22 +public class SeckillConfigRespVO extends SeckillConfigBaseVO {
15 23
16 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 24 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
17 private Long id; 25 private Long id;
18 26
19 - @Schema(description = "秒杀活动数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 27 + @Schema(description = "秒杀活动数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
20 private Integer seckillActivityCount; 28 private Integer seckillActivityCount;
21 29
22 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) 30 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  31 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
23 private LocalDateTime createTime; 32 private LocalDateTime createTime;
24 33
25 } 34 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/config/SeckillConfigSimpleRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Data;
  6 +import lombok.NoArgsConstructor;
  7 +
  8 +import javax.validation.constraints.NotNull;
  9 +
  10 +/**
  11 + * 管理后台 - 秒杀时段配置精简信息 Response VO
  12 + *
  13 + * @author HUIHUI
  14 + */
  15 +@Schema(description = "管理后台 - 秒杀时段配置精简信息 Response VO")
  16 +@Data
  17 +@NoArgsConstructor
  18 +@AllArgsConstructor
  19 +public class SeckillConfigSimpleRespVO {
  20 +
  21 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  22 + @NotNull(message = "编号不能为空")
  23 + private Long id;
  24 +
  25 + @Schema(description = "秒杀时段名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "早上场")
  26 + @NotNull(message = "秒杀时段名称不能为空")
  27 + private String name;
  28 +
  29 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/time/SeckillTimeUpdateReqVO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/config/SeckillConfigUpdateReqVO.java
1 -package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time; 1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 4 import lombok.Data;
@@ -7,11 +7,16 @@ import lombok.ToString; @@ -7,11 +7,16 @@ import lombok.ToString;
7 7
8 import javax.validation.constraints.NotNull; 8 import javax.validation.constraints.NotNull;
9 9
  10 +/**
  11 + * 管理后台 - 秒杀时段更新 Request VO
  12 + *
  13 + * @author HUIHUI
  14 + */
10 @Schema(description = "管理后台 - 秒杀时段更新 Request VO") 15 @Schema(description = "管理后台 - 秒杀时段更新 Request VO")
11 @Data 16 @Data
12 @EqualsAndHashCode(callSuper = true) 17 @EqualsAndHashCode(callSuper = true)
13 @ToString(callSuper = true) 18 @ToString(callSuper = true)
14 -public class SeckillTimeUpdateReqVO extends SeckillTimeBaseVO { 19 +public class SeckillConfigUpdateReqVO extends SeckillConfigBaseVO {
15 20
16 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 21 @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
17 @NotNull(message = "编号不能为空") 22 @NotNull(message = "编号不能为空")
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/config/SeckillConfigUpdateStatusReqVo.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import io.swagger.v3.oas.annotations.media.Schema;
  6 +import lombok.Data;
  7 +
  8 +import javax.validation.constraints.NotNull;
  9 +
  10 +/**
  11 + * 管理后台 - 修改时段配置状态 Request VO
  12 + *
  13 + * @author HUIHUI
  14 + */
  15 +@Schema(description = "管理后台 - 修改时段配置状态 Request VO")
  16 +@Data
  17 +public class SeckillConfigUpdateStatusReqVo {
  18 +
  19 + @Schema(description = "时段配置编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  20 + @NotNull(message = "时段配置编号不能为空")
  21 + private Long id;
  22 +
  23 + @Schema(description = "状态,见 CommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  24 + @NotNull(message = "状态不能为空")
  25 + @InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}")
  26 + private Integer status;
  27 +
  28 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/product/SeckillProductBaseVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.product;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import javax.validation.constraints.NotNull;
  7 +
  8 +/**
  9 + * 秒杀参与商品 Base VO,提供给添加、修改、详细的子 VO 使用
  10 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  11 + *
  12 + * @author HUIHUI
  13 + */
  14 +@Data
  15 +public class SeckillProductBaseVO {
  16 +
  17 + @Schema(description = "商品spu_id", requiredMode = Schema.RequiredMode.REQUIRED, example = "30563")
  18 + @NotNull(message = "商品spu_id不能为空")
  19 + private Long spuId;
  20 +
  21 + @Schema(description = "商品sku_id", requiredMode = Schema.RequiredMode.REQUIRED, example = "30563")
  22 + @NotNull(message = "商品sku_id不能为空")
  23 + private Long skuId;
  24 +
  25 + @Schema(description = "秒杀金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "6689")
  26 + @NotNull(message = "秒杀金额,单位:分不能为空")
  27 + private Integer seckillPrice;
  28 +
  29 + @Schema(description = "秒杀库存", requiredMode = Schema.RequiredMode.REQUIRED)
  30 + @NotNull(message = "秒杀库存不能为空")
  31 + private Integer stock;
  32 +
  33 +
  34 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/product/SeckillProductCreateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.product;
  2 +
  3 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.product.SeckillProductBaseVO;
  4 +import lombok.*;
  5 +import java.util.*;
  6 +import io.swagger.v3.oas.annotations.media.Schema;
  7 +import javax.validation.constraints.*;
  8 +
  9 +/**
  10 + * 管理后台 - 秒杀参与商品创建 Request VO
  11 + *
  12 + * @author HUIHUI
  13 + */
  14 +@Schema(description = "管理后台 - 秒杀参与商品创建 Request VO")
  15 +@Data
  16 +@EqualsAndHashCode(callSuper = true)
  17 +@ToString(callSuper = true)
  18 +public class SeckillProductCreateReqVO extends SeckillProductBaseVO {
  19 +
  20 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/product/SeckillProductRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.product;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.*;
  5 +import java.time.LocalDateTime;
  6 +
  7 +/**
  8 + * 管理后台 - 秒杀参与商品 Response VO
  9 + *
  10 + * @author HUIHUI
  11 + */
  12 +@Schema(description = "管理后台 - 秒杀参与商品 Response VO")
  13 +@Data
  14 +@EqualsAndHashCode(callSuper = true)
  15 +@ToString(callSuper = true)
  16 +public class SeckillProductRespVO extends SeckillProductBaseVO {
  17 +
  18 + @Schema(description = "秒杀参与商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "256")
  19 + private Long id;
  20 +
  21 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  22 + private LocalDateTime createTime;
  23 +
  24 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/admin/seckill/vo/product/SeckillProductUpdateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.product;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.*;
  5 +import javax.validation.constraints.*;
  6 +
  7 +/**
  8 + * 管理后台 - 秒杀参与商品更新 Request VO
  9 + *
  10 + * @author HUIHUI
  11 + */
  12 +@Schema(description = "管理后台 - 秒杀参与商品更新 Request VO")
  13 +@Data
  14 +@EqualsAndHashCode(callSuper = true)
  15 +@ToString(callSuper = true)
  16 +public class SeckillProductUpdateReqVO extends SeckillProductBaseVO {
  17 +
  18 + @Schema(description = "秒杀参与商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "256")
  19 + @NotNull(message = "秒杀参与商品编号不能为空")
  20 + private Long id;
  21 +
  22 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/activity/vo/AppActivityRespVO.java
@@ -9,19 +9,20 @@ import java.time.LocalDateTime; @@ -9,19 +9,20 @@ import java.time.LocalDateTime;
9 @Data 9 @Data
10 public class AppActivityRespVO { 10 public class AppActivityRespVO {
11 11
12 - @Schema(description = "活动编号", required = true, example = "1024") 12 + @Schema(description = "活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
13 private Long id; 13 private Long id;
14 14
15 - @Schema(description = "活动类型", required = true, example = "1") // 对应 PromotionTypeEnum 枚举 15 + @Schema(description = "活动类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  16 + // 对应 PromotionTypeEnum 枚举
16 private Integer type; 17 private Integer type;
17 18
18 - @Schema(description = "活动名称", required = true, example = "618 大促") 19 + @Schema(description = "活动名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "618 大促")
19 private String name; 20 private String name;
20 21
21 - @Schema(description = "活动开始时间", required = true) 22 + @Schema(description = "活动开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
22 private LocalDateTime startTime; 23 private LocalDateTime startTime;
23 24
24 - @Schema(description = "活动结束时间", required = true) 25 + @Schema(description = "活动结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
25 private LocalDateTime endTime; 26 private LocalDateTime endTime;
26 27
27 } 28 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/vo/activity/AppCombinationActivityDetailRespVO.java
@@ -10,28 +10,28 @@ import java.util.List; @@ -10,28 +10,28 @@ import java.util.List;
10 @Data 10 @Data
11 public class AppCombinationActivityDetailRespVO { 11 public class AppCombinationActivityDetailRespVO {
12 12
13 - @Schema(description = "拼团活动编号", required = true, example = "1024") 13 + @Schema(description = "拼团活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
14 private Long id; 14 private Long id;
15 15
16 - @Schema(description = "拼团活动名称", required = true, example = "618 大拼团") 16 + @Schema(description = "拼团活动名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "618 大拼团")
17 private String name; 17 private String name;
18 18
19 - @Schema(description = "活动状态", required = true, example = "1") 19 + @Schema(description = "活动状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
20 private Integer status; 20 private Integer status;
21 21
22 - @Schema(description = "活动开始时间", required = true) 22 + @Schema(description = "活动开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
23 private LocalDateTime startTime; 23 private LocalDateTime startTime;
24 24
25 - @Schema(description = "活动结束时间", required = true) 25 + @Schema(description = "活动结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
26 private LocalDateTime endTime; 26 private LocalDateTime endTime;
27 27
28 - @Schema(description = "拼团人数", required = true, example = "3") 28 + @Schema(description = "拼团人数", requiredMode = Schema.RequiredMode.REQUIRED, example = "3")
29 private Integer userSize; 29 private Integer userSize;
30 30
31 - @Schema(description = "成功的拼团数量", required = true, example = "100") 31 + @Schema(description = "成功的拼团数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
32 private Integer successCount; 32 private Integer successCount;
33 33
34 - @Schema(description = "商品 SPU 编号", required = true, example = "2048") 34 + @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
35 private Long spuId; 35 private Long spuId;
36 36
37 @Schema(description = "总共限购数量", example = "10") 37 @Schema(description = "总共限购数量", example = "10")
@@ -40,17 +40,17 @@ public class AppCombinationActivityDetailRespVO { @@ -40,17 +40,17 @@ public class AppCombinationActivityDetailRespVO {
40 @Schema(description = "单次限购数量", example = "5") 40 @Schema(description = "单次限购数量", example = "5")
41 private Integer singleLimitCount; 41 private Integer singleLimitCount;
42 42
43 - @Schema(description = "商品信息数组", required = true) 43 + @Schema(description = "商品信息数组", requiredMode = Schema.RequiredMode.REQUIRED)
44 private List<Product> products; 44 private List<Product> products;
45 45
46 @Schema(description = "商品信息") 46 @Schema(description = "商品信息")
47 @Data 47 @Data
48 public static class Product { 48 public static class Product {
49 49
50 - @Schema(description = "商品 SKU 编号", required = true, example = "4096") 50 + @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096")
51 private Long skuId; 51 private Long skuId;
52 52
53 - @Schema(description = "拼团金额,单位:分", required = true, example = "100") 53 + @Schema(description = "拼团金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
54 private Integer combinationPrice; 54 private Integer combinationPrice;
55 55
56 } 56 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/vo/activity/AppCombinationActivityRespVO.java
@@ -7,25 +7,28 @@ import lombok.Data; @@ -7,25 +7,28 @@ import lombok.Data;
7 @Data 7 @Data
8 public class AppCombinationActivityRespVO { 8 public class AppCombinationActivityRespVO {
9 9
10 - @Schema(description = "拼团活动编号", required = true, example = "1024") 10 + @Schema(description = "拼团活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
11 private Long id; 11 private Long id;
12 12
13 - @Schema(description = "拼团活动名称", required = true, example = "618 大拼团") 13 + @Schema(description = "拼团活动名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "618 大拼团")
14 private String name; 14 private String name;
15 15
16 - @Schema(description = "拼团人数", required = true, example = "3") 16 + @Schema(description = "拼团人数", requiredMode = Schema.RequiredMode.REQUIRED, example = "3")
17 private Integer userSize; 17 private Integer userSize;
18 18
19 - @Schema(description = "商品 SPU 编号", required = true, example = "2048") 19 + @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
20 private Long spuId; 20 private Long spuId;
21 21
22 - @Schema(description = "商品图片", required = true, example = "4096") // 从 SPU 的 picUrl 读取 22 + @Schema(description = "商品图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096")
  23 + // 从 SPU 的 picUrl 读取
23 private String picUrl; 24 private String picUrl;
24 25
25 - @Schema(description = "商品市场价,单位:分", required = true, example = "50") // 从 SPU 的 marketPrice 读取 26 + @Schema(description = "商品市场价,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "50")
  27 + // 从 SPU 的 marketPrice 读取
26 private Integer marketPrice; 28 private Integer marketPrice;
27 29
28 - @Schema(description = "拼团金额,单位:分", required = true, example = "100") // 从拼团商品里取最低价 30 + @Schema(description = "拼团金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
  31 + // 从拼团商品里取最低价
29 private Integer combinationPrice; 32 private Integer combinationPrice;
30 33
31 } 34 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/vo/record/AppCombinationRecordDetailRespVO.java
@@ -9,13 +9,14 @@ import java.util.List; @@ -9,13 +9,14 @@ import java.util.List;
9 @Data 9 @Data
10 public class AppCombinationRecordDetailRespVO { 10 public class AppCombinationRecordDetailRespVO {
11 11
12 - @Schema(description = "团长的拼团记录", required = true) 12 + @Schema(description = "团长的拼团记录", requiredMode = Schema.RequiredMode.REQUIRED)
13 private AppCombinationRecordRespVO headRecord; 13 private AppCombinationRecordRespVO headRecord;
14 14
15 - @Schema(description = "成员的拼团记录", required = true) 15 + @Schema(description = "成员的拼团记录", requiredMode = Schema.RequiredMode.REQUIRED)
16 private List<AppCombinationRecordRespVO> memberRecords; 16 private List<AppCombinationRecordRespVO> memberRecords;
17 17
18 - @Schema(description = "当前用户参团记录对应的订单编号", required = true, example = "1024") // 如果没参团,返回 null 18 + @Schema(description = "当前用户参团记录对应的订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  19 + // 如果没参团,返回 null
19 private Long orderId; 20 private Long orderId;
20 21
21 } 22 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/vo/record/AppCombinationRecordRespVO.java
@@ -9,37 +9,37 @@ import java.util.Date; @@ -9,37 +9,37 @@ import java.util.Date;
9 @Data 9 @Data
10 public class AppCombinationRecordRespVO { 10 public class AppCombinationRecordRespVO {
11 11
12 - @Schema(description = "拼团记录编号", required = true, example = "1024") 12 + @Schema(description = "拼团记录编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
13 private Long id; 13 private Long id;
14 14
15 - @Schema(description = "拼团活动编号", required = true, example = "1024") 15 + @Schema(description = "拼团活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
16 private Long activityId; 16 private Long activityId;
17 17
18 - @Schema(description = "用户昵称", required = true, example = "1024") 18 + @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
19 private String nickname; 19 private String nickname;
20 20
21 - @Schema(description = "用户头像", required = true, example = "1024") 21 + @Schema(description = "用户头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
22 private String avatar; 22 private String avatar;
23 23
24 - @Schema(description = "过期时间", required = true) 24 + @Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED)
25 private Date expireTime; 25 private Date expireTime;
26 26
27 - @Schema(description = "可参团人数", required = true, example = "10") 27 + @Schema(description = "可参团人数", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
28 private Integer userSize; 28 private Integer userSize;
29 29
30 - @Schema(description = "已参团人数", required = true, example = "5") 30 + @Schema(description = "已参团人数", requiredMode = Schema.RequiredMode.REQUIRED, example = "5")
31 private Integer userCount; 31 private Integer userCount;
32 32
33 - @Schema(description = "拼团状态", required = true, example = "1") 33 + @Schema(description = "拼团状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
34 private Integer status; 34 private Integer status;
35 35
36 - @Schema(description = "商品名字", required = true, example = "我是大黄豆") 36 + @Schema(description = "商品名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是大黄豆")
37 private String spuName; 37 private String spuName;
38 38
39 - @Schema(description = "商品图片", required = true, example = "https://www.iocoder.cn/1.png") 39 + @Schema(description = "商品图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/1.png")
40 private String picUrl; 40 private String picUrl;
41 41
42 - @Schema(description = "拼团金额,单位:分", required = true, example = "100") 42 + @Schema(description = "拼团金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
43 private Integer combinationPrice; 43 private Integer combinationPrice;
44 44
45 } 45 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/combination/vo/record/AppCombinationRecordSummaryRespVO.java
@@ -9,10 +9,10 @@ import java.util.List; @@ -9,10 +9,10 @@ import java.util.List;
9 @Data 9 @Data
10 public class AppCombinationRecordSummaryRespVO { 10 public class AppCombinationRecordSummaryRespVO {
11 11
12 - @Schema(description = "拼团用户数量", required = true, example = "1024") 12 + @Schema(description = "拼团用户数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
13 private Integer userCount; 13 private Integer userCount;
14 14
15 - @Schema(description = "拼团用户头像列表", required = true) // 只返回最近的 7 个 15 + @Schema(description = "拼团用户头像列表", requiredMode = Schema.RequiredMode.REQUIRED) // 只返回最近的 7 个
16 private List<String> avatars; 16 private List<String> avatars;
17 17
18 } 18 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/coupon/vo/template/AppCouponTemplateRespVO.java
@@ -10,27 +10,28 @@ import java.time.LocalDateTime; @@ -10,27 +10,28 @@ import java.time.LocalDateTime;
10 @Data 10 @Data
11 public class AppCouponTemplateRespVO { 11 public class AppCouponTemplateRespVO {
12 12
13 - @Schema(description = "优惠劵模板编号", required = true, example = "1") 13 + @Schema(description = "优惠劵模板编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
14 private Long id; 14 private Long id;
15 15
16 - @Schema(description = "优惠劵名", required = true, example = "春节送送送") 16 + @Schema(description = "优惠劵名", requiredMode = Schema.RequiredMode.REQUIRED, example = "春节送送送")
17 private String name; 17 private String name;
18 18
19 - @Schema(description = "每人限领个数", required = true, example = "66") // -1 - 则表示不限制 19 + @Schema(description = "每人限领个数", requiredMode = Schema.RequiredMode.REQUIRED, example = "66") // -1 - 则表示不限制
20 private Integer takeLimitCount; 20 private Integer takeLimitCount;
21 21
22 - @Schema(description = "是否设置满多少金额可用", required = true, example = "100") // 单位:分;0 - 不限制 22 + @Schema(description = "是否设置满多少金额可用", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
  23 + // 单位:分;0 - 不限制
23 private Integer usePrice; 24 private Integer usePrice;
24 25
25 // TODO 芋艿:这两要改的 26 // TODO 芋艿:这两要改的
26 -// @Schema(description = "商品范围", required = true, example = "1") 27 +// @Schema(description = "商品范围", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
27 // @InEnum(PromotionProductScopeEnum.class) 28 // @InEnum(PromotionProductScopeEnum.class)
28 // private Integer productScope; 29 // private Integer productScope;
29 // 30 //
30 // @Schema(description = "商品 SPU 编号的数组", example = "1,3") 31 // @Schema(description = "商品 SPU 编号的数组", example = "1,3")
31 // private List<Long> productSpuIds; 32 // private List<Long> productSpuIds;
32 33
33 - @Schema(description = "生效日期类型", required = true, example = "1") 34 + @Schema(description = "生效日期类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
34 private Integer validityType; 35 private Integer validityType;
35 36
36 @Schema(description = "固定日期 - 生效开始时间") 37 @Schema(description = "固定日期 - 生效开始时间")
@@ -47,7 +48,7 @@ public class AppCouponTemplateRespVO { @@ -47,7 +48,7 @@ public class AppCouponTemplateRespVO {
47 @Min(value = 1L, message = "开始天数必须大于 1") 48 @Min(value = 1L, message = "开始天数必须大于 1")
48 private Integer fixedEndTerm; 49 private Integer fixedEndTerm;
49 50
50 - @Schema(description = "优惠类型", required = true, example = "1") 51 + @Schema(description = "优惠类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
51 private Integer discountType; 52 private Integer discountType;
52 53
53 @Schema(description = "折扣百分比", example = "80") // 例如说,80% 为 80 54 @Schema(description = "折扣百分比", example = "80") // 例如说,80% 为 80
@@ -62,7 +63,7 @@ public class AppCouponTemplateRespVO { @@ -62,7 +63,7 @@ public class AppCouponTemplateRespVO {
62 63
63 // ========== 用户相关字段 ========== 64 // ========== 用户相关字段 ==========
64 65
65 - @Schema(description = "是否已领取", required = true, example = "true") 66 + @Schema(description = "是否已领取", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
66 private Boolean takeStatus; 67 private Boolean takeStatus;
67 68
68 } 69 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityDetailRespVO.java
@@ -10,24 +10,24 @@ import java.util.List; @@ -10,24 +10,24 @@ import java.util.List;
10 @Data 10 @Data
11 public class AppSeckillActivityDetailRespVO { 11 public class AppSeckillActivityDetailRespVO {
12 12
13 - @Schema(description = "秒杀活动编号", required = true, example = "1024") 13 + @Schema(description = "秒杀活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
14 private Long id; 14 private Long id;
15 15
16 - @Schema(description = "秒杀活动名称", required = true, example = "晚九点限时秒杀") 16 + @Schema(description = "秒杀活动名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "晚九点限时秒杀")
17 private String name; 17 private String name;
18 18
19 - @Schema(description = "活动状态", required = true, example = "1") 19 + @Schema(description = "活动状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
20 private Integer status; 20 private Integer status;
21 21
22 // TODO @芋艿:开始时间、结束时间,要和场次结合起来;就是要算到当前场次,是几点哈; 22 // TODO @芋艿:开始时间、结束时间,要和场次结合起来;就是要算到当前场次,是几点哈;
23 23
24 - @Schema(description = "活动开始时间", required = true) 24 + @Schema(description = "活动开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
25 private LocalDateTime startTime; 25 private LocalDateTime startTime;
26 26
27 - @Schema(description = "活动结束时间", required = true) 27 + @Schema(description = "活动结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
28 private LocalDateTime endTime; 28 private LocalDateTime endTime;
29 29
30 - @Schema(description = "商品 SPU 编号", required = true, example = "2048") 30 + @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
31 private Long spuId; 31 private Long spuId;
32 32
33 @Schema(description = "总共限购数量", example = "10") 33 @Schema(description = "总共限购数量", example = "10")
@@ -36,26 +36,26 @@ public class AppSeckillActivityDetailRespVO { @@ -36,26 +36,26 @@ public class AppSeckillActivityDetailRespVO {
36 @Schema(description = "单次限购数量", example = "5") 36 @Schema(description = "单次限购数量", example = "5")
37 private Integer singleLimitCount; 37 private Integer singleLimitCount;
38 38
39 - @Schema(description = "秒杀库存(剩余)", required = true, example = "50") 39 + @Schema(description = "秒杀库存(剩余)", requiredMode = Schema.RequiredMode.REQUIRED, example = "50")
40 private Integer stock; 40 private Integer stock;
41 41
42 - @Schema(description = "秒杀库存(总计)", required = true, example = "100") 42 + @Schema(description = "秒杀库存(总计)", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
43 private Integer totalStock; 43 private Integer totalStock;
44 44
45 - @Schema(description = "商品信息数组", required = true) 45 + @Schema(description = "商品信息数组", requiredMode = Schema.RequiredMode.REQUIRED)
46 private List<Product> products; 46 private List<Product> products;
47 47
48 @Schema(description = "商品信息") 48 @Schema(description = "商品信息")
49 @Data 49 @Data
50 public static class Product { 50 public static class Product {
51 51
52 - @Schema(description = "商品 SKU 编号", required = true, example = "4096") 52 + @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096")
53 private Long skuId; 53 private Long skuId;
54 54
55 - @Schema(description = "秒杀金额,单位:分", required = true, example = "100") 55 + @Schema(description = "秒杀金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
56 private Integer seckillPrice; 56 private Integer seckillPrice;
57 57
58 - @Schema(description = "秒杀限量库存", required = true, example = "50") 58 + @Schema(description = "秒杀限量库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "50")
59 private Integer stock; 59 private Integer stock;
60 60
61 } 61 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityNowRespVO.java
@@ -10,10 +10,10 @@ import java.util.List; @@ -10,10 +10,10 @@ import java.util.List;
10 @Data 10 @Data
11 public class AppSeckillActivityNowRespVO { 11 public class AppSeckillActivityNowRespVO {
12 12
13 - @Schema(description = "秒杀时间段", required = true) 13 + @Schema(description = "秒杀时间段", requiredMode = Schema.RequiredMode.REQUIRED)
14 private AppSeckillConfigRespVO config; 14 private AppSeckillConfigRespVO config;
15 15
16 - @Schema(description = "秒杀活动数组", required = true) 16 + @Schema(description = "秒杀活动数组", requiredMode = Schema.RequiredMode.REQUIRED)
17 private List<AppSeckillActivityRespVO> activities; 17 private List<AppSeckillActivityRespVO> activities;
18 18
19 } 19 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/seckill/vo/activity/AppSeckillActivityRespVO.java
@@ -7,28 +7,31 @@ import lombok.Data; @@ -7,28 +7,31 @@ import lombok.Data;
7 @Data 7 @Data
8 public class AppSeckillActivityRespVO { 8 public class AppSeckillActivityRespVO {
9 9
10 - @Schema(description = "秒杀活动编号", required = true, example = "1024") 10 + @Schema(description = "秒杀活动编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
11 private Long id; 11 private Long id;
12 12
13 - @Schema(description = "秒杀活动名称", required = true, example = "晚九点限时秒杀") 13 + @Schema(description = "秒杀活动名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "晚九点限时秒杀")
14 private String name; 14 private String name;
15 15
16 - @Schema(description = "商品 SPU 编号", required = true, example = "2048") 16 + @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
17 private Long spuId; 17 private Long spuId;
18 18
19 - @Schema(description = "商品图片", required = true, example = "4096") // 从 SPU 的 picUrl 读取 19 + @Schema(description = "商品图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096")
  20 + // 从 SPU 的 picUrl 读取
20 private String picUrl; 21 private String picUrl;
21 @Schema(description = "单位名", requiredMode = Schema.RequiredMode.REQUIRED, example = "个") 22 @Schema(description = "单位名", requiredMode = Schema.RequiredMode.REQUIRED, example = "个")
22 private String unitName; 23 private String unitName;
23 - @Schema(description = "商品市场价,单位:分", required = true, example = "50") // 从 SPU 的 marketPrice 读取 24 + @Schema(description = "商品市场价,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "50")
  25 + // 从 SPU 的 marketPrice 读取
24 private Integer marketPrice; 26 private Integer marketPrice;
25 27
26 - @Schema(description = "秒杀库存(剩余)", required = true, example = "100") 28 + @Schema(description = "秒杀库存(剩余)", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
27 private Integer stock; 29 private Integer stock;
28 - @Schema(description = "秒杀库存(总共)", required = true, example = "200") 30 + @Schema(description = "秒杀库存(总共)", requiredMode = Schema.RequiredMode.REQUIRED, example = "200")
29 private Integer totalStock; 31 private Integer totalStock;
30 32
31 - @Schema(description = "秒杀金额,单位:分", required = true, example = "100") // 从秒杀商品里取最低价 33 + @Schema(description = "秒杀金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
  34 + // 从秒杀商品里取最低价
32 private Integer seckillPrice; 35 private Integer seckillPrice;
33 36
34 } 37 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/seckill/vo/config/AppSeckillConfigRespVO.java
@@ -9,15 +9,15 @@ import java.util.List; @@ -9,15 +9,15 @@ import java.util.List;
9 @Data 9 @Data
10 public class AppSeckillConfigRespVO { 10 public class AppSeckillConfigRespVO {
11 11
12 - @Schema(description = "秒杀时间段编号", required = true, example = "1024") 12 + @Schema(description = "秒杀时间段编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
13 private Long id; 13 private Long id;
14 14
15 - @Schema(description = "开始时间点", required = true, example = "09:00") 15 + @Schema(description = "开始时间点", requiredMode = Schema.RequiredMode.REQUIRED, example = "09:00")
16 private String startTime; 16 private String startTime;
17 - @Schema(description = "结束时间点", required = true, example = "09:59") 17 + @Schema(description = "结束时间点", requiredMode = Schema.RequiredMode.REQUIRED, example = "09:59")
18 private String endTime; 18 private String endTime;
19 19
20 - @Schema(description = "轮播图", required = true) 20 + @Schema(description = "轮播图", requiredMode = Schema.RequiredMode.REQUIRED)
21 private List<String> sliderPicUrls; 21 private List<String> sliderPicUrls;
22 22
23 } 23 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckill/seckillactivity/SeckillActivityConvert.java
1 package cn.iocoder.yudao.module.promotion.convert.seckill.seckillactivity; 1 package cn.iocoder.yudao.module.promotion.convert.seckill.seckillactivity;
2 2
3 import cn.hutool.core.util.ObjectUtil; 3 import cn.hutool.core.util.ObjectUtil;
  4 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;  
6 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.*; 6 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO;
  7 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityDetailRespVO;
  8 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityRespVO;
  9 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityUpdateReqVO;
  10 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.product.SeckillProductCreateReqVO;
7 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; 11 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO;
8 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; 12 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO;
9 import org.mapstruct.Mapper; 13 import org.mapstruct.Mapper;
10 -import org.mapstruct.Mapping;  
11 -import org.mapstruct.Mappings;  
12 import org.mapstruct.factory.Mappers; 14 import org.mapstruct.factory.Mappers;
13 15
  16 +import java.util.ArrayList;
14 import java.util.List; 17 import java.util.List;
15 18
16 /** 19 /**
@@ -23,15 +26,10 @@ public interface SeckillActivityConvert { @@ -23,15 +26,10 @@ public interface SeckillActivityConvert {
23 26
24 SeckillActivityConvert INSTANCE = Mappers.getMapper(SeckillActivityConvert.class); 27 SeckillActivityConvert INSTANCE = Mappers.getMapper(SeckillActivityConvert.class);
25 28
26 - SeckillProductDO convert(SeckillActivityBaseVO.Product product);  
27 - 29 + SeckillProductDO convert(SeckillProductCreateReqVO product);
28 30
29 SeckillActivityDO convert(SeckillActivityCreateReqVO bean); 31 SeckillActivityDO convert(SeckillActivityCreateReqVO bean);
30 32
31 - default String map(Long[] value) {  
32 - return value.toString();  
33 - }  
34 -  
35 SeckillActivityDO convert(SeckillActivityUpdateReqVO bean); 33 SeckillActivityDO convert(SeckillActivityUpdateReqVO bean);
36 34
37 SeckillActivityRespVO convert(SeckillActivityDO bean); 35 SeckillActivityRespVO convert(SeckillActivityDO bean);
@@ -40,7 +38,6 @@ public interface SeckillActivityConvert { @@ -40,7 +38,6 @@ public interface SeckillActivityConvert {
40 38
41 PageResult<SeckillActivityRespVO> convertPage(PageResult<SeckillActivityDO> page); 39 PageResult<SeckillActivityRespVO> convertPage(PageResult<SeckillActivityDO> page);
42 40
43 - @Mappings({@Mapping(target = "products", source = "seckillProducts")})  
44 SeckillActivityDetailRespVO convert(SeckillActivityDO seckillActivity, List<SeckillProductDO> seckillProducts); 41 SeckillActivityDetailRespVO convert(SeckillActivityDO seckillActivity, List<SeckillProductDO> seckillProducts);
45 42
46 43
@@ -51,12 +48,12 @@ public interface SeckillActivityConvert { @@ -51,12 +48,12 @@ public interface SeckillActivityConvert {
51 * @param productVO 前端传入的商品 48 * @param productVO 前端传入的商品
52 * @return 是否匹配 49 * @return 是否匹配
53 */ 50 */
54 - default boolean isEquals(SeckillProductDO productDO, SeckillActivityBaseVO.Product productVO) {  
55 - return ObjectUtil.equals(productDO.getSpuId(), productVO.getSpuId()) 51 + default boolean isEquals(SeckillProductDO productDO, SeckillProductCreateReqVO productVO) {
  52 + return ObjectUtil.equals(productDO.getSpuId(), 1) // TODO puhui:再看看
56 && ObjectUtil.equals(productDO.getSkuId(), productVO.getSkuId()) 53 && ObjectUtil.equals(productDO.getSkuId(), productVO.getSkuId())
57 - && ObjectUtil.equals(productDO.getSeckillPrice(), productVO.getSeckillPrice())  
58 - && ObjectUtil.equals(productDO.getStock(), productVO.getStock())  
59 - && ObjectUtil.equals(productDO.getLimitCount(), productVO.getLimitCount()); 54 + && ObjectUtil.equals(productDO.getSeckillPrice(), productVO.getSeckillPrice());
  55 + //&& ObjectUtil.equals(productDO.getQuota(), productVO.getQuota())
  56 + //&& ObjectUtil.equals(productDO.getLimitCount(), productVO.getLimitCount());
60 } 57 }
61 58
62 /** 59 /**
@@ -69,15 +66,26 @@ public interface SeckillActivityConvert { @@ -69,15 +66,26 @@ public interface SeckillActivityConvert {
69 default boolean isEquals(SeckillProductDO productDO, SeckillProductDO productVO) { 66 default boolean isEquals(SeckillProductDO productDO, SeckillProductDO productVO) {
70 return ObjectUtil.equals(productDO.getSpuId(), productVO.getSpuId()) 67 return ObjectUtil.equals(productDO.getSpuId(), productVO.getSpuId())
71 && ObjectUtil.equals(productDO.getSkuId(), productVO.getSkuId()) 68 && ObjectUtil.equals(productDO.getSkuId(), productVO.getSkuId())
72 - && ObjectUtil.equals(productDO.getSeckillPrice(), productVO.getSeckillPrice())  
73 - && ObjectUtil.equals(productDO.getStock(), productVO.getStock())  
74 - && ObjectUtil.equals(productDO.getLimitCount(), productVO.getLimitCount()); 69 + && ObjectUtil.equals(productDO.getSeckillPrice(), productVO.getSeckillPrice());
  70 + //&& ObjectUtil.equals(productDO.getQuota(), productVO.getQuota())
  71 + //&& ObjectUtil.equals(productDO.getLimitCount(), productVO.getLimitCount());
75 72
76 } 73 }
77 74
78 - default List<SeckillProductDO> convertList(List<SeckillActivityBaseVO.Product> products, SeckillActivityDO seckillActivity) {  
79 - return CollectionUtils.convertList(products, product -> convert(product)  
80 - .setActivityId(seckillActivity.getId()).setTimeIds(seckillActivity.getTimeIds())); 75 + default List<SeckillProductDO> convertList(SeckillActivityDO seckillActivity, List<SeckillProductCreateReqVO> products) {
  76 + List<SeckillProductDO> list = new ArrayList<>();
  77 + products.forEach(sku -> {
  78 + SeckillProductDO productDO = new SeckillProductDO();
  79 + productDO.setActivityId(seckillActivity.getId());
  80 + productDO.setConfigIds(seckillActivity.getConfigIds());
  81 + productDO.setSpuId(sku.getSpuId());
  82 + productDO.setSkuId(sku.getSkuId());
  83 + productDO.setSeckillPrice(sku.getSeckillPrice());
  84 + productDO.setStock(sku.getStock());
  85 + productDO.setActivityStatus(CommonStatusEnum.ENABLE.getStatus());
  86 + productDO.setActivityStartTime(seckillActivity.getStartTime());
  87 + productDO.setActivityEndTime(seckillActivity.getEndTime());
  88 + });
  89 + return list;
81 } 90 }
82 -  
83 } 91 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckill/seckillconfig/SeckillConfigConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.convert.seckill.seckillconfig;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigCreateReqVO;
  5 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigRespVO;
  6 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigSimpleRespVO;
  7 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigUpdateReqVO;
  8 +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillconfig.SeckillConfigDO;
  9 +import org.mapstruct.Mapper;
  10 +import org.mapstruct.factory.Mappers;
  11 +
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * 秒杀时段 Convert
  16 + *
  17 + * @author 芋道源码
  18 + */
  19 +@Mapper
  20 +public interface SeckillConfigConvert {
  21 +
  22 + SeckillConfigConvert INSTANCE = Mappers.getMapper(SeckillConfigConvert.class);
  23 +
  24 + SeckillConfigDO convert(SeckillConfigCreateReqVO bean);
  25 +
  26 + SeckillConfigDO convert(SeckillConfigUpdateReqVO bean);
  27 +
  28 + SeckillConfigRespVO convert(SeckillConfigDO bean);
  29 +
  30 + List<SeckillConfigRespVO> convertList(List<SeckillConfigDO> list);
  31 +
  32 + List<SeckillConfigSimpleRespVO> convertList1(List<SeckillConfigDO> list);
  33 +
  34 + PageResult<SeckillConfigRespVO> convertPage(PageResult<SeckillConfigDO> page);
  35 +
  36 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/convert/seckill/seckilltime/SeckillTimeConvert.java deleted
1 -package cn.iocoder.yudao.module.promotion.convert.seckill.seckilltime;  
2 -  
3 -import java.util.*;  
4 -  
5 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
6 -  
7 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeCreateReqVO;  
8 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeRespVO;  
9 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeUpdateReqVO;  
10 -import org.mapstruct.Mapper;  
11 -import org.mapstruct.factory.Mappers;  
12 -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO;  
13 -  
14 -/**  
15 - * 秒杀时段 Convert  
16 - *  
17 - * @author 芋道源码  
18 - */  
19 -@Mapper  
20 -public interface SeckillTimeConvert {  
21 -  
22 - SeckillTimeConvert INSTANCE = Mappers.getMapper(SeckillTimeConvert.class);  
23 -  
24 - SeckillTimeDO convert(SeckillTimeCreateReqVO bean);  
25 -  
26 - SeckillTimeDO convert(SeckillTimeUpdateReqVO bean);  
27 -  
28 - SeckillTimeRespVO convert(SeckillTimeDO bean);  
29 -  
30 - List<SeckillTimeRespVO> convertList(List<SeckillTimeDO> list);  
31 -  
32 - PageResult<SeckillTimeRespVO> convertPage(PageResult<SeckillTimeDO> page);  
33 -  
34 -}  
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckill/seckillactivity/SeckillActivityDO.java
1 package cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity; 1 package cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity;
2 2
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler; 5 import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler;
5 -import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum;  
6 import com.baomidou.mybatisplus.annotation.KeySequence; 6 import com.baomidou.mybatisplus.annotation.KeySequence;
7 import com.baomidou.mybatisplus.annotation.TableField; 7 import com.baomidou.mybatisplus.annotation.TableField;
8 import com.baomidou.mybatisplus.annotation.TableId; 8 import com.baomidou.mybatisplus.annotation.TableId;
@@ -32,13 +32,18 @@ public class SeckillActivityDO extends BaseDO { @@ -32,13 +32,18 @@ public class SeckillActivityDO extends BaseDO {
32 @TableId 32 @TableId
33 private Long id; 33 private Long id;
34 /** 34 /**
  35 + * 秒杀活动商品
  36 + */
  37 + @TableField(typeHandler = LongListTypeHandler.class)
  38 + private List<Long> spuIds;
  39 + /**
35 * 秒杀活动名称 40 * 秒杀活动名称
36 */ 41 */
37 private String name; 42 private String name;
38 /** 43 /**
39 * 活动状态 44 * 活动状态
40 * 45 *
41 - * 枚举 {@link PromotionActivityStatusEnum 对应的类} 46 + * 枚举 {@link CommonStatusEnum 对应的类}
42 */ 47 */
43 private Integer status; 48 private Integer status;
44 /** 49 /**
@@ -61,9 +66,9 @@ public class SeckillActivityDO extends BaseDO { @@ -61,9 +66,9 @@ public class SeckillActivityDO extends BaseDO {
61 * 秒杀时段 id 66 * 秒杀时段 id
62 */ 67 */
63 @TableField(typeHandler = LongListTypeHandler.class) 68 @TableField(typeHandler = LongListTypeHandler.class)
64 - private List<Long> timeIds; 69 + private List<Long> configIds;
65 /** 70 /**
66 - * 付款订单数 71 + * 新增订单数
67 */ 72 */
68 private Integer orderCount; 73 private Integer orderCount;
69 /** 74 /**
@@ -74,5 +79,21 @@ public class SeckillActivityDO extends BaseDO { @@ -74,5 +79,21 @@ public class SeckillActivityDO extends BaseDO {
74 * 订单实付金额,单位:分 79 * 订单实付金额,单位:分
75 */ 80 */
76 private Long totalPrice; 81 private Long totalPrice;
  82 + /**
  83 + * 总限购数量
  84 + */
  85 + private Integer totalLimitCount;
  86 + /**
  87 + * 单次限够数量
  88 + */
  89 + private Integer singleLimitCount;
  90 + /**
  91 + * 秒杀库存
  92 + */
  93 + private Integer stock;
  94 + /**
  95 + * 秒杀总库存
  96 + */
  97 + private Integer totalStock;
77 98
78 } 99 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckill/seckillactivity/SeckillProductDO.java
1 package cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity; 1 package cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity;
2 2
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler; 5 import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler;
5 -import com.baomidou.mybatisplus.annotation.*;  
6 -import lombok.Data;  
7 -import lombok.EqualsAndHashCode;  
8 -import lombok.ToString; 6 +import com.baomidou.mybatisplus.annotation.KeySequence;
  7 +import com.baomidou.mybatisplus.annotation.TableField;
  8 +import com.baomidou.mybatisplus.annotation.TableId;
  9 +import com.baomidou.mybatisplus.annotation.TableName;
  10 +import lombok.*;
9 11
  12 +import java.time.LocalDateTime;
10 import java.util.List; 13 import java.util.List;
11 14
12 /** 15 /**
13 - * 秒杀参与商品 16 + * 秒杀参与商品 DO
14 * 17 *
15 - * @author halfninety  
16 - * @TableName promotion_seckill_product 18 + * @author HUIHUI
17 */ 19 */
18 -@TableName(value = "promotion_seckill_product", autoResultMap = true) 20 +@TableName("promotion_seckill_product")
19 @KeySequence("promotion_seckill_product_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 21 @KeySequence("promotion_seckill_product_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
20 @Data 22 @Data
21 @EqualsAndHashCode(callSuper = true) 23 @EqualsAndHashCode(callSuper = true)
22 @ToString(callSuper = true) 24 @ToString(callSuper = true)
  25 +@Builder
  26 +@NoArgsConstructor
  27 +@AllArgsConstructor
23 public class SeckillProductDO extends BaseDO { 28 public class SeckillProductDO extends BaseDO {
  29 +
24 /** 30 /**
25 * 秒杀参与商品编号 31 * 秒杀参与商品编号
26 */ 32 */
27 - @TableId(type = IdType.AUTO) 33 + @TableId
28 private Long id; 34 private Long id;
29 -  
30 /** 35 /**
31 - * 秒杀活动id 36 + * 秒杀活动 id
32 */ 37 */
33 private Long activityId; 38 private Long activityId;
34 -  
35 /** 39 /**
36 - * 秒杀时段id 40 + * 秒杀时段 id
37 */ 41 */
38 @TableField(typeHandler = LongListTypeHandler.class) 42 @TableField(typeHandler = LongListTypeHandler.class)
39 - private List<Long> timeIds;  
40 - 43 + private List<Long> configIds;
41 /** 44 /**
42 - * 商品id 45 + * 商品 spu_id
43 */ 46 */
44 private Long spuId; 47 private Long spuId;
45 -  
46 /** 48 /**
47 - * 商品sku_id 49 + * 商品 sku_id
48 */ 50 */
49 private Long skuId; 51 private Long skuId;
50 -  
51 /** 52 /**
52 - * 秒杀金额 53 + * 秒杀金额,单位:分
53 */ 54 */
54 private Integer seckillPrice; 55 private Integer seckillPrice;
55 -  
56 - // TODO @芋艿:改成 quota 限量库存;每次购买时,需要减小;  
57 /** 56 /**
58 * 秒杀库存 57 * 秒杀库存
59 */ 58 */
60 private Integer stock; 59 private Integer stock;
61 -  
62 /** 60 /**
63 - * 每人限购 61 + * 秒杀商品状态
  62 + * 枚举 {@link CommonStatusEnum 对应的类}
  63 + */
  64 + private Integer activityStatus;
  65 + /**
  66 + * 活动开始时间点
  67 + */
  68 + private LocalDateTime activityStartTime;
  69 + /**
  70 + * 活动结束时间点
64 */ 71 */
65 - private Integer limitCount; 72 + private LocalDateTime activityEndTime;
66 73
67 } 74 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckill/seckilltime/SeckillTimeDO.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/dataobject/seckill/seckillconfig/SeckillConfigDO.java
1 -package cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime; 1 +package cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillconfig;
2 2
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 import com.baomidou.mybatisplus.annotation.KeySequence; 5 import com.baomidou.mybatisplus.annotation.KeySequence;
5 import com.baomidou.mybatisplus.annotation.TableId; 6 import com.baomidou.mybatisplus.annotation.TableId;
@@ -8,19 +9,17 @@ import lombok.Data; @@ -8,19 +9,17 @@ import lombok.Data;
8 import lombok.EqualsAndHashCode; 9 import lombok.EqualsAndHashCode;
9 import lombok.ToString; 10 import lombok.ToString;
10 11
11 -import java.time.LocalTime;  
12 -  
13 /** 12 /**
14 * 秒杀时段 DO 13 * 秒杀时段 DO
15 * 14 *
16 * @author 芋道源码 15 * @author 芋道源码
17 */ 16 */
18 -@TableName("promotion_seckill_time")  
19 -@KeySequence("promotion_seckill_time_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 17 +@TableName("promotion_seckill_config")
  18 +@KeySequence("promotion_seckill_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
20 @Data 19 @Data
21 @EqualsAndHashCode(callSuper = true) 20 @EqualsAndHashCode(callSuper = true)
22 @ToString(callSuper = true) 21 @ToString(callSuper = true)
23 -public class SeckillTimeDO extends BaseDO { 22 +public class SeckillConfigDO extends BaseDO {
24 23
25 /** 24 /**
26 * 编号 25 * 编号
@@ -34,14 +33,20 @@ public class SeckillTimeDO extends BaseDO { @@ -34,14 +33,20 @@ public class SeckillTimeDO extends BaseDO {
34 /** 33 /**
35 * 开始时间点 34 * 开始时间点
36 */ 35 */
37 - private LocalTime startTime; 36 + private String startTime;
38 /** 37 /**
39 * 结束时间点 38 * 结束时间点
40 */ 39 */
41 - private LocalTime endTime; 40 + private String endTime;
  41 + /**
  42 + * 秒杀主图
  43 + */
  44 + private String picUrl;
42 /** 45 /**
43 - * 秒杀活动数量 46 + * 状态 开启:0 禁用:1
  47 + * <p>
  48 + * 枚举 {@link CommonStatusEnum 对应的类}
44 */ 49 */
45 - private Integer seckillActivityCount; 50 + private Integer status;
46 51
47 } 52 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckillactivity/SeckillActivityMapper.java
@@ -8,6 +8,8 @@ import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.Se @@ -8,6 +8,8 @@ import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.Se
8 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; 8 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO;
9 import org.apache.ibatis.annotations.Mapper; 9 import org.apache.ibatis.annotations.Mapper;
10 10
  11 +import java.util.List;
  12 +
11 /** 13 /**
12 * 秒杀活动 Mapper 14 * 秒杀活动 Mapper
13 * 15 *
@@ -20,7 +22,12 @@ public interface SeckillActivityMapper extends BaseMapperX&lt;SeckillActivityDO&gt; { @@ -20,7 +22,12 @@ public interface SeckillActivityMapper extends BaseMapperX&lt;SeckillActivityDO&gt; {
20 .likeIfPresent(SeckillActivityDO::getName, reqVO.getName()) 22 .likeIfPresent(SeckillActivityDO::getName, reqVO.getName())
21 .eqIfPresent(SeckillActivityDO::getStatus, reqVO.getStatus()) 23 .eqIfPresent(SeckillActivityDO::getStatus, reqVO.getStatus())
22 .betweenIfPresent(SeckillActivityDO::getCreateTime, reqVO.getCreateTime()) 24 .betweenIfPresent(SeckillActivityDO::getCreateTime, reqVO.getCreateTime())
23 - .apply(ObjectUtil.isNotNull(reqVO.getTimeId()),"FIND_IN_SET(" + reqVO.getTimeId() + ",time_ids) > 0") 25 + .apply(ObjectUtil.isNotNull(reqVO.getConfigId()), "FIND_IN_SET(" + reqVO.getConfigId() + ",time_ids) > 0")
24 .orderByDesc(SeckillActivityDO::getId)); 26 .orderByDesc(SeckillActivityDO::getId));
25 } 27 }
  28 +
  29 + default List<SeckillActivityDO> selectListByStatus(Integer status) {
  30 + return selectList(new LambdaQueryWrapperX<SeckillActivityDO>()
  31 + .eqIfPresent(SeckillActivityDO::getStatus, status));
  32 + }
26 } 33 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckillactivity/SeckillProductMapper.java
@@ -27,7 +27,7 @@ public interface SeckillProductMapper extends BaseMapperX&lt;SeckillProductDO&gt; { @@ -27,7 +27,7 @@ public interface SeckillProductMapper extends BaseMapperX&lt;SeckillProductDO&gt; {
27 27
28 default void updateTimeIdsByActivityId(Long id, List<Long> timeIds) { 28 default void updateTimeIdsByActivityId(Long id, List<Long> timeIds) {
29 new LambdaUpdateChainWrapper<>(this) 29 new LambdaUpdateChainWrapper<>(this)
30 - .set(SeckillProductDO::getTimeIds, CollUtil.join(timeIds, ",")) 30 + .set(SeckillProductDO::getConfigIds, CollUtil.join(timeIds, ","))
31 .eq(SeckillProductDO::getActivityId, id) 31 .eq(SeckillProductDO::getActivityId, id)
32 .update(); 32 .update();
33 } 33 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckillconfig/SeckillConfigMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillconfig;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigPageReqVO;
  7 +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillconfig.SeckillConfigDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +@Mapper
  11 +public interface SeckillConfigMapper extends BaseMapperX<SeckillConfigDO> {
  12 +
  13 + default PageResult<SeckillConfigDO> selectPage(SeckillConfigPageReqVO reqVO) {
  14 + return selectPage(reqVO, new LambdaQueryWrapperX<SeckillConfigDO>()
  15 + .likeIfPresent(SeckillConfigDO::getName, reqVO.getName())
  16 + .eqIfPresent(SeckillConfigDO::getStatus, reqVO.getStatus())
  17 + .orderByDesc(SeckillConfigDO::getId));
  18 + }
  19 +
  20 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/seckill/seckilltime/SeckillTimeMapper.java deleted
1 -package cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckilltime;  
2 -  
3 -import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;  
4 -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO;  
5 -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;  
6 -import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;  
7 -import org.apache.ibatis.annotations.Mapper;  
8 -  
9 -import java.time.LocalTime;  
10 -import java.util.Collection;  
11 -import java.util.List;  
12 -  
13 -@Mapper  
14 -public interface SeckillTimeMapper extends BaseMapperX<SeckillTimeDO> {  
15 -  
16 - default List<SeckillTimeDO> selectListByTime(LocalTime time) {  
17 - return selectList(SeckillTimeDO::getStartTime, SeckillTimeDO::getEndTime, time);  
18 - }  
19 -  
20 - default List<SeckillTimeDO> selectListByTime(LocalTime startTime, LocalTime endTime) {  
21 - return selectList(new LambdaQueryWrapper<SeckillTimeDO>()  
22 - .ge(SeckillTimeDO::getStartTime, startTime)  
23 - .le(SeckillTimeDO::getEndTime, endTime));  
24 - }  
25 -  
26 - default void updateActivityCount(Collection<Long> ids, String type, Integer count) {  
27 - new LambdaUpdateChainWrapper<>(this)  
28 - .in(SeckillTimeDO::getId, ids)  
29 - .setSql("`seckill_activity_count` = `seckill_activity_count` " + type + count)  
30 - .update();  
31 - }  
32 -}  
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/discount/DiscountActivityServiceImpl.java
@@ -52,7 +52,7 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { @@ -52,7 +52,7 @@ public class DiscountActivityServiceImpl implements DiscountActivityService {
52 52
53 // 插入活动 53 // 插入活动
54 DiscountActivityDO discountActivity = DiscountActivityConvert.INSTANCE.convert(createReqVO) 54 DiscountActivityDO discountActivity = DiscountActivityConvert.INSTANCE.convert(createReqVO)
55 - .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getStartTime(), createReqVO.getEndTime())); 55 + .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getEndTime()));
56 discountActivityMapper.insert(discountActivity); 56 discountActivityMapper.insert(discountActivity);
57 // 插入商品 57 // 插入商品
58 List<DiscountProductDO> discountProducts = convertList(createReqVO.getProducts(), 58 List<DiscountProductDO> discountProducts = convertList(createReqVO.getProducts(),
@@ -74,7 +74,7 @@ public class DiscountActivityServiceImpl implements DiscountActivityService { @@ -74,7 +74,7 @@ public class DiscountActivityServiceImpl implements DiscountActivityService {
74 74
75 // 更新活动 75 // 更新活动
76 DiscountActivityDO updateObj = DiscountActivityConvert.INSTANCE.convert(updateReqVO) 76 DiscountActivityDO updateObj = DiscountActivityConvert.INSTANCE.convert(updateReqVO)
77 - .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getStartTime(), updateReqVO.getEndTime())); 77 + .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getEndTime()));
78 discountActivityMapper.updateById(updateObj); 78 discountActivityMapper.updateById(updateObj);
79 // 更新商品 79 // 更新商品
80 updateDiscountProduct(updateReqVO); 80 updateDiscountProduct(updateReqVO);
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/reward/RewardActivityServiceImpl.java
@@ -41,7 +41,7 @@ public class RewardActivityServiceImpl implements RewardActivityService { @@ -41,7 +41,7 @@ public class RewardActivityServiceImpl implements RewardActivityService {
41 41
42 // 插入 42 // 插入
43 RewardActivityDO rewardActivity = RewardActivityConvert.INSTANCE.convert(createReqVO) 43 RewardActivityDO rewardActivity = RewardActivityConvert.INSTANCE.convert(createReqVO)
44 - .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getStartTime(), createReqVO.getEndTime())); 44 + .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getEndTime()));
45 rewardActivityMapper.insert(rewardActivity); 45 rewardActivityMapper.insert(rewardActivity);
46 // 返回 46 // 返回
47 return rewardActivity.getId(); 47 return rewardActivity.getId();
@@ -59,7 +59,7 @@ public class RewardActivityServiceImpl implements RewardActivityService { @@ -59,7 +59,7 @@ public class RewardActivityServiceImpl implements RewardActivityService {
59 59
60 // 更新 60 // 更新
61 RewardActivityDO updateObj = RewardActivityConvert.INSTANCE.convert(updateReqVO) 61 RewardActivityDO updateObj = RewardActivityConvert.INSTANCE.convert(updateReqVO)
62 - .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getStartTime(), updateReqVO.getEndTime())); 62 + .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getEndTime()));
63 rewardActivityMapper.updateById(updateObj); 63 rewardActivityMapper.updateById(updateObj);
64 } 64 }
65 65
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckillactivity/SeckillActivityService.java
1 package cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity; 1 package cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity;
2 2
3 -import java.util.*;  
4 -import javax.validation.*;  
5 - 3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO; 4 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO;
7 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO; 5 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO;
8 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityUpdateReqVO; 6 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityUpdateReqVO;
9 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; 7 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO;
10 -import cn.iocoder.yudao.framework.common.pojo.PageResult;  
11 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; 8 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO;
12 9
  10 +import javax.validation.Valid;
  11 +import java.util.Collection;
  12 +import java.util.List;
  13 +
13 /** 14 /**
14 * 秒杀活动 Service 接口 15 * 秒杀活动 Service 接口
15 * 16 *
@@ -77,4 +78,5 @@ public interface SeckillActivityService { @@ -77,4 +78,5 @@ public interface SeckillActivityService {
77 * @return 活动商品列表 78 * @return 活动商品列表
78 */ 79 */
79 List<SeckillProductDO> getSeckillProductListByActivityId(Long id); 80 List<SeckillProductDO> getSeckillProductListByActivityId(Long id);
  81 +
80 } 82 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckillactivity/SeckillActivityServiceImpl.java
1 package cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity; 1 package cn.iocoder.yudao.module.promotion.service.seckill.seckillactivity;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.ArrayUtil;
  5 +import cn.hutool.core.util.ObjectUtil;
  6 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 8 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
6 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityBaseVO; 9 +import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
  10 +import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
  11 +import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
  12 +import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
7 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO; 13 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityCreateReqVO;
8 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO; 14 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityPageReqVO;
9 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityUpdateReqVO; 15 import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.activity.SeckillActivityUpdateReqVO;
  16 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.product.SeckillProductBaseVO;
10 import cn.iocoder.yudao.module.promotion.convert.seckill.seckillactivity.SeckillActivityConvert; 17 import cn.iocoder.yudao.module.promotion.convert.seckill.seckillactivity.SeckillActivityConvert;
11 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO; 18 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO;
12 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO; 19 import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO;
13 import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillActivityMapper; 20 import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillActivityMapper;
14 import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillProductMapper; 21 import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillactivity.SeckillProductMapper;
15 import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum; 22 import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum;
16 -import cn.iocoder.yudao.module.promotion.service.seckill.seckilltime.SeckillTimeService; 23 +import cn.iocoder.yudao.module.promotion.service.seckill.seckillconfig.SeckillConfigService;
17 import cn.iocoder.yudao.module.promotion.util.PromotionUtils; 24 import cn.iocoder.yudao.module.promotion.util.PromotionUtils;
18 import org.springframework.stereotype.Service; 25 import org.springframework.stereotype.Service;
19 import org.springframework.validation.annotation.Validated; 26 import org.springframework.validation.annotation.Validated;
@@ -21,8 +28,12 @@ import org.springframework.validation.annotation.Validated; @@ -21,8 +28,12 @@ import org.springframework.validation.annotation.Validated;
21 import javax.annotation.Resource; 28 import javax.annotation.Resource;
22 import java.util.Collection; 29 import java.util.Collection;
23 import java.util.List; 30 import java.util.List;
  31 +import java.util.Set;
  32 +import java.util.stream.Collectors;
24 33
25 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 34 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  35 +import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS;
  36 +import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS;
26 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*; 37 import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
27 import static java.util.Arrays.asList; 38 import static java.util.Arrays.asList;
28 39
@@ -34,76 +45,105 @@ import static java.util.Arrays.asList; @@ -34,76 +45,105 @@ import static java.util.Arrays.asList;
34 @Service 45 @Service
35 @Validated 46 @Validated
36 public class SeckillActivityServiceImpl implements SeckillActivityService { 47 public class SeckillActivityServiceImpl implements SeckillActivityService {
  48 +
37 @Resource 49 @Resource
38 private SeckillActivityMapper seckillActivityMapper; 50 private SeckillActivityMapper seckillActivityMapper;
39 @Resource 51 @Resource
40 private SeckillProductMapper seckillProductMapper; 52 private SeckillProductMapper seckillProductMapper;
41 @Resource 53 @Resource
42 - private SeckillTimeService seckillTimeService; 54 + private SeckillConfigService seckillConfigService;
  55 + @Resource
  56 + private ProductSpuApi productSpuApi;
  57 + @Resource
  58 + private ProductSkuApi productSkuApi;
43 59
44 @Override 60 @Override
45 public Long createSeckillActivity(SeckillActivityCreateReqVO createReqVO) { 61 public Long createSeckillActivity(SeckillActivityCreateReqVO createReqVO) {
46 - // 校验商品是否冲突  
47 - validateSeckillActivityProductConflicts(null, createReqVO.getProducts());  
48 - // 校验秒杀时段是否存在  
49 - seckillTimeService.validateSeckillTimeExists(createReqVO.getTimeIds()); 62 + // 校验商品秒秒杀时段是否冲突
  63 + validateProductSpuSeckillConflict(createReqVO.getConfigIds(), createReqVO.getSpuIds());
  64 + // 校验商品 sku 是否存在
  65 + validateProductSkuExistence(createReqVO.getSpuIds(), createReqVO.getProducts());
50 66
51 // 插入秒杀活动 67 // 插入秒杀活动
52 SeckillActivityDO seckillActivity = SeckillActivityConvert.INSTANCE.convert(createReqVO) 68 SeckillActivityDO seckillActivity = SeckillActivityConvert.INSTANCE.convert(createReqVO)
53 - .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getStartTime(), createReqVO.getEndTime())); 69 + .setStatus(PromotionUtils.calculateActivityStatus(createReqVO.getEndTime()));
54 seckillActivityMapper.insert(seckillActivity); 70 seckillActivityMapper.insert(seckillActivity);
55 // 插入商品 71 // 插入商品
56 - List<SeckillProductDO> productDOS = SeckillActivityConvert.INSTANCE.convertList(createReqVO.getProducts(), seckillActivity);  
57 - seckillProductMapper.insertBatch(productDOS);  
58 - // 更新秒杀时段的秒杀活动数量  
59 - seckillTimeService.sekillActivityCountIncr(createReqVO.getTimeIds()); 72 + List<SeckillProductDO> productDOs = SeckillActivityConvert.INSTANCE.convertList(seckillActivity, createReqVO.getProducts());
  73 + seckillProductMapper.insertBatch(productDOs);
60 return seckillActivity.getId(); 74 return seckillActivity.getId();
61 } 75 }
62 76
  77 + private <T extends SeckillProductBaseVO> void validateProductSkuExistence(List<Long> spuIds, List<T> products) {
  78 + Set<Long> convertedSpuIds = CollectionUtils.convertSet(products, T::getSpuId);
  79 + // 校验 spu 个数是否相等
  80 + if (ObjectUtil.notEqual(spuIds.size(), convertedSpuIds.size())) {
  81 + throw exception(SKU_NOT_EXISTS);
  82 + }
  83 + // 获取所选 spu下的所有 sku
  84 + List<ProductSkuRespDTO> skuRespDTOs = productSkuApi.getSkuListBySpuId(spuIds);
  85 + // 校验 sku 个数是否一致
  86 + Set<Long> skuIdsSet = CollectionUtils.convertSet(products, T::getSkuId);
  87 + Set<Long> skuIdsSet1 = CollectionUtils.convertSet(skuRespDTOs, ProductSkuRespDTO::getId);
  88 + if (ObjectUtil.notEqual(skuIdsSet.size(), skuIdsSet1.size())) {
  89 + throw exception(SKU_NOT_EXISTS);
  90 + }
  91 + // 校验 skuId 是否存在
  92 + if (!skuIdsSet1.containsAll(skuIdsSet) || !skuIdsSet.containsAll(skuIdsSet1)) {
  93 + throw exception(SKU_NOT_EXISTS);
  94 + }
  95 + }
  96 +
  97 + private void validateProductSpuSeckillConflict(List<Long> configIds, List<Long> spuIds) {
  98 + // 校验秒杀时段是否存在
  99 + seckillConfigService.validateSeckillConfigExists(configIds);
  100 + // 校验商品 spu 是否存在
  101 + List<ProductSpuRespDTO> spuList = productSpuApi.getSpuList(spuIds);
  102 + if (ObjectUtil.notEqual(spuIds.size(), spuList.size())) {
  103 + throw exception(SPU_NOT_EXISTS);
  104 + }
  105 + // 查询所有开启的秒杀活动
  106 + List<SeckillActivityDO> activityDOs = seckillActivityMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus());
  107 + // 过滤出所有 spuIds 有交集的活动
  108 + List<SeckillActivityDO> doList = activityDOs.stream().filter(s -> {
  109 + // 判断 spu 是否有交集
  110 + List<Long> spuIdsClone = ArrayUtil.clone(s.getSpuIds());
  111 + spuIdsClone.retainAll(spuIds);
  112 + if (CollUtil.isEmpty(spuIdsClone)) {
  113 + return false;
  114 + }
  115 + // 判断秒杀时段是否有交集
  116 + List<Long> configIdsClone = ArrayUtil.clone(s.getConfigIds());
  117 + configIdsClone.retainAll(configIds);
  118 + return CollUtil.isNotEmpty(configIdsClone);
  119 + }).collect(Collectors.toList());
  120 + if (CollUtil.isNotEmpty(doList)) {
  121 + throw exception(SECKILL_ACTIVITY_SPU_CONFLICTS);
  122 + }
  123 + }
  124 +
63 @Override 125 @Override
64 public void updateSeckillActivity(SeckillActivityUpdateReqVO updateReqVO) { 126 public void updateSeckillActivity(SeckillActivityUpdateReqVO updateReqVO) {
65 // 校验存在 127 // 校验存在
66 SeckillActivityDO seckillActivity = validateSeckillActivityExists(updateReqVO.getId()); 128 SeckillActivityDO seckillActivity = validateSeckillActivityExists(updateReqVO.getId());
67 - if (PromotionActivityStatusEnum.CLOSE.getStatus().equals(seckillActivity.getStatus())) { 129 + if (CommonStatusEnum.ENABLE.getStatus().equals(seckillActivity.getStatus())) {
68 throw exception(SECKILL_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED); 130 throw exception(SECKILL_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED);
69 } 131 }
70 // 校验商品是否冲突 132 // 校验商品是否冲突
71 - validateSeckillActivityProductConflicts(updateReqVO.getId(), updateReqVO.getProducts()); 133 + validateProductSpuSeckillConflict(updateReqVO.getConfigIds(), updateReqVO.getSpuIds());
  134 + // 校验商品 sku 是否存在
  135 + validateProductSkuExistence(updateReqVO.getSpuIds(), updateReqVO.getProducts());
72 136
73 // 更新活动 137 // 更新活动
74 SeckillActivityDO updateObj = SeckillActivityConvert.INSTANCE.convert(updateReqVO) 138 SeckillActivityDO updateObj = SeckillActivityConvert.INSTANCE.convert(updateReqVO)
75 - .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getStartTime(), updateReqVO.getEndTime())); 139 + .setStatus(PromotionUtils.calculateActivityStatus(updateReqVO.getEndTime()));
76 seckillActivityMapper.updateById(updateObj); 140 seckillActivityMapper.updateById(updateObj);
77 // 更新商品 141 // 更新商品
78 - updateSeckillProduct(updateReqVO);  
79 - // 更新秒杀时段的秒杀活动数量  
80 - updateSeckillTimeActivityCount(seckillActivity, updateReqVO.getTimeIds()); 142 + //updateSeckillProduct(updateReqVO);
81 } 143 }
82 144
83 145
84 /** 146 /**
85 - * 更新秒杀时段的秒杀活动数量  
86 - *  
87 - * @param seckillActivity 查询出的秒杀活动  
88 - * @param updateTimeIds 更新后的秒杀时段id列表  
89 - */  
90 - private void updateSeckillTimeActivityCount(SeckillActivityDO seckillActivity, List<Long> updateTimeIds) {  
91 - // 查询出 timeIds  
92 - List<Long> existsTimeIds = seckillActivity.getTimeIds();  
93 - // 需要减少的时间段  
94 - Collection<Long> reduceIds = CollUtil.filterNew(existsTimeIds, existsTimeId -> !updateTimeIds.contains(existsTimeId));  
95 - // 需要添加的时间段  
96 - updateTimeIds.removeIf(existsTimeIds::contains);  
97 - // 更新减少时间段和增加时间段  
98 - if (CollUtil.isNotEmpty(updateTimeIds)) {  
99 - seckillTimeService.sekillActivityCountIncr(updateTimeIds);  
100 - }  
101 - if (CollUtil.isNotEmpty(reduceIds)) {  
102 - seckillTimeService.sekillActivityCountDecr(reduceIds);  
103 - }  
104 - }  
105 -  
106 - /**  
107 * 更新秒杀商品 147 * 更新秒杀商品
108 * 后台查出的数据和前台查出的数据进行遍历, 148 * 后台查出的数据和前台查出的数据进行遍历,
109 * 1. 对前台数据进行遍历:如果不存在于后台的 sku 中需要新增 149 * 1. 对前台数据进行遍历:如果不存在于后台的 sku 中需要新增
@@ -113,57 +153,29 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { @@ -113,57 +153,29 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
113 * @param updateReqVO 更新的请求VO 153 * @param updateReqVO 更新的请求VO
114 */ 154 */
115 private void updateSeckillProduct(SeckillActivityUpdateReqVO updateReqVO) { 155 private void updateSeckillProduct(SeckillActivityUpdateReqVO updateReqVO) {
116 - List<SeckillProductDO> seckillProductDOS = seckillProductMapper.selectListByActivityId(updateReqVO.getId());  
117 - List<SeckillActivityBaseVO.Product> products = updateReqVO.getProducts();  
118 -  
119 - // 计算需要删除的数据  
120 - List<Long> deleteIds = CollectionUtils.convertList(seckillProductDOS, SeckillProductDO::getId,  
121 - seckillProductDO -> products.stream()  
122 - .noneMatch(product -> SeckillActivityConvert.INSTANCE.isEquals(seckillProductDO, product)));  
123 - if (CollUtil.isNotEmpty(deleteIds)) {  
124 - seckillProductMapper.deleteBatchIds(deleteIds);  
125 - }  
126 -  
127 - // 计算需要新增的数据  
128 - List<SeckillProductDO> newSeckillProductDOs = CollectionUtils.convertList(products,  
129 - product -> SeckillActivityConvert.INSTANCE.convert(product).setActivityId(updateReqVO.getId()));  
130 - newSeckillProductDOs.removeIf(product -> seckillProductDOS.stream()  
131 - .anyMatch(seckillProduct -> SeckillActivityConvert.INSTANCE.isEquals(seckillProduct, product)));  
132 - if (CollUtil.isNotEmpty(newSeckillProductDOs)) {  
133 - seckillProductMapper.insertBatch(newSeckillProductDOs);  
134 - } 156 + // TODO puhui999:后续完善
  157 + //List<SeckillProductDO> seckillProductDOs = seckillProductMapper.selectListByActivityId(updateReqVO.getId());
  158 + //List<SeckillProductUpdateReqVO> products = updateReqVO.getProducts();
  159 +
  160 + ////计算需要删除的数据
  161 + //List<Long> deleteIds = CollectionUtils.convertList(seckillProductDOs, SeckillProductDO::getId,
  162 + // seckillProductDO -> products.stream()
  163 + // .noneMatch(product -> SeckillActivityConvert.INSTANCE.isEquals(seckillProductDO, product)));
  164 + //if (CollUtil.isNotEmpty(deleteIds)) {
  165 + // seckillProductMapper.deleteBatchIds(deleteIds);
  166 + //}
  167 + //
  168 + //// 计算需要新增的数据
  169 + //List<SeckillProductDO> newSeckillProductDOs = CollectionUtils.convertList(products,
  170 + // product -> SeckillActivityConvert.INSTANCE.convert(product).setActivityId(updateReqVO.getId()));
  171 + //newSeckillProductDOs.removeIf(product -> seckillProductDOs.stream()
  172 + // .anyMatch(seckillProduct -> SeckillActivityConvert.INSTANCE.isEquals(seckillProduct, product)));
  173 + //if (CollUtil.isNotEmpty(newSeckillProductDOs)) {
  174 + // seckillProductMapper.insertBatch(newSeckillProductDOs);
  175 + //}
135 176
136 //全量更新当前活动商品的秒杀时段id列表(timeIds) 177 //全量更新当前活动商品的秒杀时段id列表(timeIds)
137 - seckillProductMapper.updateTimeIdsByActivityId(updateReqVO.getId(), updateReqVO.getTimeIds());  
138 - }  
139 -  
140 - /**  
141 - * 校验商品是否冲突  
142 - *  
143 - * @param id 秒杀活动编号  
144 - * @param products 商品列表  
145 - */  
146 - private void validateSeckillActivityProductConflicts(Long id, List<SeckillActivityBaseVO.Product> products) {  
147 - if (CollUtil.isEmpty(products)) {  
148 - return;  
149 - }  
150 - List<SeckillProductDO> seckillProductDOS = seckillProductMapper  
151 - .selectListBySkuIds(CollectionUtils.convertSet(products, SeckillActivityBaseVO.Product::getSkuId));  
152 - if (CollUtil.isEmpty(seckillProductDOS)) {  
153 - return;  
154 - }  
155 - List<SeckillActivityDO> seckillActivityDOS = seckillActivityMapper  
156 - .selectBatchIds(CollectionUtils.convertSet(seckillProductDOS, SeckillProductDO::getActivityId));  
157 - if (id != null) { // 排除自己这个活动  
158 - seckillActivityDOS.removeIf(item -> id.equals(item.getId()));  
159 - }  
160 - // 排除不满足 status 的活动  
161 - List<Integer> statuses = asList(PromotionActivityStatusEnum.WAIT.getStatus(), PromotionActivityStatusEnum.RUN.getStatus());  
162 - seckillActivityDOS.removeIf(item -> !statuses.contains(item.getStatus()));  
163 - // 如果非空,则说明冲突  
164 - if (CollUtil.isNotEmpty(seckillActivityDOS)) {  
165 - throw exception(SECKILL_ACTIVITY_SPU_CONFLICTS);  
166 - } 178 + seckillProductMapper.updateTimeIdsByActivityId(updateReqVO.getId(), updateReqVO.getConfigIds());
167 } 179 }
168 180
169 @Override 181 @Override
@@ -189,8 +201,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService { @@ -189,8 +201,7 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
189 if (!statuses.contains(seckillActivity.getStatus())) { 201 if (!statuses.contains(seckillActivity.getStatus())) {
190 throw exception(SECKILL_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END); 202 throw exception(SECKILL_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END);
191 } 203 }
192 - // 更新秒杀时段的秒杀活动数量  
193 - seckillTimeService.sekillActivityCountDecr(seckillActivity.getTimeIds()); 204 +
194 // 删除 205 // 删除
195 seckillActivityMapper.deleteById(id); 206 seckillActivityMapper.deleteById(id);
196 } 207 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckilltime/SeckillTimeService.java renamed to yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckillconfig/SeckillConfigService.java
1 -package cn.iocoder.yudao.module.promotion.service.seckill.seckilltime; 1 +package cn.iocoder.yudao.module.promotion.service.seckill.seckillconfig;
2 2
3 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeCreateReqVO;  
4 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeUpdateReqVO;  
5 -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO; 3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigCreateReqVO;
  5 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigPageReqVO;
  6 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigUpdateReqVO;
  7 +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillconfig.SeckillConfigDO;
6 8
7 import javax.validation.Valid; 9 import javax.validation.Valid;
8 import java.util.Collection; 10 import java.util.Collection;
@@ -13,7 +15,7 @@ import java.util.List; @@ -13,7 +15,7 @@ import java.util.List;
13 * 15 *
14 * @author halfninety 16 * @author halfninety
15 */ 17 */
16 -public interface SeckillTimeService { 18 +public interface SeckillConfigService {
17 19
18 /** 20 /**
19 * 创建秒杀时段 21 * 创建秒杀时段
@@ -21,21 +23,21 @@ public interface SeckillTimeService { @@ -21,21 +23,21 @@ public interface SeckillTimeService {
21 * @param createReqVO 创建信息 23 * @param createReqVO 创建信息
22 * @return 编号 24 * @return 编号
23 */ 25 */
24 - Long createSeckillTime(@Valid SeckillTimeCreateReqVO createReqVO); 26 + Long createSeckillConfig(@Valid SeckillConfigCreateReqVO createReqVO);
25 27
26 /** 28 /**
27 * 更新秒杀时段 29 * 更新秒杀时段
28 * 30 *
29 * @param updateReqVO 更新信息 31 * @param updateReqVO 更新信息
30 */ 32 */
31 - void updateSeckillTime(@Valid SeckillTimeUpdateReqVO updateReqVO); 33 + void updateSeckillConfig(@Valid SeckillConfigUpdateReqVO updateReqVO);
32 34
33 /** 35 /**
34 * 删除秒杀时段 36 * 删除秒杀时段
35 * 37 *
36 * @param id 编号 38 * @param id 编号
37 */ 39 */
38 - void deleteSeckillTime(Long id); 40 + void deleteSeckillConfig(Long id);
39 41
40 /** 42 /**
41 * 获得秒杀时段 43 * 获得秒杀时段
@@ -43,34 +45,43 @@ public interface SeckillTimeService { @@ -43,34 +45,43 @@ public interface SeckillTimeService {
43 * @param id 编号 45 * @param id 编号
44 * @return 秒杀时段 46 * @return 秒杀时段
45 */ 47 */
46 - SeckillTimeDO getSeckillTime(Long id); 48 + SeckillConfigDO getSeckillConfig(Long id);
47 49
48 /** 50 /**
49 * 获得所有秒杀时段列表 51 * 获得所有秒杀时段列表
50 * 52 *
51 * @return 所有秒杀时段列表 53 * @return 所有秒杀时段列表
52 */ 54 */
53 - List<SeckillTimeDO> getSeckillTimeList(); 55 + List<SeckillConfigDO> getSeckillConfigList();
54 56
55 /** 57 /**
56 * 校验秒杀时段是否存在 58 * 校验秒杀时段是否存在
57 * 59 *
58 * @param timeIds 秒杀时段id集合 60 * @param timeIds 秒杀时段id集合
59 */ 61 */
60 - void validateSeckillTimeExists(Collection<Long> timeIds); 62 + void validateSeckillConfigExists(Collection<Long> timeIds);
  63 +
61 64
62 /** 65 /**
63 - * 秒杀时段列表的秒杀活动数量加 1 66 + * 获得秒杀时间段配置分页数据
64 * 67 *
65 - * @param ids 秒杀时段id列表 68 + * @param pageVO 分页请求参数
  69 + * @return 秒杀时段分页列表
66 */ 70 */
67 - void sekillActivityCountIncr(Collection<Long> ids); 71 + PageResult<SeckillConfigDO> getSeckillConfigPage(SeckillConfigPageReqVO pageVO);
68 72
  73 + /**
  74 + * 获得所有正常状态的时段配置列表
  75 + *
  76 + * @return 秒杀时段列表
  77 + */
  78 + List<SeckillConfigDO> getListAllSimple();
69 79
70 /** 80 /**
71 - * 秒杀时段列表的秒杀活动数量减 1 81 + * 更新秒杀时段配置状态
72 * 82 *
73 - * @param ids 秒杀时段id列表 83 + * @param id id
  84 + * @param status 状态
74 */ 85 */
75 - void sekillActivityCountDecr(Collection<Long> ids); 86 + void updateSeckillConfigStatus(Long id, Integer status);
76 } 87 }
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckillconfig/SeckillConfigServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.service.seckill.seckillconfig;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigCreateReqVO;
  7 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigPageReqVO;
  8 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigUpdateReqVO;
  9 +import cn.iocoder.yudao.module.promotion.convert.seckill.seckillconfig.SeckillConfigConvert;
  10 +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillconfig.SeckillConfigDO;
  11 +import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillconfig.SeckillConfigMapper;
  12 +import org.springframework.stereotype.Service;
  13 +import org.springframework.validation.annotation.Validated;
  14 +
  15 +import javax.annotation.Resource;
  16 +import java.time.LocalTime;
  17 +import java.util.Collection;
  18 +import java.util.List;
  19 +import java.util.Set;
  20 +import java.util.stream.Collectors;
  21 +
  22 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  23 +import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
  24 +
  25 +/**
  26 + * 秒杀时段 Service 实现类
  27 + *
  28 + * @author halfninety
  29 + */
  30 +@Service
  31 +@Validated
  32 +public class SeckillConfigServiceImpl implements SeckillConfigService {
  33 +
  34 + @Resource
  35 + private SeckillConfigMapper seckillConfigMapper;
  36 +
  37 + @Override
  38 + public Long createSeckillConfig(SeckillConfigCreateReqVO createReqVO) {
  39 + // 校验时间段是否冲突
  40 + validateSeckillConfigConflict(createReqVO.getStartTime(), createReqVO.getEndTime());
  41 +
  42 + // 插入
  43 + SeckillConfigDO seckillConfig = SeckillConfigConvert.INSTANCE.convert(createReqVO);
  44 + seckillConfigMapper.insert(seckillConfig);
  45 + // 返回
  46 + return seckillConfig.getId();
  47 + }
  48 +
  49 + @Override
  50 + public void updateSeckillConfig(SeckillConfigUpdateReqVO updateReqVO) {
  51 + // 校验存在
  52 + validateSeckillConfigExists(updateReqVO.getId());
  53 + // 校验时间段是否冲突
  54 + validateSeckillConfigConflict(updateReqVO.getStartTime(), updateReqVO.getEndTime());
  55 +
  56 + // 更新
  57 + SeckillConfigDO updateObj = SeckillConfigConvert.INSTANCE.convert(updateReqVO);
  58 + seckillConfigMapper.updateById(updateObj);
  59 + }
  60 +
  61 + @Override
  62 + public void deleteSeckillConfig(Long id) {
  63 + // 校验存在
  64 + validateSeckillConfigExists(id);
  65 +
  66 + // 删除
  67 + seckillConfigMapper.deleteById(id);
  68 + }
  69 +
  70 + private void validateSeckillConfigExists(Long id) {
  71 + if (seckillConfigMapper.selectById(id) == null) {
  72 + throw exception(SECKILL_TIME_NOT_EXISTS);
  73 + }
  74 + }
  75 +
  76 + /**
  77 + * 校验时间是否存在冲突
  78 + *
  79 + * @param startTime 开始时间
  80 + * @param endTime 结束时间
  81 + */
  82 + private void validateSeckillConfigConflict(String startTime, String endTime) {
  83 + LocalTime startTime1 = LocalTime.parse(startTime);
  84 + LocalTime endTime1 = LocalTime.parse(endTime);
  85 + // 检查选择的时间是否相等
  86 + if (startTime1.equals(endTime1)) {
  87 + throw exception(SECKILL_TIME_EQUAL);
  88 + }
  89 + // 检查开始时间是否在结束时间之前
  90 + if (startTime1.isAfter(endTime1)) {
  91 + throw exception(SECKILL_START_TIME_BEFORE_END_TIME);
  92 + }
  93 + // 查询出所有的时段配置
  94 + List<SeckillConfigDO> configDOs = seckillConfigMapper.selectList();
  95 + // 过滤出重叠的时段 ids
  96 + Set<Long> ids = configDOs.stream().filter((config) -> {
  97 + LocalTime startTime2 = LocalTime.parse(config.getStartTime());
  98 + LocalTime endTime2 = LocalTime.parse(config.getEndTime());
  99 + // 判断时间是否重叠
  100 + // 开始时间在已配置时段的结束时间之前 且 结束时间在已配置时段的开始时间之后 []
  101 + return startTime1.isBefore(endTime2) && endTime1.isAfter(startTime2)
  102 + // 开始时间在已配置时段的开始时间之前 且 结束时间在已配置时段的开始时间之后 (] 或 ()
  103 + || startTime1.isBefore(startTime2) && endTime1.isAfter(startTime2)
  104 + // 开始时间在已配置时段的结束时间之前 且 结束时间在已配值时段的结束时间之后 [) 或 ()
  105 + || startTime1.isBefore(endTime2) && endTime1.isAfter(endTime2);
  106 + }).map(SeckillConfigDO::getId).collect(Collectors.toSet());
  107 + if (CollUtil.isNotEmpty(ids)) {
  108 + throw exception(SECKILL_TIME_CONFLICTS);
  109 + }
  110 + }
  111 +
  112 + @Override
  113 + public SeckillConfigDO getSeckillConfig(Long id) {
  114 + return seckillConfigMapper.selectById(id);
  115 + }
  116 +
  117 + @Override
  118 + public List<SeckillConfigDO> getSeckillConfigList() {
  119 + return seckillConfigMapper.selectList();
  120 + }
  121 +
  122 + @Override
  123 + public void validateSeckillConfigExists(Collection<Long> configIds) {
  124 + if (CollUtil.isEmpty(configIds)) {
  125 + throw exception(SECKILL_TIME_NOT_EXISTS);
  126 + }
  127 + if (seckillConfigMapper.selectBatchIds(configIds).size() != configIds.size()) {
  128 + throw exception(SECKILL_TIME_NOT_EXISTS);
  129 + }
  130 + }
  131 +
  132 + @Override
  133 + public PageResult<SeckillConfigDO> getSeckillConfigPage(SeckillConfigPageReqVO pageVO) {
  134 + return seckillConfigMapper.selectPage(pageVO);
  135 + }
  136 +
  137 + @Override
  138 + public List<SeckillConfigDO> getListAllSimple() {
  139 + return seckillConfigMapper.selectList(SeckillConfigDO::getStatus, CommonStatusEnum.ENABLE.getStatus());
  140 + }
  141 +
  142 + @Override
  143 + public void updateSeckillConfigStatus(Long id, Integer status) {
  144 + // 校验秒杀时段是否存在
  145 + validateSeckillConfigExists(id);
  146 +
  147 + SeckillConfigDO seckillConfigDO = new SeckillConfigDO();
  148 + seckillConfigDO.setId(id);
  149 + seckillConfigDO.setStatus(status);
  150 + // 更新状态
  151 + seckillConfigMapper.updateById(seckillConfigDO);
  152 + }
  153 +
  154 +}
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/seckill/seckilltime/SeckillTimeServiceImpl.java deleted
1 -package cn.iocoder.yudao.module.promotion.service.seckill.seckilltime;  
2 -  
3 -import cn.hutool.core.collection.CollUtil;  
4 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeCreateReqVO;  
5 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeUpdateReqVO;  
6 -import cn.iocoder.yudao.module.promotion.convert.seckill.seckilltime.SeckillTimeConvert;  
7 -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO;  
8 -import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckilltime.SeckillTimeMapper;  
9 -import org.springframework.stereotype.Service;  
10 -import org.springframework.validation.annotation.Validated;  
11 -  
12 -import javax.annotation.Resource;  
13 -import java.time.LocalTime;  
14 -import java.util.Collection;  
15 -import java.util.List;  
16 -import java.util.Objects;  
17 -  
18 -import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;  
19 -import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.SECKILL_TIME_CONFLICTS;  
20 -import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.SECKILL_TIME_NOT_EXISTS;  
21 -  
22 -/**  
23 - * 秒杀时段 Service 实现类  
24 - *  
25 - * @author halfninety  
26 - */  
27 -@Service  
28 -@Validated  
29 -public class SeckillTimeServiceImpl implements SeckillTimeService {  
30 -  
31 - @Resource  
32 - private SeckillTimeMapper seckillTimeMapper;  
33 -  
34 - @Override  
35 - public Long createSeckillTime(SeckillTimeCreateReqVO createReqVO) {  
36 - // 校验时间段是否冲突  
37 - validateSeckillTimeConflict(null, createReqVO.getStartTime(), createReqVO.getEndTime());  
38 - // 插入  
39 - SeckillTimeDO seckillTime = SeckillTimeConvert.INSTANCE.convert(createReqVO);  
40 - seckillTimeMapper.insert(seckillTime);  
41 - // 返回  
42 - return seckillTime.getId();  
43 - }  
44 -  
45 - @Override  
46 - public void updateSeckillTime(SeckillTimeUpdateReqVO updateReqVO) {  
47 - // 校验存在  
48 - this.validateSeckillTimeExists(updateReqVO.getId());  
49 - // 校验时间段是否冲突  
50 - validateSeckillTimeConflict(updateReqVO.getId(), updateReqVO.getStartTime(), updateReqVO.getEndTime());  
51 - // 更新  
52 - SeckillTimeDO updateObj = SeckillTimeConvert.INSTANCE.convert(updateReqVO);  
53 - seckillTimeMapper.updateById(updateObj);  
54 - }  
55 -  
56 - @Override  
57 - public void deleteSeckillTime(Long id) {  
58 - // 校验存在  
59 - this.validateSeckillTimeExists(id);  
60 - // 删除  
61 - seckillTimeMapper.deleteById(id);  
62 - }  
63 -  
64 - private void validateSeckillTimeExists(Long id) {  
65 - if (seckillTimeMapper.selectById(id) == null) {  
66 - throw exception(SECKILL_TIME_NOT_EXISTS);  
67 - }  
68 - }  
69 -  
70 - /**  
71 - * 校验时间是否存在冲突  
72 - *  
73 - * @param startTime 开始时间  
74 - * @param endTime 结束时间  
75 - */  
76 - private void validateSeckillTimeConflict(Long id, LocalTime startTime, LocalTime endTime) {  
77 - //查询开始时间,结束时间,是否在别人的时间段内  
78 - List<SeckillTimeDO> startTimeList = seckillTimeMapper.selectListByTime(startTime);  
79 - List<SeckillTimeDO> endTimeList = seckillTimeMapper.selectListByTime(endTime);  
80 - //查询自己时间段内是否有时间段  
81 - List<SeckillTimeDO> startEndTimeList = seckillTimeMapper.selectListByTime(startTime, endTime);  
82 - if (id != null) {  
83 - //移除自己  
84 - startTimeList.removeIf(seckillTime -> Objects.equals(seckillTime.getId(), id));  
85 - endTimeList.removeIf(seckillTime -> Objects.equals(seckillTime.getId(), id));  
86 - startEndTimeList.removeIf(seckillTime -> Objects.equals(seckillTime.getId(), id));  
87 - }  
88 - if (CollUtil.isNotEmpty(startTimeList) || CollUtil.isNotEmpty(endTimeList)  
89 - || CollUtil.isNotEmpty(startEndTimeList)) {  
90 - throw exception(SECKILL_TIME_CONFLICTS);  
91 - }  
92 - }  
93 -  
94 - @Override  
95 - public SeckillTimeDO getSeckillTime(Long id) {  
96 - return seckillTimeMapper.selectById(id);  
97 - }  
98 -  
99 - @Override  
100 - public List<SeckillTimeDO> getSeckillTimeList() {  
101 - return seckillTimeMapper.selectList();  
102 - }  
103 -  
104 - @Override  
105 - public void validateSeckillTimeExists(Collection<Long> timeIds) {  
106 - if (CollUtil.isEmpty(timeIds)) {  
107 - throw exception(SECKILL_TIME_NOT_EXISTS);  
108 - }  
109 - if (seckillTimeMapper.selectBatchIds(timeIds).size() != timeIds.size()) {  
110 - throw exception(SECKILL_TIME_NOT_EXISTS);  
111 - }  
112 - }  
113 -  
114 - @Override  
115 - public void sekillActivityCountIncr(Collection<Long> ids) {  
116 - seckillTimeMapper.updateActivityCount(ids, "+", 1);  
117 - }  
118 -  
119 - @Override  
120 - public void sekillActivityCountDecr(Collection<Long> ids) {  
121 - seckillTimeMapper.updateActivityCount(ids, "-", 1);  
122 - }  
123 -  
124 -}  
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/util/PromotionUtils.java
1 package cn.iocoder.yudao.module.promotion.util; 1 package cn.iocoder.yudao.module.promotion.util;
2 2
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
3 import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils; 4 import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
4 -import cn.iocoder.yudao.module.promotion.enums.common.PromotionActivityStatusEnum;  
5 5
6 import java.time.LocalDateTime; 6 import java.time.LocalDateTime;
7 7
@@ -15,18 +15,11 @@ public class PromotionUtils { @@ -15,18 +15,11 @@ public class PromotionUtils {
15 /** 15 /**
16 * 根据时间,计算活动状态 16 * 根据时间,计算活动状态
17 * 17 *
18 - * @param startTime 开始时间  
19 * @param endTime 结束时间 18 * @param endTime 结束时间
20 * @return 活动状态 19 * @return 活动状态
21 */ 20 */
22 - public static Integer calculateActivityStatus(LocalDateTime startTime, LocalDateTime endTime) {  
23 - if (LocalDateTimeUtils.beforeNow(endTime)) {  
24 - return PromotionActivityStatusEnum.END.getStatus();  
25 - }  
26 - if (LocalDateTimeUtils.afterNow(startTime)) {  
27 - return PromotionActivityStatusEnum.WAIT.getStatus();  
28 - }  
29 - return PromotionActivityStatusEnum.RUN.getStatus(); 21 + public static Integer calculateActivityStatus(LocalDateTime endTime) {
  22 + return LocalDateTimeUtils.beforeNow(endTime) ? CommonStatusEnum.DISABLE.getStatus() : CommonStatusEnum.ENABLE.getStatus();
30 } 23 }
31 24
32 } 25 }
yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckillactivity/SeckillActivityServiceImplTest.java
@@ -108,31 +108,31 @@ public class SeckillActivityServiceImplTest extends BaseDbUnitTest { @@ -108,31 +108,31 @@ public class SeckillActivityServiceImplTest extends BaseDbUnitTest {
108 SeckillActivityDO dbSeckillActivity = randomPojo(SeckillActivityDO.class, o -> { // 等会查询到 108 SeckillActivityDO dbSeckillActivity = randomPojo(SeckillActivityDO.class, o -> { // 等会查询到
109 o.setName(null); 109 o.setName(null);
110 o.setStatus(null); 110 o.setStatus(null);
111 - o.setTimeIds(null); 111 + o.setConfigIds(null);
112 o.setCreateTime(null); 112 o.setCreateTime(null);
113 }); 113 });
114 seckillActivityMapper.insert(dbSeckillActivity); 114 seckillActivityMapper.insert(dbSeckillActivity);
115 // 测试 name 不匹配 115 // 测试 name 不匹配
116 - seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setName(null)));  
117 - // 测试 status 不匹配  
118 - seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setStatus(null)));  
119 - // 测试 timeId 不匹配  
120 - seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setTimeIds(null)));  
121 - // 测试 createTime 不匹配  
122 - seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setCreateTime(null)));  
123 - // 准备参数  
124 - SeckillActivityPageReqVO reqVO = new SeckillActivityPageReqVO();  
125 - reqVO.setName(null);  
126 - reqVO.setStatus(null);  
127 - reqVO.setTimeId(null);  
128 - reqVO.setCreateTime((new LocalDateTime[]{}));  
129 -  
130 - // 调用  
131 - PageResult<SeckillActivityDO> pageResult = seckillActivityService.getSeckillActivityPage(reqVO);  
132 - // 断言  
133 - assertEquals(1, pageResult.getTotal());  
134 - assertEquals(1, pageResult.getList().size());  
135 - assertPojoEquals(dbSeckillActivity, pageResult.getList().get(0)); 116 + seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setName(null)));
  117 + // 测试 status 不匹配
  118 + seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setStatus(null)));
  119 + // 测试 timeId 不匹配
  120 + seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setConfigIds(null)));
  121 + // 测试 createTime 不匹配
  122 + seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setCreateTime(null)));
  123 + // 准备参数
  124 + SeckillActivityPageReqVO reqVO = new SeckillActivityPageReqVO();
  125 + reqVO.setName(null);
  126 + reqVO.setStatus(null);
  127 + reqVO.setConfigId(null);
  128 + reqVO.setCreateTime((new LocalDateTime[]{}));
  129 +
  130 + // 调用
  131 + PageResult<SeckillActivityDO> pageResult = seckillActivityService.getSeckillActivityPage(reqVO);
  132 + // 断言
  133 + assertEquals(1, pageResult.getTotal());
  134 + assertEquals(1, pageResult.getList().size());
  135 + assertPojoEquals(dbSeckillActivity, pageResult.getList().get(0));
136 } 136 }
137 137
138 @Test 138 @Test
@@ -142,7 +142,7 @@ public class SeckillActivityServiceImplTest extends BaseDbUnitTest { @@ -142,7 +142,7 @@ public class SeckillActivityServiceImplTest extends BaseDbUnitTest {
142 SeckillActivityDO dbSeckillActivity = randomPojo(SeckillActivityDO.class, o -> { // 等会查询到 142 SeckillActivityDO dbSeckillActivity = randomPojo(SeckillActivityDO.class, o -> { // 等会查询到
143 o.setName(null); 143 o.setName(null);
144 o.setStatus(null); 144 o.setStatus(null);
145 - o.setTimeIds(null); 145 + o.setConfigIds(null);
146 o.setCreateTime(null); 146 o.setCreateTime(null);
147 }); 147 });
148 seckillActivityMapper.insert(dbSeckillActivity); 148 seckillActivityMapper.insert(dbSeckillActivity);
@@ -151,7 +151,7 @@ public class SeckillActivityServiceImplTest extends BaseDbUnitTest { @@ -151,7 +151,7 @@ public class SeckillActivityServiceImplTest extends BaseDbUnitTest {
151 // 测试 status 不匹配 151 // 测试 status 不匹配
152 seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setStatus(null))); 152 seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setStatus(null)));
153 // 测试 timeId 不匹配 153 // 测试 timeId 不匹配
154 - seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setTimeIds(null))); 154 + seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setConfigIds(null)));
155 // 测试 createTime 不匹配 155 // 测试 createTime 不匹配
156 seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setCreateTime(null))); 156 seckillActivityMapper.insert(cloneIgnoreId(dbSeckillActivity, o -> o.setCreateTime(null)));
157 // 准备参数 157 // 准备参数
yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckillconfig/SeckillConfigServiceImplTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.promotion.service.seckillconfig;
  2 +
  3 +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  4 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigCreateReqVO;
  5 +import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.config.SeckillConfigUpdateReqVO;
  6 +import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillconfig.SeckillConfigDO;
  7 +import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckillconfig.SeckillConfigMapper;
  8 +import cn.iocoder.yudao.module.promotion.service.seckill.seckillconfig.SeckillConfigServiceImpl;
  9 +import com.fasterxml.jackson.core.JsonProcessingException;
  10 +import com.fasterxml.jackson.databind.ObjectMapper;
  11 +import org.junit.jupiter.api.Disabled;
  12 +import org.junit.jupiter.api.Test;
  13 +import org.springframework.context.annotation.Import;
  14 +
  15 +import javax.annotation.Resource;
  16 +
  17 +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
  18 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  19 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
  20 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
  21 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
  22 +import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.SECKILL_TIME_NOT_EXISTS;
  23 +import static org.junit.jupiter.api.Assertions.assertNotNull;
  24 +import static org.junit.jupiter.api.Assertions.assertNull;
  25 +
  26 +/**
  27 + * {@link SeckillConfigServiceImpl} 的单元测试类
  28 + *
  29 + * @author 芋道源码
  30 + */
  31 +@Import(SeckillConfigServiceImpl.class)
  32 +@Disabled // TODO 芋艿:未来开启
  33 +public class SeckillConfigServiceImplTest extends BaseDbUnitTest {
  34 +
  35 + @Resource
  36 + private SeckillConfigServiceImpl SeckillConfigService;
  37 +
  38 + @Resource
  39 + private SeckillConfigMapper seckillConfigMapper;
  40 +
  41 + @Resource
  42 + private ObjectMapper objectMapper;
  43 +
  44 + @Test
  45 + public void testJacksonSerializ() {
  46 +
  47 + // 准备参数
  48 + SeckillConfigCreateReqVO reqVO = randomPojo(SeckillConfigCreateReqVO.class);
  49 +// ObjectMapper objectMapper = new ObjectMapper();
  50 + try {
  51 + String string = objectMapper.writeValueAsString(reqVO);
  52 + System.out.println(string);
  53 + } catch (JsonProcessingException e) {
  54 + e.printStackTrace();
  55 + }
  56 +
  57 +
  58 + }
  59 +
  60 + @Test
  61 + public void testCreateSeckillConfig_success() {
  62 + // 准备参数
  63 + SeckillConfigCreateReqVO reqVO = randomPojo(SeckillConfigCreateReqVO.class);
  64 +
  65 + // 调用
  66 + Long SeckillConfigId = SeckillConfigService.createSeckillConfig(reqVO);
  67 + // 断言
  68 + assertNotNull(SeckillConfigId);
  69 + // 校验记录的属性是否正确
  70 + SeckillConfigDO SeckillConfig = seckillConfigMapper.selectById(SeckillConfigId);
  71 + assertPojoEquals(reqVO, SeckillConfig);
  72 + }
  73 +
  74 + @Test
  75 + public void testUpdateSeckillConfig_success() {
  76 + // mock 数据
  77 + SeckillConfigDO dbSeckillConfig = randomPojo(SeckillConfigDO.class);
  78 + seckillConfigMapper.insert(dbSeckillConfig);// @Sql: 先插入出一条存在的数据
  79 + // 准备参数
  80 + SeckillConfigUpdateReqVO reqVO = randomPojo(SeckillConfigUpdateReqVO.class, o -> {
  81 + o.setId(dbSeckillConfig.getId()); // 设置更新的 ID
  82 + });
  83 +
  84 + // 调用
  85 + SeckillConfigService.updateSeckillConfig(reqVO);
  86 + // 校验是否更新正确
  87 + SeckillConfigDO SeckillConfig = seckillConfigMapper.selectById(reqVO.getId()); // 获取最新的
  88 + assertPojoEquals(reqVO, SeckillConfig);
  89 + }
  90 +
  91 + @Test
  92 + public void testUpdateSeckillConfig_notExists() {
  93 + // 准备参数
  94 + SeckillConfigUpdateReqVO reqVO = randomPojo(SeckillConfigUpdateReqVO.class);
  95 +
  96 + // 调用, 并断言异常
  97 + assertServiceException(() -> SeckillConfigService.updateSeckillConfig(reqVO), SECKILL_TIME_NOT_EXISTS);
  98 + }
  99 +
  100 + @Test
  101 + public void testDeleteSeckillConfig_success() {
  102 + // mock 数据
  103 + SeckillConfigDO dbSeckillConfig = randomPojo(SeckillConfigDO.class);
  104 + seckillConfigMapper.insert(dbSeckillConfig);// @Sql: 先插入出一条存在的数据
  105 + // 准备参数
  106 + Long id = dbSeckillConfig.getId();
  107 +
  108 + // 调用
  109 + SeckillConfigService.deleteSeckillConfig(id);
  110 + // 校验数据不存在了
  111 + assertNull(seckillConfigMapper.selectById(id));
  112 + }
  113 +
  114 + @Test
  115 + public void testDeleteSeckillConfig_notExists() {
  116 + // 准备参数
  117 + Long id = randomLongId();
  118 +
  119 + // 调用, 并断言异常
  120 + assertServiceException(() -> SeckillConfigService.deleteSeckillConfig(id), SECKILL_TIME_NOT_EXISTS);
  121 + }
  122 +
  123 + @Test
  124 + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
  125 + public void testGetSeckillConfigPage() {
  126 + // mock 数据
  127 +// SeckillConfigDO dbSeckillConfig = randomPojo(SeckillConfigDO.class, o -> { // 等会查询到
  128 +// o.setName(null);
  129 +// o.setStartTime(null);
  130 +// o.setEndTime(null);
  131 +// o.setCreateTime(null);
  132 +// });
  133 +// seckillConfigMapper.insert(dbSeckillConfig);
  134 +// // 测试 name 不匹配
  135 +// seckillConfigMapper.insert(cloneIgnoreId(dbSeckillConfig, o -> o.setName(null)));
  136 +// // 测试 startTime 不匹配
  137 +// seckillConfigMapper.insert(cloneIgnoreId(dbSeckillConfig, o -> o.setStartTime(null)));
  138 +// // 测试 endTime 不匹配
  139 +// seckillConfigMapper.insert(cloneIgnoreId(dbSeckillConfig, o -> o.setEndTime(null)));
  140 +// // 测试 createTime 不匹配
  141 +// seckillConfigMapper.insert(cloneIgnoreId(dbSeckillConfig, o -> o.setCreateTime(null)));
  142 +// // 准备参数
  143 +// SeckillConfigPageReqVO reqVO = new SeckillConfigPageReqVO();
  144 +// reqVO.setName(null);
  145 +//// reqVO.setStartTime((new LocalTime()));
  146 +//// reqVO.setEndTime((new LocalTime[]{}));
  147 +//// reqVO.setCreateTime((new Date[]{}));
  148 +//
  149 +// // 调用
  150 +// PageResult<SeckillConfigDO> pageResult = SeckillConfigService.getSeckillConfigPage(reqVO);
  151 +// // 断言
  152 +// assertEquals(1, pageResult.getTotal());
  153 +// assertEquals(1, pageResult.getList().size());
  154 +// assertPojoEquals(dbSeckillConfig, pageResult.getList().get(0));
  155 + }
  156 +
  157 + @Test
  158 + @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解
  159 + public void testGetSeckillConfigList() {
  160 + // mock 数据
  161 + SeckillConfigDO dbSeckillConfig = randomPojo(SeckillConfigDO.class, o -> { // 等会查询到
  162 + o.setName(null);
  163 + o.setStartTime(null);
  164 + o.setEndTime(null);
  165 + o.setCreateTime(null);
  166 + });
  167 + seckillConfigMapper.insert(dbSeckillConfig);
  168 + // 测试 name 不匹配
  169 + seckillConfigMapper.insert(cloneIgnoreId(dbSeckillConfig, o -> o.setName(null)));
  170 + // 测试 startTime 不匹配
  171 + seckillConfigMapper.insert(cloneIgnoreId(dbSeckillConfig, o -> o.setStartTime(null)));
  172 + // 测试 endTime 不匹配
  173 + seckillConfigMapper.insert(cloneIgnoreId(dbSeckillConfig, o -> o.setEndTime(null)));
  174 + // 测试 createTime 不匹配
  175 + seckillConfigMapper.insert(cloneIgnoreId(dbSeckillConfig, o -> o.setCreateTime(null)));
  176 + // 准备参数
  177 +// SeckillConfigExportReqVO reqVO = new SeckillConfigExportReqVO();
  178 +// reqVO.setName(null);
  179 +// reqVO.setStartTime((new LocalTime[]{}));
  180 +// reqVO.setEndTime((new LocalTime[]{}));
  181 +// reqVO.setCreateTime((new Date[]{}));
  182 +//
  183 +// // 调用
  184 +// List<SeckillConfigDO> list = SeckillConfigService.getSeckillConfigList(reqVO);
  185 +// // 断言
  186 +// assertEquals(1, list.size());
  187 +// assertPojoEquals(dbSeckillConfig, list.get(0));
  188 + }
  189 +
  190 +}
yudao-module-mall/yudao-module-promotion-biz/src/test/java/cn/iocoder/yudao/module/promotion/service/seckilltime/SeckillTimeServiceImplTest.java deleted
1 -package cn.iocoder.yudao.module.promotion.service.seckilltime;  
2 -  
3 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeCreateReqVO;  
4 -import cn.iocoder.yudao.module.promotion.controller.admin.seckill.vo.time.SeckillTimeUpdateReqVO;  
5 -import cn.iocoder.yudao.module.promotion.service.seckill.seckilltime.SeckillTimeServiceImpl;  
6 -import com.fasterxml.jackson.core.JsonProcessingException;  
7 -import com.fasterxml.jackson.databind.ObjectMapper;  
8 -import org.junit.jupiter.api.Disabled;  
9 -import org.junit.jupiter.api.Test;  
10 -  
11 -import javax.annotation.Resource;  
12 -  
13 -import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;  
14 -  
15 -import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckilltime.SeckillTimeDO;  
16 -import cn.iocoder.yudao.module.promotion.dal.mysql.seckill.seckilltime.SeckillTimeMapper;  
17 -  
18 -import org.springframework.context.annotation.Import;  
19 -  
20 -import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;  
21 -import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.*;  
22 -import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.*;  
23 -import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.*;  
24 -import static org.junit.jupiter.api.Assertions.*;  
25 -  
26 -/**  
27 -* {@link SeckillTimeServiceImpl} 的单元测试类  
28 -*  
29 -* @author 芋道源码  
30 -*/  
31 -@Import(SeckillTimeServiceImpl.class)  
32 -@Disabled // TODO 芋艿:未来开启  
33 -public class SeckillTimeServiceImplTest extends BaseDbUnitTest {  
34 -  
35 - @Resource  
36 - private SeckillTimeServiceImpl seckillTimeService;  
37 -  
38 - @Resource  
39 - private SeckillTimeMapper seckillTimeMapper;  
40 -  
41 - @Resource  
42 - private ObjectMapper objectMapper;  
43 -  
44 - @Test  
45 - public void testJacksonSerializ(){  
46 -  
47 - // 准备参数  
48 - SeckillTimeCreateReqVO reqVO = randomPojo(SeckillTimeCreateReqVO.class);  
49 -// ObjectMapper objectMapper = new ObjectMapper();  
50 - try {  
51 - String string = objectMapper.writeValueAsString(reqVO);  
52 - System.out.println(string);  
53 - } catch (JsonProcessingException e) {  
54 - e.printStackTrace();  
55 - }  
56 -  
57 -  
58 - }  
59 -  
60 - @Test  
61 - public void testCreateSeckillTime_success() {  
62 - // 准备参数  
63 - SeckillTimeCreateReqVO reqVO = randomPojo(SeckillTimeCreateReqVO.class);  
64 -  
65 - // 调用  
66 - Long seckillTimeId = seckillTimeService.createSeckillTime(reqVO);  
67 - // 断言  
68 - assertNotNull(seckillTimeId);  
69 - // 校验记录的属性是否正确  
70 - SeckillTimeDO seckillTime = seckillTimeMapper.selectById(seckillTimeId);  
71 - assertPojoEquals(reqVO, seckillTime);  
72 - }  
73 -  
74 - @Test  
75 - public void testUpdateSeckillTime_success() {  
76 - // mock 数据  
77 - SeckillTimeDO dbSeckillTime = randomPojo(SeckillTimeDO.class);  
78 - seckillTimeMapper.insert(dbSeckillTime);// @Sql: 先插入出一条存在的数据  
79 - // 准备参数  
80 - SeckillTimeUpdateReqVO reqVO = randomPojo(SeckillTimeUpdateReqVO.class, o -> {  
81 - o.setId(dbSeckillTime.getId()); // 设置更新的 ID  
82 - });  
83 -  
84 - // 调用  
85 - seckillTimeService.updateSeckillTime(reqVO);  
86 - // 校验是否更新正确  
87 - SeckillTimeDO seckillTime = seckillTimeMapper.selectById(reqVO.getId()); // 获取最新的  
88 - assertPojoEquals(reqVO, seckillTime);  
89 - }  
90 -  
91 - @Test  
92 - public void testUpdateSeckillTime_notExists() {  
93 - // 准备参数  
94 - SeckillTimeUpdateReqVO reqVO = randomPojo(SeckillTimeUpdateReqVO.class);  
95 -  
96 - // 调用, 并断言异常  
97 - assertServiceException(() -> seckillTimeService.updateSeckillTime(reqVO), SECKILL_TIME_NOT_EXISTS);  
98 - }  
99 -  
100 - @Test  
101 - public void testDeleteSeckillTime_success() {  
102 - // mock 数据  
103 - SeckillTimeDO dbSeckillTime = randomPojo(SeckillTimeDO.class);  
104 - seckillTimeMapper.insert(dbSeckillTime);// @Sql: 先插入出一条存在的数据  
105 - // 准备参数  
106 - Long id = dbSeckillTime.getId();  
107 -  
108 - // 调用  
109 - seckillTimeService.deleteSeckillTime(id);  
110 - // 校验数据不存在了  
111 - assertNull(seckillTimeMapper.selectById(id));  
112 - }  
113 -  
114 - @Test  
115 - public void testDeleteSeckillTime_notExists() {  
116 - // 准备参数  
117 - Long id = randomLongId();  
118 -  
119 - // 调用, 并断言异常  
120 - assertServiceException(() -> seckillTimeService.deleteSeckillTime(id), SECKILL_TIME_NOT_EXISTS);  
121 - }  
122 -  
123 - @Test  
124 - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解  
125 - public void testGetSeckillTimePage() {  
126 - // mock 数据  
127 -// SeckillTimeDO dbSeckillTime = randomPojo(SeckillTimeDO.class, o -> { // 等会查询到  
128 -// o.setName(null);  
129 -// o.setStartTime(null);  
130 -// o.setEndTime(null);  
131 -// o.setCreateTime(null);  
132 -// });  
133 -// seckillTimeMapper.insert(dbSeckillTime);  
134 -// // 测试 name 不匹配  
135 -// seckillTimeMapper.insert(cloneIgnoreId(dbSeckillTime, o -> o.setName(null)));  
136 -// // 测试 startTime 不匹配  
137 -// seckillTimeMapper.insert(cloneIgnoreId(dbSeckillTime, o -> o.setStartTime(null)));  
138 -// // 测试 endTime 不匹配  
139 -// seckillTimeMapper.insert(cloneIgnoreId(dbSeckillTime, o -> o.setEndTime(null)));  
140 -// // 测试 createTime 不匹配  
141 -// seckillTimeMapper.insert(cloneIgnoreId(dbSeckillTime, o -> o.setCreateTime(null)));  
142 -// // 准备参数  
143 -// SeckillTimePageReqVO reqVO = new SeckillTimePageReqVO();  
144 -// reqVO.setName(null);  
145 -//// reqVO.setStartTime((new LocalTime()));  
146 -//// reqVO.setEndTime((new LocalTime[]{}));  
147 -//// reqVO.setCreateTime((new Date[]{}));  
148 -//  
149 -// // 调用  
150 -// PageResult<SeckillTimeDO> pageResult = seckillTimeService.getSeckillTimePage(reqVO);  
151 -// // 断言  
152 -// assertEquals(1, pageResult.getTotal());  
153 -// assertEquals(1, pageResult.getList().size());  
154 -// assertPojoEquals(dbSeckillTime, pageResult.getList().get(0));  
155 - }  
156 -  
157 - @Test  
158 - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解  
159 - public void testGetSeckillTimeList() {  
160 - // mock 数据  
161 - SeckillTimeDO dbSeckillTime = randomPojo(SeckillTimeDO.class, o -> { // 等会查询到  
162 - o.setName(null);  
163 - o.setStartTime(null);  
164 - o.setEndTime(null);  
165 - o.setCreateTime(null);  
166 - });  
167 - seckillTimeMapper.insert(dbSeckillTime);  
168 - // 测试 name 不匹配  
169 - seckillTimeMapper.insert(cloneIgnoreId(dbSeckillTime, o -> o.setName(null)));  
170 - // 测试 startTime 不匹配  
171 - seckillTimeMapper.insert(cloneIgnoreId(dbSeckillTime, o -> o.setStartTime(null)));  
172 - // 测试 endTime 不匹配  
173 - seckillTimeMapper.insert(cloneIgnoreId(dbSeckillTime, o -> o.setEndTime(null)));  
174 - // 测试 createTime 不匹配  
175 - seckillTimeMapper.insert(cloneIgnoreId(dbSeckillTime, o -> o.setCreateTime(null)));  
176 - // 准备参数  
177 -// SeckillTimeExportReqVO reqVO = new SeckillTimeExportReqVO();  
178 -// reqVO.setName(null);  
179 -// reqVO.setStartTime((new LocalTime[]{}));  
180 -// reqVO.setEndTime((new LocalTime[]{}));  
181 -// reqVO.setCreateTime((new Date[]{}));  
182 -//  
183 -// // 调用  
184 -// List<SeckillTimeDO> list = seckillTimeService.getSeckillTimeList(reqVO);  
185 -// // 断言  
186 -// assertEquals(1, list.size());  
187 -// assertPojoEquals(dbSeckillTime, list.get(0));  
188 - }  
189 -  
190 -}  
yudao-module-mall/yudao-module-promotion-biz/src/test/resources/sql/clean.sql
@@ -4,3 +4,4 @@ DELETE FROM &quot;promotion_coupon&quot;; @@ -4,3 +4,4 @@ DELETE FROM &quot;promotion_coupon&quot;;
4 DELETE FROM "promotion_reward_activity"; 4 DELETE FROM "promotion_reward_activity";
5 DELETE FROM "promotion_discount_activity"; 5 DELETE FROM "promotion_discount_activity";
6 DELETE FROM "promotion_discount_product"; 6 DELETE FROM "promotion_discount_product";
  7 +DELETE FROM "promotion_seckill_config";
yudao-module-mall/yudao-module-promotion-biz/src/test/resources/sql/create_tables.sql
@@ -107,18 +107,45 @@ CREATE TABLE IF NOT EXISTS &quot;promotion_discount_activity&quot; ( @@ -107,18 +107,45 @@ CREATE TABLE IF NOT EXISTS &quot;promotion_discount_activity&quot; (
107 PRIMARY KEY ("id") 107 PRIMARY KEY ("id")
108 ) COMMENT '限时折扣活动'; 108 ) COMMENT '限时折扣活动';
109 109
110 -CREATE TABLE IF NOT EXISTS "promotion_discount_product" (  
111 - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,  
112 - "activity_id" bigint NOT NULL,  
113 - "spu_id" bigint NOT NULL,  
114 - "sku_id" bigint NOT NULL,  
115 - "discount_type" int NOT NULL,  
116 - "discount_percent" int,  
117 - "discount_price" int,  
118 - "creator" varchar DEFAULT '',  
119 - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,  
120 - "updater" varchar DEFAULT '',  
121 - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  
122 - "deleted" bit NOT NULL DEFAULT FALSE,  
123 - PRIMARY KEY ("id")  
124 -) COMMENT '限时折扣活动'; 110 +-- 将该建表 SQL 语句,添加到 yudao-module-promotion-biz 模块的 test/resources/sql/create_tables.sql 文件里
  111 +CREATE TABLE IF NOT EXISTS "promotion_seckill_activity" (
  112 + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  113 + "spu_id" bigint NOT NULL,
  114 + "name" varchar NOT NULL,
  115 + "status" int NOT NULL,
  116 + "remark" varchar,
  117 + "start_time" varchar NOT NULL,
  118 + "end_time" varchar NOT NULL,
  119 + "sort" int NOT NULL,
  120 + "config_ids" varchar NOT NULL,
  121 + "order_count" int NOT NULL,
  122 + "user_count" int NOT NULL,
  123 + "total_price" int NOT NULL,
  124 + "total_limit_count" int,
  125 + "single_limit_count" int,
  126 + "stock" int,
  127 + "total_stock" int,
  128 + "creator" varchar DEFAULT '',
  129 + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  130 + "updater" varchar DEFAULT '',
  131 + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  132 + "deleted" bit NOT NULL DEFAULT FALSE,
  133 + "tenant_id" bigint NOT NULL,
  134 + PRIMARY KEY ("id")
  135 +) COMMENT '秒杀活动';
  136 +
  137 +CREATE TABLE IF NOT EXISTS "promotion_seckill_config" (
  138 + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  139 + "name" varchar NOT NULL,
  140 + "start_time" varchar NOT NULL,
  141 + "end_time" varchar NOT NULL,
  142 + "pic_url" varchar NOT NULL,
  143 + "status" int NOT NULL,
  144 + "creator" varchar DEFAULT '',
  145 + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  146 + "updater" varchar DEFAULT '',
  147 + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  148 + "deleted" bit NOT NULL DEFAULT FALSE,
  149 + "tenant_id" bigint NOT NULL,
  150 + PRIMARY KEY ("id")
  151 +) COMMENT '秒杀时段配置';
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressBaseVO.java
@@ -12,22 +12,22 @@ import javax.validation.constraints.NotNull; @@ -12,22 +12,22 @@ import javax.validation.constraints.NotNull;
12 @Data 12 @Data
13 public class DeliveryExpressBaseVO { 13 public class DeliveryExpressBaseVO {
14 14
15 - @Schema(description = "快递公司编码", required = true) 15 + @Schema(description = "快递公司编码", requiredMode = Schema.RequiredMode.REQUIRED)
16 @NotNull(message = "快递公司编码不能为空") 16 @NotNull(message = "快递公司编码不能为空")
17 private String code; 17 private String code;
18 18
19 - @Schema(description = "快递公司名称", required = true, example = "李四") 19 + @Schema(description = "快递公司名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
20 @NotNull(message = "快递公司名称不能为空") 20 @NotNull(message = "快递公司名称不能为空")
21 private String name; 21 private String name;
22 22
23 @Schema(description = "快递公司logo") 23 @Schema(description = "快递公司logo")
24 private String logo; 24 private String logo;
25 25
26 - @Schema(description = "排序", required = true) 26 + @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED)
27 @NotNull(message = "排序不能为空") 27 @NotNull(message = "排序不能为空")
28 private Integer sort; 28 private Integer sort;
29 29
30 - @Schema(description = "状态", required = true, example = "1") 30 + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
31 @NotNull(message = "状态不能为空") 31 @NotNull(message = "状态不能为空")
32 private Integer status; 32 private Integer status;
33 33
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressRespVO.java
1 package cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.express; 1 package cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.express;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 -import lombok.*; 4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
5 import java.time.LocalDateTime; 8 import java.time.LocalDateTime;
6 9
7 @Schema(description = "管理后台 - 快递公司 Response VO") 10 @Schema(description = "管理后台 - 快递公司 Response VO")
@@ -10,10 +13,10 @@ import java.time.LocalDateTime; @@ -10,10 +13,10 @@ import java.time.LocalDateTime;
10 @ToString(callSuper = true) 13 @ToString(callSuper = true)
11 public class DeliveryExpressRespVO extends DeliveryExpressBaseVO { 14 public class DeliveryExpressRespVO extends DeliveryExpressBaseVO {
12 15
13 - @Schema(description = "编号", required = true, example = "6592") 16 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6592")
14 private Long id; 17 private Long id;
15 18
16 - @Schema(description = "创建时间", required = true) 19 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
17 private LocalDateTime createTime; 20 private LocalDateTime createTime;
18 21
19 } 22 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/express/DeliveryExpressUpdateReqVO.java
@@ -13,7 +13,7 @@ import javax.validation.constraints.NotNull; @@ -13,7 +13,7 @@ import javax.validation.constraints.NotNull;
13 @ToString(callSuper = true) 13 @ToString(callSuper = true)
14 public class DeliveryExpressUpdateReqVO extends DeliveryExpressBaseVO { 14 public class DeliveryExpressUpdateReqVO extends DeliveryExpressBaseVO {
15 15
16 - @Schema(description = "编号", required = true, example = "6592") 16 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6592")
17 @NotNull(message = "编号不能为空") 17 @NotNull(message = "编号不能为空")
18 private Long id; 18 private Long id;
19 19
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateBaseVO.java
@@ -12,15 +12,15 @@ import javax.validation.constraints.NotNull; @@ -12,15 +12,15 @@ import javax.validation.constraints.NotNull;
12 @Data 12 @Data
13 public class DeliveryExpressTemplateBaseVO { 13 public class DeliveryExpressTemplateBaseVO {
14 14
15 - @Schema(description = "模板名称", required = true, example = "王五") 15 + @Schema(description = "模板名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
16 @NotNull(message = "模板名称不能为空") 16 @NotNull(message = "模板名称不能为空")
17 private String name; 17 private String name;
18 18
19 - @Schema(description = "配送计费方式 1:按件 2:按重量 3:按体积", required = true) 19 + @Schema(description = "配送计费方式 1:按件 2:按重量 3:按体积", requiredMode = Schema.RequiredMode.REQUIRED)
20 @NotNull(message = "配送计费方式 1:按件 2:按重量 3:按体积不能为空") 20 @NotNull(message = "配送计费方式 1:按件 2:按重量 3:按体积不能为空")
21 private Integer chargeMode; 21 private Integer chargeMode;
22 22
23 - @Schema(description = "排序", required = true) 23 + @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED)
24 @NotNull(message = "排序不能为空") 24 @NotNull(message = "排序不能为空")
25 private Integer sort; 25 private Integer sort;
26 26
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateRespVO.java
1 package cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.expresstemplate; 1 package cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.expresstemplate;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 -import lombok.*; 4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
5 import java.time.LocalDateTime; 8 import java.time.LocalDateTime;
6 9
7 @Schema(description = "管理后台 - 快递运费模板 Response VO") 10 @Schema(description = "管理后台 - 快递运费模板 Response VO")
@@ -10,10 +13,10 @@ import java.time.LocalDateTime; @@ -10,10 +13,10 @@ import java.time.LocalDateTime;
10 @ToString(callSuper = true) 13 @ToString(callSuper = true)
11 public class DeliveryExpressTemplateRespVO extends DeliveryExpressTemplateBaseVO { 14 public class DeliveryExpressTemplateRespVO extends DeliveryExpressTemplateBaseVO {
12 15
13 - @Schema(description = "编号,自增", required = true, example = "371") 16 + @Schema(description = "编号,自增", requiredMode = Schema.RequiredMode.REQUIRED, example = "371")
14 private Long id; 17 private Long id;
15 18
16 - @Schema(description = "创建时间", required = true) 19 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
17 private LocalDateTime createTime; 20 private LocalDateTime createTime;
18 21
19 } 22 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateSimpleRespVO.java
@@ -12,10 +12,10 @@ import lombok.NoArgsConstructor; @@ -12,10 +12,10 @@ import lombok.NoArgsConstructor;
12 @AllArgsConstructor 12 @AllArgsConstructor
13 public class DeliveryExpressTemplateSimpleRespVO { 13 public class DeliveryExpressTemplateSimpleRespVO {
14 14
15 - @Schema(description = "模版编号", required = true, example = "1024") 15 + @Schema(description = "模版编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
16 private Long id; 16 private Long id;
17 17
18 - @Schema(description = "模板名称", required = true, example = "测试模版") 18 + @Schema(description = "模板名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "测试模版")
19 private String name; 19 private String name;
20 20
21 } 21 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/expresstemplate/DeliveryExpressTemplateUpdateReqVO.java
@@ -15,7 +15,7 @@ import java.util.List; @@ -15,7 +15,7 @@ import java.util.List;
15 @ToString(callSuper = true) 15 @ToString(callSuper = true)
16 public class DeliveryExpressTemplateUpdateReqVO extends DeliveryExpressTemplateBaseVO { 16 public class DeliveryExpressTemplateUpdateReqVO extends DeliveryExpressTemplateBaseVO {
17 17
18 - @Schema(description = "编号", required = true, example = "371") 18 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "371")
19 @NotNull(message = "编号不能为空") 19 @NotNull(message = "编号不能为空")
20 private Long id; 20 private Long id;
21 21
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreBaseVO.java
@@ -18,49 +18,49 @@ import java.time.LocalTime; @@ -18,49 +18,49 @@ import java.time.LocalTime;
18 @Data 18 @Data
19 public class DeliveryPickUpStoreBaseVO { 19 public class DeliveryPickUpStoreBaseVO {
20 20
21 - @Schema(description = "门店名称", required = true, example = "李四") 21 + @Schema(description = "门店名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
22 @NotBlank(message = "门店名称不能为空") 22 @NotBlank(message = "门店名称不能为空")
23 private String name; 23 private String name;
24 24
25 @Schema(description = "门店简介", example = "我是门店简介") 25 @Schema(description = "门店简介", example = "我是门店简介")
26 private String introduction; 26 private String introduction;
27 27
28 - @Schema(description = "门店手机", required = true, example = "15601892312") 28 + @Schema(description = "门店手机", requiredMode = Schema.RequiredMode.REQUIRED, example = "15601892312")
29 @NotBlank(message = "门店手机不能为空") 29 @NotBlank(message = "门店手机不能为空")
30 @Mobile 30 @Mobile
31 private String phone; 31 private String phone;
32 32
33 - @Schema(description = "区域编号", required = true, example = "18733") 33 + @Schema(description = "区域编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "18733")
34 @NotNull(message = "区域编号不能为空") 34 @NotNull(message = "区域编号不能为空")
35 private Integer areaId; 35 private Integer areaId;
36 36
37 - @Schema(description = "门店详细地址", required = true, example = "复旦大学路 188 号") 37 + @Schema(description = "门店详细地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "复旦大学路 188 号")
38 @NotBlank(message = "门店详细地址不能为空") 38 @NotBlank(message = "门店详细地址不能为空")
39 private String detailAddress; 39 private String detailAddress;
40 40
41 - @Schema(description = "门店 logo", required = true, example = "https://www.iocoder.cn/1.png") 41 + @Schema(description = "门店 logo", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/1.png")
42 @NotBlank(message = "门店 logo 不能为空") 42 @NotBlank(message = "门店 logo 不能为空")
43 private String logo; 43 private String logo;
44 44
45 - @Schema(description = "营业开始时间", required = true) 45 + @Schema(description = "营业开始时间", requiredMode = Schema.RequiredMode.REQUIRED)
46 @NotNull(message = "营业开始时间不能为空") 46 @NotNull(message = "营业开始时间不能为空")
47 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm") 47 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm")
48 private LocalTime openingTime; 48 private LocalTime openingTime;
49 49
50 - @Schema(description = "营业结束时间", required = true) 50 + @Schema(description = "营业结束时间", requiredMode = Schema.RequiredMode.REQUIRED)
51 @NotNull(message = "营业结束时间不能为空") 51 @NotNull(message = "营业结束时间不能为空")
52 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm") 52 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm")
53 private LocalTime closingTime; 53 private LocalTime closingTime;
54 54
55 - @Schema(description = "纬度", required = true, example = "5.88") 55 + @Schema(description = "纬度", requiredMode = Schema.RequiredMode.REQUIRED, example = "5.88")
56 @NotNull(message = "纬度不能为空") 56 @NotNull(message = "纬度不能为空")
57 private Double latitude; 57 private Double latitude;
58 58
59 - @Schema(description = "经度", required = true, example = "6.99") 59 + @Schema(description = "经度", requiredMode = Schema.RequiredMode.REQUIRED, example = "6.99")
60 @NotNull(message = "经度不能为空") 60 @NotNull(message = "经度不能为空")
61 private Double longitude; 61 private Double longitude;
62 62
63 - @Schema(description = "门店状态", required = true, example = "1") 63 + @Schema(description = "门店状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
64 @NotNull(message = "门店状态不能为空") 64 @NotNull(message = "门店状态不能为空")
65 @InEnum(CommonStatusEnum.class) 65 @InEnum(CommonStatusEnum.class)
66 private Integer status; 66 private Integer status;
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreRespVO.java
1 package cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.pickup; 1 package cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.pickup;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 -import lombok.*; 4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
5 import java.time.LocalDateTime; 8 import java.time.LocalDateTime;
6 9
7 @Schema(description = "管理后台 - 自提门店 Response VO") 10 @Schema(description = "管理后台 - 自提门店 Response VO")
@@ -10,10 +13,10 @@ import java.time.LocalDateTime; @@ -10,10 +13,10 @@ import java.time.LocalDateTime;
10 @ToString(callSuper = true) 13 @ToString(callSuper = true)
11 public class DeliveryPickUpStoreRespVO extends DeliveryPickUpStoreBaseVO { 14 public class DeliveryPickUpStoreRespVO extends DeliveryPickUpStoreBaseVO {
12 15
13 - @Schema(description = "编号", required = true, example = "23128") 16 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23128")
14 private Long id; 17 private Long id;
15 18
16 - @Schema(description = "创建时间", required = true) 19 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
17 private LocalDateTime createTime; 20 private LocalDateTime createTime;
18 21
19 } 22 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/admin/delivery/vo/pickup/DeliveryPickUpStoreUpdateReqVO.java
1 package cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.pickup; 1 package cn.iocoder.yudao.module.trade.controller.admin.delivery.vo.pickup;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 -import lombok.*;  
5 -import java.util.*;  
6 -import javax.validation.constraints.*; 4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +import javax.validation.constraints.NotNull;
7 9
8 @Schema(description = "管理后台 - 自提门店更新 Request VO") 10 @Schema(description = "管理后台 - 自提门店更新 Request VO")
9 @Data 11 @Data
@@ -11,7 +13,7 @@ import javax.validation.constraints.*; @@ -11,7 +13,7 @@ import javax.validation.constraints.*;
11 @ToString(callSuper = true) 13 @ToString(callSuper = true)
12 public class DeliveryPickUpStoreUpdateReqVO extends DeliveryPickUpStoreBaseVO { 14 public class DeliveryPickUpStoreUpdateReqVO extends DeliveryPickUpStoreBaseVO {
13 15
14 - @Schema(description = "编号", required = true, example = "23128") 16 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23128")
15 @NotNull(message = "编号不能为空") 17 @NotNull(message = "编号不能为空")
16 private Long id; 18 private Long id;
17 19
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/AppTradeAfterSaleCreateReqVO.java
@@ -36,7 +36,7 @@ public class AppTradeAfterSaleCreateReqVO { @@ -36,7 +36,7 @@ public class AppTradeAfterSaleCreateReqVO {
36 /** 36 /**
37 * @see AfterSaleStatusEnum 37 * @see AfterSaleStatusEnum
38 */ 38 */
39 - @Schema(description = "操作类型", required = true, example = "1") 39 + @Schema(description = "操作类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
40 @NotNull(message = "操作类型不能为空") 40 @NotNull(message = "操作类型不能为空")
41 private String operateType; 41 private String operateType;
42 42
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/aftersale/vo/AppTradeAfterSalePageItemRespVO.java
@@ -11,48 +11,48 @@ import java.util.List; @@ -11,48 +11,48 @@ import java.util.List;
11 @Data 11 @Data
12 public class AppTradeAfterSalePageItemRespVO { 12 public class AppTradeAfterSalePageItemRespVO {
13 13
14 - @Schema(description = "售后编号", required = true, example = "1024") 14 + @Schema(description = "售后编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
15 private Long id; 15 private Long id;
16 16
17 - @Schema(description = "售后流水号", required = true, example = "1146347329394184195") 17 + @Schema(description = "售后流水号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1146347329394184195")
18 private String no; 18 private String no;
19 19
20 - @Schema(description = "售后状态", required = true, example = "1") 20 + @Schema(description = "售后状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
21 private Integer status; 21 private Integer status;
22 22
23 - @Schema(description = "售后方式", required = true, example = "1") 23 + @Schema(description = "售后方式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
24 private Integer way; 24 private Integer way;
25 25
26 - @Schema(description = "售后类型", required = true, example = "1") 26 + @Schema(description = "售后类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
27 private Integer type; 27 private Integer type;
28 28
29 - @Schema(description = "申请原因", required = true, example = "1") 29 + @Schema(description = "申请原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
30 private String applyReason; 30 private String applyReason;
31 31
32 - @Schema(description = "补充描述", required = true, example = "1") 32 + @Schema(description = "补充描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
33 private String applyDescription; 33 private String applyDescription;
34 34
35 - @Schema(description = "补充凭证图片", required = true, example = "1") 35 + @Schema(description = "补充凭证图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
36 private List<String> applyPicUrls; 36 private List<String> applyPicUrls;
37 37
38 // ========== 交易订单相关 ========== 38 // ========== 交易订单相关 ==========
39 39
40 - @Schema(description = "交易订单编号", required = true, example = "1") 40 + @Schema(description = "交易订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
41 private Long orderId; 41 private Long orderId;
42 42
43 - @Schema(description = "交易订单流水号", required = true, example = "1") 43 + @Schema(description = "交易订单流水号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
44 private String orderNo; 44 private String orderNo;
45 45
46 - @Schema(description = "交易订单项编号", required = true, example = "1") 46 + @Schema(description = "交易订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
47 private Long orderItemId; 47 private Long orderItemId;
48 48
49 - @Schema(description = "商品 SPU 编号", required = true, example = "1") 49 + @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
50 private Long spuId; 50 private Long spuId;
51 51
52 - @Schema(description = "商品 SPU 名称", required = true, example = "1") 52 + @Schema(description = "商品 SPU 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
53 private String spuName; 53 private String spuName;
54 54
55 - @Schema(description = "商品 SKU 编号", required = true, example = "1") 55 + @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
56 private Long skuId; 56 private Long skuId;
57 57
58 /** 58 /**
@@ -60,10 +60,10 @@ public class AppTradeAfterSalePageItemRespVO { @@ -60,10 +60,10 @@ public class AppTradeAfterSalePageItemRespVO {
60 */ 60 */
61 private List<AppProductPropertyValueDetailRespVO> properties; 61 private List<AppProductPropertyValueDetailRespVO> properties;
62 62
63 - @Schema(description = "商品图片", required = true, example = "https://www.iocoder.cn/01.jpg") 63 + @Schema(description = "商品图片", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/01.jpg")
64 private String picUrl; 64 private String picUrl;
65 65
66 - @Schema(description = "退货商品数量", required = true, example = "1") 66 + @Schema(description = "退货商品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
67 private Integer count; 67 private Integer count;
68 68
69 // ========== 审批相关 ========== 69 // ========== 审批相关 ==========
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/vo/AppTradeCartAddReqVO.java
@@ -17,7 +17,7 @@ public class AppTradeCartAddReqVO { @@ -17,7 +17,7 @@ public class AppTradeCartAddReqVO {
17 @NotNull(message = "数量不能为空") 17 @NotNull(message = "数量不能为空")
18 private Integer count; 18 private Integer count;
19 19
20 - @Schema(description = "是否添加到购物车", required = true, example = "true") 20 + @Schema(description = "是否添加到购物车", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
21 @NotNull(message = "是否添加购物车不能为空") 21 @NotNull(message = "是否添加购物车不能为空")
22 private Boolean addStatus; 22 private Boolean addStatus;
23 23
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/vo/AppTradeCartListRespVO.java
@@ -25,10 +25,10 @@ public class AppTradeCartListRespVO { @@ -25,10 +25,10 @@ public class AppTradeCartListRespVO {
25 @Data 25 @Data
26 public static class Cart { 26 public static class Cart {
27 27
28 - @Schema(description = "购物项的编号", required = true, example = "1024") 28 + @Schema(description = "购物项的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
29 private Long id; 29 private Long id;
30 30
31 - @Schema(description = "商品数量", required = true, example = "1") 31 + @Schema(description = "商品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
32 private Integer count; 32 private Integer count;
33 33
34 /** 34 /**
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/cart/vo/AppTradeCartUpdateReqVO.java
@@ -10,11 +10,11 @@ import javax.validation.constraints.NotNull; @@ -10,11 +10,11 @@ import javax.validation.constraints.NotNull;
10 @Data 10 @Data
11 public class AppTradeCartUpdateReqVO { 11 public class AppTradeCartUpdateReqVO {
12 12
13 - @Schema(description = "编号", required = true, example = "1024") 13 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
14 @NotNull(message = "编号不能为空") 14 @NotNull(message = "编号不能为空")
15 private Long id; 15 private Long id;
16 16
17 - @Schema(description = "商品数量", required = true, example = "1") 17 + @Schema(description = "商品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
18 @NotNull(message = "数量不能为空") 18 @NotNull(message = "数量不能为空")
19 @Min(message = "数量必须大于 0", value = 1L) 19 @Min(message = "数量必须大于 0", value = 1L)
20 private Integer count; 20 private Integer count;
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/AppTradeOrderController.java
@@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; 5 import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
6 import cn.iocoder.yudao.module.pay.api.notify.dto.PayOrderNotifyReqDTO; 6 import cn.iocoder.yudao.module.pay.api.notify.dto.PayOrderNotifyReqDTO;
7 import cn.iocoder.yudao.module.product.api.comment.ProductCommentApi; 7 import cn.iocoder.yudao.module.product.api.comment.ProductCommentApi;
  8 +import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO;
8 import cn.iocoder.yudao.module.product.api.property.ProductPropertyValueApi; 9 import cn.iocoder.yudao.module.product.api.property.ProductPropertyValueApi;
9 import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO; 10 import cn.iocoder.yudao.module.product.api.property.dto.ProductPropertyValueDetailRespDTO;
10 import cn.iocoder.yudao.module.trade.controller.app.order.vo.*; 11 import cn.iocoder.yudao.module.trade.controller.app.order.vo.*;
@@ -35,6 +36,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils. @@ -35,6 +36,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.
35 import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP; 36 import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
36 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; 37 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
37 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_ITEM_NOT_FOUND; 38 import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_ITEM_NOT_FOUND;
  39 +import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_NOT_FOUND;
38 40
39 @Tag(name = "用户 App - 交易订单") 41 @Tag(name = "用户 App - 交易订单")
40 @RestController 42 @RestController
@@ -138,16 +140,20 @@ public class AppTradeOrderController { @@ -138,16 +140,20 @@ public class AppTradeOrderController {
138 @PostMapping("/item/create-comment") 140 @PostMapping("/item/create-comment")
139 @Operation(summary = "创建交易订单项的评价") 141 @Operation(summary = "创建交易订单项的评价")
140 public CommonResult<Long> createOrderItemComment(@RequestBody AppTradeOrderItemCommentCreateReqVO createReqVO) { 142 public CommonResult<Long> createOrderItemComment(@RequestBody AppTradeOrderItemCommentCreateReqVO createReqVO) {
141 - // 校验订单项,订单项存在订单就存在  
142 - // TODO @puhui999:要去查询订单是不是自己的;不然别人模拟请求哈;  
143 - TradeOrderItemDO item = tradeOrderService.getOrderItem(createReqVO.getUserId(), createReqVO.getOrderItemId());  
144 - if (item == null) { 143 + Long loginUserId = getLoginUserId();
  144 + // 先通过订单项 ID 查询订单项是否存在
  145 + TradeOrderItemDO orderItemDO = tradeOrderService.getOrderItemByIdAndUserId(createReqVO.getOrderItemId(), loginUserId);
  146 + if (orderItemDO == null) {
145 throw exception(ORDER_ITEM_NOT_FOUND); 147 throw exception(ORDER_ITEM_NOT_FOUND);
146 } 148 }
  149 + // 校验订单
  150 + TradeOrderDO orderDO = tradeOrderService.getOrderByIdAndUserId(orderItemDO.getOrderId(), loginUserId);
  151 + if (orderDO == null) {
  152 + throw exception(ORDER_NOT_FOUND);
  153 + }
147 154
148 - return success(productCommentApi.createComment(TradeOrderConvert.INSTANCE.convert04(createReqVO), item.getOrderId())); 155 + ProductCommentCreateReqDTO productCommentCreateReqDTO = TradeOrderConvert.INSTANCE.convert04(createReqVO, orderItemDO);
  156 + return success(productCommentApi.createComment(productCommentCreateReqDTO));
149 } 157 }
150 158
151 - // TODO 合并代码后发现只有商家回复功能 用户追评不要了吗?不要了哈;  
152 -  
153 } 159 }
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/order/vo/AppTradeOrderSettlementReqVO.java
@@ -21,7 +21,7 @@ public class AppTradeOrderSettlementReqVO { @@ -21,7 +21,7 @@ public class AppTradeOrderSettlementReqVO {
21 @Deprecated // TODO 芋艿:后续干掉这个字段,对于前端不需要关注这个 21 @Deprecated // TODO 芋艿:后续干掉这个字段,对于前端不需要关注这个
22 private Integer type; 22 private Integer type;
23 23
24 - @Schema(description = "商品项数组", required = true) 24 + @Schema(description = "商品项数组", requiredMode = Schema.RequiredMode.REQUIRED)
25 @NotNull(message = "商品不能为空") 25 @NotNull(message = "商品不能为空")
26 private List<Item> items; 26 private List<Item> items;
27 27