From 996b2f16afaa271ce8aad6abf6858aa5db503eb3 Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期六, 25 四月 2026 14:07:34 +0800
Subject: [PATCH] 代码生成

---
 server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java |  246 ++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 231 insertions(+), 15 deletions(-)

diff --git a/server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java b/server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java
index cd636c8..ff79a7e 100644
--- a/server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java
+++ b/server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java
@@ -14,6 +14,7 @@
 import com.doumee.core.utils.Utils;
 import com.doumee.biz.system.AreasBiz;
 import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.utils.aliyun.AliSmsService;
 import com.doumee.dao.business.MemberMapper;
 import com.doumee.dao.business.MultifileMapper;
 import com.doumee.dao.business.OrdersMapper;
@@ -32,9 +33,13 @@
 import com.doumee.dao.vo.ShopCenterVO;
 import com.doumee.dao.vo.ShopLoginVO;
 import com.doumee.dao.vo.ShopNearbyVO;
+import com.doumee.dao.vo.ShopSalesStatsVO;
 import com.doumee.dao.vo.ShopWebDetailVO;
 import com.doumee.service.business.AreasService;
 import com.doumee.service.business.ShopInfoService;
+import com.doumee.dao.business.SmsrecordMapper;
+import com.doumee.dao.business.model.Smsrecord;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.RandomStringUtils;
@@ -51,6 +56,7 @@
  * @author rk
  * @date 2026/04/08
  */
+@Slf4j
 @Service
 public class ShopInfoServiceImpl implements ShopInfoService {
 
@@ -83,6 +89,9 @@
 
     @Autowired
     private AreasService areasService;
+
+    @Autowired
+    private SmsrecordMapper smsrecordMapper;
     @Override
     public Integer create(ShopInfo shopInfo) {
         shopInfoMapper.insert(shopInfo);
@@ -196,6 +205,9 @@
         }
         if (pageWrap.getModel().getAreaId() != null) {
             queryWrapper.lambda().eq(ShopInfo::getAreaId, pageWrap.getModel().getAreaId());
+        }
+        if (pageWrap.getModel().getAddress() != null) {
+            queryWrapper.lambda().like(ShopInfo::getAddress, pageWrap.getModel().getAddress());
         }
         if (pageWrap.getModel().getAuditStatus() != null) {
             queryWrapper.lambda().eq(ShopInfo::getAuditStatus, pageWrap.getModel().getAuditStatus());
@@ -319,6 +331,8 @@
             existing.setAuditTime(null);
             existing.setAuditUserId(null);
             existing.setAuditStatus(Constants.ZERO);
+            // 璇诲彇鎶奸噾閲戦
+            setDepositAmountFromPricingRule(existing);
             shopInfoMapper.updateById(existing);
             shopId = existing.getId();
         } else {
@@ -351,6 +365,8 @@
             shopInfo.setCreateTime(now);
             shopInfo.setUpdateTime(now);
             shopInfo.setRegionMemberId(member.getId());
+            // 璇诲彇鎶奸噾閲戦
+            setDepositAmountFromPricingRule(shopInfo);
             shopInfoMapper.insert(shopInfo);
             shopId = shopInfo.getId();
         }
@@ -444,17 +460,27 @@
                 }
             }
 
-            // 3. 浠嶱ricingRule璇诲彇鎶奸噾閲戦
-            PricingRule pricingRule = pricingRuleMapper.selectOne(new QueryWrapper<PricingRule>().lambda()
-                    .eq(PricingRule::getDeleted, Constants.ZERO)
-                    .eq(PricingRule::getType, Constants.THREE)
-                    .eq(PricingRule::getFieldA, String.valueOf(shopInfo.getCompanyType()))
-                    .last("limit 1"));
-            if (pricingRule != null && StringUtils.isNotBlank(pricingRule.getFieldB())) {
-                shopInfo.setDepositAmount(Long.parseLong(pricingRule.getFieldB()));
-            }
+            // 3. 浠嶱ricingRule璇诲彇鎶奸噾閲戦锛堝鎵规椂鏇存柊锛�
+            setDepositAmountFromPricingRule(shopInfo);
         }
         shopInfoMapper.updateById(shopInfo);
