From 80d88f15a2222ec2dbe33f5d1d2b2296a890f41b Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期二, 03 三月 2026 16:22:04 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 server/dmmall_service/src/main/java/com/doumee/service/business/MemberCouponService.java          |    6 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java         |    2 
 server/dmmall_service/src/main/java/com/doumee/dao/business/model/Notice.java                     |    7 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/NoticeServiceImpl.java       |   20 
 server/dmmall_service/src/main/java/com/doumee/service/business/AftersaleService.java             |    1 
 server/dmmall_admin/src/main/java/com/doumee/task/ScheduleTool.java                               |   62 +++
 server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/PayResponse.java            |    3 
 server/dmmall_web/src/main/java/com/doumee/api/web/mall/GoodsApi.java                             |    9 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java       |   14 
 server/dmmall_web/src/main/java/com/doumee/api/web/AccountApi.java                                |    1 
 server/dmmall_web/src/main/java/com/doumee/api/web/mall/IntegralApi.java                          |    1 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java        |  123 +++----
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopcartServiceImpl.java     |    4 
 server/dmmall_service/src/main/java/com/doumee/service/business/GoodsService.java                 |    4 
 server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goods.java                      |   53 +++
 server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java                          |   16 
 server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java               |    6 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java     |  254 +++++++++++++---
 server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsMapper.java                      |    4 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java       |    3 
 server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/MemberOrderResponse.java    |    7 
 server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java            |    3 
 server/dmmall_service/src/main/java/com/doumee/service/business/IntegralService.java              |   11 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java   |  138 ++++++--
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java |   99 +++++
 server/dmmall_service/src/main/java/com/doumee/core/utils/DateUtil.java                           |    2 
 server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsorderMapper.java                 |    4 
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/AftersaleServiceImpl.java    |   14 
 server/dmmall_web/src/main/java/com/doumee/api/web/mall/OrderApi.java                             |   13 
 29 files changed, 668 insertions(+), 216 deletions(-)

diff --git a/server/dmmall_admin/src/main/java/com/doumee/task/ScheduleTool.java b/server/dmmall_admin/src/main/java/com/doumee/task/ScheduleTool.java
index 8b05dec..ef3ba1a 100644
--- a/server/dmmall_admin/src/main/java/com/doumee/task/ScheduleTool.java
+++ b/server/dmmall_admin/src/main/java/com/doumee/task/ScheduleTool.java
@@ -62,6 +62,9 @@
     @Autowired
     private IntegralService integralService;
 
+    @Autowired
+    private MemberCouponService memberCouponService;
+
     /**
      * 鏄惁寮�鍙戣��
      */
@@ -122,9 +125,9 @@
     /**
      * 瀹氭椂鍙栨秷 鏈敮浠樿鍗曚俊鎭�
      */
-//    @Scheduled(fixedDelay = 1000L * 10L )
+    @Scheduled(fixedDelay = 1000L * 10L )
     public void cancelGoodsOrder(){
-        goodsorderService.autoCancel();
+        goodsorderService.autoCancelOrder();
     }
 
     /**
@@ -152,9 +155,23 @@
         activitySignService.autoCancelSign();
     }
 
-
-
-
+    /**
+     * 瀹氭椂閫氱煡鐢ㄦ埛浼樻儬鍒稿嵆灏嗚繃鏈�
+     * 姣忓ぉ鏃╀笂 9 鐐规墽琛岋紝閫氱煡 7 澶╁唴鍗冲皢杩囨湡鐨勪紭鎯犲埜
+     */
+    @Scheduled(cron = "0 0 9 * * ?")
+    public void notifyCouponExpired() {
+        if (timing) {
+            System.out.println("寮�濮嬫墽琛屼紭鎯犲埜杩囨湡閫氱煡浠诲姟--------Begin------");
+            try {
+                // 鎻愬墠 3 澶╅�氱煡
+                memberCouponService.notifyExpiredCoupon(7);
+                System.out.println("浼樻儬鍒歌繃鏈熼�氱煡浠诲姟鎵ц鎴愬姛--------End------");
+            } catch (Exception e) {
+                System.out.println("浼樻儬鍒歌繃鏈熼�氱煡浠诲姟鎵ц澶辫触锛�" + e.getMessage());
+            }
+        }
+    }
 
     /**
      * 鍙戦�乬et璇锋眰
@@ -258,4 +275,39 @@
         }
     }
 
+    /**
+     * 瀹氭椂澶勭悊绉垎杩囨湡
+     * 姣忓ぉ鍑屾櫒 2 鐐规墽琛�
+     */
+    @Scheduled(cron = "0 0 2 1 * ?")
+    public void autoExpiredIntegral() {
+        if (timing) {
+            System.out.println("寮�濮嬫墽琛岀Н鍒嗚繃鏈熷鐞嗕换鍔�--------Begin------");
+            try {
+                integralService.expiredIntegral();
+                System.out.println("绉垎杩囨湡澶勭悊浠诲姟鎵ц鎴愬姛--------End------");
+            } catch (Exception e) {
+                System.out.println("绉垎杩囨湡澶勭悊浠诲姟鎵ц澶辫触锛�" + e.getMessage());
+            }
+        }
+    }
+
+
+    /**
+     * 瀹氭椂鍙戦�佺Н鍒嗗嵆灏嗚繃鏈熼�氱煡
+     * 姣忓ぉ鍑屾櫒 2 鐐规墽琛�
+     */
+    @Scheduled(cron = "0 0 2 25 * ?")
+    public void autoExpiredIntegralNotice() {
+        if (timing) {
+            System.out.println("寮�濮嬫墽琛岀Н鍒嗗嵆灏嗚繃鏈熼�氱煡澶勭悊浠诲姟--------Begin------");
+            try {
+                integralService.expiredIntegralNotice();
+                System.out.println("绉垎鍗冲皢杩囨湡閫氱煡澶勭悊浠诲姟鎵ц鎴愬姛--------End------");
+            } catch (Exception e) {
+                System.out.println("绉垎鍗冲皢杩囨湡閫氱煡澶勭悊浠诲姟鎵ц澶辫触锛�" + e.getMessage());
+            }
+        }
+    }
+
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java b/server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
index a884c7f..a236f1d 100644
--- a/server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
+++ b/server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -2,6 +2,8 @@
 
 import cn.binarywang.wx.miniapp.bean.WxMaCodeLineColor;
 import com.doumee.core.wx.WxMiniConfig;
+import com.doumee.dao.business.model.Member;
+import com.doumee.dao.business.model.MemberCoupon;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 
@@ -869,10 +871,9 @@
 
 
         EXPIRE_INTEGRAL(40,"绉垎杩囨湡鎻愰啋",3,0,"绉垎鍗冲皢杩囨湡","鎮ㄦ湁{param}绉垎鍗冲皢杩囨湡"),
-        EXPIRE_COUPON(41,"浼樻儬鍒稿彂鏀�",3,0,"浼樻儬鍒稿彂鏀�","鎮ㄦ湁{param}寮犱紭鎯犲埜灏嗗湪{param2}杩囨湡"),
+        EXPIRE_COUPON(41,"浼樻儬鍒歌繃鏈熸彁閱�",3,0,"浼樻儬鍒歌繃鏈熸彁閱�","鎮ㄦ湁{param}寮犱紭鎯犲埜灏嗗湪{param1}杩囨湡"),
 
         COMMENT(50,"绀惧尯娑堟伅",4,1,"鏀跺埌璇勮","{param}鍥炲浜嗘偍鐨勮瘎璁�"),
-
         ;
 
         private Integer key;
@@ -960,7 +961,7 @@
         MEMBER_ORDER_REFUND(28,"璁㈠崟閫�娆�","璁㈠崟閫�娆撅紝杩旇繕璁㈠崟娑堣��${param}绉垎",0,0),
         MEMBER_ORDER(9,"涓嬪崟鎶垫墸","娑堣垂鎶垫墸锛屾秷鑰�${param}绉垎",1,0),
         ORDER_DONATE(15,"娑堣垂杩旂Н鍒�","璐墿鎴愬姛锛岃幏寰�${param}绉垎",0,0),
-        SHOP_YEAR_SETTLEMENT(18,"绉垎杩囨湡","绉垎杩囨湡锛屾秷鑰�${param}绉垎",0,0),
+        MEMBER_YEAR_SETTLEMENT(18,"绉垎杩囨湡","绉垎杩囨湡锛屾秷鑰�${param}绉垎",0,0),
         MEMBER_ORDER_REFUND_RETURN(27,"璁㈠崟閫�娆�","璁㈠崟閫�娆撅紝鎵i櫎璁㈠崟杩旇繕${param}绉垎",0,0),
 
 
@@ -1435,6 +1436,15 @@
     }
 
 
+    public static String getCouponInfo(MemberCoupon mc, Integer num){
+        String info = Constants.equalsInteger(mc.getCouponType(),Constants.ZERO)?
+                "婊�"+mc.getLimitPrice()+"鍏冨噺"+mc.getPrice()+"鍏冩姷鎵e埜*"+num:
+                "婊�"+mc.getLimitPrice()+"鍏冧韩"+mc.getPrice()+"鎶樺埜*"+num;
+        return info;
+    }
+
+
+
 
 
 
diff --git a/server/dmmall_service/src/main/java/com/doumee/core/utils/DateUtil.java b/server/dmmall_service/src/main/java/com/doumee/core/utils/DateUtil.java
index 1b2b8ff..274f6b0 100644
--- a/server/dmmall_service/src/main/java/com/doumee/core/utils/DateUtil.java
+++ b/server/dmmall_service/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -3005,7 +3005,7 @@
         Date date = new Date();
         Long l = date.getTime()+1000*60*60*24*days;
         date.setTime(l);
