Forráskód Böngészése

Merge remote-tracking branch 'origin/master'

lyx 3 hónapja
szülő
commit
4015e54498
33 módosított fájl, 565 hozzáadás és 244 törlés
  1. 16 0
      alien-entity/src/main/java/shop/alien/entity/store/LifeCoupon.java
  2. 1 0
      alien-entity/src/main/java/shop/alien/entity/store/LifeGroupBuyMain.java
  3. 2 1
      alien-entity/src/main/java/shop/alien/entity/store/vo/LifeGroupBuyThaliVo.java
  4. 1 1
      alien-entity/src/main/java/shop/alien/entity/store/vo/StoreInfoVo.java
  5. 7 1
      alien-entity/src/main/java/shop/alien/mapper/ManagementInfoMapper.java
  6. 1 1
      alien-entity/src/main/java/shop/alien/mapper/second/SecondTradeRecordMapper.java
  7. 51 9
      alien-entity/src/main/resources/mapper/ManagementInfoMapper.xml
  8. 2 2
      alien-entity/src/main/resources/mapper/second/SecondGoodsInfoMapper.xml
  9. 1 1
      alien-second/src/main/java/shop/alien/second/controller/UserGoodsController.java
  10. 4 2
      alien-second/src/main/java/shop/alien/second/service/impl/SecondTradeRecordServiceImpl.java
  11. 35 0
      alien-store/src/main/java/shop/alien/store/config/GaoDeMapUtil.java
  12. 116 96
      alien-store/src/main/java/shop/alien/store/config/WebSocketProcess.java
  13. 12 0
      alien-store/src/main/java/shop/alien/store/controller/GaoDeController.java
  14. 8 0
      alien-store/src/main/java/shop/alien/store/controller/LifeBlacklistController.java
  15. 27 31
      alien-store/src/main/java/shop/alien/store/controller/LifeCouponController.java
  16. 1 0
      alien-store/src/main/java/shop/alien/store/controller/LifeDiscountCouponController.java
  17. 3 3
      alien-store/src/main/java/shop/alien/store/controller/LifeGroupBuyController.java
  18. 9 3
      alien-store/src/main/java/shop/alien/store/controller/ManagementInfoController.java
  19. 6 3
      alien-store/src/main/java/shop/alien/store/controller/StoreIncomeDetailsRecordController.java
  20. 26 13
      alien-store/src/main/java/shop/alien/store/controller/WebSocketController.java
  21. 2 0
      alien-store/src/main/java/shop/alien/store/service/LifeBlacklistService.java
  22. 13 3
      alien-store/src/main/java/shop/alien/store/service/LifeCouponService.java
  23. 1 1
      alien-store/src/main/java/shop/alien/store/service/LifeGroupBuyService.java
  24. 1 1
      alien-store/src/main/java/shop/alien/store/service/ManagementInfoService.java
  25. 19 0
      alien-store/src/main/java/shop/alien/store/service/impl/LifeBlacklistServiceImpl.java
  26. 23 8
      alien-store/src/main/java/shop/alien/store/service/impl/LifeCouponServiceImpl.java
  27. 23 7
      alien-store/src/main/java/shop/alien/store/service/impl/LifeDiscountCouponServiceImpl.java
  28. 2 2
      alien-store/src/main/java/shop/alien/store/service/impl/LifeGroupBuyServiceImpl.java
  29. 1 0
      alien-store/src/main/java/shop/alien/store/service/impl/LifeMessageServiceImpl.java
  30. 118 28
      alien-store/src/main/java/shop/alien/store/service/impl/ManagementInfoServiceImpl.java
  31. 10 14
      alien-store/src/main/java/shop/alien/store/service/impl/PlatformStoreCouponServiceImpl.java
  32. 12 2
      alien-store/src/main/java/shop/alien/store/service/impl/StoreIncomeDetailsRecordServiceImpl.java
  33. 11 11
      alien-store/src/main/java/shop/alien/store/service/impl/StoreInfoServiceImpl.java

+ 16 - 0
alien-entity/src/main/java/shop/alien/entity/store/LifeCoupon.java