+
+        // 鐭俊閫氱煡
+        if (Constants.equalsInteger(newAuditStatus, Constants.ONE)) {
+            // 瀹℃牳閫氳繃 鈫� 閫氱煡缂寸撼鎶奸噾
+            String depositMoney = shopInfo.getDepositAmount() != null
+                    ? String.valueOf(shopInfo.getDepositAmount() / 100.0) : "0";
+            sendSmsNotify(shopInfo.getTelephone(),
+                    Constants.SmsNotify.SHOP_AUTH_APPROVED_DEPOSIT,
+                    "storeName", shopInfo.getName(),
+                    "money", depositMoney);
+        } else if (Constants.equalsInteger(newAuditStatus, Constants.TWO)) {
+            // 瀹℃牳椹冲洖
+            sendSmsNotify(shopInfo.getTelephone(),
+                    Constants.SmsNotify.SHOP_AUTH_REJECTED,
+                    "storeName", shopInfo.getName(),
+                    "reason", auditDTO.getAuditRemark() != null ? auditDTO.getAuditRemark() : "");
+        }
     }
 
     @Override
@@ -731,6 +757,13 @@
             }
         }
 
+        // 闂ㄥ簵澶村儚锛氫紭鍏堜娇鐢� coverImg锛屼负绌哄垯鍙栭棬澶寸収绗竴寮�
+        if (StringUtils.isNotBlank(shopInfo.getCoverImg())) {
+            vo.setShopAvatar(imgPrefix + shopInfo.getCoverImg());
+        } else if (!CollectionUtils.isEmpty(vo.getStoreFrontImgUrls())) {
+            vo.setShopAvatar(vo.getStoreFrontImgUrls().get(0));
+        }
+
         return vo;
     }
 
@@ -880,8 +913,8 @@
     }
 
     @Override
-    public ShopInfoMaintainDTO getShopMaintainInfo(Integer memberId) {
-        ShopInfo shop = shopInfoMapper.selectById(memberId);
+    public ShopInfoMaintainDTO getShopMaintainInfo(Integer shopId) {
+        ShopInfo shop = shopInfoMapper.selectById(shopId);
         if (Objects.isNull(shop) || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) {
             return null;
         }
@@ -893,6 +926,10 @@
         dto.setDeliveryArea(shop.getDeliveryArea());
         dto.setShopHours(shop.getShopHours());
         dto.setBusinessType(shop.getBusinessType());
+        // 澶村儚鍏ㄨ矾寰�
+        if (StringUtils.isNotBlank(shop.getCoverImg())) {
+            dto.setCoverImgUrl(getShopPrefix() + shop.getCoverImg());
+        }
         return dto;
     }
 
@@ -996,6 +1033,106 @@
                 .eq(Orders::getDeleted, Constants.ZERO)
                 .in(Orders::getStatus, Constants.OrderStatus.delivering.getStatus(), Constants.OrderStatus.arrived.getStatus()));
         vo.setWaitReceiveCount(waitReceiveCount.intValue());