-        return DateToStr(date, "yyyyMMdd");
+        return DateToStr(date, "yyyy-MM-dd");
     }
 
     public static String beforeDateToStr(Integer days){
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsMapper.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsMapper.java
index e3c4a8d..b33078a 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsMapper.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsMapper.java
@@ -19,7 +19,7 @@
 
 
 
-    @Select(" select g.* , " +
+    /*@Select(" select g.* , " +
             "(( select count(1) from goodsorder_detail gd inner join goods_sku gs on gd.GOODS_SKU_ID = gs.id where gs.GOODS_ID = g.`id`  )+ g.SALENUM) as realSaleNum ," +
             //"( select gs.id from goods_sku gs where gs.GOODS_ID = g.id  limit 1 ) as realSaleNum ," +
             " ifnull(( select min(gs.PRICE) from goods_sku gs where gs.GOODS_ID = g.id ),0) as minPrice  " +
@@ -41,7 +41,7 @@
             " ifnull(( select sum(gd.NAME) from goodsorder_detail gd  inner join goodsorder go on gd.ORDER_ID = go.id  where gd.GOODS_SKU_ID = gs.`id` and  go.DISTRIBUTION_SHOP_ID = #{shopId} ),0) as realSaleNum " +
             " from goods g left join goods_sku gs on g.id = gs.GOODS_ID " +
             " ${ew.customSqlSegment} ")
-    IPage<GoodsInfoResponse> goodsPageForShop(IPage<GoodsRequest> page, @Param(Constants.WRAPPER) Wrapper wrapper,@Param("shopId") Integer shopId);
+    IPage<GoodsInfoResponse> goodsPageForShop(IPage<GoodsRequest> page, @Param(Constants.WRAPPER) Wrapper wrapper,@Param("shopId") Integer shopId);*/
 
 
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsorderMapper.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsorderMapper.java
index 0724f12..ea81c9b 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsorderMapper.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/GoodsorderMapper.java
@@ -25,7 +25,7 @@
 
     @Select(" select g.CODE AS code ,  g.id as orderId , g.CREATE_DATE as createDate    , g.TYPE as orderType , g.STATUS as orderStatus , g.IS_COMMENT as isComment , g.PAY_STATUS as  payStatus ," +
             " g.COUPON_PRICE as couponPrice , g.price , g.LINKNAME  as linkName , g.LINKPHONE as linkPhone , g.LINKADDR as linkAddress , " +
-            "g.KD_DATE as kdDate , g.KD_NAME as kdName  , g.KD_CODE as kdCode , g.INTEGRAL as integral , SUBDATE(g.CREATE_DATE,interval - 15 minute) as cancelDate , g.PAY_DATE AS payDate , g.DONE_DATE as doneDate " +
+            "g.KD_DATE as kdDate , g.KD_NAME as kdName  , g.KD_CODE as kdCode , g.INTEGRAL as integral ,  g.CANCEL_DATE AS cancelDate ,SUBDATE(g.CREATE_DATE,interval - 15 minute) as cancelOptDate , g.PAY_DATE AS payDate , g.DONE_DATE as doneDate " +
             " , g.MEMBER_INFO , g.RECEIVE_TYPE as receiveType, s.name as shopName,s.phone as shopPhone ,s.id as shopId ,g.exchange_code as exchangeCode  " +
             " from goodsorder g left join shop s on g.PICK_UP_SHOP_ID = s.id   " +
             " ${ew.customSqlSegment} ")
@@ -34,7 +34,7 @@
 
     @Select(" select g.CODE AS code , g.pay_Method , g.MEMBER_INFO as memberInfo , g.PAY_ORDER_ID as payOrderId , g.REFUND_MONEY refundMoney , g.REFUND_TIME as refundTime, g.REFUND_INFO as refundInfo,  g.id as orderId , g.MEMBER_ID as memberId , g.CREATE_DATE as createDate    , g.TYPE as orderType , g.STATUS as orderStatus , g.IS_COMMENT as isComment , g.PAY_STATUS as  payStatus ," +
             " g.COUPON_PRICE as couponPrice , g.price , g.LINKNAME  as linkName , g.LINKPHONE as linkPhone , g.LINKADDR as linkAddress , " +
-            "g.KD_DATE as kdDate , g.KD_NAME as kdName  , g.KD_CODE as kdCode , g.INTEGRAL as integral , SUBDATE(g.CREATE_DATE,interval - 15 minute) as cancelDate , g.PAY_DATE AS payDate , g.DONE_DATE as doneDate " +
+            "g.KD_DATE as kdDate , g.KD_NAME as kdName  , g.KD_CODE as kdCode , g.INTEGRAL as integral , g.CANCEL_DATE AS cancelDate ,SUBDATE(g.CREATE_DATE,interval - 15 minute) as cancelOptDate , g.PAY_DATE AS payDate , g.DONE_DATE as doneDate " +
             " , g.MEMBER_INFO , g.RECEIVE_TYPE as receiveType, s.name as shopName,s.phone as shopPhone ,s.id as shopId,g.exchange_code as exchangeCode , g.mail_price as mailPrice , g.TOTAL_PRICE as totalPrice " +
             " from goodsorder g left join shop s on g.PICK_UP_SHOP_ID = s.id   " +
             " where g.id = #{id} ")
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goods.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goods.java
index c427c62..5b3e9e1 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goods.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Goods.java
@@ -2,6 +2,9 @@
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.dao.web.dto.MultiFileDTO;
+import com.doumee.dao.web.response.goods.GoodsSkuResponse;
+import com.doumee.dao.web.response.goods.SkuResponse;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.baomidou.mybatisplus.annotation.IdType;
@@ -215,8 +218,58 @@
     @ApiModelProperty(value = "涓撳尯缂栫爜" )
     @TableField(exist = false)
     private Integer zhuanquId;
+
     @ApiModelProperty(value = "鍟嗗渚涜揣浠�" )
     @TableField(exist = false)
     private BigDecimal shopPrice;
 
+    @ApiModelProperty(value = "閿�閲�" )
+    @TableField(exist = false)
+    private Integer realSaleNum;
+
+    @ApiModelProperty(value = "鏈�浣庝环" )
+    @TableField(exist = false)
+    private BigDecimal minPrice;
+
+    @ApiModelProperty(value = "鍒掔嚎浠�" )
+    @TableField(exist = false)
+    private BigDecimal linePrice;
+
+    @ApiModelProperty(value = "渚涜揣浠�")
+    @TableField(exist = false)
+    private BigDecimal exFactoryPrice;
+
+    @ApiModelProperty(value = "閫傜敤鍝佺墝鍚嶇О")
+    @TableField(exist = false)
+    private String brandNames ;
+
+    @ApiModelProperty(value = "鐪熷疄搴撳瓨")
+    @TableField(exist = false)
+    private Integer stock;
+
+    @ApiModelProperty(value = "鏀惰棌鐘舵�侊細0=鏈敹钘忥紱1=宸叉敹钘�")
+    @TableField(exist = false)
+    private Integer collectStatus;
+
+    @ApiModelProperty(value = "鍟嗗搧瑙勬牸鍒楄〃")
+    @TableField(exist = false)
+    private List<GoodsSkuResponse> goodsSkuResponseList;
+
+
+    @ApiModelProperty(value = "鍟嗗搧鍟嗗搧SKU淇℃伅鍒楄〃")
+    @TableField(exist = false)
+    private List<SkuResponse> skuResponsesList;
+
+    @ApiModelProperty(value = "鍟嗗搧鍒嗙被")
+    @TableField(exist = false)
+    private Labels categoryLabels;
+
+
+    @ApiModelProperty(value = "鍝佺墝")
+    @TableField(exist = false)
+    private Labels brandLabels;
+
+    @ApiModelProperty(value = "鍟嗗搧杞挱鍥�")
+    @TableField(exist = false)
+    private List<MultiFileDTO> goodBannerMultiFiles;
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java
index 4d8fb43..0e22679 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java
@@ -114,6 +114,12 @@
     @ApiModelProperty(value = "鎶樻墸鍗锋弧鍑忎笂闄愰噾棰�")
     private BigDecimal maxPrice;
 
+    @ApiModelProperty(value = "杩囨湡閫氱煡锛�0=鏈�氱煡锛�1=宸查�氱煡", example = "1")
+    private Integer noticeStatus;
+
+    @ApiModelProperty(value = "閫氱煡鏃堕棿", example = "1")
+    private Date noticeTime;
+
     @ApiModelProperty(value = "鏄电О")
     @TableField(exist = false)
     @ExcelColumn(name="鐢ㄦ埛",width = 10,index = 1)
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Notice.java b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Notice.java
index 0fee836..0fa8418 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Notice.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/business/model/Notice.java
@@ -111,18 +111,17 @@
 
 
 
-    public Notice notice(Constants.NoticeType noticeType,Integer memberId,Integer objId){
+    public static Notice getNotice(Constants.NoticeType noticeType,Integer memberId,Integer objId){
         Notice notice = new Notice();
         notice.setCreateDate(new Date());
         notice.setIsdeleted(Constants.ZERO);
         notice.setMemberId(memberId);
         notice.setTitle(noticeType.getTitle());
         notice.setContent(noticeType.getContent());
-        notice.setType(noticeType.getNoticeType());
         notice.setObjId(objId);
         notice.setObjType(noticeType.getObjType());
-
-
+        notice.setType(noticeType.getNoticeType());
+        notice.setStatus(Constants.ZERO);
         return notice;
     }
 
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/MemberOrderResponse.java b/server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/MemberOrderResponse.java
index 6489992..930b012 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/MemberOrderResponse.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/MemberOrderResponse.java
@@ -33,9 +33,14 @@
     @ApiModelProperty(value = "鍊掕鏃�", example = "1")
     private Long countdown;
 
-    @ApiModelProperty(value = "鍙栨秷鏃堕棿", example = "1")
+    @ApiModelProperty(value = "璁㈠崟鍙栨秷鏃堕棿", example = "1")
     private Date cancelDate;
 
+
+    @ApiModelProperty(value = "鍙栨秷鏃堕棿(鑷姩鍙栨秷浣跨敤)", example = "1")
+    private Date cancelOptDate;
+
+
     @ApiModelProperty(value = "鍒涘缓鏃堕棿", example = "1")
     private Date createDate;
 
diff --git a/server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/PayResponse.java b/server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/PayResponse.java
index 0e623ea..57fe9e4 100644
--- a/server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/PayResponse.java
+++ b/server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/PayResponse.java
@@ -25,4 +25,7 @@
     @ApiModelProperty(value = "寰俊璋冭捣涓氬姟")
     private Object response;
 
+    @ApiModelProperty(value = "閿佸畾缂栧彿",hidden = true)
+    private String lockKey;
+
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/AftersaleService.java b/server/dmmall_service/src/main/java/com/doumee/service/business/AftersaleService.java
index 3034707..36ed199 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/AftersaleService.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/AftersaleService.java
@@ -117,4 +117,5 @@
     void autoDone();
 
     void afterSaleApply(AfterSaleApplyRequest afterSaleApplyRequest);
+
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/GoodsService.java b/server/dmmall_service/src/main/java/com/doumee/service/business/GoodsService.java
index fc41eaf..6c77644 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/GoodsService.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/GoodsService.java
@@ -122,7 +122,7 @@
      * @param pageWrap
      * @return
      */
-    IPage<GoodsInfoResponse> getGoodsPage(PageWrap<GoodsRequest> pageWrap);
+    IPage<Goods> getGoodsPage(PageWrap<GoodsRequest> pageWrap);
 
 
     /**
@@ -130,7 +130,7 @@
      * @param goodsId
      * @return
      */
-    GoodsInfoResponse getGoodsInfo(Integer goodsId,Integer memberId);
+    Goods getGoodsInfo(Integer goodsId,Integer memberId);
 
 
     /**
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java b/server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java
index f47066a..1961abc 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/GoodsorderService.java
@@ -242,4 +242,7 @@
 
     String createExchangeCode();
 
+
+    void autoCancelOrder();
+
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/IntegralService.java b/server/dmmall_service/src/main/java/com/doumee/service/business/IntegralService.java
index 81de709..78d3027 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/IntegralService.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/IntegralService.java
@@ -156,5 +156,16 @@
     IntegralDataResponse getIntegralData(IntegralRecordDTO model);
 
     void updateIntegral(Integral param);
+
+    /**
+     * 绉垎杩囨湡澶勭悊(瀹氭椂浠诲姟)
+     */
+    void expiredIntegral();
+
+
+    /**
+     * 绉垎鍗冲皢杩囨湡閫氱煡
+     */
+    void expiredIntegralNotice();
 }
 
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/MemberCouponService.java b/server/dmmall_service/src/main/java/com/doumee/service/business/MemberCouponService.java
index e8e3398..f800742 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/MemberCouponService.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/MemberCouponService.java
@@ -147,4 +147,10 @@
     List<MemberCoupon> getApplyCoupon(List<PayDetailRequest> requestList, Integer memberId);
 
     String addBatch(MemberCouponAddDTO memberCoupon);
+
+    /**
+     * 瀹氭椂閫氱煡鐢ㄦ埛浼樻儬鍒稿嵆灏嗚繃鏈�
+     * @param days 鎻愬墠閫氱煡澶╂暟
+     */
+    void notifyExpiredCoupon(Integer days);
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/AftersaleServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/AftersaleServiceImpl.java
index 38747e8..e1c461d 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/AftersaleServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/AftersaleServiceImpl.java
@@ -59,6 +59,8 @@
     @Autowired
     private GoodsorderMapper goodsorderMapper;
     @Autowired
+    private NoticeMapper noticeMapper;
+    @Autowired
     private ShopMapper shopMapper;
     @Autowired
     private MemberMapper memberMapper;
@@ -1177,6 +1179,18 @@
         if(Constants.equalsInteger(goodsorder.getReceiveType(),Constants.ONE)&&StringUtils.isNotBlank(goodsorder.getExchangeCode())){
             RedisUtil.deleteObject(redisTemplate,Constants.RedisKeys.EXCHANGE_KEY+goodsorder.getExchangeCode());
         }
+
+
+        //鍙戦�佽鍗曢��娆剧珯鍐呬俊
+        Notice notice = Notice.getNotice(
+                Constants.NoticeType.NOTICE_ORDER_REFUND,
+                goodsorder.getMemberId(),
+                goodsorder.getId()
+        );
+        notice.setContent(notice.getContent().replace("{param}",goodsorder.getCode().toString()));
+        noticeMapper.insert(notice);
+
+
     }
 
 
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java
index bdff142..f59fe7f 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/BannerServiceImpl.java
@@ -195,9 +195,6 @@
             BannerDTO dto = new BannerDTO();
             BeanUtils.copyProperties(s, dto);
             dto.setImgurl(path + s.getImgurl());
-            if (Constants.equalsInteger(dto.getType(),Constants.ZERO)){
-                dto.setContent(null);
-            }
             return dto;
         }).collect(Collectors.toList());
         return collect;
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
index 9801ba2..aa3cbef 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
@@ -968,45 +968,51 @@
      * @return
      */
     @Override