@@ -20,6 +20,22 @@ public class LifeCoupon {
     @TableId(value = "id", type = IdType.AUTO)
     private String id;
 
+    @ApiModelProperty(value = "数据类型: 0:正式数据, 1:草稿数据")
+    @TableField("data_type")
+    private Integer dataType;
+
+    @ApiModelProperty(value = "购买须知-使用开始时间")
+    @TableField("buy_use_start_time")
+    private String buyUseStartTime;
+
+    @ApiModelProperty(value = "购买须知-使用结束时间")
+    @TableField("buy_use_end_time")
+    private String buyUseEndTime;
+
+    @ApiModelProperty(value = "可用节假日")
+    @TableField("use_festival")
+    private String useFestival;
+
     @ApiModelProperty(value = "券id")
     @TableField("coupon_code")
     private String couponCode;

+ 1 - 0
alien-entity/src/main/java/shop/alien/entity/store/LifeGroupBuyMain.java

@@ -247,4 +247,5 @@ public class LifeGroupBuyMain {
     @ApiModelProperty(value = "修改人ID")
     @TableField("updated_user_id")
     private Integer updatedUserId;
+
 }

+ 2 - 1
alien-entity/src/main/java/shop/alien/entity/store/vo/LifeGroupBuyThaliVo.java

@@ -224,7 +224,7 @@ public class LifeGroupBuyThaliVo {
      * 自动为用户补偿优惠券id
      */
     @ApiModelProperty(value = "自动为用户补偿优惠券id")
-    @TableField("coupon_id")
+
     private Integer couponId;
 
     @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
@@ -252,4 +252,5 @@ public class LifeGroupBuyThaliVo {
 
     @ApiModelProperty(value = "子信息")
     private List<LifeGroupBuyNameThaliVo> details;
+
 }

+ 1 - 1
alien-entity/src/main/java/shop/alien/entity/store/vo/StoreInfoVo.java

@@ -143,7 +143,7 @@ public class StoreInfoVo extends StoreInfo {
     private List<LifeCouponVo> couponList;
 
     @ApiModelProperty(value = "优惠券列表")
-    private List<LifeCouponVo> tuangouList;
+    private List<LifeGroupBuyMainVo> tuangouList;
 
     @ApiModelProperty(value = "员工列表")
     private List<StoreStaffConfig> employeeList;

+ 7 - 1
alien-entity/src/main/java/shop/alien/mapper/ManagementInfoMapper.java

@@ -34,7 +34,7 @@ public interface ManagementInfoMapper {
 
     IPage<ManagementInfoVo> getApplicationForWithdrawal(IPage<ManagementInfoVo> iPage, @Param("storeId") Integer storeId, @Param("storeName") String storeName);
 
-    IPage<ManagementInfoVo> getStoreOrderDetail(IPage<ManagementInfoVo> iPage, @Param("storeId") String storeId);
+    IPage<ManagementInfoVo> getStoreOrderDetail(IPage<ManagementInfoVo> iPage, @Param("storeId") String storeId, @Param("orderNo") String orderNo, @Param("userId") String userId, @Param("userName") String userName);
 
     //获取平台净利润
     ManagementInfoVo getPlatformNetProfit(@Param("dataTime") String dataTime);
@@ -98,4 +98,10 @@ public interface ManagementInfoMapper {
 
     //获取退款金额
     ManagementInfoVo getRefundAmount(@Param("dataTime") String dataTime);
+
+    ManagementInfoVo getWithdrawalAmount(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("storeId") String storeId);
+    ManagementInfoVo getOrderAmount(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("storeId") String storeId);
+    ManagementInfoVo getTransactionAmount(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("storeId") String storeId);
+    ManagementInfoVo getWrittenOffAmount(@Param("startDate") String startDate, @Param("endDate") String endDate, @Param("storeId") String storeId);
+
 }

+ 1 - 1
alien-entity/src/main/java/shop/alien/mapper/second/SecondTradeRecordMapper.java

@@ -24,7 +24,7 @@ import java.util.List;
 @Mapper
 public interface SecondTradeRecordMapper extends BaseMapper<SecondTradeRecord> {
 
-    @Select("select trade.id, goods.title, goods.home_image, goods.price, trade.transaction_amount, trade.trade_status, trade.transaction_time, " +
+    @Select("select trade.id, goods.title, goods.home_image, goods.price, trade.transaction_amount, trade.trade_status, trade.transaction_time, trade.seller_id, " +
             "       trade.transaction_latitude_longitude, trade.transaction_latitude_longitude_address, trade.transaction_location, trade.created_user_id, " +
             "       if (now() >= trade.transaction_time, 1, 0) timeOutFlag " +
             "from second_trade_record trade " +

+ 51 - 9
alien-entity/src/main/resources/mapper/ManagementInfoMapper.xml

@@ -10,16 +10,16 @@
             store.store_name,
             IFNULL(meal.coupon_count, 0)  AS meal_coupon_count,
             IFNULL(meal.order_count, 0) AS meal_order_count,
-            ROUND(IFNULL(meal.order_amount, 0) / 100,2) AS meal_order_amount,
+            ROUND(IFNULL(meal.order_amount, 0) / 1000000,2) AS meal_order_amount,
             IFNULL(meal.income_count, 0) AS meal_income_count,
-            ROUND(IFNULL(meal.income_money, 0) / 100,2) AS meal_income_money,
+            ROUND(IFNULL(meal.income_money, 0) / 1000000,2) AS meal_income_money,
             IFNULL(coupon.coupon_count, 0) AS coupon_coupon_count,
             IFNULL(coupon.order_count, 0) AS coupon_order_count,
-            ROUND(IFNULL(coupon.order_amount, 0) / 100,2) AS coupon_order_amount,
+            ROUND(IFNULL(coupon.order_amount, 0) / 1000000,2) AS coupon_order_amount,
             IFNULL(coupon.income_count, 0) AS coupon_income_count,
-            ROUND(IFNULL(coupon.income_money, 0) / 100,2) AS coupon_income_money,
-            ROUND(IFNULL(allInfo.cash_out_money, 0) / 100,2) AS cashout_money,
-            ROUND(IFNULL(allInfo.account_frozen, 0) / 100,2) AS account_frozen
+            ROUND(IFNULL(coupon.income_money, 0) / 1000000,2) AS coupon_income_money,
+            ROUND(IFNULL(allInfo.cash_out_money, 0) / 1000000,2) AS cashout_money,
+            ROUND(IFNULL(allInfo.account_frozen, 0) / 1000000,2) AS account_frozen
         FROM
             store_info store
                 LEFT JOIN merchant_reconciliation_coupon coupon ON store.id = coupon.store_id
@@ -34,7 +34,7 @@
         SELECT
             store.id,
             store.store_name,
-            ROUND(IFNULL( sum( money ), 0 ) / 100,2) AS income_money
+            ROUND(IFNULL( sum( money ), 0 ) / 1000000,2) AS income_money
         FROM
             store_info store
                 LEFT JOIN ( SELECT * FROM store_income_details_record WHERE created_time > #{startDate} AND created_time &lt; #{endDate} ) income ON store.id = income.store_id
@@ -63,6 +63,14 @@
             AND store_id = #{storeId}
         </if>
     </select>
+    <select id="getTransactionAmount" resultType="shop.alien.entity.store.vo.ManagementInfoVo">
+        SELECT
+        ROUND(IFNULL(SUM( money ),0) / 100,2) AS totalTransactionAmount
+        FROM
+        store_income_details_record income
+        WHERE
+        created_time > #{startDate} AND created_time &lt; #{endDate}
+    </select>
     <select id="getTransactionNumber" resultType="shop.alien.entity.store.vo.ManagementInfoVo">
         SELECT
         COUNT(1) AS transactionNumber
@@ -82,6 +90,14 @@
             AND store_id = #{storeId}
         </if>
     </select>
+    <select id="getOrderAmount" resultType="shop.alien.entity.store.vo.ManagementInfoVo">
+        SELECT
+        ROUND(IFNULL(SUM( final_price ),0) / 100,2) AS allOrderAmount
+        FROM
+        life_user_order
+        where
+        created_time > #{startDate} AND created_time &lt; #{endDate}
+    </select>
     <select id="getAllWrittenOffAmount" resultType="shop.alien.entity.store.vo.ManagementInfoVo">
         SELECT
             ROUND(IFNULL(SUM( money ),0) / 100,2) AS allWrittenOffAmount
@@ -93,6 +109,14 @@
             AND store_id = #{storeId}
         </if>
     </select>
+    <select id="getWrittenOffAmount" resultType="shop.alien.entity.store.vo.ManagementInfoVo">
+        SELECT
+        ROUND(IFNULL(SUM( money ),0) / 100,2) AS allWrittenOffAmount
+        FROM
+        store_income_details_record
+        where
+        created_time > #{startDate} AND created_time &lt; #{endDate}
+    </select>
     <select id="getTotalWithdrawalAmount" resultType="shop.alien.entity.store.vo.ManagementInfoVo">
         SELECT
             ROUND(IFNULL(SUM( money ),0) / 100,2) AS totalWithdrawalAmount
@@ -104,6 +128,14 @@
             AND store_id = #{storeId}
         </if>
     </select>
+    <select id="getWithdrawalAmount" resultType="shop.alien.entity.store.vo.ManagementInfoVo">
+        SELECT
+        ROUND(IFNULL(SUM( money ),0) / 100,2) AS totalWithdrawalAmount
+        FROM
+        store_cash_out_record cash
+        where payment_status = 1 and
+        created_time > #{startDate} AND created_time &lt; #{endDate}
+    </select>
     <select id="getStoreOrderDetail" resultType="shop.alien.entity.store.vo.ManagementInfoVo">
         SELECT
             userOrder.id,
@@ -115,7 +147,7 @@
                 WHEN 1 THEN
                     "代金券"
                 WHEN 2 THEN
-                    "团购"
+                    "套餐"
                 END AS type_name,
             coupon.`name`,
             "1" AS buy_count,
@@ -136,13 +168,23 @@
                     "待退款"
                 WHEN 4 THEN
                     "已退款"
-                END AS status_name
+                END AS status_name,
+        userOrder.order_no
         FROM
             life_user_order userOrder
                 LEFT JOIN life_coupon coupon ON coupon.id = userOrder.id
                 LEFT JOIN life_user userInfo ON userOrder.user_id = userInfo.id
         WHERE
             userOrder.store_id = #{storeId}
+        <if test = "orderNo != null and orderNo != ''" >
+            AND userOrder.order_no = #{orderNo}
+        </if >
+        <if test = "userId != null and userId != ''" >
+            AND userOrder.user_id = #{userId}
+        </if >
+        <if test = "userName != null and userName != ''" >
+            AND userInfo.user_name like concat('%',#{userName},'%')
+        </if >
     </select>
     <select id="getUserCount" resultType="shop.alien.entity.store.vo.ManagementInfoVo">
         SELECT

+ 2 - 2
alien-entity/src/main/resources/mapper/second/SecondGoodsInfoMapper.xml

@@ -163,7 +163,7 @@
         ) a where rn <![CDATA[ <= ]]> 2
     </select>
 
-    <!-- 分页查询推荐数据 -->
+    <!-- 分页查询新发数据 -->
     <select id="querySecondNewGoodsByPage" resultType="shop.alien.entity.second.vo.SecondGoodsRecommendVo">
         with shieldUser as (
             select g.id from life_blacklist lb inner join second_goods g
@@ -209,7 +209,7 @@
             left join life_collect lc on lc.business_id = g.id and lc.user_id = #{phoneId} and lc.delete_flag = 0 and lc.business_type = 1
         where g.delete_flag = 0
             and not exists (select 1 from shieldUser s where s.id = g.id)
-            and not exists (select 1 from second_shield s where s.user_id = #{userId} and s.shield_type = 1 and s.shield_id = g.id)
+            and not exists (select 1 from second_shield s where s.user_id = #{userId} and s.shield_type = 1 and s.shield_id = g.id and s.delete_flag = 0)
             and g.goods_status = 3
             and g.position != '' and g.position is not null
         order by g.release_time desc

+ 1 - 1
alien-second/src/main/java/shop/alien/second/controller/UserGoodsController.java

@@ -146,7 +146,7 @@ public class UserGoodsController {
             @RequestParam(defaultValue = "10") Integer pageSize) {
         log.info("SecondGoodsController.getDraftList?page={},size={},", pageNum,pageSize);
         R<IPage<SecondGoodsVo>> result = new R<>();
-        IPage<SecondGoodsVo> page = new Page<>(pageNum, pageNum);
+        IPage<SecondGoodsVo> page = new Page<>(pageNum, pageSize);
         JSONObject data = JwtUtil.getCurrentUserInfo();
         if (null != data) {
             int userId = data.getInteger("userId");

+ 4 - 2
alien-second/src/main/java/shop/alien/second/service/impl/SecondTradeRecordServiceImpl.java

@@ -63,7 +63,7 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
                 LambdaQueryWrapper<SecondTradeRecord> wrapper = new LambdaQueryWrapper<>();
                 wrapper.between(SecondTradeRecord::getCreatedTime, now + " 00:00:00", now + " 23:59:59");
                 int count = secondTradeRecordMapper.selectCount(wrapper);
-                String tradeNo = "S" + now.toString().replace("-", "") + String.format("%05d", count);
+                String tradeNo = "S" + now.toString().replace("-", "") + String.format("%05d", count + 1);
                 trade.setTradeNo(tradeNo);
             }
             // 保存交易记录
@@ -348,7 +348,9 @@ public class SecondTradeRecordServiceImpl extends ServiceImpl<SecondTradeRecordM
             alienStoreFeign.sendMsgToClientByPhoneId(receiverId, JSONObject.from(webSocketVo).toJSONString());
 
             return true;
-        } catch (Exception e) {
+        } catch (BusinessException e) {
+            throw new BusinessException(e);
+        }  catch (Exception e) {
             log.error("SecondTradeRecordServiceImpl.tradeSignIn(): Error Msg={}", e.getMessage());
             throw new Exception(e);
         }

+ 35 - 0
alien-store/src/main/java/shop/alien/store/config/GaoDeMapUtil.java

@@ -47,6 +47,9 @@ public class GaoDeMapUtil {
     @Value("${gaode.distanceUrl}")
     private String distanceUrl;
 
+    @Value("${gaode.distanceTypeUrl}")
+    private String distanceTypeUrl;
+
     @Value("${gaode.nearUrl}")
     private String nearUrl;
 
@@ -147,6 +150,38 @@ public class GaoDeMapUtil {
     }
 
     /**
+     * 计算两个经纬度的距离
+     *
+     * @param longitudeOne 经度1
+     * @param latitudeOne  纬度1
+     * @param longitudeTwo 经度2
+     * @param latitudeTwo  纬度2
+     * @return distance
+     */
+    public Double getDistanceStraightLine(String longitudeOne, String latitudeOne, String longitudeTwo, String latitudeTwo) {
+        try {
+            String urlString = String.format(distanceTypeUrl, key, longitudeOne, latitudeOne, longitudeTwo, latitudeTwo, 0);
+            JSONObject obj = getResponse(urlString);
+            if (null != obj && "1".equals(String.valueOf(obj.get("status")))) {
+                JSONArray resultsArray = obj.getJSONArray("results");
+                if (resultsArray != null && !resultsArray.isEmpty()) {
+                    JSONObject resultJSON = resultsArray.getJSONObject(0);
+                    return Double.parseDouble(resultJSON.getString("distance"));
+                } else {
+                    log.error("AddressLocationUtil.getDistance ERROR 计算距离失败,结果为空");
+                    return null;
+                }
+            } else {
+                log.error("AddressLocationUtil.getDistance ERROR 计算距离失败");
+                return null;
+            }
+        } catch (Exception e) {
+            log.error("AddressLocationUtil.getDistance ERROR {}", e.getMessage());
+            return null;
+        }
+    }
+
+    /**
      * 获取附近商家、建筑等信息
      *
      * @param longitude 经度

+ 116 - 96
alien-store/src/main/java/shop/alien/store/config/WebSocketProcess.java

@@ -51,7 +51,6 @@ public class WebSocketProcess implements ApplicationContextAware {
     @Override
     public void setApplicationContext(ApplicationContext context) {
         WebSocketProcess.applicationContext = context;
-        // 初始化Mapper
         WebSocketProcess.lifeBlacklistMapper = context.getBean(LifeBlacklistMapper.class);
         WebSocketProcess.lifeMessageMapper = context.getBean(LifeMessageMapper.class);
         WebSocketProcess.baseRedisService = context.getBean(BaseRedisService.class);
@@ -63,140 +62,161 @@ public class WebSocketProcess implements ApplicationContextAware {
      **/
     private Session session;
 
-    /*
-     * 客户端创建连接时触发
-     * */
-    @OnOpen
-    public void onOpen(Session session, @PathParam("sendId") String id) {
-        //每新建立一个连接,就把当前客户id为key,this为value存储到map中
-        this.session = session;
-        concurrentHashMap.put(id, this);
-        log.info("WebSocketProcess.onOpen() Open a websocket. id={}", id);
-
-        // 获取拉黑自己的用户信息
-        LambdaQueryWrapper<LifeBlacklist> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(LifeBlacklist::getBlockedPhoneId, id);
-        List<String> blackList = lifeBlacklistMapper.selectList(wrapper).stream().map(LifeBlacklist::getBlockerPhoneId).collect(Collectors.toList());
-        if (CollectionUtil.isNotEmpty(blackList))
-            baseRedisService.setSaveOrOverwriteScriptList("blackList_" + id, blackList);
-    }
-
-
-    /**
-     * 客户端连接关闭时触发
-     **/
-    @OnClose
-    public void onClose(Session session, @PathParam("sendId") String id) {
-        //客户端连接关闭时,移除map中存储的键值对
-        concurrentHashMap.remove(id);
-        log.info("WebSocketProcess.onClose() close a websocket, concurrentHashMap remove sessionId= {}", id);
-        if (baseRedisService.hasKey("blackList_" + id)) baseRedisService.delete("blackList_" + id);
-    }
-
-    /**
-     * 连接发生异常时候触发
-     */
-    @OnError
-    public void onError(Session session, Throwable error) {
-        log.error("WebSocketProcess.onError() Error Mgs=", error);
-    }
-
     /**
      * 接收到客户端消息时触发
      */
     @OnMessage
-    public void onMessage(String message) throws Exception {
+    public void onMessage(@PathParam("sendId") String id, String message) throws Exception {
         try {
+            // 解析消息
+            WebSocketVo webSocketVo = JSONObject.parseObject(message, WebSocketVo.class);
+
             // 过滤心跳
-            WebSocketVo websocketVo = JSONObject.parseObject(message, WebSocketVo.class);
-            if (null == websocketVo || "heartbeat".equals(websocketVo.getCategory())) return;
+            if (null == webSocketVo || "heartbeat".equals(webSocketVo.getCategory())) return;
 
             // 记录已读消息id
-            if ("receipt".equals(websocketVo.getCategory())) {
-                baseRedisService.setListRight("readMessageIdKey", String.valueOf(websocketVo.getMessageId()));
+            if ("receipt".equals(webSocketVo.getCategory())) {
+                baseRedisService.setListRight("readMessageIdKey", String.valueOf(webSocketVo.getMessageId()));
                 return;
             }
 
             // 检查消息合规性
-            if (!checkCompliance(websocketVo)) {
-                websocketVo.setType("7");
-                websocketVo.setText("发送内容存在违规行为");
-                sendMessage(websocketVo.getSenderId(), JSONObject.from(websocketVo).toJSONString());
+            if (!checkCompliance(webSocketVo)) {
+                webSocketVo.setType("7");
+                webSocketVo.setText("发送内容存在违规行为");
+                sendMessage(webSocketVo.getSenderId(), JSONObject.from(webSocketVo).toJSONString());
                 return;
             }
 
-            log.info("websocketVo----------------{}",JSONObject.from(websocketVo).toJSONString());
-            log.info("concurrentHashMap----------{}",concurrentHashMap.keySet());
+            log.info("webSocketVo----------------{}", JSONObject.from(webSocketVo).toJSONString());
+            log.info("concurrentHashMap----------{}", concurrentHashMap.keySet());
 
             // 保存消息记录
             LifeMessage lifeMessage = new LifeMessage();
-            lifeMessage.setSenderId(websocketVo.getSenderId());
-            lifeMessage.setReceiverId(websocketVo.getReceiverId());
-            lifeMessage.setContent(websocketVo.getText());
-            lifeMessage.setType(websocketVo.getType());
+            lifeMessage.setSenderId(webSocketVo.getSenderId());
+            lifeMessage.setReceiverId(webSocketVo.getReceiverId());
+            lifeMessage.setContent(webSocketVo.getText());
+            lifeMessage.setType(webSocketVo.getType());
             // 查询自己是否在对方的黑名单中
-            if (baseRedisService.hasKey("blackList_" + websocketVo.getSenderId())) {
-                List<String> blackList = baseRedisService.getList("blackList_" + websocketVo.getSenderId());
-                if (blackList.contains(websocketVo.getReceiverId())) {
-                    lifeMessage.setDeletePhoneId(websocketVo.getReceiverId());
+            if (baseRedisService.hasKey("blackList_" + webSocketVo.getSenderId())) {
+                List<String> blackList = baseRedisService.getList("blackList_" + webSocketVo.getSenderId());
+                if (blackList.contains(webSocketVo.getReceiverId())) {
+                    lifeMessage.setDeletePhoneId(webSocketVo.getReceiverId());
                     lifeMessageMapper.insert(lifeMessage);
                     // 发送消息
-                    websocketVo.setMessageId(lifeMessage.getId());
-                    websocketVo.setCategory("message");
-                    websocketVo.setCreatedTime(lifeMessage.getCreatedTime());
-                    sendMessage(websocketVo.getSenderId(), JSONObject.from(websocketVo).toJSONString());
+                    webSocketVo.setMessageId(lifeMessage.getId());
+                    webSocketVo.setCategory("message");
+                    webSocketVo.setCreatedTime(lifeMessage.getCreatedTime());
+                    sendMessage(webSocketVo.getSenderId(), JSONObject.from(webSocketVo).toJSONString());
                     return;
                 }
             }
 
             lifeMessageMapper.insert(lifeMessage);
             // 发送消息
-            websocketVo.setMessageId(lifeMessage.getId());
-            websocketVo.setCategory("message");
-            websocketVo.setCreatedTime(lifeMessage.getCreatedTime());
-            sendMessage(websocketVo.getSenderId(), JSONObject.from(websocketVo).toJSONString());
-            sendMessage(websocketVo.getReceiverId(), JSONObject.from(websocketVo).toJSONString());
+            webSocketVo.setMessageId(lifeMessage.getId());
+            webSocketVo.setCategory("message");
+            webSocketVo.setCreatedTime(lifeMessage.getCreatedTime());
+            sendMessage(webSocketVo.getSenderId(), JSONObject.from(webSocketVo).toJSONString());
+            sendMessage(webSocketVo.getReceiverId(), JSONObject.from(webSocketVo).toJSONString());
+        } catch (Exception e) {
+            log.error("WebSocketProcess.onMessage()----Exception----Message={}", e.getMessage());
+        }
+    }
+
+    /**
+     * 发送消息到指定客户端
+     */
+    public void sendMessage(String id, String message) throws Exception {
+        try {
+            log.info("WebSocketProcess.sendMessage()--readySend----id={},message={}", id, message);
+            // 根据id,从map中获取存储的webSocket对象
+            WebSocketProcess webSocketProcess = concurrentHashMap.get(id);
+            if (!ObjectUtils.isEmpty(webSocketProcess)) {
+                // 当客户端是Open状态时,才能发送消息
+                if (webSocketProcess.session.isOpen()) {
+                    webSocketProcess.session.getBasicRemote().sendText(message);
+                    log.info("WebSocketProcess.sendMessage()---sendSuccess---id={},message={}", id, message);
+                } else {
+                    log.error("WebSocketProcess.sendMessage()---sendError----websocket session:{} is closed ", id);
+                }
+            } else {
+                log.error("WebSocketProcess.sendMessage()---sendError----websocket session:{} is not exit ", id);
+            }
+        } catch (Exception e) {
+            log.error("WebSocketProcess.sendMessage()---Exception----Message={}", e.getMessage());
+        }
+    }
+
+    /**
+     * 客户端创建连接时触发
+     * */
+    @OnOpen
+    public void onOpen(@PathParam("sendId") String id, Session session) {
+        try {
+            //每新建立一个连接,就把当前客户id为key,this为value存储到map中
+            this.session = session;
+            concurrentHashMap.put(id, this);
+            log.info("WebSocketProcess.onOpen() Open a websocket. id={}", id);
+
+            // 获取拉黑自己的用户信息
+            LambdaQueryWrapper<LifeBlacklist> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(LifeBlacklist::getBlockedPhoneId, id);
+            List<String> blackList = lifeBlacklistMapper.selectList(wrapper).stream().map(LifeBlacklist::getBlockerPhoneId).collect(Collectors.toList());
+            if (CollectionUtil.isNotEmpty(blackList)) baseRedisService.setSaveOrOverwriteScriptList("blackList_" + id, blackList);
         } catch (Exception e) {
-            log.error("WebSocketProcess.onMessage()----error----Msg={}", e.getMessage());
+            log.error("WebSocketProcess.onOpen()----Exception----Message={}", e.getMessage());
         }
     }
 
 
-    private boolean checkCompliance(WebSocketVo websocketVo) throws Exception {
-        List<String> servicesList = Lists.newArrayList();
-        TextModerationResultVO textModerationResultVO = null;
-        if ("1".equals(websocketVo.getType())) {
-            servicesList.add(TextReviewServiceEnum.AD_COMPLIANCE_DETECTION_PRO.getService());
-            servicesList.add(TextReviewServiceEnum.CHAT_DETECTION_PRO.getService());
-            textModerationResultVO = textModerationUtil.invokeFunction(websocketVo.getText(), servicesList);
-
-        } else if ("2".equals(websocketVo.getType())) {
-            servicesList.add(ImageReviewServiceEnum.TONALITY_IMPROVE.getService());
-            textModerationResultVO = textModerationUtil.invokeFunction(websocketVo.getText(), servicesList);
+    /**
+     * 客户端连接关闭时触发
+     **/
+    @OnClose
+    public void onClose(Session session, @PathParam("sendId") String id) {
+        try {
+            //客户端连接关闭时,移除map中存储的键值对
+            concurrentHashMap.remove(id);
+            log.info("WebSocketProcess.onClose() close a websocket, concurrentHashMap remove sessionId= {}", id);
+            if (baseRedisService.hasKey("blackList_" + id)) baseRedisService.delete("blackList_" + id);
+        } catch (Exception e) {
+            log.error("WebSocketProcess.onClose()----Exception----Message={}", e.getMessage());
         }
-        if (null != textModerationResultVO && "high".equals(textModerationResultVO.getRiskLevel())) {
-            return false;
+    }
+
+    /**
+     * 连接发生异常时候触发
+     */
+    @OnError
+    public void onError(@PathParam("sendId") String id, Throwable error) {
+        try {
+            log.error("WebSocketProcess.onError() Error,id={}, Msg=", id, error);
+        } catch (Exception e) {
+            log.error("WebSocketProcess.onError()----Exception----Message={}", e.getMessage());
         }
-        return true;
     }
 
     /**
-     * 发送消息到指定客户端
+     * 验证消息合规性
      */
-    public void sendMessage(String id, String message) throws Exception {
-        log.info("WebSocketProcess.sendMessage()--ready----id={},message={}", id, message);
-        //根据id,从map中获取存储的webSocket对象
-        WebSocketProcess webSocketProcess = concurrentHashMap.get(id);
-        if (!ObjectUtils.isEmpty(webSocketProcess)) {
-            //当客户端是Open状态时,才能发送消息
-            if (webSocketProcess.session.isOpen()) {
-                webSocketProcess.session.getBasicRemote().sendText(message);
-                log.info("WebSocketProcess.sendMessage()---success---id={},message={}", id, message);
-            } else {
-                log.error("WebSocketProcess.sendMessage()---error----websocket session:{} is closed ", id);
+    private boolean checkCompliance(WebSocketVo websocketVo) throws Exception {
+        try {
+            List<String> servicesList = Lists.newArrayList();
+            TextModerationResultVO textModerationResultVO = null;
+            if ("1".equals(websocketVo.getType())) {
+                servicesList.add(TextReviewServiceEnum.AD_COMPLIANCE_DETECTION_PRO.getService());
+                servicesList.add(TextReviewServiceEnum.CHAT_DETECTION_PRO.getService());
+                textModerationResultVO = textModerationUtil.invokeFunction(websocketVo.getText(), servicesList);
+
+            } else if ("2".equals(websocketVo.getType())) {
+                servicesList.add(ImageReviewServiceEnum.TONALITY_IMPROVE.getService());
+                textModerationResultVO = textModerationUtil.invokeFunction(websocketVo.getText(), servicesList);
             }
-        } else {
-            log.error("WebSocketProcess.sendMessage()---error----websocket session:{} is not exit ", id);
+            return !(null != textModerationResultVO && "high".equals(textModerationResultVO.getRiskLevel()));
+        } catch (Exception e) {
+            log.error("WebSocketProcess.checkCompliance()----Exception----Message={}", e.getMessage());
+            return true;
         }
     }
 

+ 12 - 0
alien-store/src/main/java/shop/alien/store/controller/GaoDeController.java

@@ -130,4 +130,16 @@ public class GaoDeController {
         return R.data(gaodeMapUtil.getDistance(longitudeOne, latitudeOne, longitudeTwo, latitudeTwo));
     }
 
+    @ApiOperation("获取两个经纬度的距离(直线距离)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "longitudeOne", value = "经度1", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "latitudeOne", value = "纬度1", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "longitudeTwo", value = "纬度2", dataType = "String", paramType = "query", required = true),
+            @ApiImplicitParam(name = "latitudeTwo", value = "纬度2", dataType = "String", paramType = "query", required = true)
+    })
+    @GetMapping("/getDistanceStraightLine")
+    public R<Double> getDistanceStraightLine(String longitudeOne, String latitudeOne, String longitudeTwo, String latitudeTwo) {
+        return R.data(gaodeMapUtil.getDistanceStraightLine(longitudeOne, latitudeOne, longitudeTwo, latitudeTwo));
+    }
+
 }

+ 8 - 0
alien-store/src/main/java/shop/alien/store/controller/LifeBlacklistController.java

@@ -75,4 +75,12 @@ public class LifeBlacklistController {
             return R.data("取消拉黑成功");
         }
     }
+
+    @ApiOperation("双方是否存在拉黑关系")
+    @ApiOperationSupport(order = 5)
+    @GetMapping("/hasBlackList")
+    public R<Boolean> hasBlackList(String otherSidePhoneId) throws Exception {
+        log.info("LifeBlacklistController.hasBlackList?otherSidePhoneId={}", otherSidePhoneId);
+        return R.data(lifeBlacklistService.hasBlackList(otherSidePhoneId));
+    }
 }

+ 27 - 31
alien-store/src/main/java/shop/alien/store/controller/LifeCouponController.java

@@ -36,21 +36,29 @@ public class LifeCouponController {
         return R.fail("失败");
     }
 
+    /**
+     * 修改库存数量
+     *
+     * @param id        主键
+     * @param singleQty 库存数量
+     * @return boolean
+     */
+    @ApiOperation("修改库存数量")
+    @GetMapping("/updateCouponSingleQty")
+    public R<Boolean> updateCouponSingleQty(@RequestParam("id") Integer id, @RequestParam("singleQty") Integer singleQty) {
+        log.info("LifeCouponController.updateCouponSingleQty?id={}&singleQty={}", id, singleQty);
+        if (lifeCouponService.updateCouponSingleQty(id, singleQty)) {
+            return R.success("成功");
+        }
+        return R.fail("失败");
+    }
+
     @ApiOperation("代金劵列表")
-    @ApiImplicitParams({@ApiImplicitParam(name = "page", value = "页数", dataType = "Integer", paramType = "query", required = true),
-            @ApiImplicitParam(name = "size", value = "页容", dataType = "Integer", paramType = "query", required = true),
-            @ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true),
-            @ApiImplicitParam(name = "status", value = "状态", dataType = "Integer", paramType = "query", required = true),
-            @ApiImplicitParam(name = "name", value = "名称", dataType = "Integer", paramType = "query", required = false)
-    })
+    @ApiImplicitParams({@ApiImplicitParam(name = "page", value = "页数", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "size", value = "页容", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "status", value = "状态", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "name", value = "名称", dataType = "Integer", paramType = "query"), @ApiImplicitParam(name = "dataType", value = "数据类型: 0:正式数据, 1:草稿数据", dataType = "Integer", paramType = "query", defaultValue = "0")})
     @GetMapping("/getCouponList")
-    private R<IPage<LifeCoupon>> getCouponList(@RequestParam(value = "page", defaultValue = "1") int page,
-                                               @RequestParam(value = "size", defaultValue = "10") int size,
-                                               @RequestParam("storeId") String storeId,
-                                               @RequestParam("status") String status,
-                                               @RequestParam(value = "name",required = false) String name) {
-        log.info("LifeCouponController.getCouponList?page={},size={},storeId={},status={},name={}", page, size, storeId, status, name);
-        return R.data(lifeCouponService.getCouponList(page, size, storeId, status, name));
+    private R<IPage<LifeCoupon>> getCouponList(@RequestParam(value = "page", defaultValue = "1") int page, @RequestParam(value = "size", defaultValue = "10") int size, @RequestParam("storeId") String storeId, @RequestParam("status") String status, @RequestParam(value = "name", required = false) String name, @RequestParam(value = "dataType", defaultValue = "0") Integer dataType) {
+        log.info("LifeCouponController.getCouponList?page={},size={},storeId={},status={},name={},dataType={}", page, size, storeId, status, name, dataType);
+        return R.data(lifeCouponService.getCouponList(page, size, storeId, status, name, dataType));
     }
 
     @ApiOperation("暂停恢复优惠券")
@@ -71,8 +79,7 @@ public class LifeCouponController {
     }
 
     @ApiOperation("核销订单")
-    @ApiImplicitParams({@ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true),
-            @ApiImplicitParam(name = "quanCode", value = "券码", dataType = "Integer", paramType = "query", required = true)})
+    @ApiImplicitParams({@ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "quanCode", value = "券码", dataType = "Integer", paramType = "query", required = true)})
     @GetMapping("/verify")
     public R<Map<String, String>> verify(@RequestParam("storeId") String storeId, @RequestParam("quanCode") String quanCode) {
         log.info("LifeCouponController.verify?storeId={},quanCode={}", storeId, quanCode);
@@ -82,9 +89,7 @@ public class LifeCouponController {
     @ApiOperation("获取优惠券状态")
     @ApiOperationSupport(order = 1)
     @GetMapping("/getCouponStatus")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "couponId", value = "优惠券id", dataType = "String", paramType = "query", required = true),
-    })
+    @ApiImplicitParams({@ApiImplicitParam(name = "couponId", value = "优惠券id", dataType = "String", paramType = "query", required = true),})
     public R<LifeCouponStatusVo> getCouponStatus(@RequestParam(value = "couponId") String couponId) {
         log.info("LifeDiscountCouponController.getCouponStatus?couponId={}", couponId);
         try {
@@ -97,20 +102,11 @@ public class LifeCouponController {
     }
 
     @ApiOperation("节假日列表")
-    @ApiImplicitParams({@ApiImplicitParam(name = "page", value = "页数", dataType = "Integer", paramType = "query", required = true),
-            @ApiImplicitParam(name = "size", value = "页容", dataType = "Integer", paramType = "query", required = true),
-            @ApiImplicitParam(name = "year", value = "年份", dataType = "String", paramType = "query", required = false),
-            @ApiImplicitParam(name = "openFlag", value = "是否启用(0:未启用,1:已启用)", dataType = "String", paramType = "query", required = false),
-            @ApiImplicitParam(name = "holidayName", value = "节假日名称", dataType = "String", paramType = "query", required = false)
-    })
+    @ApiImplicitParams({@ApiImplicitParam(name = "page", value = "页数", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "size", value = "页容", dataType = "Integer", paramType = "query", required = true), @ApiImplicitParam(name = "year", value = "年份", dataType = "String", paramType = "query", required = false), @ApiImplicitParam(name = "openFlag", value = "是否启用(0:未启用,1:已启用)", dataType = "String", paramType = "query", required = false), @ApiImplicitParam(name = "holidayName", value = "节假日名称", dataType = "String", paramType = "query", required = false)})
     @GetMapping("/getHolidayList")
-    private R<IPage<EssentialHolidayComparison>> getHolidayList(@RequestParam(value = "page", defaultValue = "1") int page,
-                                                                @RequestParam(value = "size", defaultValue = "10") int size,
-                                                                @RequestParam("year") String year,
-                                                                @RequestParam("openFlag") String openFlag,
-                                                                @RequestParam("holidayName") String holidayName) {
-        log.info("LifeCouponController.getHolidayList?page={},size={},year={},openFlag={},holidayName={}", page, size, year,openFlag, holidayName);
-        return R.data(lifeCouponService.getHolidayList(page, size, year,openFlag, holidayName));
+    private R<IPage<EssentialHolidayComparison>> getHolidayList(@RequestParam(value = "page", defaultValue = "1") int page, @RequestParam(value = "size", defaultValue = "10") int size, @RequestParam("year") String year, @RequestParam("openFlag") String openFlag, @RequestParam("holidayName") String holidayName) {
+        log.info("LifeCouponController.getHolidayList?page={},size={},year={},openFlag={},holidayName={}", page, size, year, openFlag, holidayName);
+        return R.data(lifeCouponService.getHolidayList(page, size, year, openFlag, holidayName));
     }
 
     @ApiOperation("保存节假日")

+ 1 - 0
alien-store/src/main/java/shop/alien/store/controller/LifeDiscountCouponController.java

@@ -206,6 +206,7 @@ public class LifeDiscountCouponController {
             @ApiImplicitParam(name = "couponName", value = "优惠券名称", dataType = "String", paramType = "query", required = false),
             @ApiImplicitParam(name = "tab", value = "分页类型(0:全部(传其他也查全部),1:进行中,2:已结束)", dataType = "String", paramType = "query", required = true),
             @ApiImplicitParam(name = "couponsFromType", required = false, value = "查询类型(1:我的优惠券,2:好友的优惠券)"),
+            @ApiImplicitParam(name = "couponStatus", required = false, value = "优惠券状态(0:草稿,1:正式)"),
     })
     public R<IPage<LifeDiscountCouponVo>> getStoreAllCouponList(@ApiIgnore @TokenInfo UserLoginInfo userLoginInfo,
                                                                 @RequestParam(defaultValue = "1") int page,

+ 3 - 3
alien-store/src/main/java/shop/alien/store/controller/LifeGroupBuyController.java

@@ -64,9 +64,9 @@ public class LifeGroupBuyController {
 
     @ApiOperation("修改团购状态")
     @GetMapping("/updateStatus")
-    private R updateStatus(@RequestParam("id") String id, @RequestParam("status") String status) {
-        log.info("LifeGroupBuyController.updateStatus?id={},status={}", id, status);
-        if (lifeGroupBuyService.updateStatus(id, status)) {
+    private R updateStatus(@RequestParam("id") String id, @RequestParam("status") String status, @RequestParam("approvalComments") String approvalComments) {
+        log.info("LifeGroupBuyController.updateStatus?id={},status={},approvalComments={}", id, status, approvalComments);
+        if (lifeGroupBuyService.updateStatus(id, status, approvalComments)) {
             return R.success("成功");
         }
         return R.fail("失败");

+ 9 - 3
alien-store/src/main/java/shop/alien/store/controller/ManagementInfoController.java

@@ -52,14 +52,20 @@ public class ManagementInfoController {
     @ApiImplicitParams({
             @ApiImplicitParam(name = "storeId", value = "店铺id", dataType = "String", paramType = "query"),
             @ApiImplicitParam(name = "page", value = "分页序数", dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "size", value = "分页长度", dataType = "String", paramType = "query")
+            @ApiImplicitParam(name = "size", value = "分页长度", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "orderNo", value = "订单号", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "userName", value = "用户名", dataType = "String", paramType = "query")
     })
     @GetMapping("/getStoreOrderDetail")
     public R<IPage<ManagementInfoVo>> getStoreOrderDetail(
             @RequestParam(value = "page", defaultValue = "1") int page,
             @RequestParam(value = "size", defaultValue = "10") int size,
-            @RequestParam(value = "storeId", required = false) String storeId) {
-        return R.data(managementInfoService.getStoreOrderDetail(page, size, storeId));
+            @RequestParam(value = "storeId", required = false) String storeId,
+            @RequestParam(value = "orderNo", required = false) String orderNo,
+            @RequestParam(value = "userId", required = false) String userId,
+            @RequestParam(value = "userName", required = false) String userName) {
+        return R.data(managementInfoService.getStoreOrderDetail(page, size, storeId, orderNo, userId, userName));
     }
 
     @ApiOperation("店铺详情账单统计")

+ 6 - 3
alien-store/src/main/java/shop/alien/store/controller/StoreIncomeDetailsRecordController.java

@@ -64,10 +64,13 @@ public class StoreIncomeDetailsRecordController {
     @GetMapping("/approveCashOut")
     public R<Boolean> approveCashOut(Integer cashOutId, String approveStatus, String failReason) {
         String s = storeIncomeDetailsRecordService.approveCashOut(cashOutId, approveStatus, failReason);
-        if ("success".equals(s)) {
-            return R.success("提现成功");
+        if ("付款失败".equals(s)) {
+            return R.fail("付款失败");
+        } else if("付款状态异常".equals(s)){
+            return R.fail("付款状态异常");
+        } else {
+            return R.success(s);
         }
-        return R.fail(s);
     }
 
     @ApiOperation("新增收入-手续费一单一算")

+ 26 - 13
alien-store/src/main/java/shop/alien/store/controller/WebSocketController.java

@@ -12,6 +12,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import shop.alien.entity.result.R;
 import shop.alien.store.config.WebSocketProcess;
+import shop.alien.util.common.JwtUtil;
+
+import java.util.Objects;
 
 /**
  * websocket消息推送
@@ -30,6 +33,29 @@ public class WebSocketController {
 
     private final WebSocketProcess webSocketProcess;
 
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("向指定客户端发消息")
+    @GetMapping(value = "/sendMsgToClientByPhoneId")
+    public R<Boolean> sendMsgToClientByPhoneId(String messageReceiverId, String webSocketVoStr) {
+        try {
+            log.info("WebSocketController.sendMsgToClientByPhoneId?messageReceiverId={}, webSocketVoStr={}", messageReceiverId, webSocketVoStr);
+            webSocketProcess.sendMessage(messageReceiverId, webSocketVoStr);
+            return R.success("发送成功");
+        } catch (Exception e) {
+            log.error("WebSocketController_sendMsgToClientById Error Mgs={}", e.getMessage());
+        }
+        return R.fail("发送失败");
+    }
+
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("socket轮询获取token状态")
+    @GetMapping(value = "/getTokenStatus")
+    public R<Boolean> getTokenStatus() {
+        String phoneId = Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getString("userType") + "_" + JwtUtil.getCurrentUserInfo().getString("phone");
+        log.info("WebSocketController.getTokenStatus()----------phoneId={}", phoneId);
+        return R.data(true);
+    }
+
 //    @ApiOperationSupport(order = 1)
 //    @ApiOperation("向指定客户端发消息")
 //    @GetMapping(value = "/sendMsgToClientByPhoneId")
@@ -59,19 +85,6 @@ public class WebSocketController {
 //        return R.fail("发送失败");
 //    }
 
-    @ApiOperationSupport(order = 1)
-    @ApiOperation("向指定客户端发消息")
-    @GetMapping(value = "/sendMsgToClientByPhoneId")
-    public R<Boolean> sendMsgToClientByPhoneId(String messageReceiverId, String webSocketVoStr) {
-        try {
-            log.info("WebSocketController.sendMsgToClientByPhoneId?messageReceiverId={}, webSocketVoStr={}", messageReceiverId, webSocketVoStr);
-            webSocketProcess.sendMessage(messageReceiverId, webSocketVoStr);
-            return R.success("发送成功");
-        } catch (Exception e) {
-            log.error("WebSocketController_sendMsgToClientById Error Mgs={}", e.getMessage());
-        }
-        return R.fail("发送失败");
-    }
 
 //    /**
 //     * 向指定客户端发消息

+ 2 - 0
alien-store/src/main/java/shop/alien/store/service/LifeBlacklistService.java

@@ -24,4 +24,6 @@ public interface LifeBlacklistService extends IService<LifeBlacklist> {
     Boolean isBlackListUser(LifeBlacklist lifeBlacklist);
 
     int cancelBlacklist(LifeBlacklist lifeBlacklist);
+
+    boolean hasBlackList(String otherSidePhoneId) throws Exception;
 }

+ 13 - 3
alien-store/src/main/java/shop/alien/store/service/LifeCouponService.java

@@ -2,6 +2,7 @@ package shop.alien.store.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.bind.annotation.RequestParam;
 import shop.alien.entity.store.EssentialHolidayComparison;
 import shop.alien.entity.store.LifeCoupon;
 import shop.alien.entity.store.vo.LifeCouponStatusVo;
@@ -15,18 +16,27 @@ public interface LifeCouponService extends IService<LifeCoupon> {
 
     boolean addOrUpdateCoupon(LifeCoupon lifeCoupon);
 
-    IPage<LifeCoupon> getCouponList(int page, int size, String storeId, String status, String name);
+    /**
+     * 修改库存数量
+     *
+     * @param id        主键
+     * @param singleQty 库存数量
+     * @return boolean
+     */
+    boolean updateCouponSingleQty(Integer id, Integer singleQty);
+
+    IPage<LifeCoupon> getCouponList(int page, int size, String storeId, String status, String name, Integer dataType);
 
     int updateCoupon(String id, Integer status);
 
-    Map<String,String> couponVerify(String storeId, String quanCode);
+    Map<String, String> couponVerify(String storeId, String quanCode);
 
     /**
      * 获取代金券状态
      */
     public LifeCouponStatusVo getCouponStatus(String couponId);
 
-    IPage<EssentialHolidayComparison> getHolidayList(int page, int size, String year,String openFlag, String holidayName);
+    IPage<EssentialHolidayComparison> getHolidayList(int page, int size, String year, String openFlag, String holidayName);
 
     boolean saveHoliday(EssentialHolidayComparison essentialHolidayComparison);
 

+ 1 - 1
alien-store/src/main/java/shop/alien/store/service/LifeGroupBuyService.java

@@ -19,7 +19,7 @@ public interface LifeGroupBuyService extends IService<LifeGroupBuyMain> {
 
     LifeGroupBuyThaliVo getThaliById(String id);
 
-    boolean updateStatus(String id,String status);
+    boolean updateStatus(String id,String status, String approvalComments);
 
     boolean delThaliById(String id,String groupType);
 

+ 1 - 1
alien-store/src/main/java/shop/alien/store/service/ManagementInfoService.java

@@ -22,7 +22,7 @@ public interface ManagementInfoService {
     /**
      * 获取店铺订单详情,根据id
      */
-    IPage<ManagementInfoVo> getStoreOrderDetail(int pageNo, int pageSize, String storeId);
+    IPage<ManagementInfoVo> getStoreOrderDetail(int pageNo, int pageSize, String storeId, String orderNo, String userId, String userName);
 
     /**
      * 获取提现申请列表

+ 19 - 0
alien-store/src/main/java/shop/alien/store/service/impl/LifeBlacklistServiceImpl.java

@@ -1,8 +1,10 @@
 package shop.alien.store.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import shop.alien.entity.store.LifeBlacklist;
@@ -16,10 +18,12 @@ import shop.alien.mapper.StoreImgMapper;
 import shop.alien.mapper.StoreUserMapper;
 import shop.alien.store.config.BaseRedisService;
 import shop.alien.store.service.LifeBlacklistService;
+import shop.alien.util.common.JwtUtil;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * <p>
@@ -30,6 +34,7 @@ import java.util.List;
  * @author ssk
  * @since 2025-04-30
  */
+@Slf4j
 @Service
 @RequiredArgsConstructor
 public class LifeBlacklistServiceImpl extends ServiceImpl<LifeBlacklistMapper, LifeBlacklist> implements LifeBlacklistService {
@@ -151,5 +156,19 @@ public class LifeBlacklistServiceImpl extends ServiceImpl<LifeBlacklistMapper, L
         return lifeBlacklistMapper.deleteById(black.getId());
     }
 
+    @Override
+    public boolean hasBlackList(String otherSidePhoneId) throws Exception {
+        try {
+            String phoneId = Objects.requireNonNull(JwtUtil.getCurrentUserInfo()).getString("userType") + "_" + JwtUtil.getCurrentUserInfo().getString("phone");
+            LambdaQueryWrapper<LifeBlacklist> wrapper = new LambdaQueryWrapper<>();
+            wrapper.apply("((blocker_phone_id='" + otherSidePhoneId + "' and blocked_phone_id='" + phoneId + "')" +
+                    " or (blocker_phone_id='" + phoneId + "' and blocked_phone_id='" + otherSidePhoneId + "'))");
+            return lifeBlacklistMapper.selectCount(wrapper) > 0;
+        } catch (Exception e) {
+            log.error("LifeBlacklistServiceImpl.hasBlackList() error={}", e.getMessage());
+            throw new Exception(e);
+        }
+    }
+
 
 }

+ 23 - 8
alien-store/src/main/java/shop/alien/store/service/impl/LifeCouponServiceImpl.java

@@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
-import org.apache.http.client.utils.DateUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
@@ -97,13 +96,29 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
         }
     }
 
+    /**
+     * 修改库存数量
+     *
+     * @param id        主键
+     * @param singleQty 库存数量
+     * @return boolean
+     */
     @Override
-    public IPage<LifeCoupon> getCouponList(int page, int size, String storeId, String status, String name) {
+    public boolean updateCouponSingleQty(Integer id, Integer singleQty) {
+        LifeCoupon lifeCoupon = new LifeCoupon();
+        lifeCoupon.setId(String.valueOf(id));
+        lifeCoupon.setSingleQty(singleQty);
+        return this.updateById(lifeCoupon);
+    }
+
+    @Override
+    public IPage<LifeCoupon> getCouponList(int page, int size, String storeId, String status, String name, Integer dataType) {
         LambdaUpdateWrapper<LifeCoupon> wrapper = new LambdaUpdateWrapper<>();
         wrapper.eq(storeId != null && !storeId.isEmpty(), LifeCoupon::getStoreId, storeId);
         wrapper.eq(status != null && !status.isEmpty(), LifeCoupon::getStatus, status);
         wrapper.like(name != null && !name.isEmpty(), LifeCoupon::getName, name);
         wrapper.eq(LifeCoupon::getType, 1);
+        wrapper.eq(LifeCoupon::getDataType, dataType);
         wrapper.orderByDesc(LifeCoupon::getCreatedTime);
         IPage<LifeCoupon> lifeCouponIPage = new Page<>(page, size);
         return lifeCouponMapper.selectPage(lifeCouponIPage, wrapper);
@@ -233,18 +248,18 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
     }
 
     @Override
-    public IPage<EssentialHolidayComparison> getHolidayList(int page, int size, String year,String openFlag,String holidayName) {
+    public IPage<EssentialHolidayComparison> getHolidayList(int page, int size, String year, String openFlag, String holidayName) {
         if (StringUtils.isEmpty(year)) {
             LambdaQueryWrapper<EssentialHolidayComparison> essentialHolidayComparisonLambdaQueryWrapper = new LambdaQueryWrapper<>();
             essentialHolidayComparisonLambdaQueryWrapper.eq(EssentialHolidayComparison::getDelFlag, 0).groupBy(EssentialHolidayComparison::getParticularYear).orderByDesc(EssentialHolidayComparison::getParticularYear);
             IPage<EssentialHolidayComparison> essentialHolidayComparisonIPage = new Page<>(page, size);
             return essentialHolidayComparisonMapper.selectPage(essentialHolidayComparisonIPage, essentialHolidayComparisonLambdaQueryWrapper);
-        }else {
+        } else {
             LambdaQueryWrapper<EssentialHolidayComparison> essentialHolidayComparisonLambdaQueryWrapper = new LambdaQueryWrapper<>();
             essentialHolidayComparisonLambdaQueryWrapper.eq(EssentialHolidayComparison::getDelFlag, 0)
-                    .eq(com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotEmpty(year),EssentialHolidayComparison::getParticularYear,year)
-                    .eq(com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotEmpty(openFlag),EssentialHolidayComparison::getOpenFlag,openFlag)
-                    .like(com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotEmpty(holidayName),EssentialHolidayComparison::getFestivalName,holidayName)
+                    .eq(com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotEmpty(year), EssentialHolidayComparison::getParticularYear, year)
+                    .eq(com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotEmpty(openFlag), EssentialHolidayComparison::getOpenFlag, openFlag)
+                    .like(com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotEmpty(holidayName), EssentialHolidayComparison::getFestivalName, holidayName)
                     .orderByAsc(EssentialHolidayComparison::getStartTime);
             IPage<EssentialHolidayComparison> essentialHolidayComparisonIPage = new Page<>(page, size);
             return essentialHolidayComparisonMapper.selectPage(essentialHolidayComparisonIPage, essentialHolidayComparisonLambdaQueryWrapper);
@@ -259,7 +274,7 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
             }
             essentialHolidayComparisonMapper.updateById(essentialHolidayComparison);
             return true;
-        }else {
+        } else {
             if (ObjectUtils.isNotEmpty(essentialHolidayComparison.getStartTime())) {
                 essentialHolidayComparison.setFestivalDate(essentialHolidayComparison.getStartTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
             }

+ 23 - 7
alien-store/src/main/java/shop/alien/store/service/impl/LifeDiscountCouponServiceImpl.java

@@ -94,9 +94,9 @@ public class LifeDiscountCouponServiceImpl extends ServiceImpl<LifeDiscountCoupo
             String specifiedDay = lifeDiscountCoupon.getSpecifiedDay();
             if(!StringUtils.isEmpty(specifiedDay)){
                 int sDay = Integer.parseInt(specifiedDay);
-                if(sDay > 0 && lifeDiscountCouponDto.getBeginGetDate() != null){
-                    Date beginGetDate = Date.from(lifeDiscountCouponDto.getBeginGetDate().atStartOfDay(ZoneId.systemDefault()).toInstant());
-                    Date validDate = addDaysToDateJava8(beginGetDate, sDay);
+                if(sDay > 0 && lifeDiscountCouponDto.getEndGetDate() != null){
+                    Date endGetDate = Date.from(lifeDiscountCouponDto.getEndGetDate().atStartOfDay(ZoneId.systemDefault()).toInstant());
+                    Date validDate = addDaysToDateJava8(endGetDate, sDay);
                     LocalDate validDateLocalDate = validDate.toInstant()
                             .atZone(ZoneId.systemDefault())
                             .toLocalDate();
@@ -189,9 +189,9 @@ public class LifeDiscountCouponServiceImpl extends ServiceImpl<LifeDiscountCoupo
             String specifiedDay = lifeDiscountCouponDto.getSpecifiedDay();
             if(!StringUtils.isEmpty(specifiedDay)){
                 int sDay = Integer.parseInt(specifiedDay);
-                if(sDay > 0 && lifeDiscountCouponDto.getBeginGetDate() != null) {
-                    Date beginGetDate = Date.from(lifeDiscountCouponDto.getBeginGetDate().atStartOfDay(ZoneId.systemDefault()).toInstant());
-                    Date validDate = addDaysToDateJava8(beginGetDate, sDay);
+                if(sDay > 0 && lifeDiscountCouponDto.getEndGetDate() != null) {
+                    Date endGetDate = Date.from(lifeDiscountCouponDto.getEndGetDate().atStartOfDay(ZoneId.systemDefault()).toInstant());
+                    Date validDate = addDaysToDateJava8(endGetDate, sDay);
                     LocalDate validDateLocalDate = validDate.toInstant()
                             .atZone(ZoneId.systemDefault())
                             .toLocalDate();
@@ -786,6 +786,14 @@ public class LifeDiscountCouponServiceImpl extends ServiceImpl<LifeDiscountCoupo
                     } else if (startResult >= 0 && endResult <= 0) {
                         lifeDiscountCouponVo.setStatus(Integer.parseInt(DiscountCouponEnum.UNDER_WAY.getValue()));
                     }
+                } else {
+                    if(lifeDiscountCoupon.getCouponStatus() == 0){
+                        //如果为草稿则状态为未开始
+                        lifeDiscountCouponVo.setStatus(Integer.parseInt(DiscountCouponEnum.HAVE_NOT_STARTED.getValue()));
+                    } else {
+                        // 开始结束时间为空,数据异常跳过
+                        continue;
+                    }
                 }
                 // 查询三个规则
                 List<LifeDiscountCouponUnavailableRules> discountCouponId = lifeDiscountCouponUnavailableRulesMapper.selectList(new QueryWrapper<LifeDiscountCouponUnavailableRules>().eq("discount_coupon_id", lifeDiscountCoupon.getId()));
@@ -855,9 +863,17 @@ public class LifeDiscountCouponServiceImpl extends ServiceImpl<LifeDiscountCoupo
                         record.setStatus(Integer.parseInt(DiscountCouponEnum.HAVE_NOT_STARTED.getValue()));
                     } else if (endResult > 0) {
                         record.setStatus(Integer.parseInt(DiscountCouponEnum.FINISHED.getValue()));
-                    } else if (startResult >= 0 && endResult <= 0) {
+                    } else {
                         record.setStatus(Integer.parseInt(DiscountCouponEnum.UNDER_WAY.getValue()));
                     }
+                } else {
+                    if(record.getCouponStatus() == 0){
+                        //如果为草稿则状态为未开始
+                        record.setStatus(Integer.parseInt(DiscountCouponEnum.HAVE_NOT_STARTED.getValue()));
+                    } else {
+                        // 开始结束时间为空,数据异常跳过
+                        continue;
+                    }
                 }
                 List<LifeDiscountCouponUnavailableRules> discountCouponId = lifeDiscountCouponUnavailableRulesMapper.selectList(new QueryWrapper<LifeDiscountCouponUnavailableRules>().eq("discount_coupon_id", record.getCouponId()));
                 Map<String, List<LifeDiscountCouponUnavailableRules>> collect = discountCouponId.stream().collect(Collectors.groupingBy(x -> x.getUnavailableRuleType()));

+ 2 - 2
alien-store/src/main/java/shop/alien/store/service/impl/LifeGroupBuyServiceImpl.java

@@ -135,8 +135,8 @@ public class LifeGroupBuyServiceImpl extends ServiceImpl<LifeGroupBuyMainMapper,
     }
 
     @Override
-    public boolean updateStatus(String id, String status) {
-        lifeGroupBuyMainMapper.update(null, new LambdaUpdateWrapper<LifeGroupBuyMain>().eq(LifeGroupBuyMain::getId, id).set(LifeGroupBuyMain::getStatus, status));
+    public boolean updateStatus(String id, String status, String approvalComments) {
+        lifeGroupBuyMainMapper.update(null, new LambdaUpdateWrapper<LifeGroupBuyMain>().eq(LifeGroupBuyMain::getId, id).set(LifeGroupBuyMain::getStatus, status).set(LifeGroupBuyMain::getApprovalComments, approvalComments));
         return true;
     }
 

+ 1 - 0
alien-store/src/main/java/shop/alien/store/service/impl/LifeMessageServiceImpl.java

@@ -434,6 +434,7 @@ public class LifeMessageServiceImpl extends ServiceImpl<LifeMessageMapper, LifeM
             messageWrapper.eq(LifeMessage::getReceiverId, receiverId);
             messageWrapper.eq(LifeMessage::getIsRead, 0);
             messageWrapper.notIn(LifeMessage::getSenderId, notDisturbIdsStr);
+            messageWrapper.apply("(instr(delete_phone_id, '" + receiverId + "') is null or instr(delete_phone_id, '" + receiverId + "') = 0)");
             int noReadMessageCount = lifeMessageMapper.selectCount(messageWrapper);
 
             // 查询未读通知数量

+ 118 - 28
alien-store/src/main/java/shop/alien/store/service/impl/ManagementInfoServiceImpl.java

@@ -10,16 +10,20 @@ import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Service;
 import shop.alien.entity.store.*;
 import shop.alien.entity.store.vo.ManagementInfoVo;
 import shop.alien.mapper.*;
 import shop.alien.store.service.ManagementInfoService;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
+import shop.alien.util.ali.AliOSSUtil;
+
+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.time.*;
@@ -53,6 +57,8 @@ public class ManagementInfoServiceImpl implements ManagementInfoService {
 
     private final StoreUserMapper storeUserMapper;
 
+    private final AliOSSUtil aliOSSUtil;
+
     @Override
     public IPage<ManagementInfo> getAllManagementInfo(int pageNo, int pageSize, String storeName) {
         IPage<LifeDiscountCoupon> iPage = new Page<>(pageNo, pageSize);
@@ -75,6 +81,7 @@ public class ManagementInfoServiceImpl implements ManagementInfoService {
             for (StoreIncomeDetailsRecord storeIncomeDetailsRecord : storeIncomeDetailsRecords) {
                 storeIncomeDetailsCount += storeIncomeDetailsRecord.getMoney();
             }
+            storeIncomeDetailsCount = Math.floor(storeIncomeDetailsCount/1000000*100)/100;
             managementInfo.setAccountFrozen(storeIncomeDetailsCount);
         }
         return allManagementInfo;
@@ -113,38 +120,54 @@ public class ManagementInfoServiceImpl implements ManagementInfoService {
         ManagementInfoVo allWrittenOffAmount = managementInfoMapper.getAllWrittenOffAmount(startDate, endDate, null);
         //查询总提现金额
         ManagementInfoVo totalWithdrawalAmount = managementInfoMapper.getTotalWithdrawalAmount(startDate, endDate, null);
-        //查询已解冻金额
+        //查询已提现金额(根据时间查询)
+        ManagementInfoVo withdrawalAmount = managementInfoMapper.getWithdrawalAmount(startDate, endDate, null);
+        //查询总订单金额(根据时间查询)
+        ManagementInfoVo orderAmount = managementInfoMapper.getOrderAmount(startDate, endDate, null);
+        //查询总交易金额(根据时间查询)
+        ManagementInfoVo transactionAmount = managementInfoMapper.getTransactionAmount(startDate, endDate, null);
+        //查询总核销金额(根据时间查询)
+        ManagementInfoVo writtenOffAmount = managementInfoMapper.getWrittenOffAmount(startDate, endDate, null);
+
+        //查询已冻结金额
         List<StoreIncomeDetailsRecord> storeIncomeDetailsRecords = storeIncomeDetailsRecordMapper
                 .selectList(
                         new LambdaQueryWrapper<StoreIncomeDetailsRecord>()
                                 .gt(StoreIncomeDetailsRecord::getCreatedTime, threeDaysAgoMidnight)
+                                .gt(StoreIncomeDetailsRecord::getCreatedTime, startDate)
+                                .lt(StoreIncomeDetailsRecord::getCreatedTime, endDate)
                 );
         Double storeIncomeDetailsCount = 0d;
         for (StoreIncomeDetailsRecord storeIncomeDetailsRecord : storeIncomeDetailsRecords) {
             storeIncomeDetailsCount += storeIncomeDetailsRecord.getMoney();
         }
+
         //存入账单排名
         result.put("billingRanking", billingRanking);
         //存入已付款金额
-        result.put("amountPaid", amountPaid.getAmountPaid());
-        //存入总交易金额
-        result.put("totalTransactionAmount", totalTransactionAmount.getTotalTransactionAmount());
-        //存入交易笔数
-        result.put("transactionNumber", transactionNumber.getTransactionNumber());
+        result.put("amountPaid", Math.floor(amountPaid.getAmountPaid()/10000*100)/100);
+
+        //存入冻结未提现金额
+        result.put("unwithdrawnAmountsFrozen", Math.floor((withdrawalAmount.getTotalWithdrawalAmount() - storeIncomeDetailsCount)/10000*100)/100);
+        //存入未解冻金额
+        result.put("freezeAmounts", Math.floor(storeIncomeDetailsCount/10000*100)/100);
+        // 已提现金额
+        result.put("withdrawalAmount", Math.floor(withdrawalAmount.getTotalWithdrawalAmount()/10000*100)/100);
         //存入未核销金额
-        result.put("amountNotWrittenOff", allOrderAmount.getAllOrderAmount() - allWrittenOffAmount.getAllWrittenOffAmount());
+        result.put("amountNotWrittenOff", Math.floor((orderAmount.getAllOrderAmount() - writtenOffAmount.getAllWrittenOffAmount())/10000*100)/100);
+        //存入交易笔数
+        result.put("transactionNumber", Math.floor(transactionNumber.getTransactionNumber()/10000*100)/100);
         //存入已核销金额
-        result.put("amountWrittenOff", allWrittenOffAmount.getAllWrittenOffAmount());
-        //存入已冻结未提现金额
-        result.put("unwithdrawnAmountsFrozen", totalWithdrawalAmount.getTotalWithdrawalAmount() - storeIncomeDetailsCount);
-
+        result.put("amountWrittenOff", Math.floor(writtenOffAmount.getAllWrittenOffAmount()/10000*100)/100);
+        //存入总交易金额
+        result.put("totalTransactionAmount", Math.floor(transactionAmount.getTotalTransactionAmount()/10000*100)/100);
         return result;
     }
 
     @Override
-    public IPage<ManagementInfoVo> getStoreOrderDetail(int pageNo, int pageSize, String storeId) {
+    public IPage<ManagementInfoVo> getStoreOrderDetail(int pageNo, int pageSize, String storeId, String orderNo, String userId, String userName) {
         IPage<ManagementInfoVo> iPage = new Page<>(pageNo, pageSize);
-        IPage<ManagementInfoVo> storeOrderDetail = managementInfoMapper.getStoreOrderDetail(iPage, storeId);
+        IPage<ManagementInfoVo> storeOrderDetail = managementInfoMapper.getStoreOrderDetail(iPage, storeId, orderNo, userId, userName);
         return storeOrderDetail;
     }
 
@@ -157,6 +180,13 @@ public class ManagementInfoServiceImpl implements ManagementInfoService {
 
     @Override
     public HashMap<String, Object> storeDetailBillingStatistics(String storeId) {
+        // 获取当前日期
+        LocalDate currentDate = LocalDate.now();
+        // 计算三天前的日期
+        LocalDate threeDaysAgo = currentDate.minusDays(3);
+        // 设置时间为当天的 0 点
+        LocalDateTime threeDaysAgoMidnight = threeDaysAgo.atStartOfDay();
+
         HashMap<String, Object> result = new HashMap<>();
         //查询总交易金额
         ManagementInfoVo allOrderAmount = managementInfoMapper.getAllOrderAmount(null, null, storeId);
@@ -167,15 +197,39 @@ public class ManagementInfoServiceImpl implements ManagementInfoService {
         //查询核验金额
         ManagementInfoVo verificationAmount = managementInfoMapper.getVerificationAmount(storeId);
 
+        //查询已提现金额
+        ManagementInfoVo totalWithdrawalAmount = managementInfoMapper.getTotalWithdrawalAmount(null, null, storeId);
+
+        //查询冻结金额
+        List<StoreIncomeDetailsRecord> storeIncomeDetailsRecords = storeIncomeDetailsRecordMapper
+                .selectList(
+                        new LambdaQueryWrapper<StoreIncomeDetailsRecord>()
+                                .gt(StoreIncomeDetailsRecord::getCreatedTime, threeDaysAgoMidnight)
+                                .eq(StoreIncomeDetailsRecord::getStoreId, storeId)
+                );
+        Double storeIncomeDetailsCount = 0d;
+        for (StoreIncomeDetailsRecord storeIncomeDetailsRecord : storeIncomeDetailsRecords) {
+            storeIncomeDetailsCount += storeIncomeDetailsRecord.getMoney();
+        }
+
+
         //存入已付款金额
-        result.put("allOrderAmount", allOrderAmount.getAllOrderAmount());
+        result.put("allOrderAmount", Math.floor(allOrderAmount.getAllOrderAmount()/10000*100)/100);
         //存入总交易金额
         result.put("userCount", userCount.getUserCount());
         //存入交易笔数
-        result.put("orderTransactionNumber", orderTransactionNumber.getOrderTransactionNumber());
-        //存入交易笔数
-        result.put("verificationAmount", verificationAmount.getVerificationAmount());
+        result.put("orderTransactionNumber", Math.floor(orderTransactionNumber.getOrderTransactionNumber()/10000*100)/100);
+        //存入核验金额
+        result.put("verificationAmount", Math.floor(verificationAmount.getVerificationAmount()/10000*100)/100);
+
+        //已提现金额
+        result.put("totalWithdrawalAmount", Math.floor(totalWithdrawalAmount.getTotalWithdrawalAmount()/10000*100)/100);
 
+        //冻结金额
+        result.put("freezeAmounts", Math.floor(storeIncomeDetailsCount/10000*100)/100);
+
+        //冻结待提现金额
+        result.put("unwithdrawnAmountsFrozen", Math.floor(storeIncomeDetailsCount/10000*100)/100);
         return result;
     }
 
@@ -504,7 +558,16 @@ public class ManagementInfoServiceImpl implements ManagementInfoService {
     }
 
     public String generateReceiptFile(String storeName, String storeAccount, String storePhone, String invoiceAmount, String amountPaid, String paymentTime, String fileName) {
-        String filePath = "";
+        String filePath = excelPath + excelGeneratePath + fileName + ".xlsx";
+        String osName = System.getProperty("os.name").toLowerCase();
+        if (osName.contains("win")) {
+            filePath = "d:/" + filePath;
+            String substring = filePath.substring(0, filePath.lastIndexOf("/"));
+            File dir = new File(substring);
+            if (!dir.exists()) {
+                dir.mkdirs();
+            }
+        }
         // 创建 File 对象
         File file = new File(excelPath + excelGeneratePath + fileName + ".xlsx");
         // 判断文件是否存在
@@ -512,8 +575,8 @@ public class ManagementInfoServiceImpl implements ManagementInfoService {
             filePath = fileUrl + "excel" + excelGeneratePath + fileName + ".xlsx";
             return filePath;
         }
-
-        try (FileInputStream fis = new FileInputStream(excelPath + excelClearingReceipt);
+        String templateUrl = fileUrl +"excel/" +excelClearingReceipt;
+        try (FileInputStream fis = toFileInputStream(downloadAsInputStream(templateUrl));
              Workbook workbook = new XSSFWorkbook(fis)) {
             // 获取第一个工作表
             Sheet sheet = workbook.getSheetAt(0);
@@ -581,14 +644,41 @@ public class ManagementInfoServiceImpl implements ManagementInfoService {
                 sheet.autoSizeColumn(i);
             }
             // 保存填充后的工作簿到本地文件
-            try (FileOutputStream fos = new FileOutputStream(excelPath + excelGeneratePath + fileName + ".xlsx")) {
+//            try (FileOutputStream fos = new FileOutputStream(excelPath + excelGeneratePath + fileName + ".xlsx")) {
+//                workbook.write(fos);
+//                filePath = fileUrl + "excel" + excelGeneratePath + fileName + ".xlsx";
+//            }
+            try (FileOutputStream fos = new FileOutputStream(filePath)) {
                 workbook.write(fos);
-                filePath = fileUrl + "excel" + excelGeneratePath + fileName + ".xlsx";
             }
+
         } catch (IOException e) {
             e.printStackTrace();
         }
-        return filePath;
+
+        return aliOSSUtil.uploadFile(new File(filePath), "excel/" + fileName + ".xlsx");
+    }
+
+    public InputStream downloadAsInputStream(String fileUrl) throws IOException {
+        URL url = new URL(fileUrl);
+        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+        connection.setRequestMethod("GET");
+        return connection.getInputStream(); // 直接返回 HTTP 流
+    }
+    public static FileInputStream toFileInputStream(InputStream inputStream) throws IOException {
+        Path tempFile = Files.createTempFile("temp-", ".tmp");
+        tempFile.toFile().deleteOnExit();
+        try (InputStream is = inputStream) {
+            Files.copy(is, tempFile, StandardCopyOption.REPLACE_EXISTING);
+        }
+        return new FileInputStream(tempFile.toFile());
+    }
+    public FileInputStream getExcelTemplate() throws IOException {
+        // 1. 通过 ClassPathResource 获取文件
+        ClassPathResource resource = new ClassPathResource("templates/clearing_receipt.xlsx");
+        // 2. 转换为 FileInputStream(仅在文件系统有效,JAR 内会报错)
+        File file = resource.getFile(); // 注意:JAR 中会抛出 FileNotFoundException
+        return new FileInputStream(file);
     }
 
 //    public static void main(String[] args) {

+ 10 - 14
alien-store/src/main/java/shop/alien/store/service/impl/PlatformStoreCouponServiceImpl.java

@@ -10,11 +10,6 @@ import lombok.RequiredArgsConstructor;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
-import shop.alien.entity.store.LifeCoupon;
-import shop.alien.entity.store.LifeGroupBuyMain;
-import shop.alien.entity.store.StoreImg;
-import shop.alien.entity.store.StoreInfo;
-import shop.alien.entity.store.excelVo.LifeUserViolationExcelVO;
 import shop.alien.entity.store.*;
 import shop.alien.entity.store.excelVo.StoreCouponStatusVo;
 import shop.alien.entity.store.excelVo.util.ExcelGenerator;
@@ -66,6 +61,7 @@ public class PlatformStoreCouponServiceImpl implements PlatformStoreCouponServic
         wrapper.eq(StringUtils.isNotEmpty(status), "coupon.status", status);
         wrapper.eq(StringUtils.isNotEmpty(type), "coupon.type", type);
         wrapper.eq("coupon.delete_flag", 0);
+        wrapper.eq("coupon.data_type", 0);
         wrapper.eq("store.delete_flag", 0);
         wrapper.eq("user.delete_flag", 0);
         wrapper.like(StringUtils.isNotEmpty(createdTime), "coupon.created_time", createdTime);
@@ -81,7 +77,7 @@ public class PlatformStoreCouponServiceImpl implements PlatformStoreCouponServic
             } else {
                 item.setStatusName("已通过");
             }
-// expiredState 赋值逻辑(修正版)
+            // expiredState 赋值逻辑(修正版)
             LocalDateTime now = LocalDateTime.now(); // 获取当前时间
             Date endDate = item.getEndDate();
             if (endDate != null) {
@@ -507,8 +503,6 @@ public class PlatformStoreCouponServiceImpl implements PlatformStoreCouponServic
         LocalDateTime nowDate = LocalDateTime.now(); // 获取当前时间
 
         // 格式化日期
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-        String formattedEndDate = "";
         LocalDateTime endDateTime = lifeGroupBuyMainVo.getEndTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
         // 调整结束时间为前一天的23:59:59
         endDateTime = endDateTime.minusDays(1).withHour(23).withMinute(59).withSecond(59);
@@ -536,12 +530,14 @@ public class PlatformStoreCouponServiceImpl implements PlatformStoreCouponServic
             lifeGroupBuyMainVo.setExpiredState("1"); // 当前时间超过 endDate → 已到期
         }
         // 不可用日期
-        String afterSemicolon = lifeGroupBuyMain.getDisableDateValue().split(";")[1];
-        if (StringUtils.isNotEmpty(afterSemicolon)) {
-            List<String> collectUnavailableDate = Arrays.stream(afterSemicolon.split(",")).map(String::trim).collect(Collectors.toList());
-            if (CollectionUtils.isNotEmpty(collectUnavailableDate)) {
-                List<EssentialHolidayComparison> essentialHolidayComparisons = essentialHolidayComparisonMapper.selectList(new LambdaQueryWrapper<EssentialHolidayComparison>().in(EssentialHolidayComparison::getId, collectUnavailableDate));
-                lifeGroupBuyMainVo.setEssentialHolidayComparisonList(essentialHolidayComparisons);
+        if(lifeGroupBuyMainVo.getDisableDateType()==1){
+            String afterSemicolon = lifeGroupBuyMain.getDisableDateValue().split(";")[1];
+            if (StringUtils.isNotEmpty(afterSemicolon)) {
+                List<String> collectUnavailableDate = Arrays.stream(afterSemicolon.split(",")).map(String::trim).collect(Collectors.toList());
+                if (CollectionUtils.isNotEmpty(collectUnavailableDate)) {
+                    List<EssentialHolidayComparison> essentialHolidayComparisons = essentialHolidayComparisonMapper.selectList(new LambdaQueryWrapper<EssentialHolidayComparison>().in(EssentialHolidayComparison::getId, collectUnavailableDate));
+                    lifeGroupBuyMainVo.setEssentialHolidayComparisonList(essentialHolidayComparisons);
+                }
             }
         }
         return lifeGroupBuyMainVo;

+ 12 - 2
alien-store/src/main/java/shop/alien/store/service/impl/StoreIncomeDetailsRecordServiceImpl.java

@@ -216,6 +216,9 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
     public String approveCashOut(Integer cashOutId, String approveStatus, String failReason) {
         if (cashOutId != null && cashOutId > 0 && StringUtils.isNotBlank(approveStatus)) {
             StoreCashOutRecord storeCashOutRecord = storeCashOutRecordMapper.selectById(cashOutId);
+            if(!(storeCashOutRecord.getPaymentStatus() == 3)){
+                return "付款状态异常";
+            }
             if (approveStatus.equals("0")) {
                 //同意,开始提现
                 Integer storeUserId = storeCashOutRecord.getStoreUserId();
@@ -235,19 +238,25 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
                     storeCashOutRecord.setPaymentStatus(1);//提现成功
                     storeCashOutRecord.setApproveTime(new Date());// 审批时间
                     storeCashOutRecord.setPayDate(new Date());//支付时间
-
+                    storeCashOutRecord.setPaymentDate(new Date());//支付到账时间
                     //减少账户余额
                     storeUserMapper.updateById(new StoreUser(storeCashOutRecord.getStoreId(), storeUser.getMoney() - storeCashOutRecord.getMoney() - storeCashOutRecord.getCommission()));
+                    storeCashOutRecordMapper.updateById(storeCashOutRecord);
+                    return "付款成功";
+
                 } else {
                     // 提现失败
                     storeCashOutRecord.setPaymentStatus(2);
                     storeCashOutRecord.setApproveTime(new Date());// 审批时间
                     storeCashOutRecord.setFailReason("支付失败");
+                    storeCashOutRecord.setPayDate(new Date());//支付时间
+                    storeCashOutRecordMapper.updateById(storeCashOutRecord);
+                    return "付款失败";
                 }
-                storeCashOutRecordMapper.updateById(storeCashOutRecord);
             } else {
                 storeCashOutRecord.setPaymentStatus(4);
                 storeCashOutRecord.setFailReason(failReason);
+                storeCashOutRecord.setApproveTime(new Date());// 审批时间
                 storeCashOutRecordMapper.updateById(storeCashOutRecord);
                 // 拒绝将账单中的提现记录置空
                 LambdaUpdateWrapper<StoreIncomeDetailsRecord> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
@@ -255,6 +264,7 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
                         .eq(StoreIncomeDetailsRecord::getCashOutId, storeCashOutRecord.getId())
                         .set(StoreIncomeDetailsRecord::getCashOutId, "");
                  int result = storeIncomeDetailsRecordMapper.updateByCashOutId(storeCashOutRecord.getStoreId(), storeCashOutRecord.getId());
+                return "已拒绝";
             }
         }
         return "审批成功";

+ 11 - 11
alien-store/src/main/java/shop/alien/store/service/impl/StoreInfoServiceImpl.java

@@ -939,22 +939,22 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
         result.setCouponList(quanVoList);
 
         // 获取店铺团购
-        LambdaUpdateWrapper<LifeCoupon> tuangouWrapper = new LambdaUpdateWrapper<>();
-        tuangouWrapper.eq(LifeCoupon::getStoreId, storeId).eq(LifeCoupon::getStatus, 1).eq(LifeCoupon::getType, 2).orderByDesc(LifeCoupon::getCreatedTime);
-        List<LifeCoupon> tuangouList = lifeCouponMapper.selectList(tuangouWrapper);
-        List<LifeCouponVo> tuangouVOList = new ArrayList<>();
-        for (LifeCoupon lifeCoupon : tuangouList) {
-            LifeCouponVo lifeCouponVo = new LifeCouponVo();
-            BeanUtils.copyProperties(lifeCoupon, lifeCouponVo);
-            if (StringUtils.isNotEmpty(lifeCoupon.getImagePath())) {
-                List<String> ids = Arrays.stream(lifeCoupon.getImagePath().split(",")).map(String::trim).collect(Collectors.toList());
+        LambdaUpdateWrapper<LifeGroupBuyMain> tuangouWrapper = new LambdaUpdateWrapper<>();
+        tuangouWrapper.eq(LifeGroupBuyMain::getStoreId, storeId).eq(LifeGroupBuyMain::getStatus, 5).orderByDesc(LifeGroupBuyMain::getCreatedTime);
+        List<LifeGroupBuyMain> tuangouList = lifeGroupBuyMainMapper.selectList(tuangouWrapper);
+        List<LifeGroupBuyMainVo> tuangouVOList = new ArrayList<>();
+        for (LifeGroupBuyMain lifeGroupBuyMain : tuangouList) {
+            LifeGroupBuyMainVo lifeGroupBuyMainVo = new LifeGroupBuyMainVo();
+            BeanUtils.copyProperties(lifeGroupBuyMain, lifeGroupBuyMainVo);
+            if (StringUtils.isNotEmpty(lifeGroupBuyMain.getImageId())) {
+                List<String> ids = Arrays.stream(lifeGroupBuyMain.getImageId().split(",")).map(String::trim).collect(Collectors.toList());
                 List<StoreImg> imgList = storeImgMapper.selectList(new LambdaQueryWrapper<StoreImg>().in(StoreImg::getId, ids));
                 if (imgList != null) {
                     String imgs = imgList.stream().map(StoreImg::getImgUrl).collect(Collectors.joining(","));
-                    lifeCouponVo.setImgs(imgs);
+                    lifeGroupBuyMainVo.setImageId(imgs);
                 }
             }
-            tuangouVOList.add(lifeCouponVo);
+            tuangouVOList.add(lifeGroupBuyMainVo);
         }
         result.setTuangouList(tuangouVOList);