From 0e9b6603d4ae9d11c1fbc90257ce816c5807b8ff Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期五, 28 十月 2022 16:55:02 +0800
Subject: [PATCH] 批量添加结算消息

---
 app/src/main/java/com/yeshi/makemoney/app/service/impl/money/ExtractServiceImpl.java |  166 ++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 134 insertions(+), 32 deletions(-)

diff --git a/app/src/main/java/com/yeshi/makemoney/app/service/impl/money/ExtractServiceImpl.java b/app/src/main/java/com/yeshi/makemoney/app/service/impl/money/ExtractServiceImpl.java
index 4183d53..ab7f5ee 100644
--- a/app/src/main/java/com/yeshi/makemoney/app/service/impl/money/ExtractServiceImpl.java
+++ b/app/src/main/java/com/yeshi/makemoney/app/service/impl/money/ExtractServiceImpl.java
@@ -18,12 +18,15 @@
 import com.yeshi.makemoney.app.exception.money.UserMoneyBalanceException;
 import com.yeshi.makemoney.app.service.inter.config.SystemConfigService;
 import com.yeshi.makemoney.app.service.inter.money.ExtractService;
+import com.yeshi.makemoney.app.service.inter.money.UserExtractMoneyLimitService;
 import com.yeshi.makemoney.app.service.inter.money.UserMoneyRecordService;
 import com.yeshi.makemoney.app.service.inter.money.UserMoneyService;
+import com.yeshi.makemoney.app.service.inter.msg.UserMsgNotifyService;
 import com.yeshi.makemoney.app.service.inter.user.UserInfoService;
 import com.yeshi.makemoney.app.service.query.money.ExtractQuery;
 import com.yeshi.makemoney.app.utils.Constant;
 import com.yeshi.makemoney.app.utils.factory.UserMoneyRecordFactory;
+import com.yeshi.makemoney.app.utils.factory.msg.UserMsgFactory;
 import com.yeshi.makemoney.app.utils.mq.CMQManager;
 import com.yeshi.makemoney.app.utils.pay.AlipayUtil;
 import org.slf4j.Logger;
@@ -39,6 +42,7 @@
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -63,14 +67,20 @@
     @Resource
     private UserMoneyRecordService userMoneyRecordService;
 
+    @Resource
+    private UserExtractMoneyLimitService userExtractMoneyLimitService;
+
+    @Resource
+    private UserMsgNotifyService userMsgNotifyService;
+
     @Override
     public List<Extract> list(ExtractQuery extractQuery, int page, int pageSize) {
         DaoQuery daoQuery = new DaoQuery();
-        try {
-            BeanUtil.copyProperties(extractQuery, daoQuery);
-        } catch (IllegalAccessException e) {
-            e.printStackTrace();
-        }
+        daoQuery.uid = extractQuery.getUid();
+        daoQuery.state = extractQuery.getState();
+        daoQuery.minCreateTime = extractQuery.toStartTime();
+        daoQuery.maxCreateTime = extractQuery.toEndTime();
+        daoQuery.sortList = Arrays.asList(new String[]{"create_time desc"});
         daoQuery.start = (page - 1) * pageSize;
         daoQuery.count = pageSize;
         return extractMapper.list(daoQuery);
@@ -79,11 +89,10 @@
     @Override
     public long count(ExtractQuery extractQuery) {
         DaoQuery daoQuery = new DaoQuery();
-        try {
-            BeanUtil.copyProperties(extractQuery, daoQuery);
-        } catch (IllegalAccessException e) {
-            e.printStackTrace();
-        }
+        daoQuery.uid = extractQuery.getUid();
+        daoQuery.state = extractQuery.getState();
+        daoQuery.minCreateTime = extractQuery.toStartTime();
+        daoQuery.maxCreateTime = extractQuery.toEndTime();
         return extractMapper.count(daoQuery);
     }
 
@@ -99,12 +108,34 @@
         return extractMapper.count(daoQuery) < 1L;
     }
 