-    public IPage<GoodsInfoResponse> getGoodsPage(PageWrap<GoodsRequest> pageWrap) {
+    public IPage<Goods> getGoodsPage(PageWrap<GoodsRequest> pageWrap) {
        GoodsRequest model = pageWrap.getModel();
-       QueryWrapper<GoodsRequest> wrapper = new QueryWrapper<GoodsRequest>()
-                .eq("g.ISDELETED",Constants.ZERO)
+        MPJLambdaWrapper<Goods> wrapper = new MPJLambdaWrapper<Goods>()
+                .selectAll(Goods.class)
+                .select("  ifnull(( select min(gs.PRICE) from goods_sku gs where gs.GOODS_ID = t.id ),0)   ",Goods::getMinPrice)
+                .leftJoin(SystemUser.class, SystemUser::getId, Goods::getCreator)
+                .eq(Goods::getIsdeleted,Constants.ZERO)
                 .eq(!Objects.isNull(model) && Objects.nonNull(model.getCategoryId()),
-                        "g.CATEGORY_ID", model.getCategoryId())
+                        Goods::getCategoryId, model.getCategoryId())
                //閫傜敤鍝佺墝  閫傜敤绯诲垪
                .apply(!Objects.isNull(model) && Objects.nonNull(model.getApplicableBrandId()),
-                       " find_in_set( '["+model.getApplicableBrandId()+"]' , g.BRAND_IDS )  ")
+                       " find_in_set( '["+model.getApplicableBrandId()+"]' , t.BRAND_IDS )  ")
                .apply(!Objects.isNull(model) && Objects.nonNull(model.getSeriesBrandId()),
-                       " find_in_set( '["+model.getSeriesBrandId()+"]' , g.SERIAL_IDS )  ")
-                .eq("g.STATUS", Constants.ZERO)
-                .like(StringUtils.isNotBlank(model.getGoodsName()),"g.NAME",model.getGoodsName());
+                       " find_in_set( '["+model.getSeriesBrandId()+"]' , t.SERIAL_IDS )  ")
+               .apply(!Objects.isNull(model) && Objects.nonNull(model.getQualityId()),
+                        " find_in_set( '["+model.getQualityId()+"]' , t.ZHUANQU_IDS )  ")
+                .eq(Goods::getStatus, Constants.ZERO)
+                .like(StringUtils.isNotBlank(model.getGoodsName()),Goods::getName,model.getGoodsName());
+        if(Objects.nonNull(model.getShopId())){
+            wrapper.select("  ifnull( ( select sgr.PRICE from shop_goods_relation sgr where sgr.GOODS_ID = t.ID and sgr.ISDELETED = 0 and sgr.`STATUS` = 0  and sgr.SHOP_ID = "+model.getShopId()+" ) ,0) ",Goods::getExFactoryPrice);
+            wrapper.select(" ifnull(( select sum(gd.GOODS_NUM) from goodsorder_detail gd  inner join goodsorder go on gd.ORDER_ID = go.id  where gd.GOODS_ID = t.`id` and  go.DISTRIBUTION_SHOP_ID = "+model.getShopId()+" ),0) ",Goods::getRealSaleNum);
 
-                if(Objects.nonNull(model.getSortInfo())){
-                    //鎺掑簭鏂瑰紡锛�0=缁煎悎鎺掑簭锛�1=閿�閲忕敱浣庡埌楂� 锛�2=浠锋牸鐢变綆鍒伴珮锛�3=閿�閲忕敱楂樺埌浣庯紱4=浠锋牸鐢遍珮鍒颁綆
-                    if(Constants.equalsInteger(model.getSortInfo(),Constants.ZERO)){
-                        wrapper.orderByDesc("g.CREATE_DATE");
-                    }else if(Constants.equalsInteger(model.getSortInfo(),Constants.ONE)){
-                        wrapper.orderByAsc("realSaleNum");
-                    }else if(Constants.equalsInteger(model.getSortInfo(),Constants.TWO)){
-                        wrapper.orderByAsc("g.price");
-                    }else if(Constants.equalsInteger(model.getSortInfo(),Constants.THREE)){
-                        wrapper.orderByDesc("realSaleNum");
-                    }else if(Constants.equalsInteger(model.getSortInfo(),Constants.FOUR)){
-                        wrapper.orderByDesc("g.price");
-                    }
-                }
-        IPage<GoodsInfoResponse> page =
-                Objects.isNull(model.getShopId())?
-                goodsMapper.goodsPage(pageWrap.toPage(),wrapper)
-                :
-                goodsMapper.goodsPageForShop(pageWrap.toPage(),wrapper,model.getShopId()) ;
+        }else{
+            wrapper.select(" (( select ifnull(sum(GOODS_NUM),0) from goodsorder_detail gd  where gd.GOODS_ID =  t.id  )) ",Goods::getRealSaleNum);
+        }
+
+        if(Objects.nonNull(model.getSortInfo())){
+            //鎺掑簭鏂瑰紡锛�0=缁煎悎鎺掑簭锛�1=閿�閲忕敱浣庡埌楂� 锛�2=浠锋牸鐢变綆鍒伴珮锛�3=閿�閲忕敱楂樺埌浣庯紱4=浠锋牸鐢遍珮鍒颁綆
+            if(Constants.equalsInteger(model.getSortInfo(),Constants.ZERO)){
+                wrapper.orderByDesc("t.CREATE_DATE");
+            }else if(Constants.equalsInteger(model.getSortInfo(),Constants.ONE)){
+                wrapper.orderByAsc("realSaleNum");
+            }else if(Constants.equalsInteger(model.getSortInfo(),Constants.TWO)){
+                wrapper.orderByAsc("t.price");
+            }else if(Constants.equalsInteger(model.getSortInfo(),Constants.THREE)){
+                wrapper.orderByDesc("realSaleNum");
+            }else if(Constants.equalsInteger(model.getSortInfo(),Constants.FOUR)){
+                wrapper.orderByDesc("t.price");
+            }
+        }
+        IPage<Goods> page =
+                goodsMapper.selectJoinPage(pageWrap.toPage(), Goods.class, wrapper);
         if (!CollectionUtils.isEmpty(page.getRecords())){
             String preFixPath = systemDictDataBiz.getPreFixPath(Constants.RESOURCE_PATH, Constants.GOODS_FILE);
-
-
-            for (GoodsInfoResponse goodsInfoResponse:page.getRecords()
-                 ) {
+            for (Goods goodsInfoResponse:page.getRecords()) {
                 goodsInfoResponse.setImgurl(StringUtils.isNotBlank(goodsInfoResponse.getImgurl())?(preFixPath+goodsInfoResponse.getImgurl()):null);
                 if(Objects.isNull(model.getShopId())){
                     //sku鍩虹淇℃伅
@@ -1045,51 +1051,18 @@
      * @param goodsResponse
      * @return
      */
-    public void getSkuInfo(GoodsInfoResponse goodsResponse) {
+    public void getSkuInfo(Goods goodsResponse) {
 
         List<GoodsSkuResponse>  goodsSkuResponseList = goodsSkuMapper.getSkuResponseList(goodsResponse.getId());
-
-//        String fullUrl = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
-//                systemDictDataBiz.queryByCode(Constants.OSS,Constants.GOODS_FILE).getCode();
         Integer sumStock = Constants.ZERO;
         for (GoodsSkuResponse goodsSkuResponse:goodsSkuResponseList) {
             goodsSkuResponse.setStock(Objects.isNull(goodsSkuResponse.getStock())?Constants.ZERO:goodsSkuResponse.getStock());
-//            if(StringUtils.isBlank(goodsSkuResponse.getImgurl())){
-//                goodsSkuResponse.setImgurl(fullUrl + goodsSkuResponse.getGoodsImgUrl());
-//            }else{
-//                goodsSkuResponse.setImgurl(fullUrl + goodsSkuResponse.getImgurl());
-//            }
-//            //澶勭悊鏁版嵁涓嬫爣
-//            String goodsSkuName = goodsSkuResponse.getName();
-//            List<String> strList = Arrays.asList(goodsSkuName.split(";"));
-//            StringBuffer indexData = new StringBuffer();
-//            for (int i = 0; i < strList.size(); i++) {
-//                //鏌ヨsku淇℃伅
-//                Sku sku =  skuMapper.selectOne(new QueryWrapper<Sku>()
-//                        .eq("GOODS_ID",goodsResponse.getId())
-//                        .eq("SORTNUM",i)
-//                        .last(" limit 1 ")
-//                );
-//                if(Objects.isNull(sku)){
-//                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"SKU淇℃伅寮傚父,璇峰埛鏂版煡鐪�");
-//                }
-//                //鏌ヨSKU_ATTR
-//                SkuAttr skuAttr = skuAttrMapper.selectOne(new QueryWrapper<SkuAttr>()
-//                        .eq("SKU_ID",sku.getId())
-//                        .eq("NAME",strList.get(i))
-//                        .last(" limit 1 ")
-//                );
-//                if(Objects.isNull(skuAttr)){
-//                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"SKU淇℃伅寮傚父,璇峰埛鏂版煡鐪�");
-//                }
-//                indexData.append("," + ( skuAttr.getSortnum()-1));
-//            }
-//            goodsSkuResponse.setIndexData(indexData.toString().substring(1));
             sumStock = sumStock + goodsSkuResponse.getStock();
         }
         //鐪熷疄閿�閲� = realSaleNum  - saleNum;
         //鐪熷疄搴撳瓨= sumStock - (realSaleNum  - saleNum)
-        goodsResponse.setStock(sumStock - goodsResponse.getRealSaleNum() + goodsResponse.getSaleNum());
+        goodsResponse.setStock(sumStock);
+        goodsResponse.setRealSaleNum(goodsResponse.getRealSaleNum()+sumStock);
         goodsResponse.setGoodsSkuResponseList(goodsSkuResponseList);
         //Sku鍩虹淇℃伅
         List<SkuResponse> skuResponseList = skuMapper.getSkuResponseList(goodsResponse.getId());
@@ -1104,10 +1077,22 @@
     }
 
     @Override
-    public GoodsInfoResponse getGoodsInfo(Integer goodsId,Integer memberId) {
+    public Goods getGoodsInfo(Integer goodsId,Integer memberId) {
         String fullUrl = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
                 systemDictDataBiz.queryByCode(Constants.OSS,Constants.GOODS_FILE).getCode();
-        GoodsInfoResponse goodsResponse = goodsMapper.getGoodsInfo(goodsId);
+//        GoodsInfoResponse goodsResponse = goodsMapper.getGoodsInfo(goodsId);
+        Goods goodsResponse = goodsMapper.selectOne(
+                 new MPJLambdaWrapper<Goods>()
+                        .selectAll(Goods.class)
+                        .select(" (( select ifnull(sum(GOODS_NUM),0) from goodsorder_detail gd  where gd.GOODS_ID =  t.id  )) ",Goods::getRealSaleNum)
+                        .select("  ifnull(( select min(gs.PRICE) from goods_sku gs where gs.GOODS_ID = t.id ),0)   ",Goods::getMinPrice)
+                         .select("  ifnull(( select min(gs.SHOW_PRICE) from goods_sku gs where gs.GOODS_ID = t.id ),0)   ",Goods::getLinePrice)
+                        .leftJoin(SystemUser.class, SystemUser::getId, Goods::getCreator)
+//                        .eq(Goods::getIsdeleted,Constants.ZERO)
+//                        .eq(Goods::getStatus, Constants.ZERO)
+                        .eq(Goods::getId,goodsId)
+                         .last("limit 1")
+        );
         if(Objects.isNull(goodsResponse)){
             throw new BusinessException(ResponseStatus.DATA_EMPTY);
         }
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
index 057ce21..4ffb780 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -1,5 +1,6 @@
 package com.doumee.service.business.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -65,6 +66,7 @@
 import java.net.UnknownHostException;
 import java.util.*;
 import java.util.Date;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -168,6 +170,9 @@
 
     @Autowired
     private IntegralMapper integralMapper;
+
+
+    private final static String GOODS_ORDER_CREATE_LOCK = "goods:order:create:lock:";
 
     @Override
     public Integer create(Goodsorder goodsorder) {
@@ -287,6 +292,16 @@
                     goodsorder.getKdName()+"(鍗曞彿锛�"+goodsorder.getKdCode()+")");
 
         }
+
+        //鍙戦�佸彂璐х珯鍐呬俊
+        Notice notice = Notice.getNotice(
+                Constants.NoticeType.NOTICE_ORDER_SEND,
+                goodsorder.getMemberId(),
+                goodsorder.getId()
+        );
+        notice.setContent(notice.getContent().replace("{param}",goodsorder.getCode().toString()));
+        noticeMapper.insert(notice);
+
 
       /*  // TODO 鍙戦�佸井淇℃ā鏉挎秷鎭�
         Member member=memberMapper.selectById(query.getMemberId());
@@ -720,6 +735,13 @@
     @Override
     @Transactional(rollbackFor = {Exception.class,BusinessException.class})
     public PayResponse orderPay(ShopOrderPayRequest orderPayRequest,MemberCouponServiceImpl memberCouponService){
+        String lockKey  = GOODS_ORDER_CREATE_LOCK + orderPayRequest.getMemberId();
+        //鍒ゆ柇鍓嶇鏄惁鍦ㄥ悓涓�椤甸潰鍒涘缓浜嗕袱娆¤鍗�
+        if (redisTemplate.hasKey(lockKey)) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"姝e湪鍒涘缓璁㈠崟锛岃鍕块噸澶嶈皟鐢紒");
+        } else {
+            redisTemplate.opsForValue().set(lockKey, "", 5, TimeUnit.SECONDS);
+        }
         Member member = memberMapper.selectById(orderPayRequest.getMemberId());
 
         Goodsorder goodsorder = new Goodsorder();
@@ -798,8 +820,8 @@
         }
         goodsorder.setPrice(orderPayConfirmResponse.getPayAmount());
         goodsorder.setTotalPrice(orderPayConfirmResponse.getAmount());
-        goodsorder.setUseIntegral(orderPayConfirmResponse.getDeductIntegral());
-        goodsorder.setIntegral(orderPayConfirmResponse.getIntegralAmount());
+        goodsorder.setUseIntegral(Constants.equalsInteger(orderPayRequest.getUseIntegral(),Constants.ONE)?orderPayConfirmResponse.getDeductIntegral():BigDecimal.ZERO);
+        goodsorder.setIntegral(Constants.equalsInteger(orderPayRequest.getUseIntegral(),Constants.ONE)?orderPayConfirmResponse.getIntegralAmount():BigDecimal.ZERO);
         goodsorder.setMailPrice(orderPayConfirmResponse.getMailAmount());
         goodsorder.setPayMethod(goodsorder.getPrice().compareTo(BigDecimal.ZERO)>Constants.ZERO?Constants.ZERO:Constants.ONE);
         goodsorder.setGoodsNum(orderPayRequest.getPayDetailRequestList().stream().mapToInt(PayDetailRequest::getGoodsNum).sum());
@@ -825,14 +847,14 @@
         for (OrderGoodsCalculateResponse payDetailRequest:goodsCalculateList) {
             //鏌ヨ鍟嗗搧
             GoodsSku goodsSku = goodsSkuMapper.selectById(payDetailRequest.getSkuId());
-            if(Objects.isNull(goodsSku)){
+            if(Objects.isNull(goodsSku)||!Constants.equalsInteger(goodsSku.getIsdeleted(),Constants.ZERO)){
                 throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鍟嗗搧SKU淇℃伅锛�");
             }
             Goods goods = goodsMapper.selectById(goodsSku.getGoodsId());
             if(Objects.isNull(goods)){
                 throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鍟嗗搧淇℃伅锛�");
             }
-            if(goods.getStatus().equals(Constants.ONE)){
+            if(!Constants.equalsInteger(goods.getStatus(),Constants.ZERO)||!Constants.equalsInteger(goods.getIsdeleted(),Constants.ZERO)){
                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀛樺湪鍟嗗搧宸插垹闄ゆ垨宸蹭笅鏋讹紝鏃犳硶涓嬪崟");
             }
             if(goodsSku.getStock().compareTo(new BigDecimal(Constants.formatIntegerNum(payDetailRequest.getGoodsNum())))<Constants.ZERO){
@@ -918,10 +940,11 @@
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗗搧浠锋牸鍙戠敓鍙樺寲锛岃鍒锋柊鍚庨噸鏂版敮浠橈紒");
         }
 
-
         //瀛樺湪鐜伴噾鏀粯
         if(Constants.equalsInteger(goodsorder.getPayMethod(),Constants.ZERO)){
-            return this.wxPay(goodsorder,member);
+            PayResponse payResponse = this.wxPay(goodsorder,member);
+            payResponse.setLockKey(lockKey);
+            return payResponse;
         }
         //鏃犵幇閲戞敮浠�
         goodsorderMapper.update(null,new UpdateWrapper<Goodsorder>().lambda()
@@ -934,12 +957,12 @@
         PayResponse payResponse = new PayResponse();
         payResponse.setOrderId(goodsorder.getId());
         payResponse.setPayType(Constants.ONE);
-        //鍙戦�侀�氱煡
-        if(Objects.nonNull(goodsorder.getPickUpShopId())){
-            //鍙戦�佺珯鍐呬俊 - 缁忛攢鍟�
-            noticeService.orderPayNotice(goodsorder.getPickUpShopId(),goodsorder.getId(),goodsorder.getReceiveType());
-        }
-
+        payResponse.setLockKey(lockKey);
+//        //鍙戦�侀�氱煡
+//        if(Objects.nonNull(goodsorder.getPickUpShopId())){
+//            //鍙戦�佺珯鍐呬俊 - 缁忛攢鍟�
+//            noticeService.orderPayNotice(goodsorder.getPickUpShopId(),goodsorder.getId(),goodsorder.getReceiveType());
+//        }
 
         return payResponse;
     }
@@ -1087,7 +1110,7 @@
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌璁㈠崟淇℃伅");
         }
         if(memberOrderResponse.getOrderStatus().equals(Constants.OrderStatus.WAIT_PAY.getKey())){
-            memberOrderResponse.setCountdown(memberOrderResponse.getCancelDate().getTime()>System.currentTimeMillis()?memberOrderResponse.getCancelDate().getTime()-System.currentTimeMillis():Constants.ZERO);
+            memberOrderResponse.setCountdown(memberOrderResponse.getCancelOptDate().getTime()>System.currentTimeMillis()?memberOrderResponse.getCancelOptDate().getTime()-System.currentTimeMillis():Constants.ZERO);
         }
         String fullUrl = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
                 systemDictDataBiz.queryByCode(Constants.OSS,Constants.GOODS_FILE).getCode();
@@ -1236,20 +1259,8 @@
     }
 
 
-    @Override
     @Transactional(rollbackFor = {Exception.class,BusinessException.class})
-    public void cancelOrderNew(Integer orderId,Integer optUserId,String cancelInfo){
-        if(Objects.isNull(orderId)){
-            throw new BusinessException(ResponseStatus.BAD_REQUEST);
-        }
-        Goodsorder goodsorder = goodsorderMapper.selectById(orderId);
-        if(Objects.isNull(goodsorder)){
-            throw new BusinessException(ResponseStatus.DATA_EMPTY);
-        }
-        if(!(Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.WAIT_PAY.getKey())
-            || Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.PAY_DONE.getKey()) )){
-            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟鍙栨秷澶辫触锛氳鍗曠姸鎬佸凡娴佽浆锛�");
-        }
+    public void cancel(Goodsorder goodsorder,Integer optUserId,String cancelInfo){
         if(Constants.formatBigdecimal(goodsorder.getPrice()).compareTo(BigDecimal.ZERO)>Constants.ZERO
                 && Constants.equalsObject(goodsorder.getPayStatus(),Constants.ONE) ){
             //寰俊鐜伴噾閫�娆�
@@ -1269,10 +1280,10 @@
             fundMapper.insert(fund);
         }
         //璁㈠崟宸叉敮浠樼姸鎬� 锛� 浣跨敤浜嗙Н鍒� 涓旂Н鍒嗕娇鐢ㄥぇ浜�0
-        if(goodsorder.getIntegral().compareTo(BigDecimal.ZERO)>Constants.ZERO){
+        if(goodsorder.getUseIntegral().compareTo(BigDecimal.ZERO)>Constants.ZERO){
             //鏇存柊浣欓淇℃伅 娣诲姞绉垎鍙樺姩璁板綍
             DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
-            dealIntegralRequest.setIntegralNum(goodsorder.getIntegral());
+            dealIntegralRequest.setIntegralNum(goodsorder.getUseIntegral());
             dealIntegralRequest.setDealType(Constants.ZERO);
             dealIntegralRequest.setMemberId(goodsorder.getMemberId());
             dealIntegralRequest.setObjId(goodsorder.getId());
@@ -1307,9 +1318,9 @@
         }
 
         // 鐢ㄦ埛涓诲姩鍙栨秷 鍙戦�佺粡閿�鍟嗙珯鍐呮秷鎭�
-        if(Objects.nonNull(goodsorder.getPickUpShopId())&&StringUtils.isBlank(cancelInfo)){
-            noticeService.orderCancelNotice(goodsorder.getPickUpShopId(),goodsorder.getId(),goodsorder.getCode().toString());
-        }
+//        if(Objects.nonNull(goodsorder.getPickUpShopId())&&StringUtils.isBlank(cancelInfo)){
+//            noticeService.orderCancelNotice(goodsorder.getPickUpShopId(),goodsorder.getId(),goodsorder.getCode().toString());
+//        }
 
         //鏌ヨ浼樻儬鍒镐俊鎭褰�
         if(!Objects.isNull(goodsorder.getCouponId())){
@@ -1319,6 +1330,26 @@
                 memberCouponMapper.updateById(memberCoupon);
             }
         }
+    }
+
+
+
+    @Override
+    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
+    public void cancelOrderNew(Integer orderId,Integer optUserId,String cancelInfo){
+        if(Objects.isNull(orderId)){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        Goodsorder goodsorder = goodsorderMapper.selectById(orderId);
+        if(Objects.isNull(goodsorder)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        if(!(Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.WAIT_PAY.getKey())
+            || Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.PAY_DONE.getKey()) )){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璁㈠崟鍙栨秷澶辫触锛氳鍗曠姸鎬佸凡娴佽浆锛�");
+        }
+        this.cancel(goodsorder,optUserId,cancelInfo);
+
     }
 
     public BigDecimal getDeductAmount(List<PayDetailRequest> requestList){
@@ -1669,6 +1700,7 @@
         this.orderAddMemberIntegral(goodsorder);
         //缁忛攢鍟� 缁撶畻閲戦
         this.orderAddShopCash(goodsorder);
+
     }
 
 
@@ -1731,14 +1763,19 @@
                 couponNoticeRequest.setMemberCoupon(memberCoupon);
                 couponNoticeRequest.setNum(num);
                 requestList.add(couponNoticeRequest);
+
+                Notice notice = Notice.getNotice(Constants.NoticeType.COUPON,
+                        member.getId(),null);
+                notice.setContent(notice.getContent().replace("{param}",Constants.getCouponInfo(memberCoupon,num)));
+                noticeMapper.insert(notice);
             }
             if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(memberCouponList)){
                 memberCouponJoinMapper.insert(memberCouponList);
             }
-            if(CollectionUtils.isNotEmpty(requestList)){
-                //鍙戦�佺珯鍐呬俊
-                noticeService.couponNotice(inviteMember.getId(),requestList);
-            }
+//            if(CollectionUtils.isNotEmpty(requestList)){
+//                //鍙戦�佺珯鍐呬俊
+//                noticeService.couponNotice(inviteMember.getId(),requestList);
+//            }
         }
         inviteRecordMapper.update(new UpdateWrapper<InviteRecord>().lambda()
                 .set(InviteRecord::getFirstOrderStatus,Constants.ONE)
@@ -1796,6 +1833,15 @@
             //缁忛攢鍟� 缁撶畻閲戦
             this.orderAddShopCash(goodsorder);
         }
+        //鍙戦�佹牳閿�閫氱煡
+        Notice notice = Notice.getNotice(
+                Constants.NoticeType.NOTICE_ORDER_WRITE_OFF,
+                goodsorder.getMemberId(),
+                goodsorder.getId()
+        );
+        notice.setContent(notice.getContent().replace("{param}",goodsorder.getCode().toString()));
+        noticeMapper.insert(notice);
+
     }
 
 
@@ -2263,4 +2309,26 @@
         }
     }
 
+
+    /**
+     * 璁㈠崟鏈敮浠樿秴鏃惰嚜鍔ㄥ彇娑�
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void autoCancelOrder(){
+        List<Goodsorder> goodsorderList = goodsorderMapper.selectList(new QueryWrapper<Goodsorder>().lambda()
+                .eq(Goodsorder::getIsdeleted, Constants.ZERO)
+                .eq(Goodsorder::getStatus, Constants.OrderStatus.WAIT_PAY.getKey())
+                .ge(Goodsorder::getCreateDate, "DATE_SUB(NOW(), INTERVAL 15 MINUTE)")
+        );
+        if(CollectionUtils.isNotEmpty(goodsorderList)){
+            for (Goodsorder goodsorder:goodsorderList) {
+                this.cancel(goodsorder,null,"璁㈠崟鏈敮浠樿秴鏃惰嚜鍔ㄥ彇娑�");
+            }
+        }
+
+
+
+    }
+
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java
index c57306c..abb185f 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java
@@ -34,10 +34,7 @@
 
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -72,6 +69,9 @@
 
     @Autowired
     private NoticeService noticeService;
+
+    @Autowired
+    private NoticeMapper noticeMapper;
 
     @Transactional(rollbackFor = {Exception.class, BusinessException.class})
     @Override
@@ -160,7 +160,7 @@
         integral.setIsdeleted(Constants.ZERO);
         integral.setTitle(dealIntegralRequest.getIntegralObjType().getName());
         String info = dealIntegralRequest.getIntegralObjType().getNoteinfo();
-        info = info.replace("${param}",dealIntegralRequest.getIntegralNum().toString());
+        info = info.replace("${param}",dealIntegralRequest.getIntegralNum().intValue()+"");
         if(StringUtils.isNotBlank(dealIntegralRequest.getParam1())){
             info = info .replace("${param1}",dealIntegralRequest.getParam1());
         }
@@ -170,7 +170,7 @@
         integral.setObjType(dealIntegralRequest.getIntegralObjType().getKey());
         integral.setType(dealIntegralRequest.getDealType());
         integral.setNum(dealIntegralRequest.getIntegralNum());
-        integral.setTotalNum(dealIntegralRequest.getDealType().equals(Constants.ZERO)? member.getIntegral().add(integral.getNum()):member.getIntegral().subtract(integral.getNum()));
+        integral.setTotalNum(dealIntegralRequest.getDealType().equals(Constants.ZERO)? Objects.nonNull(member.getIntegral())?member.getIntegral():BigDecimal.ZERO.add(integral.getNum()):Objects.nonNull(member.getIntegral())?member.getIntegral():BigDecimal.ZERO.subtract(integral.getNum()));
         integral.setOrderCode(dealIntegralRequest.getOrderCode());
         integral.setUserType(Constants.ZERO);
         integralMapper.insert(integral);
@@ -185,7 +185,7 @@
 
         //绔欏唴淇�
         noticeService.saveMemberIntegralNotice(
-                dealIntegralRequest.getIntegralObjType(),Constants.ZERO,member.getId(),dealIntegralRequest.getIntegralNum(),
+                dealIntegralRequest.getIntegralObjType(),Constants.ONE,member.getId(),dealIntegralRequest.getIntegralNum(),
                 integral.getId(), info
         );
         return integral.getId();
@@ -193,7 +193,6 @@
 
     @Override
     public Integer dealShopIntegral(DealIntegralRequest dealIntegralRequest,Shop shop) {
-        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
         if(shop ==null){
             shop = shopMapper.selectById(dealIntegralRequest.getMemberId());
         }
@@ -225,23 +224,16 @@
         shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
                     .eq(Shop::getId,shop.getId())
                     .set(Shop::getEditDate,new Date())
-                    .set(Shop::getEditor,user!=null ? user.getId():null)
                     .setSql(dealIntegralRequest.getDealType().equals(Constants.ZERO),"total_integral = ifnull(total_integral,0)+" + dealIntegralRequest.getIntegralNum())//绱澧炲姞
                     .setSql(dealIntegralRequest.getDealType().equals(Constants.ZERO),"integral = ifnull(integral,0)+" +  dealIntegralRequest.getIntegralNum())
                     .setSql(dealIntegralRequest.getDealType().equals(Constants.ONE),"integral = ifnull(integral,0)-" + dealIntegralRequest.getIntegralNum()));
-     /* if(dealIntegralRequest.getDealType().equals(Constants.ZERO)){
-            shopMapper.addIntegral(shop.getId(),dealIntegralRequest.getIntegralNum(),
-                    dealIntegralRequest.getIntegralObjType().getAddTitle()==Constants.ZERO?dealIntegralRequest.getIntegralNum():BigDecimal.ZERO);
-        }else{
 
-            shopMapper.subtractIntegral(shop.getId(),dealIntegralRequest.getIntegralNum());
-        }*/
 
-        //绔欏唴淇�
-        noticeService.saveMemberIntegralNotice(
-                dealIntegralRequest.getIntegralObjType(),Constants.ZERO,shop.getId(),dealIntegralRequest.getIntegralNum(),
-                integral.getId(), info
-        );
+//        //绔欏唴淇�
+//        noticeService.saveMemberIntegralNotice(
+//                dealIntegralRequest.getIntegralObjType(),Constants.ZERO,shop.getId(),dealIntegralRequest.getIntegralNum(),
+//                integral.getId(), info
+//        );
         return integral.getId();
     }
 
@@ -273,22 +265,12 @@
         integral.setUserType(Constants.TWO);
         integralMapper.insert(integral);
 
-        LoginUserInfo user =(LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
         shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
                 .eq(Shop::getId,shop.getId())
                 .set(Shop::getEditDate,new Date())
-                .set(Shop::getEditor,user!=null ? user.getId():null)
                 .setSql(dealIntegralRequest.getDealType().equals(Constants.ZERO),"total_integral = ifnull(total_integral,0)+" + dealIntegralRequest.getIntegralNum())//绱澧炲姞
                 .setSql(dealIntegralRequest.getDealType().equals(Constants.ZERO),"integral = ifnull(integral,0)+" +  dealIntegralRequest.getIntegralNum())
                 .setSql(dealIntegralRequest.getDealType().equals(Constants.ONE),"integral = ifnull(integral,0)-" + dealIntegralRequest.getIntegralNum()));
-
-
-      /*  if(dealIntegralRequest.getDealType().equals(Constants.ZERO)){
-            shopMapper.addAmount(shop.getId(),dealIntegralRequest.getIntegralNum(),
-                    dealIntegralRequest.getIntegralObjType().getAddTitle()==Constants.ZERO?dealIntegralRequest.getIntegralNum():BigDecimal.ZERO);
-        }else{
-            shopMapper.subtractAmount(shop.getId(),dealIntegralRequest.getIntegralNum());
-        }*/
         return integral.getId();
     }
 
@@ -598,10 +580,17 @@
         IntegralDataResponse integralDataResponse = new IntegralDataResponse();
         integralDataResponse.setSurplusIntegral(BigDecimal.ZERO);
         integralDataResponse.setExpiredIntegral(BigDecimal.ZERO);
-        Shop shop = shopMapper.selectById(model.getMemberId());
-        if (Objects.nonNull(shop)) {
-            integralDataResponse.setSurplusIntegral(
-                    Constants.equalsInteger(model.getUserType(),Constants.TWO)?shop.getAmount():shop.getIntegral());
+        //鐢ㄦ埛绉垎
+        if(Constants.equalsInteger(model.getUserType(),Constants.ZERO)){
+            Member member = memberMapper.selectById(model.getMemberId());
+            integralDataResponse.setSurplusIntegral(member.getIntegral());
+        }else{
+            //鍟嗘埛绉垎/浣欓
+            Shop shop = shopMapper.selectById(model.getMemberId());
+            if (Objects.nonNull(shop)) {
+                integralDataResponse.setSurplusIntegral(
+                        Constants.equalsInteger(model.getUserType(),Constants.TWO)?shop.getAmount():shop.getIntegral());
+            }
         }
         List<Integral> list = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
                 .eq(Objects.nonNull(model.getUserType()),Integral::getUserType,model.getUserType())
@@ -635,26 +624,44 @@
                         .reduce(BigDecimal.ZERO, BigDecimal::add)
                 );
             }
-            //绉垎澶辨晥鏂瑰紡 0闀挎湡鏈夋晥 1鎸夌Н鍒嗕骇鐢熸椂闂村け鏁�
-            Integer type  = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDTYPE).getCode());
-            //娑堣垂鑰呯Н鍒� 闇�瑕佹煡璇㈠嵆灏嗚繃鏈熺Н鍒�
-            if(Constants.equalsInteger(type,Constants.ONE)&& Constants.equalsInteger(model.getUserType(),Constants.ONE)){
-                Integer validYear  = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDCIRCLE).getCode());
-                if(validYear.compareTo(Constants.ZERO)>Constants.ZERO){
-                     list = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
-                            .eq(Objects.nonNull(model.getUserType()),Integral::getUserType,model.getUserType())
-                            .eq(Objects.nonNull(model.getType()),Integral::getType,model.getType())
-                            .eq(Integral::getMemberId,model.getMemberId())
-                             .apply(" CREATE_DATE >= DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL "+(validYear*12)+1+" MONTH) ")
-                            .orderByDesc(Integral::getCreateDate));
-                    BigDecimal newIntegral = list.stream().map(i->i.getNum().multiply(new BigDecimal(i.getType().toString()))
-                    ).reduce(BigDecimal.ZERO, BigDecimal::add);
-                    integralDataResponse.setExpiredIntegral(
-                            integralDataResponse.getSurplusIntegral().compareTo(newIntegral)>Constants.ZERO?integralDataResponse.getSurplusIntegral().subtract(newIntegral):BigDecimal.ZERO
-                    );
+            if(Constants.equalsInteger(model.getUserType(),Constants.ZERO)){
+                //绉垎澶辨晥鏂瑰紡 0闀挎湡鏈夋晥 1鎸夌Н鍒嗕骇鐢熸椂闂村け鏁�
+                Integer type  = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDTYPE).getCode());
+                //娑堣垂鑰呯Н鍒� 闇�瑕佹煡璇㈠嵆灏嗚繃鏈熺Н鍒�
+                if(Constants.equalsInteger(type,Constants.ONE)&& Constants.equalsInteger(model.getUserType(),Constants.ZERO)){
+                    Integer validYear  = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDCIRCLE).getCode());
+                    if(validYear.compareTo(Constants.ZERO)>Constants.ZERO){
+                        List<Integral> expiredIntegrals = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
+                                .eq(Integral::getUserType, Constants.ZERO)  // 娑堣垂鑰呯Н鍒�
+                                .eq(Integral::getIsdeleted, Constants.ZERO) // 鏈垹闄�
+                                .eq(Integral::getMemberId,model.getMemberId())
+                                // 鏌ユ壘瓒呰繃鏈夋晥鏈熺殑绉垎锛堝垱寤烘棩鏈熸棭浜庡綋鍓嶆棩鏈熷噺鍘绘湁鏁堝勾闄愶級
+                                .apply(  " create_date < ( DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL " + ((validYear * 12) + 1) + " MONTH) ) ")    // 宸茶繃鏈�
+                                .orderByAsc(Integral::getCreateDate));
+
+
+                        //鏌ヨ杩囨湡鏃ユ湡鍚庣殑娑堣�楃Н鍒�
+                        List<Integral> useIntegrals = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
+                                .eq(Integral::getUserType, Constants.ZERO)  // 娑堣垂鑰呯Н鍒�
+                                .eq(Integral::getIsdeleted, Constants.ZERO) // 鏈垹闄�
+                                .eq(Integral::getType, Constants.ONE) // 浣跨敤鐨勭Н鍒�
+                                .eq(Integral::getMemberId,model.getMemberId())
+                                // 鏌ユ壘瓒呰繃鏈夋晥鏈熺殑绉垎锛堝垱寤烘棩鏈熸棭浜庡綋鍓嶆棩鏈熷噺鍘绘湁鏁堝勾闄愶級
+                                .apply(  " create_date >= ( DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL " + ((validYear * 12) + 1) + " MONTH) ) ")    // 宸茶繃鏈�
+                                .orderByAsc(Integral::getCreateDate));
+                        BigDecimal totalExpiredNum = expiredIntegrals.stream().map(i->i.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add);
+
+                        BigDecimal afterUseIntegral = useIntegrals.stream().map(i->i.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add);
+
+                        if(afterUseIntegral.compareTo(totalExpiredNum)>=Constants.ZERO){
+                            integralDataResponse.setExpiredIntegral(BigDecimal.ZERO);
+                        }else{
+                            integralDataResponse.setExpiredIntegral(totalExpiredNum.subtract(afterUseIntegral));
+                        }
+
+                    }
                 }
             }