+        // 鏀粯瀹濇彁鐜拌处鍙�
+        vo.setAliAccount(shop.getAliAccount());
+        vo.setAliName(shop.getAliName());
+        return vo;
+    }
+
+    @Override
+    public ShopSalesStatsVO getShopSalesStats(Integer shopId, Integer period) {
+        // 璁$畻鏃堕棿鑼冨洿 0=浠婃棩 1=鏈湀 2=涓婃湀
+        Calendar cal = Calendar.getInstance();
+        Date startTime;
+        Date endTime;
+
+        if (Constants.equalsInteger(period, 2)) {
+            // 涓婃湀锛氫笂鏈�1鍙�00:00:00 ~ 鏈湀1鍙�00:00:00
+            cal.set(Calendar.DAY_OF_MONTH, 1);
+            cal.set(Calendar.HOUR_OF_DAY, 0);
+            cal.set(Calendar.MINUTE, 0);
+            cal.set(Calendar.SECOND, 0);
+            cal.set(Calendar.MILLISECOND, 0);
+            endTime = cal.getTime();
+            cal.add(Calendar.MONTH, -1);
+            startTime = cal.getTime();
+        } else if (Constants.equalsInteger(period, 1)) {
+            // 鏈湀锛氭湰鏈�1鍙�00:00:00 ~ 涓嬫湀1鍙�00:00:00
+            cal.set(Calendar.DAY_OF_MONTH, 1);
+            cal.set(Calendar.HOUR_OF_DAY, 0);
+            cal.set(Calendar.MINUTE, 0);
+            cal.set(Calendar.SECOND, 0);
+            cal.set(Calendar.MILLISECOND, 0);
+            startTime = cal.getTime();
+            cal.add(Calendar.MONTH, 1);
+            endTime = cal.getTime();
+        } else {
+            // 浠婃棩锛氫粖澶�00:00:00 ~ 鏄庡ぉ00:00:00
+            cal.set(Calendar.HOUR_OF_DAY, 0);
+            cal.set(Calendar.MINUTE, 0);
+            cal.set(Calendar.SECOND, 0);
+            cal.set(Calendar.MILLISECOND, 0);
+            startTime = cal.getTime();
+            cal.add(Calendar.DAY_OF_MONTH, 1);
+            endTime = cal.getTime();
+        }
+
+        ShopSalesStatsVO vo = new ShopSalesStatsVO();
+
+        // 1. 閿�鍞 + 璁㈠崟鏁帮細鎸夎鍗曞垱寤烘椂闂达紝瀛樹欢闂ㄥ簵鎴栧彇浠堕棬搴楁槸鏈棬搴�
+        // 瀛樹欢闂ㄥ簵
+        List<Orders> depositSalesOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .ge(Orders::getCreateTime, startTime)
+                .lt(Orders::getCreateTime, endTime)
+                .eq(Orders::getDepositShopId, shopId));
+        // 鍙栦欢闂ㄥ簵
+        List<Orders> takeSalesOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .ge(Orders::getCreateTime, startTime)
+                .lt(Orders::getCreateTime, endTime)
+                .eq(Orders::getTakeShopId, shopId));
+        long salesAmount = depositSalesOrders.stream().mapToLong(o -> o.getTotalAmount() != null ? o.getTotalAmount() : 0L).sum()
+                + takeSalesOrders.stream().mapToLong(o -> o.getTotalAmount() != null ? o.getTotalAmount() : 0L).sum();
+        vo.setSalesAmount(salesAmount);
+        vo.setOrderCount(depositSalesOrders.size() + takeSalesOrders.size());
+
+        // 2. 缁撶畻鍒╂鼎锛氭寜缁撶畻鏃堕棿锛屾牴鎹棬搴楄鑹插彇depositShopFee鎴杢akeShopFee
+        // 瀛樹欢闂ㄥ簵 = 鏈棬搴� 鐨勮鍗曪紝鍙� depositShopFee
+        List<Orders> depositSettleOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .eq(Orders::getSettlementStatus, Constants.ONE)
+                .ge(Orders::getSettlementTime, startTime)
+                .lt(Orders::getSettlementTime, endTime)
+                .eq(Orders::getDepositShopId, shopId));
+        // 鍙栦欢闂ㄥ簵 = 鏈棬搴� 鐨勮鍗曪紝鍙� takeShopFee
+        List<Orders> takeSettleOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .eq(Orders::getSettlementStatus, Constants.ONE)
+                .ge(Orders::getSettlementTime, startTime)
+                .lt(Orders::getSettlementTime, endTime)
+                .eq(Orders::getTakeShopId, shopId));
+        long depositFee = depositSettleOrders.stream()
+                .mapToLong(o -> o.getDepositShopFee() != null ? o.getDepositShopFee() : 0L).sum();
+        long takeFee = takeSettleOrders.stream()
+                .mapToLong(o -> o.getTakeShopFee() != null ? o.getTakeShopFee() : 0L).sum();
+        vo.setSettlementProfit(depositFee + takeFee);
+
+        // 3. 鍦ㄥ簱璁㈠崟鏁�
+        // 3.1 瀛樹欢闂ㄥ簵=鏈棬搴楋紝status in (2宸插瘎瀛�, 5寰呭彇浠�)
+        Long depositStorageCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .eq(Orders::getDepositShopId, shopId)
+                .in(Orders::getStatus,
+                        Constants.OrderStatus.deposited.getStatus(),
+                        Constants.OrderStatus.arrived.getStatus()));
+        // 3.2 鍙栦欢闂ㄥ簵=鏈棬搴楋紝status = 5寰呭彇浠�
+        Long takeStorageCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda()
+                .eq(Orders::getDeleted, Constants.ZERO)
+                .eq(Orders::getTakeShopId, shopId)
+                .eq(Orders::getStatus, Constants.OrderStatus.arrived.getStatus()));
+        vo.setStorageCount(depositStorageCount.intValue() + takeStorageCount.intValue());
+
         return vo;
     }
 
@@ -1059,12 +1196,13 @@
     }
 
     @Override
-    public ShopLoginVO shopSilentLogin(String openid) {
-        if (StringUtils.isBlank(openid)) {
-            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "openid涓嶈兘涓虹┖");
+    public ShopLoginVO shopSilentLogin(Integer memberId) {
+        Member member = memberMapper.selectById(memberId);
+        if(Objects.isNull(member)||StringUtils.isBlank(member.getOpenid())){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "褰撳墠鐧诲綍浼氬憳韬唤寮傚父,璇疯仈绯荤鐞嗗憳!");
         }
         ShopInfo shop = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda()
-                .eq(ShopInfo::getOpenid, openid)
+                .eq(ShopInfo::getOpenid, member.getOpenid())
                 .eq(ShopInfo::getDeleted, Constants.ZERO)
                 .last("limit 1"));
         if (shop == null) {
@@ -1173,4 +1311,82 @@
         return errors;
     }
 