-    private ExtractConfig getExtractConfig(SystemEnum system) {
+    @Override
+    public ExtractConfig getExtractConfig(SystemEnum system) {
         String value = systemConfigService.getValueCache(system, SystemConfigKey.extractConfig);
         if (StringUtil.isNullOrEmpty(value)) {
             return null;
         }
         return new Gson().fromJson(value, ExtractConfig.class);
+    }
+
+    @Override
+    public List<Extract> listNeedPassRecord(BigDecimal maxMoney, Date minCreateTime, int page, int pageSize) {
+        DaoQuery daoQuery = new DaoQuery();
+        daoQuery.state = Extract.STATE_NOT_PROCESS;
+        daoQuery.minCreateTime = minCreateTime;
+        daoQuery.maxMoney = maxMoney;
+        daoQuery.sortList = Arrays.asList(new String[]{"create_time asc"});
+        daoQuery.start = (page - 1) * pageSize;
+        daoQuery.count = pageSize;
+        return extractMapper.list(daoQuery);
+    }
+
+    @Override
+    public long countNeedPassRecord(BigDecimal maxMoney, Date minCreateTime) {
+        DaoQuery daoQuery = new DaoQuery();
+        daoQuery.state = Extract.STATE_NOT_PROCESS;
+        daoQuery.minCreateTime = minCreateTime;
+        daoQuery.maxMoney = maxMoney;
+        return extractMapper.count(daoQuery);
     }
 
     private void validateExtract(BigDecimal money, UserInfo user) throws ExtractException {
@@ -113,15 +144,11 @@
             throw new ExtractException(ExtractException.CODE_EXTRACT_CONFIG_ERROR, "鎻愮幇閰嶇疆閿欒");
         }
 
-        if (isFirst(user.getId())) {
-            if (money.compareTo(config.getFirstMinMoney()) < 0) {
-                throw new ExtractException(ExtractException.CODE_MONEY_LIMIT, String.format("棣栨鎻愮幇鏈�浣庨噾棰濅负%s鍏�", config.getFirstMinMoney().toString()));
-            }
-        } else {
-            if (money.compareTo(config.getMinMoney()) < 0) {
-                throw new ExtractException(ExtractException.CODE_MONEY_LIMIT, String.format("鏈�浣庢彁鐜伴噾棰濅负%s鍏�", config.getMinMoney().toString()));
-            }
+
+        if (money.compareTo(config.getMinMoney()) < 0) {
+            throw new ExtractException(ExtractException.CODE_MONEY_LIMIT, String.format("鏈�浣庢彁鐜伴噾棰濅负%s鍏�", config.getMinMoney().toString()));
         }
+
 
         if (money.compareTo(config.getMaxMoney()) > 0) {
             throw new ExtractException(ExtractException.CODE_MONEY_LIMIT, String.format("鏈�楂樻彁鐜伴噾棰濅负%s鍏�", config.getMaxMoney().toString()));
@@ -147,6 +174,44 @@
             throw new ExtractException(ExtractException.CODE_MONEY_LIMIT, String.format("鍗曟棩绱鏈�楂樻彁鐜版鏁颁负%s娆�", config.getMaxNumPerDay().toString()));
         }
 
+        //灏忛噾棰濇彁鐜伴檺鍒�
+        if (money.compareTo(Constant.EXTRACT_LITTLE_MONEY_LIMIT) < 0) {
+            //鏄惁宸茬粡鐢ㄥ畬鏂扮敤鎴烽搴�
+            if (!canExtractLittleMoney(user.getId(), config.getNewerLittleMoneyNum(), new Date(currentTime))) {
+                throw new ExtractException(ExtractException.CODE_LITTLE_MONEY_LIMIT, "浠婃棩灏忎簬1鍏冩彁鐜版鏁板凡鐢ㄥ敖");
+            }
+        }
+
+    }
+
+    @Override
+    public boolean canExtractLittleMoney(Long uid, int maxNewerCount, Date date) {
+        //鍒ゆ柇鏂颁汉
+        long count = countByMaxMoney(uid, Constant.EXTRACT_LITTLE_MONEY_LIMIT, Arrays.asList(new Integer[]{Extract.STATE_NOT_PROCESS, Extract.STATE_PROCESSING, Extract.STATE_PASS}), null);
+        if (maxNewerCount > count) {
+            return true;
+        }
+
+        //鍒ゆ柇婵�鍔卞垎閰�
+        int limit = userExtractMoneyLimitService.getLittleMoneyLimit(uid, date);
+        if (limit <= 0) {
+            return false;
+        }
+        count = countByMaxMoney(uid, Constant.EXTRACT_LITTLE_MONEY_LIMIT, Arrays.asList(new Integer[]{Extract.STATE_NOT_PROCESS, Extract.STATE_PROCESSING, Extract.STATE_PASS}), new Date(TimeUtil.convertToTimeTemp(TimeUtil.getGernalTime(date.getTime(), "yyyyMMdd"), "yyyyMMdd")));
+        if (count < limit) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public BigDecimal getExtractingMoney(Long uid) {
+        DaoQuery daoQuery = new DaoQuery();
+        daoQuery.uid = uid;
+        daoQuery.state = Extract.STATE_NOT_PROCESS;
+        BigDecimal money = extractMapper.sumMoney(daoQuery);
+
+        return money == null ? new BigDecimal(0) : money;
     }
 
 
@@ -193,7 +258,7 @@
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void passExtract(Long id, Long adminId) throws ExtractException {
+    public void passExtract(Long id, String adminId) throws ExtractException {
         Extract extract = extractMapper.selectByPrimaryKeyForUpdate(id);
         if (extract == null) {
             throw new ExtractException(ExtractException.CODE_NOT_EXIST, "鎻愮幇璁板綍涓嶅瓨鍦�");
@@ -217,15 +282,26 @@
         if (extract.getType() == ExtractPayType.alipay) {
             transferByAlipay(extract, adminId);
         } else {
-            transferByWX(extract, adminId, systemConfigService.getValueCache(user.getSystem(), SystemConfigKey.wxAppId));
+          String result =  transferByWX(extract, adminId, systemConfigService.getValueCache(user.getSystem(), SystemConfigKey.wxAppId));
+            Map<String, String> resultMap = WXUtil.parseXML(result);
+            if ("SUCCESS".equalsIgnoreCase(resultMap.get("return_code")) && "SUCCESS".equalsIgnoreCase(resultMap.get("result_code"))) {
+                ;
+            } else {
+
+                String errCode = resultMap.get("err_code");
+                String errMsg = resultMap.get("err_code_des");
+                boolean noMoney = "NOTENOUGH".equalsIgnoreCase(errCode);
+                if(noMoney) {
+                    throw new ExtractException(ExtractException.CODE_WX_PAY_ACCOUNT_NO_MONEY,"寰俊鏀粯璐︽埛浣欓涓嶈冻");
+                }
+            }
+
         }
-
-
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void rejectExtract(Long id, Long adminId, String reason) throws ExtractException, UserMoneyBalanceException, ParamsException {
+    public void rejectExtract(Long id, String adminId, String reason) throws ExtractException, UserMoneyBalanceException, ParamsException {
         Extract extract = extractMapper.selectByPrimaryKeyForUpdate(id);
         if (extract == null) {
             throw new ExtractException(ExtractException.CODE_NOT_EXIST, "鎻愮幇璁板綍涓嶅瓨鍦�");
@@ -244,7 +320,12 @@
         updateExtract.setState(Extract.STATE_REJECT);
         updateExtract.setReason(reason);
         extractMapper.updateByPrimaryKeySelective(updateExtract);
-        //TODO 娑堟伅
+        //娣诲姞娑堟伅閫氱煡
+        try {
+            userMsgNotifyService.notify(UserMsgFactory.createExtractFail(extract.getUser().getId(), extract.getMoney(), reason));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
     }
 
     @Override
@@ -283,13 +364,23 @@
         }
     }
 
+    @Override
+    public long countByMaxMoney(Long uid, BigDecimal money, List<Integer> stateList, Date minCreateTime) {
+        DaoQuery daoQuery = new DaoQuery();
+        daoQuery.uid = uid;
+        daoQuery.maxMoney = money;
+        daoQuery.stateList = stateList;
+        daoQuery.minCreateTime = minCreateTime;
+        return extractMapper.count(daoQuery);
+    }
+
     /**
      * 鎻愮幇鍒版敮浠樺疂
      *
      * @param extract
      * @param adminId
      */
-    private void transferByAlipay(Extract extract, Long adminId) {
+    private void transferByAlipay(Extract extract, String adminId) {
         //鑾峰彇鐢ㄦ埛鐨勭郴缁�
         UserInfo user = userInfoService.get(extract.getUser().getId());
         String appName = user.getSystem().getName();
@@ -313,18 +404,20 @@
         }
     }
 
-    private void transferByWX(Extract extract, Long adminId, String wxAPPId) {
+    private String transferByWX(Extract extract, String adminId, String wxAPPId) {
         //鑾峰彇鐢ㄦ埛鐨勭郴缁�
         UserInfo user = userInfoService.get(extract.getUser().getId());
         String appName = user.getSystem().getName();
         //鐞嗙敱
-        String result = WXPayUtil.payToOpenId(wxAPPId, extract.getAccount(), Constant.wxTransferConfig.getMchId(), Constant.wxTransferConfig.getKey(), Constant.wxTransferConfig.getCertPwd(), this.getClass().getClassLoader().getResourceAsStream(Constant.wxTransferConfig.getCertPath()), "makemoney" + extract.getId(), extract.getMoney(), "鎻愮幇", extract.getIp());
+        String result = WXPayUtil.payToOpenId(wxAPPId, extract.getAccount(), Constant.wxTransferConfig.getMchId(), Constant.wxTransferConfig.getKey(), Constant.wxTransferConfig.getCertPwd(), this.getClass().getClassLoader().getResourceAsStream(Constant.wxTransferConfig.getCertPath()), "makemoney" + extract.getId(), extract.getMoney(), String.format("鏉ヨ嚜%s鐨勬彁鐜�",appName), extract.getIp());
         try {
             CMQManager.getInstance().addExtractResultMsg(new ExtractTransferResultMQMsg(extract.getId(), result, adminId));
             logger.info("鎻愮幇:娣诲姞澶勭悊闃熷垪鎴愬姛-" + extract.getId());
         } catch (Exception e) {
             logger.error("鎻愮幇:寰俊鎻愮幇CMQ寮傚父锛歿}", result + ",鎻愮幇淇℃伅" + GsonUtil.toJson(extract));
         }
+
+        return result;
     }
 
 
@@ -360,7 +453,12 @@
                 userMoneyRecordService.update(update);
             }
         }
-        // TODO 閫氱煡杞处鎴愬姛
+        //娣诲姞娑堟伅閫氱煡
+        try {
+            userMsgNotifyService.notify(UserMsgFactory.createExtractSuccess(extract.getUser().getId(), extract.getMoney()));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
     }
 
 
@@ -370,7 +468,7 @@
         if (noMoney) {
             Extract updateExtract = new Extract();
             updateExtract.setId(extract.getId());
-            updateExtract.setState(Extract.STATE_PROCESSING);
+            updateExtract.setState(Extract.STATE_NOT_PROCESS);
             updateExtract.setReason(msg);
             extractMapper.updateByPrimaryKeySelective(updateExtract);
         } else {
@@ -388,8 +486,12 @@
             } catch (Exception e) {
                 e.printStackTrace();
             }
-            // 鏂扮増鎻愮幇
-            //TODO 閫氱煡杞处琚嫆缁�
+            //娣诲姞娑堟伅閫氱煡
+            try {
+                userMsgNotifyService.notify(UserMsgFactory.createExtractFail(extract.getUser().getId(), extract.getMoney(), null));
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
         }
     }
 

--
Gitblit v1.8.0