-
         }
         String info  = systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALRULEINFO).getCode();
         integralDataResponse.setInfo(info);
@@ -663,7 +670,150 @@
     }
 
 
+    /**
+     * 绉垎杩囨湡澶勭悊(瀹氭椂浠诲姟)
+     */
+    @Override
+    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
+    public void expiredIntegral() {
+        // 绉垎澶辨晥鏂瑰紡 0 闀挎湡鏈夋晥 1 鎸夌Н鍒嗕骇鐢熸椂闂村け鏁�
+        Integer type = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDTYPE).getCode());
+        // 鍙湁閰嶇疆涓烘寜鏃堕棿澶辨晥鏃舵墠鎵ц
+        if (Constants.equalsInteger(type, Constants.ONE)) {
+            Integer validYear = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDCIRCLE).getCode());
 
+            if (validYear != null && validYear.compareTo(Constants.ZERO) > 0) {
+                // 鏌ヨ鎵�鏈夐渶瑕佸鐞嗙殑鐢ㄦ埛绉垎璁板綍
+                // 鏌ヨ鎵�鏈夊凡杩囨湡浣嗚繕鏈鐞嗙殑绉垎璁板綍
+                List<Integral> expiredIntegrals = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
+                        .eq(Integral::getUserType, Constants.ZERO)  // 娑堣垂鑰呯Н鍒�
+                        .eq(Integral::getIsdeleted, Constants.ZERO) // 鏈垹闄�
+                        // 鏌ユ壘瓒呰繃鏈夋晥鏈熺殑绉垎锛堝垱寤烘棩鏈熸棭浜庡綋鍓嶆棩鏈熷噺鍘绘湁鏁堝勾闄愶級
+                        .apply(  " create_date < ( DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL " + ((validYear * 12) + 1) + " MONTH) ) ")    // 宸茶繃鏈�
+                        .orderByAsc(Integral::getCreateDate));
+
+
+                //鏌ヨ杩囨湡鏃ユ湡鍚庣殑娑堣�楃Н鍒�
+                List<Integral> useIntegrals = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
+                        .eq(Integral::getUserType, Constants.ZERO)  // 娑堣垂鑰呯Н鍒�
+                        .eq(Integral::getIsdeleted, Constants.ZERO) // 鏈垹闄�
+                        .eq(Integral::getType, Constants.ONE) // 浣跨敤鐨勭Н鍒�
+                        // 鏌ユ壘瓒呰繃鏈夋晥鏈熺殑绉垎锛堝垱寤烘棩鏈熸棭浜庡綋鍓嶆棩鏈熷噺鍘绘湁鏁堝勾闄愶級
+                        .apply(  " create_date >= ( DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL " + ((validYear * 12) + 1) + " MONTH) ) ")    // 宸茶繃鏈�
+                        .orderByAsc(Integral::getCreateDate));
+
+                if (CollectionUtils.isEmpty(expiredIntegrals)) {
+                    return;
+                }
+                // 鎸変細鍛樺垎缁勭粺璁¤繃鏈熺Н鍒�
+                Map<Integer, List<Integral>> memberIntegralMap = expiredIntegrals.stream()
+                        .collect(Collectors.groupingBy(Integral::getMemberId));
+                // 閬嶅巻姣忎釜鐢ㄦ埛鐨勮繃鏈熺Н鍒嗚繘琛屽鐞�
+                for (Map.Entry<Integer, List<Integral>> entry : memberIntegralMap.entrySet()) {
+                    Integer memberId = entry.getKey();
+                    List<Integral> integrals = entry.getValue();
+                    // 缁熻璇ョ敤鎴风殑鎬昏繃鏈熺Н鍒�
+                    BigDecimal totalExpiredNum = integrals.stream()
+                            .map(Integral::getNum)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add);
+                    if (totalExpiredNum.compareTo(BigDecimal.ZERO) <= 0) {
+                        continue;
+                    }
+                    // 鏌ヨ鐢ㄦ埛褰撳墠绉垎
+                    Member member = memberMapper.selectById(memberId);
+                    if (member == null || member.getIsdeleted() == Constants.ONE) {
+                        continue;
+                    }
+
+                    BigDecimal afterUseIntegral = useIntegrals.stream().filter(i->Constants.equalsInteger(memberId,i.getMemberId())).map(i->i.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add);
+                    if(afterUseIntegral.compareTo(totalExpiredNum)>=Constants.ZERO){
+                        continue;
+                    }
+                    DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
+                    dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.MEMBER_YEAR_SETTLEMENT);
+                    dealIntegralRequest.setIntegralNum(totalExpiredNum.subtract(afterUseIntegral));
+                    dealIntegralRequest.setMemberId(memberId);
+                    dealIntegralRequest.setDealType(Constants.ONE);
+                    this.dealIntegral(dealIntegralRequest,member);
+                }
+            }
+        }
+    }
+
+
+
+    /**
+     * 绉垎鍗冲皢杩囨湡閫氱煡
+     */
+    @Override
+    public void expiredIntegralNotice() {
+        // 绉垎澶辨晥鏂瑰紡 0 闀挎湡鏈夋晥 1 鎸夌Н鍒嗕骇鐢熸椂闂村け鏁�
+        Integer type = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDTYPE).getCode());
+        // 鍙湁閰嶇疆涓烘寜鏃堕棿澶辨晥鏃舵墠鎵ц
+        if (Constants.equalsInteger(type, Constants.ONE)) {
+            Integer validYear = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDCIRCLE).getCode());
+
+            if (validYear != null && validYear.compareTo(Constants.ZERO) > 0) {
+                // 鏌ヨ鎵�鏈夐渶瑕佸鐞嗙殑鐢ㄦ埛绉垎璁板綍
+                // 鏌ヨ鎵�鏈夊凡杩囨湡浣嗚繕鏈鐞嗙殑绉垎璁板綍
+                List<Integral> expiredIntegrals = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
+                        .eq(Integral::getUserType, Constants.ZERO)  // 娑堣垂鑰呯Н鍒�
+                        .eq(Integral::getIsdeleted, Constants.ZERO) // 鏈垹闄�
+                        // 鏌ユ壘瓒呰繃鏈夋晥鏈熺殑绉垎锛堝垱寤烘棩鏈熸棭浜庡綋鍓嶆棩鏈熷噺鍘绘湁鏁堝勾闄愶級
+                        .apply(  " create_date < ( DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL " + ((validYear * 12) + 1) + " MONTH) ) ")    // 宸茶繃鏈�
+                        .orderByAsc(Integral::getCreateDate));
+
+                //鏌ヨ杩囨湡鏃ユ湡鍚庣殑娑堣�楃Н鍒�
+                List<Integral> useIntegrals = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
+                        .eq(Integral::getUserType, Constants.ZERO)  // 娑堣垂鑰呯Н鍒�
+                        .eq(Integral::getIsdeleted, Constants.ZERO) // 鏈垹闄�
+                        .eq(Integral::getType, Constants.ONE) // 浣跨敤鐨勭Н鍒�
+                        // 鏌ユ壘瓒呰繃鏈夋晥鏈熺殑绉垎锛堝垱寤烘棩鏈熸棭浜庡綋鍓嶆棩鏈熷噺鍘绘湁鏁堝勾闄愶級
+                        .apply(  " create_date >= ( DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL " + ((validYear * 12) + 1) + " MONTH) ) ")    // 宸茶繃鏈�
+                        .orderByAsc(Integral::getCreateDate));
+
+                if (CollectionUtils.isEmpty(expiredIntegrals)) {
+                    return;
+                }
+                // 鎸変細鍛樺垎缁勭粺璁¤繃鏈熺Н鍒�
+                Map<Integer, List<Integral>> memberIntegralMap = expiredIntegrals.stream()
+                        .collect(Collectors.groupingBy(Integral::getMemberId));
+                // 閬嶅巻姣忎釜鐢ㄦ埛鐨勮繃鏈熺Н鍒嗚繘琛屽鐞�
+                for (Map.Entry<Integer, List<Integral>> entry : memberIntegralMap.entrySet()) {
+                    Integer memberId = entry.getKey();
+                    List<Integral> integrals = entry.getValue();
+                    // 缁熻璇ョ敤鎴风殑鎬昏繃鏈熺Н鍒�
+                    BigDecimal totalExpiredNum = integrals.stream()
+                            .map(Integral::getNum)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                    BigDecimal afterUseIntegral = useIntegrals.stream().filter(i->Constants.equalsInteger(memberId,i.getMemberId())).map(i->i.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add);
+
+                    if (totalExpiredNum.compareTo(BigDecimal.ZERO) <= 0) {
+                        continue;
+                    }
+                    // 鏌ヨ鐢ㄦ埛褰撳墠绉垎
+                    Member member = memberMapper.selectById(memberId);
+                    if (member == null || member.getIsdeleted() == Constants.ONE) {
+                        continue;
+                    }
+                    if(afterUseIntegral.compareTo(totalExpiredNum)>=Constants.ZERO){
+                        continue;
+                    }
+                    //鍙戦�佸彂璐х珯鍐呬俊
+                    Notice notice = Notice.getNotice(
+                            Constants.NoticeType.EXPIRE_INTEGRAL,
+                            memberId,
+                            null
+                    );
+                    notice.setContent(notice.getContent().replace("{param}", totalExpiredNum.subtract(afterUseIntegral).intValue()+""));
+                    noticeMapper.insert(notice);
+
+                }
+
+            }
+        }
+    }
 
 
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
index 64c3ff8..e0d9e29 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
@@ -15,6 +15,7 @@
 import com.doumee.dao.system.model.SystemUser;
 import com.doumee.dao.web.dto.CouponDTO;
 import com.doumee.dao.web.dto.MemberCouponDTO;