+    /**
+     * 浠嶱ricingRule璇诲彇鎶奸噾閲戦骞惰祴鍊煎埌闂ㄥ簵璁板綍
+     */
+    private void setDepositAmountFromPricingRule(ShopInfo shopInfo) {
+        if (shopInfo.getCompanyType() == null) {
+            return;
+        }
+        PricingRule pricingRule = pricingRuleMapper.selectOne(new QueryWrapper<PricingRule>().lambda()
+                .eq(PricingRule::getDeleted, Constants.ZERO)
+                .eq(PricingRule::getType, Constants.THREE)
+                .eq(PricingRule::getFieldA, String.valueOf(shopInfo.getCompanyType()))
+                .last("limit 1"));
+        if (pricingRule != null && StringUtils.isNotBlank(pricingRule.getFieldB())) {
+            shopInfo.setDepositAmount(Long.parseLong(pricingRule.getFieldB()));
+        }
+    }
+
+    /**
+     * 鍙戦�佺煭淇¢�氱煡锛堝け璐ヤ笉褰卞搷涓讳笟鍔★級
+     */
+    private void sendSmsNotify(String phone, Constants.SmsNotify smsNotify, String... paramPairs) {
+        if (StringUtils.isBlank(phone)) {
+            return;
+        }
+        String content = smsNotify.format(paramPairs);
+        try {
+            JSONObject templateParam = new JSONObject();
+            for (int i = 0; i < paramPairs.length - 1; i += 2) {
+                templateParam.put(paramPairs[i], paramPairs[i + 1]);
+            }
+            boolean result = AliSmsService.sendSms(phone, smsNotify.getTemplateCode(),
+                    templateParam.toJSONString());
+            if (result) {
+                log.info("鐭俊鍙戦�佹垚鍔�: phone={}, template={}", phone, smsNotify.name());
+            } else {
+                log.warn("鐭俊鍙戦�佸け璐�: phone={}, template={}", phone, smsNotify.name());
+            }
+            // 瀛樺偍鐭俊璁板綍
+            Smsrecord smsRecord = new Smsrecord();
+            smsRecord.setPhone(phone);
+            smsRecord.setContent(content);
+            smsRecord.setType(Constants.ONE);
+            smsRecord.setStatus(result ? Constants.ONE : Constants.ZERO);
+            smsRecord.setCreateTime(new Date());
+            smsRecord.setDeleted(Constants.ZERO);
+            smsrecordMapper.insert(smsRecord);
+        } catch (Exception e) {
+            log.error("鐭俊鍙戦�佸紓甯�: phone={}, template={}, error={}", phone, smsNotify.name(), e.getMessage());
+        }
+    }
+
+    @Override
+    public void changePassword(Integer shopId, String newPassword, String token) {
+        if (StringUtils.isBlank(newPassword)) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵嗙爜涓嶈兘涓虹┖");
+        }
+        // 鏍¢獙瀵嗙爜蹇呴』鍚屾椂鍖呭惈瀛楁瘝鍜屾暟瀛�
+        boolean hasLetter = newPassword.chars().anyMatch(Character::isLetter);
+        boolean hasDigit = newPassword.chars().anyMatch(Character::isDigit);
+        if (!hasLetter || !hasDigit) {
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵嗙爜蹇呴』鍚屾椂鍖呭惈瀛楁瘝鍜屾暟瀛�");
+        }
+        // 鏌ヨ闂ㄥ簵
+        ShopInfo shopInfo = shopInfoMapper.selectById(shopId);
+        if (shopInfo == null || Constants.equalsInteger(shopInfo.getDeleted(), Constants.ONE)) {
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        // 閲嶆柊鐢熸垚salt锛屽姞瀵嗘柊瀵嗙爜骞舵洿鏂�
+        String salt = RandomStringUtils.randomAlphabetic(6);
+        shopInfo.setPassword(Utils.Secure.encryptPassword(newPassword, salt));
+        shopInfo.setSalt(salt);
+        shopInfoMapper.updateById(shopInfo);
+        // 娓呴櫎token锛屽己鍒堕噸鏂扮櫥褰�
+        if (StringUtils.isNotBlank(token)) {
+            redisTemplate.delete(token);
+        }
+    }
+
 }

--
Gitblit v1.9.3