+import com.doumee.dao.web.request.CouponNoticeRequest;
 import com.doumee.dao.web.request.PayDetailRequest;
 import com.doumee.dao.web.response.MemberCouponResponse;
 import com.doumee.dao.web.response.goods.OrderGoodsCalculateResponse;
@@ -27,6 +28,7 @@
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -68,6 +70,10 @@
     @Autowired
     private MemberMapper memberMapper;
 
+    @Autowired
+    private NoticeMapper noticeMapper;
+
+
     @Override
     @Transactional(rollbackFor = {BusinessException.class,Exception.class})
     public    String addBatch(MemberCouponAddDTO memberCouponAddDTO){
@@ -85,8 +91,8 @@
                 throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗��"+index+"銆戜釜浼樻儬鍒告煡璇㈡棤鏁堬紝璇峰埛鏂伴〉闈㈤噸鏂帮紒");
             }
             for(Member member : memberList){
+                MemberCoupon memberCoupon = MemberCoupon.couponToBean(coupon,member,now,Constants.TWO,loginUserInfo);
                 for (int i = 0; i < Constants.formatLongNum(param.getNum()); i++) {
-                    MemberCoupon memberCoupon = MemberCoupon.couponToBean(coupon,member,now,Constants.TWO,loginUserInfo);
                     //婊″噺鍗蜂笉浼氱敓鎴恗axPrice 闇�瑕佹牴鎹紭鎯犲埜鍑忓皯閲戦璁剧疆
                     if(Constants.equalsInteger(coupon.getCouponType(),Constants.ZERO)){
                         memberCoupon.setMaxPrice(coupon.getPrice());
@@ -94,6 +100,11 @@
                     //鎸ㄤ釜閫�
                     addList.add(memberCoupon);
                 }
+                //浼樻儬鍒稿彂鏀鹃�氱煡
+                Notice notice = Notice.getNotice(Constants.NoticeType.COUPON,
+                        member.getId(),null);
+                notice.setContent(notice.getContent().replace("{param}",Constants.getCouponInfo(memberCoupon, (int) Constants.formatLongNum(param.getNum()))));
+                noticeMapper.insert(notice);
             }
             index++;
         }
@@ -545,7 +556,7 @@
                 .in(GoodsSku::getId,requestList.stream().map(i->i.getGoodsSkuId()).collect(Collectors.toList()))
         );
         if(CollectionUtils.isEmpty(goodsSkuList)||!Constants.equalsInteger(goodsSkuList.size(),requestList.size())){
-            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗗搧SKU淇℃伅閿欒,璇峰埛鏂伴噸璇�");
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗗搧SKU淇℃伅宸插け鏁�,璇峰埛鏂伴噸璇�");
         }
         //鏌ヨ鍟嗗搧鍒楄〃
         List<Goods> goodsList = goodsMapper.selectJoinList(Goods.class,
@@ -573,6 +584,7 @@
         List<MemberCoupon> allCoupon =  memberCouponMapper.selectList(new QueryWrapper<MemberCoupon>().lambda()
                         .eq(MemberCoupon::getIsdeleted,Constants.ZERO)
                         .eq(MemberCoupon::getStatus,Constants.ZERO)
+                        .eq(MemberCoupon::getMemberId,memberId)
                         .apply("  LIMIT_PRICE <= " + totalAmount)
                         .apply("  now() between START_DATE and  END_DATE "));
 
@@ -581,11 +593,11 @@
                 //閫傜敤绫诲瀷锛�0=鍏ㄥ満;1=鍝佺被锛�2=鎸囧畾鍟嗗搧
                  if(Constants.equalsInteger(memberCoupon.getApplyType(),Constants.ZERO)){
                      memberCoupon.setValidAmount(memberCoupon.getPrice());
+                     memberCouponList.add(memberCoupon);
                  }else{
                      List<String> applyIdList = Arrays.asList(memberCoupon.getApplyIds().split(","));
                      //鑾峰彇鏈夋晥鍙互浣跨敤浼樻儬鍒哥殑鏁版嵁
-                     isVaildUse(applyIdList,goodsCalculateList,
-                             Constants.equalsInteger(memberCoupon.getApplyType(),Constants.ONE)?Constants.ONE:Constants.ZERO);
+                     isVaildUse(applyIdList,goodsCalculateList,memberCoupon.getApplyType());
                      BigDecimal skuAmount = goodsCalculateList.stream().filter(i->i.getUseCoupon()).map(i->i.getSkuAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
                      if(skuAmount.compareTo(memberCoupon.getLimitPrice())>=Constants.ZERO){
                          //鏍规嵁閲戦璁$畻瀹為檯鎶樻墸閲戦
@@ -622,7 +634,7 @@
                 .in(GoodsSku::getId,requestList.stream().map(i->i.getGoodsSkuId()).collect(Collectors.toList()))
         );
         if(CollectionUtils.isEmpty(goodsSkuList)||!Constants.equalsInteger(goodsSkuList.size(),requestList.size())){
-            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗗搧SKU淇℃伅閿欒,璇峰埛鏂伴噸璇�");
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗗搧SKU淇℃伅宸插け鏁�,璇峰埛鏂伴噸璇�");
         }
         //鏌ヨ鍟嗗搧鍒楄〃
         List<Goods> goodsList = goodsMapper.selectJoinList(Goods.class,
@@ -682,8 +694,10 @@
         //鏍规嵁浼樻儬鍒哥被鍨� 璁$畻鍙互浣跨敤浼樻儬鍒哥殑鍟嗗搧淇℃伅 閫傜敤绫诲瀷锛�0=鍏ㄥ満;1=鍝佺被锛�2=鎸囧畾鍟嗗搧
         if(!Constants.equalsInteger(coupon.getApplyType(),Constants.ZERO)){
             List<String> applyIdList = Arrays.asList(coupon.getApplyIds().split(","));
-            isVaildUse(applyIdList,goodsCalculateList,
-                    Constants.equalsInteger(coupon.getApplyType(),Constants.ONE)?Constants.ONE:Constants.ZERO);
+            isVaildUse(applyIdList,goodsCalculateList,coupon.getApplyType());
+                    //Constants.equalsInteger(coupon.getApplyType(),Constants.ONE)?Constants.ONE:Constants.ZERO);
+        }else{
+            isVaildUse(null,goodsCalculateList,coupon.getApplyType());
         }
         //浣跨敤浜嗕紭鎯犲埜鐨勫晢鍝佹暟閲�
         Integer countCouponNum = goodsCalculateList.stream().filter(i->i.getUseCoupon()).collect(Collectors.toList()).size();
@@ -714,13 +728,20 @@
      * 鍒ゆ柇鏄惁鍙互鏈夋晥浣跨敤
      * @param idList
      * @param goodsList
-     * @param vaildType 0=鍟嗗搧锛�1=鍝佺被
+     * @param vaildType 0=鍏ㄥ満;1=鍝佺被锛�2=鎸囧畾鍟嗗搧
      * @return
      */
     public void isVaildUse(List<String> idList,List<OrderGoodsCalculateResponse> goodsList,Integer vaildType){
-        for (OrderGoodsCalculateResponse response:goodsList) {
-            response.setUseCoupon(idList.contains(Constants.equalsInteger(vaildType,Constants.ZERO)?response.getId().toString():response.getCategoryId().toString())?true:false);
+        if(Constants.equalsInteger(vaildType,Constants.ZERO)){
+            for (OrderGoodsCalculateResponse response:goodsList) {
+                response.setUseCoupon(true);
+            }
+        }else{
+            for (OrderGoodsCalculateResponse response:goodsList) {
+                response.setUseCoupon(idList.contains(Constants.equalsInteger(vaildType,Constants.TWO)?response.getId().toString():response.getCategoryId().toString())?true:false);
+            }
         }
+
     }
 
 
@@ -739,10 +760,60 @@
 //        }
 //        return new HashSet<>();
 //    }
+    
+    @Override
+    @Transactional(rollbackFor = {Exception.class})
+    public void notifyExpiredCoupon(Integer days) {
+        if (days == null || days <= 0) {
+            days = 3; // 榛樿鎻愬墠 3 澶╅�氱煡
+        }
+        String afterDate = DateUtil.afterDateToStr(days);
+        // 鏌ヨ鍗冲皢杩囨湡鐨勪紭鎯犲埜锛堟湭浣跨敤涓斿湪鐩爣鏃ユ湡鑼冨洿鍐呰繃鏈燂級
+        List<MemberCoupon> expiredCoupons = memberCouponMapper.selectList(
+            new QueryWrapper<MemberCoupon>().lambda()
+                .eq(MemberCoupon::getIsdeleted, Constants.ZERO)
+                .eq(MemberCoupon::getStatus, Constants.ZERO) // 鏈娇鐢�
+                .eq(MemberCoupon::getNoticeStatus,Constants.ZERO)// 鏈�氱煡鏁版嵁
+                .ge(MemberCoupon::getEndDate, DateUtil.getCurrDateTime()) // 澶т簬绛変簬寮�濮嬫椂闂�
+                .lt(MemberCoupon::getEndDate, (afterDate+" 23:59:59") )  // 灏忎簬缁撴潫鏃堕棿
+        );
+        if (CollectionUtils.isEmpty(expiredCoupons)) {
+            return;
+        }
+        // 鎸夌敤鎴峰垎缁勭粺璁�
+        Map<Integer, List<MemberCoupon>> memberCouponMap = expiredCoupons.stream()
+                .collect(Collectors.groupingBy(MemberCoupon::getMemberId));
+        
+        // 閬嶅巻姣忎釜鐢ㄦ埛鐨勪紭鎯犲埜鍙戦�侀�氱煡
+        for (Map.Entry<Integer, List<MemberCoupon>> entry : memberCouponMap.entrySet()) {
+            Integer memberId = entry.getKey();
+            List<MemberCoupon> coupons = entry.getValue();
+            if (CollectionUtils.isEmpty(coupons)) {
+                continue;
+            }
+            // 鏌ヨ鐢ㄦ埛淇℃伅
+            Member member = memberMapper.selectById(memberId);
+            if (member == null || member.getIsdeleted() == Constants.ONE) {
+                continue;
+            }
+            // 缁熻浼樻儬鍒告暟閲忓拰绫诲瀷
+            long count = coupons.size();
 
-
-
-
-
+            List<Integer> couponIds = coupons.stream().map(MemberCoupon::getId).collect(Collectors.toList());
+            //鍙戦�佺珯鍐呬俊 浼樻儬鍒稿嵆灏嗚繃鏈�
+            Notice notice = Notice.getNotice(
+                    Constants.NoticeType.EXPIRE_COUPON,
+                    member.getId(),
+                    null
+            );
+            notice.setContent(notice.getContent().replace("{param}",Long.toString(count)).replace("{param1}",afterDate));
+            noticeMapper.insert(notice);
+            memberCouponMapper.update(new UpdateWrapper<MemberCoupon>().lambda()
+                    .set(MemberCoupon::getNoticeStatus,Constants.ONE)
+                    .set(MemberCoupon::getNoticeTime,DateUtil.getCurrDateTime())
+                    .in(MemberCoupon::getId,couponIds)
+            );
+        }
+    }
 
 }
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index e7949b5..339d3aa 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -55,6 +55,7 @@
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.shiro.SecurityUtils;
+import org.checkerframework.checker.units.qual.N;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -91,6 +92,8 @@
     private ShopMapper shopMapper;
     @Autowired
     private UserActionMapper userActionMapper;
+    @Autowired
+    private NoticeMapper noticeMapper;
 
 
     @Autowired
@@ -371,7 +374,6 @@
                 if(!this.checkIsCreateInvite(phone)){
                     member.setRecId(wxPhoneRequest.getRecId());
                 }
-                member.setIntegral(BigDecimal.ZERO);
                 member.setPhone(phone);
                 member.setStatus(Constants.ZERO);
             }
@@ -424,7 +426,7 @@
             dealIntegralRequest.setDealType(Constants.ZERO);
             dealIntegralRequest.setMemberId(member.getId());
             dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.REGISTER);
-            integralService.dealIntegral(dealIntegralRequest,null);
+            integralService.dealIntegral(dealIntegralRequest,member);
         }
         //寮�鍚敞鍐岄�佷紭鎯犲埜
         if(Constants.equalsInteger(platformConfigDTO.getRegCouponRewardStatus(),Constants.ZERO)){
@@ -450,6 +452,10 @@
                         }
                         memberCouponList.add(memberCoupon);
                     }
+                    Notice notice = Notice.getNotice(Constants.NoticeType.COUPON,
+                            member.getId(),null);
+                    notice.setContent(notice.getContent().replace("{param}",Constants.getCouponInfo(memberCoupon,num)));
+                    noticeMapper.insert(notice);
                 }
                 if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(memberCouponList)){
                     memberCouponJoinMapper.insert(memberCouponList);
@@ -486,10 +492,8 @@
             dealIntegralRequest.setMemberId(member.getRecId());
             dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.INVITENEWUSER);
             dealIntegralRequest.setParam1(member.getNickname());
-            integralService.dealIntegral(dealIntegralRequest,null);
+            integralService.dealIntegral(dealIntegralRequest,member);
             //娣诲姞娑堟伅璁板綍
-
-
 
         }
     }
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/NoticeServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/NoticeServiceImpl.java
index b188c07..6216bb3 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/NoticeServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/NoticeServiceImpl.java
@@ -224,10 +224,8 @@
 
         Notice notice = pageWrap.getModel();
 
-        queryWrapper.ne(Objects.nonNull(notice.getQueryType())&&Constants.equalsInteger(notice.getQueryType(),Constants.ZERO),
-                        Notice::getObjType,Constants.TWO)
-                    .eq(Objects.nonNull(notice.getQueryType())&&Constants.equalsInteger(notice.getQueryType(),Constants.ONE),
-                        Notice::getObjType,Constants.TWO)
+        queryWrapper.ne(Objects.nonNull(notice.getQueryType()),
+                        Notice::getType,notice.getQueryType())
                     .eq(Notice::getMemberId,notice.getMemberId())
                 .orderByAsc(Notice::getStatus)
                 .orderByDesc(Notice::getId)
@@ -252,11 +250,10 @@
 
     /**
      *
-     * @param type 0娑堣垂鑰咃紱1=缁忛攢鍟嗭紱
-     * @param objType 0鍟嗗煄璁㈠崟 1绉垎娴佹按 2浜掑姩璇勪环 3浼樻儬鍒�
+     * @param type 娑堟伅绫诲瀷 0=绯荤粺娑堟伅锛�1=绀惧尯娑堟伅
+     * @param objType 0鍟嗗煄璁㈠崟 1绉垎娴佹按 2杩囨湡鎻愰啋 3绀惧尯娑堟伅
      *
      */
-
     public void saveNoticeInfo(Integer type,Integer objType,Integer memberId
         ,String title,String content,Integer objId){
         Notice notice = new Notice();
@@ -286,6 +283,7 @@
                                          BigDecimal integral,
                                          Integer objId,String info){
         String title = integralObjType.getName();
+
         this.saveNoticeInfo(
                 type,
                 Constants.ONE,
@@ -311,14 +309,14 @@
             MemberCoupon mc = c.getMemberCoupon();
             String info = Constants.equalsInteger(mc.getCouponType(),Constants.ZERO)?
                     "婊�"+mc.getLimitPrice()+"鍏冨噺"+mc.getPrice()+"鍏冩姷鎵e埜*"+c.getNum():
-                    "婊�"+mc.getLimitPrice()+"鍏冧韩"+mc.getPrice()+"鎶樺埜";
+                    "婊�"+mc.getLimitPrice()+"鍏冧韩"+mc.getPrice()+"鎶樺埜*"+c.getNum();
             replaceInfo = replaceInfo + (StringUtils.isBlank(replaceInfo)?
                     info:","+info);
         }
         noticeInfo.replace("${param}",replaceInfo);
 
         this.saveNoticeInfo(
-                Constants.ZERO,
+                Constants.ONE,
                 Constants.ONE,
                 memberId,
                 "鑾峰緱绯荤粺鍙戞斁鐨勪紭鎯犲埜",
@@ -365,8 +363,8 @@
         String noticeInfo = "${param}鍥炲浜嗘偍鐨勮瘎璁�";
         noticeInfo.replace("${param}",memberName);
         this.saveNoticeInfo(
-                Constants.ZERO,
-                Constants.TWO,
+                Constants.ONE,
+                Constants.THREE,
                 memberId,
                 noticeInfo,
                 noticeInfo,
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java
index 61c08ad..8642b11 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java
@@ -146,6 +146,8 @@
         shop.setIsrec(Constants.ONE);
         shop.setOrigin(Constants.ONE);
         shop.setSaleType(Constants.formatIntegerNum(shop.getSaleType()));
+        shop.setAmount(BigDecimal.ZERO);
+        shop.setTotalAmount(BigDecimal.ZERO);
         String salt = RandomStringUtils.randomAlphabetic(6);
 
         shop.setPassword(shop.getCode()+"@123456");
diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopcartServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopcartServiceImpl.java
index e8b89d8..18e9dac 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopcartServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/ShopcartServiceImpl.java
@@ -238,6 +238,10 @@
         if(Objects.isNull(goodsSku)){
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鍟嗗搧SKU淇℃伅");
         }
+        Goods goods = goodsMapper.selectById(goodsSku.getGoodsId());
+        if(Objects.isNull(goods)||!Constants.equalsInteger(goods.getStatus(),Constants.ZERO)||!Constants.equalsInteger(goods.getIsdeleted(),Constants.ZERO)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝鍟嗗搧宸蹭笅鏋讹紝鏃犳硶鍔犲叆璐墿杞︼紒");
+        }
         if(!Objects.isNull(shopcart)){
             shopcart.setNum(shopcart.getNum() + addCartGoodsRequest.getNum());
             shopcart.setEditDate(new Date());
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/AccountApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/AccountApi.java
index 8269a4a..4180450 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/AccountApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/AccountApi.java
@@ -167,5 +167,4 @@
         return  ApiResponse.success("鎿嶄綔鎴愬姛");
     }
 
-
 }
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/mall/GoodsApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/mall/GoodsApi.java
index 5160009..4ac39ef 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/mall/GoodsApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/mall/GoodsApi.java
@@ -7,6 +7,7 @@
 import com.doumee.core.model.ApiResponse;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.Goods;
 import com.doumee.dao.business.model.SearchHistory;
 import com.doumee.dao.web.request.goods.GoodsRequest;
 import com.doumee.dao.web.response.goods.GoodsInfoResponse;
@@ -35,8 +36,8 @@
 
     @ApiOperation("鍟嗗搧鍒楄〃")
     @PostMapping("/goodsPage")
-    public ApiResponse<IPage<GoodsInfoResponse>> goodsPage(@RequestBody PageWrap<GoodsRequest> pageWrap) {
-        IPage<GoodsInfoResponse> page = goodsService.getGoodsPage(pageWrap);
+    public ApiResponse<IPage<Goods>> goodsPage(@RequestBody PageWrap<GoodsRequest> pageWrap) {
+        IPage<Goods> page = goodsService.getGoodsPage(pageWrap);
         return ApiResponse.success("鏌ヨ鎴愬姛",page);
     }
 
@@ -46,8 +47,8 @@
             @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "goodsId", value = "鍟嗗搧涓婚敭", required = true),
             @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "memberId", value = "鐢ㄦ埛涓婚敭", required = true),
     })
-    public ApiResponse<GoodsInfoResponse> goodsInfo(@RequestParam Integer goodsId,Integer memberId) {
-        GoodsInfoResponse goodsInfoResponse = goodsService.getGoodsInfo(goodsId,memberId);
+    public ApiResponse<Goods> goodsInfo(@RequestParam Integer goodsId,Integer memberId) {
+        Goods goodsInfoResponse = goodsService.getGoodsInfo(goodsId,memberId);
         return ApiResponse.success("鏌ヨ鎴愬姛",goodsInfoResponse);
     }
 
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/mall/IntegralApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/mall/IntegralApi.java
index 03451f5..781a08c 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/mall/IntegralApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/mall/IntegralApi.java
@@ -95,5 +95,4 @@
 
 
 
-
 }
diff --git a/server/dmmall_web/src/main/java/com/doumee/api/web/mall/OrderApi.java b/server/dmmall_web/src/main/java/com/doumee/api/web/mall/OrderApi.java
index eceb395..4d7180f 100644
--- a/server/dmmall_web/src/main/java/com/doumee/api/web/mall/OrderApi.java
+++ b/server/dmmall_web/src/main/java/com/doumee/api/web/mall/OrderApi.java
@@ -36,13 +36,16 @@
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * Created by IntelliJ IDEA.
@@ -56,6 +59,10 @@
 @RequestMapping("/web/orders")
 @Slf4j
 public class OrderApi extends ApiController {
+
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+
     @LoginRequired
     @ApiOperation("鍜栧暋璁″垝宸茶闃呭垪琛�")
     @PostMapping("/planOrdersPage")
@@ -156,7 +163,11 @@
     })
     public ApiResponse<PayResponse> orderPay(@Valid @RequestBody  ShopOrderPayRequest request) {
         request.setMemberId(getMemberId());
-        return ApiResponse.success("鎿嶄綔鎴愬姛", goodsorderService.orderPay(request, memberCouponServiceImpl));
+        PayResponse payResponse = goodsorderService.orderPay(request, memberCouponServiceImpl);
+        if(Objects.nonNull(payResponse)&&StringUtils.isNotBlank(payResponse.getLockKey())){
+            redisTemplate.delete(payResponse.getLockKey());
+        }
+        return ApiResponse.success("鎿嶄綔鎴愬姛", payResponse);
     }
 
     @LoginRequired

--
Gitblit v1.9.3