From d5a9aaeb556a72b4ac22ea87f981d8b1b2b43aa9 Mon Sep 17 00:00:00 2001
From: java110 <928255095@qq.com>
Date: 星期四, 26 十一月 2020 11:22:50 +0800
Subject: [PATCH] 优化代码

---
 service-common/src/main/java/com/java110/common/dao/impl/LogSystemErrorServiceDaoImpl.java                                               |   98 +
 java110-interface/src/main/java/com/java110/intf/common/ILogSystemErrorInnerServiceSMO.java                                              |   52 
 java110-utils/src/main/java/com/java110/utils/constant/ServiceCodePayFeeDetailDiscountConstant.java                                      |   31 
 service-fee/src/main/java/com/java110/fee/dao/impl/PayFeeDetailDiscountServiceDaoImpl.java                                               |  130 ++
 service-fee/src/main/java/com/java110/fee/listener/payFeeDetailDiscount/AbstractPayFeeDetailDiscountBusinessServiceDataFlowListener.java |   94 +
 service-common/src/main/java/com/java110/common/smo/impl/LogSystemErrorInnerServiceSMOImpl.java                                          |   83 +
 service-fee/src/main/java/com/java110/fee/bmo/payFeeConfigDiscount/impl/GetPayFeeConfigDiscountBMOImpl.java                              |    3 
 java110-generator/src/main/resources/back/template_1.json                                                                                |   49 
 service-common/src/main/java/com/java110/common/bmo/logSystemError/IUpdateLogSystemErrorBMO.java                                         |   17 
 java110-db/src/main/resources/mapper/common/LogSystemErrorServiceDaoImplMapper.xml                                                       |   88 +
 service-api/src/main/java/com/java110/api/listener/payFeeDetailDiscount/ListPayFeeDetailDiscountsListener.java                           |   82 +
 service-fee/src/main/java/com/java110/fee/listener/payFeeDetailDiscount/SavePayFeeDetailDiscountInfoListener.java                        |  176 +++
 java110-core/src/main/java/com/java110/core/smo/fee/IPayFeeDetailDiscountInnerServiceSMO.java                                            |   42 
 java110-db/src/main/resources/mapper/fee/PayFeeDetailDiscountServiceDaoImplMapper.xml                                                    |  217 +++
 service-api/src/main/java/com/java110/api/listener/payFeeDetailDiscount/SavePayFeeDetailDiscountListener.java                            |   49 
 service-job/src/main/java/com/java110/job/quartz/TaskSystemQuartz.java                                                                   |   52 
 java110-bean/src/main/java/com/java110/po/payFeeDetailDiscount/PayFeeDetailDiscountPo.java                                               |   60 +
 service-api/src/main/java/com/java110/api/bmo/payFeeDetailDiscount/IPayFeeDetailDiscountBMO.java                                         |   38 
 service-fee/src/main/java/com/java110/fee/smo/impl/PayFeeDetailDiscountInnerServiceSMOImpl.java                                          |   93 +
 service-fee/src/main/java/com/java110/fee/listener/payFeeDetailDiscount/UpdatePayFeeDetailDiscountInfoListener.java                      |  190 +++
 docs/document/services/payFeeDetailDiscount/UpdatePayFeeDetailDiscountInfo.md                                                            |  188 +++
 service-api/src/main/java/com/java110/api/bmo/payFeeDetailDiscount/impl/PayFeeDetailDiscountBMOImpl.java                                 |   61 +
 service-common/src/main/java/com/java110/common/bmo/logSystemError/IDeleteLogSystemErrorBMO.java                                         |   17 
 java110-utils/src/main/java/com/java110/utils/constant/BusinessTypeConstant.java                                                         |   17 
 java110-bean/src/main/java/com/java110/dto/logSystemError/LogSystemErrorDto.java                                                         |   71 +
 service-api/src/main/java/com/java110/api/smo/ISaveTransactionLogSMO.java                                                                |    2 
 service-common/src/main/java/com/java110/common/bmo/logSystemError/impl/DeleteLogSystemErrorBMOImpl.java                                 |   34 
 service-fee/src/main/java/com/java110/fee/listener/payFeeDetailDiscount/DeletePayFeeDetailDiscountInfoListener.java                      |  176 +++
 java110-core/src/main/java/com/java110/core/factory/GenerateCodeFactory.java                                                             |    4 
 java110-service/src/main/java/com/java110/service/smo/ISaveSystemErrorSMO.java                                                           |   18 
 service-common/src/main/java/com/java110/common/bmo/logSystemError/IGetLogSystemErrorBMO.java                                            |   16 
 service-common/src/main/java/com/java110/common/bmo/logSystemError/impl/GetLogSystemErrorBMOImpl.java                                    |   44 
 java110-utils/src/main/java/com/java110/utils/util/ExceptionUtil.java                                                                    |   22 
 service-api/src/main/java/com/java110/api/listener/payFeeDetailDiscount/UpdatePayFeeDetailDiscountListener.java                          |   49 
 java110-bean/src/main/java/com/java110/po/logSystemError/LogSystemErrorPo.java                                                           |   39 
 service-common/src/main/java/com/java110/common/bmo/logSystemError/ISaveLogSystemErrorBMO.java                                           |   17 
 java110-bean/src/main/java/com/java110/dto/payFeeDetailDiscount/PayFeeDetailDiscountDto.java                                             |   90 +
 service-api/src/main/java/com/java110/api/listener/payFeeDetailDiscount/DeletePayFeeDetailDiscountListener.java                          |   49 
 docs/document/services/payFeeDetailDiscount/DeletePayFeeDetailDiscountInfo.md                                                            |  175 +++
 service-common/src/main/java/com/java110/common/api/LogSystemErrorApi.java                                                               |  103 +
 service-common/src/main/java/com/java110/common/dao/ILogSystemErrorServiceDao.java                                                       |   61 +
 docs/document/services/payFeeDetailDiscount/SavePayFeeDetailDiscountInfo.md                                                              |  175 +++
 java110-service/src/main/java/com/java110/service/smo/impl/SaveSystemErrorSMOImpl.java                                                   |   29 
 service-common/src/main/java/com/java110/common/bmo/logSystemError/impl/UpdateLogSystemErrorBMOImpl.java                                 |   34 
 service-job/src/main/java/com/java110/job/quartz/TaskSystemJob.java                                                                      |    3 
 java110-generator/src/main/resources/newBack/template_1.json                                                                             |   33 
 service-common/src/main/java/com/java110/common/bmo/logSystemError/impl/SaveLogSystemErrorBMOImpl.java                                   |   38 
 service-fee/src/main/java/com/java110/fee/dao/IPayFeeDetailDiscountServiceDao.java                                                       |   81 +
 48 files changed, 3,219 insertions(+), 71 deletions(-)

diff --git a/docs/document/services/payFeeDetailDiscount/DeletePayFeeDetailDiscountInfo.md b/docs/document/services/payFeeDetailDiscount/DeletePayFeeDetailDiscountInfo.md
new file mode 100644
index 0000000..aa87db1
--- /dev/null
+++ b/docs/document/services/payFeeDetailDiscount/DeletePayFeeDetailDiscountInfo.md
@@ -0,0 +1,175 @@
+package com.java110.fee.listener.payFeeDetailDiscount;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.utils.constant.BusinessTypeConstant;
+import com.java110.utils.constant.ResponseConstant;
+import com.java110.utils.constant.StatusConstant;
+import com.java110.utils.exception.ListenerExecuteException;
+import com.java110.utils.util.Assert;
+import com.java110.core.annotation.Java110Listener;
+import com.java110.core.context.DataFlowContext;
+import com.java110.entity.center.Business;
+import com.java110.fee.dao.IPayFeeDetailDiscountServiceDao;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鍒犻櫎缂磋垂浼樻儬淇℃伅 渚﹀惉
+ *
+ * 澶勭悊鑺傜偣
+ * 1銆乥usinessPayFeeDetailDiscount:{} 缂磋垂浼樻儬鍩烘湰淇℃伅鑺傜偣
+ * 2銆乥usinessPayFeeDetailDiscountAttr:[{}] 缂磋垂浼樻儬灞炴�т俊鎭妭鐐�
+ * 3銆乥usinessPayFeeDetailDiscountPhoto:[{}] 缂磋垂浼樻儬鐓х墖淇℃伅鑺傜偣
+ * 4銆乥usinessPayFeeDetailDiscountCerdentials:[{}] 缂磋垂浼樻儬璇佷欢淇℃伅鑺傜偣
+ * 鍗忚鍦板潃 锛歨ttps://github.com/java110/MicroCommunity/wiki/%E5%88%A0%E9%99%A4%E5%95%86%E6%88%B7%E4%BF%A1%E6%81%AF-%E5%8D%8F%E8%AE%AE
+ * Created by wuxw on 2018/5/18.
+ */
+@Java110Listener("deletePayFeeDetailDiscountInfoListener")
+@Transactional
+public class DeletePayFeeDetailDiscountInfoListener extends AbstractPayFeeDetailDiscountBusinessServiceDataFlowListener {
+
+    private final static Logger logger = LoggerFactory.getLogger(DeletePayFeeDetailDiscountInfoListener.class);
+    @Autowired
+    IPayFeeDetailDiscountServiceDao payFeeDetailDiscountServiceDaoImpl;
+
+    @Override
+    public int getOrder() {
+        return 3;
+    }
+
+    @Override
+    public String getBusinessTypeCd() {
+        return BusinessTypeConstant.BUSINESS_TYPE_DELETE_DETAIL_DISCOUNT_INFO;
+    }
+
+    /**
+     * 鏍规嵁鍒犻櫎淇℃伅 鏌ュ嚭Instance琛ㄤ腑鏁版嵁 淇濆瓨鑷砨usiness琛� 锛堢姸鎬佸啓DEL锛� 鏂逛究鎾ゅ崟鏃剁洿鎺ユ洿鏂板洖鍘�
+     * @param dataFlowContext 鏁版嵁瀵硅薄
+     * @param business 褰撳墠涓氬姟瀵硅薄
+     */
+    @Override
+    protected void doSaveBusiness(DataFlowContext dataFlowContext, Business business) {
+        JSONObject data = business.getDatas();
+
+        Assert.notEmpty(data,"娌℃湁datas 鑺傜偣锛屾垨娌℃湁瀛愯妭鐐归渶瑕佸鐞�");
+
+            //澶勭悊 businessPayFeeDetailDiscount 鑺傜偣
+            if(data.containsKey(PayFeeDetailDiscountPo.class.getSimpleName())){
+                Object _obj = data.get(PayFeeDetailDiscountPo.class.getSimpleName());
+                JSONArray businessPayFeeDetailDiscounts = null;
+                if(_obj instanceof JSONObject){
+                    businessPayFeeDetailDiscounts = new JSONArray();
+                    businessPayFeeDetailDiscounts.add(_obj);
+                }else {
+                    businessPayFeeDetailDiscounts = (JSONArray)_obj;
+                }
+                //JSONObject businessPayFeeDetailDiscount = data.getJSONObject(PayFeeDetailDiscountPo.class.getSimpleName());
+                for (int _payFeeDetailDiscountIndex = 0; _payFeeDetailDiscountIndex < businessPayFeeDetailDiscounts.size();_payFeeDetailDiscountIndex++) {
+                    JSONObject businessPayFeeDetailDiscount = businessPayFeeDetailDiscounts.getJSONObject(_payFeeDetailDiscountIndex);
+                    doBusinessPayFeeDetailDiscount(business, businessPayFeeDetailDiscount);
+                    if(_obj instanceof JSONObject) {
+                        dataFlowContext.addParamOut("detailDiscountId", businessPayFeeDetailDiscount.getString("detailDiscountId"));
+                    }
+                }
+
+        }
+
+
+    }
+
+    /**
+     * 鍒犻櫎 instance鏁版嵁
+     * @param dataFlowContext 鏁版嵁瀵硅薄
+     * @param business 褰撳墠涓氬姟瀵硅薄
+     */
+    @Override
+    protected void doBusinessToInstance(DataFlowContext dataFlowContext, Business business) {
+        String bId = business.getbId();
+        //Assert.hasLength(bId,"璇锋眰鎶ユ枃涓病鏈夊寘鍚� bId");
+
+        //缂磋垂浼樻儬淇℃伅
+        Map info = new HashMap();
+        info.put("bId",business.getbId());
+        info.put("operate",StatusConstant.OPERATE_DEL);
+
+        //缂磋垂浼樻儬淇℃伅
+        List<Map> businessPayFeeDetailDiscountInfos = payFeeDetailDiscountServiceDaoImpl.getBusinessPayFeeDetailDiscountInfo(info);
+        if( businessPayFeeDetailDiscountInfos != null && businessPayFeeDetailDiscountInfos.size() >0) {
+            for (int _payFeeDetailDiscountIndex = 0; _payFeeDetailDiscountIndex < businessPayFeeDetailDiscountInfos.size();_payFeeDetailDiscountIndex++) {
+                Map businessPayFeeDetailDiscountInfo = businessPayFeeDetailDiscountInfos.get(_payFeeDetailDiscountIndex);
+                flushBusinessPayFeeDetailDiscountInfo(businessPayFeeDetailDiscountInfo,StatusConstant.STATUS_CD_INVALID);
+                payFeeDetailDiscountServiceDaoImpl.updatePayFeeDetailDiscountInfoInstance(businessPayFeeDetailDiscountInfo);
+                dataFlowContext.addParamOut("detailDiscountId",businessPayFeeDetailDiscountInfo.get("detail_discount_id"));
+            }
+        }
+
+    }
+
+    /**
+     * 鎾ゅ崟
+     * 浠巄usiness琛ㄤ腑鏌ヨ鍒癉EL鐨勬暟鎹� 灏唅nstance涓殑鏁版嵁鏇存柊鍥炴潵
+     * @param dataFlowContext 鏁版嵁瀵硅薄
+     * @param business 褰撳墠涓氬姟瀵硅薄
+     */
+    @Override
+    protected void doRecover(DataFlowContext dataFlowContext, Business business) {
+        String bId = business.getbId();
+        //Assert.hasLength(bId,"璇锋眰鎶ユ枃涓病鏈夊寘鍚� bId");
+        Map info = new HashMap();
+        info.put("bId",bId);
+        info.put("statusCd",StatusConstant.STATUS_CD_INVALID);
+
+        Map delInfo = new HashMap();
+        delInfo.put("bId",business.getbId());
+        delInfo.put("operate",StatusConstant.OPERATE_DEL);
+        //缂磋垂浼樻儬淇℃伅
+        List<Map> payFeeDetailDiscountInfo = payFeeDetailDiscountServiceDaoImpl.getPayFeeDetailDiscountInfo(info);
+        if(payFeeDetailDiscountInfo != null && payFeeDetailDiscountInfo.size() > 0){
+
+            //缂磋垂浼樻儬淇℃伅
+            List<Map> businessPayFeeDetailDiscountInfos = payFeeDetailDiscountServiceDaoImpl.getBusinessPayFeeDetailDiscountInfo(delInfo);
+            //闄ら潪绋嬪簭鍑洪敊浜嗭紝杩欓噷涓嶄細涓虹┖
+            if(businessPayFeeDetailDiscountInfos == null ||  businessPayFeeDetailDiscountInfos.size() == 0){
+                throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_INNER_ERROR,"鎾ゅ崟澶辫触锛坧ayFeeDetailDiscount锛夛紝绋嬪簭鍐呴儴寮傚父,璇锋鏌ワ紒 "+delInfo);
+            }
+            for (int _payFeeDetailDiscountIndex = 0; _payFeeDetailDiscountIndex < businessPayFeeDetailDiscountInfos.size();_payFeeDetailDiscountIndex++) {
+                Map businessPayFeeDetailDiscountInfo = businessPayFeeDetailDiscountInfos.get(_payFeeDetailDiscountIndex);
+                flushBusinessPayFeeDetailDiscountInfo(businessPayFeeDetailDiscountInfo,StatusConstant.STATUS_CD_VALID);
+                payFeeDetailDiscountServiceDaoImpl.updatePayFeeDetailDiscountInfoInstance(businessPayFeeDetailDiscountInfo);
+            }
+        }
+    }
+
+
+
+    /**
+     * 澶勭悊 businessPayFeeDetailDiscount 鑺傜偣
+     * @param business 鎬荤殑鏁版嵁鑺傜偣
+     * @param businessPayFeeDetailDiscount 缂磋垂浼樻儬鑺傜偣
+     */
+    private void doBusinessPayFeeDetailDiscount(Business business,JSONObject businessPayFeeDetailDiscount){
+
+        Assert.jsonObjectHaveKey(businessPayFeeDetailDiscount,"detailDiscountId","businessPayFeeDetailDiscount 鑺傜偣涓嬫病鏈夊寘鍚� detailDiscountId 鑺傜偣");
+
+        if(businessPayFeeDetailDiscount.getString("detailDiscountId").startsWith("-")){
+            throw new ListenerExecuteException(ResponseConstant.RESULT_PARAM_ERROR,"detailDiscountId 閿欒锛屼笉鑳借嚜鍔ㄧ敓鎴愶紙蹇呴』宸茬粡瀛樺湪鐨刣etailDiscountId锛�"+businessPayFeeDetailDiscount);
+        }
+        //鑷姩鎻掑叆DEL
+        autoSaveDelBusinessPayFeeDetailDiscount(business,businessPayFeeDetailDiscount);
+    }
+    @Override
+    public IPayFeeDetailDiscountServiceDao getPayFeeDetailDiscountServiceDaoImpl() {
+        return payFeeDetailDiscountServiceDaoImpl;
+    }
+
+    public void setPayFeeDetailDiscountServiceDaoImpl(IPayFeeDetailDiscountServiceDao payFeeDetailDiscountServiceDaoImpl) {
+        this.payFeeDetailDiscountServiceDaoImpl = payFeeDetailDiscountServiceDaoImpl;
+    }
+}
diff --git a/docs/document/services/payFeeDetailDiscount/SavePayFeeDetailDiscountInfo.md b/docs/document/services/payFeeDetailDiscount/SavePayFeeDetailDiscountInfo.md
new file mode 100644
index 0000000..c2e6a93
--- /dev/null
+++ b/docs/document/services/payFeeDetailDiscount/SavePayFeeDetailDiscountInfo.md
@@ -0,0 +1,175 @@
+package com.java110.fee.listener.payFeeDetailDiscount;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.utils.constant.BusinessTypeConstant;
+import com.java110.utils.constant.StatusConstant;
+import com.java110.utils.util.Assert;
+import com.java110.fee.dao.IPayFeeDetailDiscountServiceDao;
+import com.java110.core.annotation.Java110Listener;
+import com.java110.core.context.DataFlowContext;
+import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.entity.center.Business;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 淇濆瓨 缂磋垂浼樻儬淇℃伅 渚﹀惉
+ * Created by wuxw on 2018/5/18.
+ */
+@Java110Listener("savePayFeeDetailDiscountInfoListener")
+@Transactional
+public class SavePayFeeDetailDiscountInfoListener extends AbstractPayFeeDetailDiscountBusinessServiceDataFlowListener{
+
+    private static Logger logger = LoggerFactory.getLogger(SavePayFeeDetailDiscountInfoListener.class);
+
+    @Autowired
+    private IPayFeeDetailDiscountServiceDao payFeeDetailDiscountServiceDaoImpl;
+
+    @Override
+    public int getOrder() {
+        return 0;
+    }
+
+    @Override
+    public String getBusinessTypeCd() {
+        return BusinessTypeConstant.BUSINESS_TYPE_SAVE_DETAIL_DISCOUNT_INFO;
+    }
+
+    /**
+     * 淇濆瓨缂磋垂浼樻儬淇℃伅 business 琛ㄤ腑
+     * @param dataFlowContext 鏁版嵁瀵硅薄
+     * @param business 褰撳墠涓氬姟瀵硅薄
+     */
+    @Override
+    protected void doSaveBusiness(DataFlowContext dataFlowContext, Business business) {
+        JSONObject data = business.getDatas();
+        Assert.notEmpty(data,"娌℃湁datas 鑺傜偣锛屾垨娌℃湁瀛愯妭鐐归渶瑕佸鐞�");
+
+        //澶勭悊 businessPayFeeDetailDiscount 鑺傜偣
+        if(data.containsKey(PayFeeDetailDiscountPo.class.getSimpleName())){
+            Object bObj = data.get(PayFeeDetailDiscountPo.class.getSimpleName());
+            JSONArray businessPayFeeDetailDiscounts = null;
+            if(bObj instanceof JSONObject){
+                businessPayFeeDetailDiscounts = new JSONArray();
+                businessPayFeeDetailDiscounts.add(bObj);
+            }else {
+                businessPayFeeDetailDiscounts = (JSONArray)bObj;
+            }
+            //JSONObject businessPayFeeDetailDiscount = data.getJSONObject(PayFeeDetailDiscountPo.class.getSimpleName());
+            for (int bPayFeeDetailDiscountIndex = 0; bPayFeeDetailDiscountIndex < businessPayFeeDetailDiscounts.size();bPayFeeDetailDiscountIndex++) {
+                JSONObject businessPayFeeDetailDiscount = businessPayFeeDetailDiscounts.getJSONObject(bPayFeeDetailDiscountIndex);
+                doBusinessPayFeeDetailDiscount(business, businessPayFeeDetailDiscount);
+                if(bObj instanceof JSONObject) {
+                    dataFlowContext.addParamOut("detailDiscountId", businessPayFeeDetailDiscount.getString("detailDiscountId"));
+                }
+            }
+        }
+    }
+
+    /**
+     * business 鏁版嵁杞Щ鍒� instance
+     * @param dataFlowContext 鏁版嵁瀵硅薄
+     * @param business 褰撳墠涓氬姟瀵硅薄
+     */
+    @Override
+    protected void doBusinessToInstance(DataFlowContext dataFlowContext, Business business) {
+        JSONObject data = business.getDatas();
+
+        Map info = new HashMap();
+        info.put("bId",business.getbId());
+        info.put("operate",StatusConstant.OPERATE_ADD);
+
+        //缂磋垂浼樻儬淇℃伅
+        List<Map> businessPayFeeDetailDiscountInfo = payFeeDetailDiscountServiceDaoImpl.getBusinessPayFeeDetailDiscountInfo(info);
+        if( businessPayFeeDetailDiscountInfo != null && businessPayFeeDetailDiscountInfo.size() >0) {
+            reFreshShareColumn(info, businessPayFeeDetailDiscountInfo.get(0));
+            payFeeDetailDiscountServiceDaoImpl.savePayFeeDetailDiscountInfoInstance(info);
+            if(businessPayFeeDetailDiscountInfo.size() == 1) {
+                dataFlowContext.addParamOut("detailDiscountId", businessPayFeeDetailDiscountInfo.get(0).get("detail_discount_id"));
+            }
+        }
+    }
+
+
+    /**
+     * 鍒� 鍒嗙墖瀛楁
+     *
+     * @param info         鏌ヨ瀵硅薄
+     * @param businessInfo 灏忓尯ID
+     */
+    private void reFreshShareColumn(Map info, Map businessInfo) {
+
+        if (info.containsKey("community_id")) {
+            return;
+        }
+
+        if (!businessInfo.containsKey("communityId")) {
+            return;
+        }
+
+        info.put("community_id", businessInfo.get("communityId"));
+    }
+    /**
+     * 鎾ゅ崟
+     * @param dataFlowContext 鏁版嵁瀵硅薄
+     * @param business 褰撳墠涓氬姟瀵硅薄
+     */
+    @Override
+    protected void doRecover(DataFlowContext dataFlowContext, Business business) {
+        String bId = business.getbId();
+        //Assert.hasLength(bId,"璇锋眰鎶ユ枃涓病鏈夊寘鍚� bId");
+        Map info = new HashMap();
+        info.put("bId",bId);
+        info.put("statusCd",StatusConstant.STATUS_CD_VALID);
+        Map paramIn = new HashMap();
+        paramIn.put("bId",bId);
+        paramIn.put("statusCd",StatusConstant.STATUS_CD_INVALID);
+        //缂磋垂浼樻儬淇℃伅
+        List<Map> payFeeDetailDiscountInfo = payFeeDetailDiscountServiceDaoImpl.getPayFeeDetailDiscountInfo(info);
+        if(payFeeDetailDiscountInfo != null && payFeeDetailDiscountInfo.size() > 0){
+            reFreshShareColumn(paramIn, payFeeDetailDiscountInfo.get(0));
+            payFeeDetailDiscountServiceDaoImpl.updatePayFeeDetailDiscountInfoInstance(paramIn);
+        }
+    }
+
+
+
+    /**
+     * 澶勭悊 businessPayFeeDetailDiscount 鑺傜偣
+     * @param business 鎬荤殑鏁版嵁鑺傜偣
+     * @param businessPayFeeDetailDiscount 缂磋垂浼樻儬鑺傜偣
+     */
+    private void doBusinessPayFeeDetailDiscount(Business business,JSONObject businessPayFeeDetailDiscount){
+
+        Assert.jsonObjectHaveKey(businessPayFeeDetailDiscount,"detailDiscountId","businessPayFeeDetailDiscount 鑺傜偣涓嬫病鏈夊寘鍚� detailDiscountId 鑺傜偣");
+
+        if(businessPayFeeDetailDiscount.getString("detailDiscountId").startsWith("-")){
+            //鍒锋柊缂撳瓨
+            //flushPayFeeDetailDiscountId(business.getDatas());
+
+            businessPayFeeDetailDiscount.put("detailDiscountId",GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailDiscountId));
+
+        }
+
+        businessPayFeeDetailDiscount.put("bId",business.getbId());
+        businessPayFeeDetailDiscount.put("operate", StatusConstant.OPERATE_ADD);
+        //淇濆瓨缂磋垂浼樻儬淇℃伅
+        payFeeDetailDiscountServiceDaoImpl.saveBusinessPayFeeDetailDiscountInfo(businessPayFeeDetailDiscount);
+
+    }
+    @Override
+    public IPayFeeDetailDiscountServiceDao getPayFeeDetailDiscountServiceDaoImpl() {
+        return payFeeDetailDiscountServiceDaoImpl;
+    }
+
+    public void setPayFeeDetailDiscountServiceDaoImpl(IPayFeeDetailDiscountServiceDao payFeeDetailDiscountServiceDaoImpl) {
+        this.payFeeDetailDiscountServiceDaoImpl = payFeeDetailDiscountServiceDaoImpl;
+    }
+}
diff --git a/docs/document/services/payFeeDetailDiscount/UpdatePayFeeDetailDiscountInfo.md b/docs/document/services/payFeeDetailDiscount/UpdatePayFeeDetailDiscountInfo.md
new file mode 100644
index 0000000..1123e79
--- /dev/null
+++ b/docs/document/services/payFeeDetailDiscount/UpdatePayFeeDetailDiscountInfo.md
@@ -0,0 +1,188 @@
+package com.java110.fee.listener.payFeeDetailDiscount;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.utils.constant.BusinessTypeConstant;
+import com.java110.utils.constant.ResponseConstant;
+import com.java110.utils.constant.StatusConstant;
+import com.java110.utils.exception.ListenerExecuteException;
+import com.java110.utils.util.Assert;
+import com.java110.core.annotation.Java110Listener;
+import com.java110.core.context.DataFlowContext;
+import com.java110.entity.center.Business;
+import com.java110.fee.dao.IPayFeeDetailDiscountServiceDao;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 淇敼缂磋垂浼樻儬淇℃伅 渚﹀惉
+ *
+ * 澶勭悊鑺傜偣
+ * 1銆乥usinessPayFeeDetailDiscount:{} 缂磋垂浼樻儬鍩烘湰淇℃伅鑺傜偣
+ * 2銆乥usinessPayFeeDetailDiscountAttr:[{}] 缂磋垂浼樻儬灞炴�т俊鎭妭鐐�
+ * 3銆乥usinessPayFeeDetailDiscountPhoto:[{}] 缂磋垂浼樻儬鐓х墖淇℃伅鑺傜偣
+ * 4銆乥usinessPayFeeDetailDiscountCerdentials:[{}] 缂磋垂浼樻儬璇佷欢淇℃伅鑺傜偣
+ * 鍗忚鍦板潃 锛歨ttps://github.com/java110/MicroCommunity/wiki/%E4%BF%AE%E6%94%B9%E5%95%86%E6%88%B7%E4%BF%A1%E6%81%AF-%E5%8D%8F%E8%AE%AE
+ * Created by wuxw on 2018/5/18.
+ */
+@Java110Listener("updatePayFeeDetailDiscountInfoListener")
+@Transactional
+public class UpdatePayFeeDetailDiscountInfoListener extends AbstractPayFeeDetailDiscountBusinessServiceDataFlowListener {
+
+    private static Logger logger = LoggerFactory.getLogger(UpdatePayFeeDetailDiscountInfoListener.class);
+    @Autowired
+    private IPayFeeDetailDiscountServiceDao payFeeDetailDiscountServiceDaoImpl;
+
+    @Override
+    public int getOrder() {
+        return 2;
+    }
+
+    @Override
+    public String getBusinessTypeCd() {
+        return BusinessTypeConstant.BUSINESS_TYPE_UPDATE_DETAIL_DISCOUNT_INFO;
+    }
+
+    /**
+     * business杩囩▼
+     * @param dataFlowContext 涓婁笅鏂囧璞�
+     * @param business 涓氬姟瀵硅薄
+     */
+    @Override
+    protected void doSaveBusiness(DataFlowContext dataFlowContext, Business business) {
+
+        JSONObject data = business.getDatas();
+
+        Assert.notEmpty(data,"娌℃湁datas 鑺傜偣锛屾垨娌℃湁瀛愯妭鐐归渶瑕佸鐞�");
+
+
+            //澶勭悊 businessPayFeeDetailDiscount 鑺傜偣
+            if(data.containsKey(PayFeeDetailDiscountPo.class.getSimpleName())){
+                Object _obj = data.get(PayFeeDetailDiscountPo.class.getSimpleName());
+                JSONArray businessPayFeeDetailDiscounts = null;
+                if(_obj instanceof JSONObject){
+                    businessPayFeeDetailDiscounts = new JSONArray();
+                    businessPayFeeDetailDiscounts.add(_obj);
+                }else {
+                    businessPayFeeDetailDiscounts = (JSONArray)_obj;
+                }
+                //JSONObject businessPayFeeDetailDiscount = data.getJSONObject(PayFeeDetailDiscountPo.class.getSimpleName());
+                for (int _payFeeDetailDiscountIndex = 0; _payFeeDetailDiscountIndex < businessPayFeeDetailDiscounts.size();_payFeeDetailDiscountIndex++) {
+                    JSONObject businessPayFeeDetailDiscount = businessPayFeeDetailDiscounts.getJSONObject(_payFeeDetailDiscountIndex);
+                    doBusinessPayFeeDetailDiscount(business, businessPayFeeDetailDiscount);
+                    if(_obj instanceof JSONObject) {
+                        dataFlowContext.addParamOut("detailDiscountId", businessPayFeeDetailDiscount.getString("detailDiscountId"));
+                    }
+                }
+            }
+    }
+
+
+    /**
+     * business to instance 杩囩▼
+     * @param dataFlowContext 鏁版嵁瀵硅薄
+     * @param business 褰撳墠涓氬姟瀵硅薄
+     */
+    @Override
+    protected void doBusinessToInstance(DataFlowContext dataFlowContext, Business business) {
+
+        JSONObject data = business.getDatas();
+
+        Map info = new HashMap();
+        info.put("bId",business.getbId());
+        info.put("operate",StatusConstant.OPERATE_ADD);
+
+        //缂磋垂浼樻儬淇℃伅
+        List<Map> businessPayFeeDetailDiscountInfos = payFeeDetailDiscountServiceDaoImpl.getBusinessPayFeeDetailDiscountInfo(info);
+        if( businessPayFeeDetailDiscountInfos != null && businessPayFeeDetailDiscountInfos.size() >0) {
+            for (int _payFeeDetailDiscountIndex = 0; _payFeeDetailDiscountIndex < businessPayFeeDetailDiscountInfos.size();_payFeeDetailDiscountIndex++) {
+                Map businessPayFeeDetailDiscountInfo = businessPayFeeDetailDiscountInfos.get(_payFeeDetailDiscountIndex);
+                flushBusinessPayFeeDetailDiscountInfo(businessPayFeeDetailDiscountInfo,StatusConstant.STATUS_CD_VALID);
+                payFeeDetailDiscountServiceDaoImpl.updatePayFeeDetailDiscountInfoInstance(businessPayFeeDetailDiscountInfo);
+                if(businessPayFeeDetailDiscountInfo.size() == 1) {
+                    dataFlowContext.addParamOut("detailDiscountId", businessPayFeeDetailDiscountInfo.get("detail_discount_id"));
+                }
+            }
+        }
+
+    }
+
+    /**
+     * 鎾ゅ崟
+     * @param dataFlowContext 鏁版嵁瀵硅薄
+     * @param business 褰撳墠涓氬姟瀵硅薄
+     */
+    @Override
+    protected void doRecover(DataFlowContext dataFlowContext, Business business) {
+
+        String bId = business.getbId();
+        //Assert.hasLength(bId,"璇锋眰鎶ユ枃涓病鏈夊寘鍚� bId");
+        Map info = new HashMap();
+        info.put("bId",bId);
+        info.put("statusCd",StatusConstant.STATUS_CD_VALID);
+        Map delInfo = new HashMap();
+        delInfo.put("bId",business.getbId());
+        delInfo.put("operate",StatusConstant.OPERATE_DEL);
+        //缂磋垂浼樻儬淇℃伅
+        List<Map> payFeeDetailDiscountInfo = payFeeDetailDiscountServiceDaoImpl.getPayFeeDetailDiscountInfo(info);
+        if(payFeeDetailDiscountInfo != null && payFeeDetailDiscountInfo.size() > 0){
+
+            //缂磋垂浼樻儬淇℃伅
+            List<Map> businessPayFeeDetailDiscountInfos = payFeeDetailDiscountServiceDaoImpl.getBusinessPayFeeDetailDiscountInfo(delInfo);
+            //闄ら潪绋嬪簭鍑洪敊浜嗭紝杩欓噷涓嶄細涓虹┖
+            if(businessPayFeeDetailDiscountInfos == null || businessPayFeeDetailDiscountInfos.size() == 0){
+                throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_INNER_ERROR,"鎾ゅ崟澶辫触锛坧ayFeeDetailDiscount锛夛紝绋嬪簭鍐呴儴寮傚父,璇锋鏌ワ紒 "+delInfo);
+            }
+            for (int _payFeeDetailDiscountIndex = 0; _payFeeDetailDiscountIndex < businessPayFeeDetailDiscountInfos.size();_payFeeDetailDiscountIndex++) {
+                Map businessPayFeeDetailDiscountInfo = businessPayFeeDetailDiscountInfos.get(_payFeeDetailDiscountIndex);
+                flushBusinessPayFeeDetailDiscountInfo(businessPayFeeDetailDiscountInfo,StatusConstant.STATUS_CD_VALID);
+                payFeeDetailDiscountServiceDaoImpl.updatePayFeeDetailDiscountInfoInstance(businessPayFeeDetailDiscountInfo);
+            }
+        }
+
+    }
+
+
+
+    /**
+     * 澶勭悊 businessPayFeeDetailDiscount 鑺傜偣
+     * @param business 鎬荤殑鏁版嵁鑺傜偣
+     * @param businessPayFeeDetailDiscount 缂磋垂浼樻儬鑺傜偣
+     */
+    private void doBusinessPayFeeDetailDiscount(Business business,JSONObject businessPayFeeDetailDiscount){
+
+        Assert.jsonObjectHaveKey(businessPayFeeDetailDiscount,"detailDiscountId","businessPayFeeDetailDiscount 鑺傜偣涓嬫病鏈夊寘鍚� detailDiscountId 鑺傜偣");
+
+        if(businessPayFeeDetailDiscount.getString("detailDiscountId").startsWith("-")){
+            throw new ListenerExecuteException(ResponseConstant.RESULT_PARAM_ERROR,"detailDiscountId 閿欒锛屼笉鑳借嚜鍔ㄧ敓鎴愶紙蹇呴』宸茬粡瀛樺湪鐨刣etailDiscountId锛�"+businessPayFeeDetailDiscount);
+        }
+        //鑷姩淇濆瓨DEL
+        autoSaveDelBusinessPayFeeDetailDiscount(business,businessPayFeeDetailDiscount);
+
+        businessPayFeeDetailDiscount.put("bId",business.getbId());
+        businessPayFeeDetailDiscount.put("operate", StatusConstant.OPERATE_ADD);
+        //淇濆瓨缂磋垂浼樻儬淇℃伅
+        payFeeDetailDiscountServiceDaoImpl.saveBusinessPayFeeDetailDiscountInfo(businessPayFeeDetailDiscount);
+
+    }
+
+
+
+    @Override
+    public IPayFeeDetailDiscountServiceDao getPayFeeDetailDiscountServiceDaoImpl() {
+        return payFeeDetailDiscountServiceDaoImpl;
+    }
+
+    public void setPayFeeDetailDiscountServiceDaoImpl(IPayFeeDetailDiscountServiceDao payFeeDetailDiscountServiceDaoImpl) {
+        this.payFeeDetailDiscountServiceDaoImpl = payFeeDetailDiscountServiceDaoImpl;
+    }
+
+
+
+}
diff --git a/java110-bean/src/main/java/com/java110/dto/logSystemError/LogSystemErrorDto.java b/java110-bean/src/main/java/com/java110/dto/logSystemError/LogSystemErrorDto.java
new file mode 100644
index 0000000..0f0a947
--- /dev/null
+++ b/java110-bean/src/main/java/com/java110/dto/logSystemError/LogSystemErrorDto.java
@@ -0,0 +1,71 @@
+package com.java110.dto.logSystemError;
+
+import com.java110.dto.PageDto;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @ClassName FloorDto
+ * @Description 绯荤粺寮傚父鏁版嵁灞傚皝瑁�
+ * @Author wuxw
+ * @Date 2019/4/24 8:52
+ * @Version 1.0
+ * add by wuxw 2019/4/24
+ **/
+public class LogSystemErrorDto extends PageDto implements Serializable {
+
+
+    public static final String ERR_TYPE_JOB = "JOB";
+
+    private String msg;
+    private String errType;
+    private String errId;
+
+
+    private Date createTime;
+
+    private String statusCd = "0";
+
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public String getErrType() {
+        return errType;
+    }
+
+    public void setErrType(String errType) {
+        this.errType = errType;
+    }
+
+    public String getErrId() {
+        return errId;
+    }
+
+    public void setErrId(String errId) {
+        this.errId = errId;
+    }
+
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getStatusCd() {
+        return statusCd;
+    }
+
+    public void setStatusCd(String statusCd) {
+        this.statusCd = statusCd;
+    }
+}
diff --git a/java110-bean/src/main/java/com/java110/dto/payFeeDetailDiscount/PayFeeDetailDiscountDto.java b/java110-bean/src/main/java/com/java110/dto/payFeeDetailDiscount/PayFeeDetailDiscountDto.java
new file mode 100644
index 0000000..41d13c6
--- /dev/null
+++ b/java110-bean/src/main/java/com/java110/dto/payFeeDetailDiscount/PayFeeDetailDiscountDto.java
@@ -0,0 +1,90 @@
+package com.java110.dto.payFeeDetailDiscount;
+
+import com.java110.dto.PageDto;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @ClassName FloorDto
+ * @Description 缂磋垂浼樻儬鏁版嵁灞傚皝瑁�
+ * @Author wuxw
+ * @Date 2019/4/24 8:52
+ * @Version 1.0
+ * add by wuxw 2019/4/24
+ **/
+public class PayFeeDetailDiscountDto extends PageDto implements Serializable {
+
+    private String detailDiscountId;
+private String discountPrice;
+private String detailId;
+private String remark;
+private String communityId;
+private String discountId;
+private String feeId;
+
+
+    private Date createTime;
+
+    private String statusCd = "0";
+
+
+    public String getDetailDiscountId() {
+        return detailDiscountId;
+    }
+public void setDetailDiscountId(String detailDiscountId) {
+        this.detailDiscountId = detailDiscountId;
+    }
+public String getDiscountPrice() {
+        return discountPrice;
+    }
+public void setDiscountPrice(String discountPrice) {
+        this.discountPrice = discountPrice;
+    }
+public String getDetailId() {
+        return detailId;
+    }
+public void setDetailId(String detailId) {
+        this.detailId = detailId;
+    }
+public String getRemark() {
+        return remark;
+    }
+public void setRemark(String remark) {
+        this.remark = remark;
+    }
+public String getCommunityId() {
+        return communityId;
+    }
+public void setCommunityId(String communityId) {
+        this.communityId = communityId;
+    }
+public String getDiscountId() {
+        return discountId;
+    }
+public void setDiscountId(String discountId) {
+        this.discountId = discountId;
+    }
+public String getFeeId() {
+        return feeId;
+    }
+public void setFeeId(String feeId) {
+        this.feeId = feeId;
+    }
+
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getStatusCd() {
+        return statusCd;
+    }
+
+    public void setStatusCd(String statusCd) {
+        this.statusCd = statusCd;
+    }
+}
diff --git a/java110-bean/src/main/java/com/java110/po/logSystemError/LogSystemErrorPo.java b/java110-bean/src/main/java/com/java110/po/logSystemError/LogSystemErrorPo.java
new file mode 100644
index 0000000..c661e45
--- /dev/null
+++ b/java110-bean/src/main/java/com/java110/po/logSystemError/LogSystemErrorPo.java
@@ -0,0 +1,39 @@
+package com.java110.po.logSystemError;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class LogSystemErrorPo implements Serializable {
+
+    private String msg;
+private String errType;
+private String errId;
+private String statusCd = "0";
+public String getMsg() {
+        return msg;
+    }
+public void setMsg(String msg) {
+        this.msg = msg;
+    }
+public String getErrType() {
+        return errType;
+    }
+public void setErrType(String errType) {
+        this.errType = errType;
+    }
+public String getErrId() {
+        return errId;
+    }
+public void setErrId(String errId) {
+        this.errId = errId;
+    }
+public String getStatusCd() {
+        return statusCd;
+    }
+public void setStatusCd(String statusCd) {
+        this.statusCd = statusCd;
+    }
+
+
+
+}
diff --git a/java110-bean/src/main/java/com/java110/po/payFeeDetailDiscount/PayFeeDetailDiscountPo.java b/java110-bean/src/main/java/com/java110/po/payFeeDetailDiscount/PayFeeDetailDiscountPo.java
new file mode 100644
index 0000000..f5ed0fa
--- /dev/null
+++ b/java110-bean/src/main/java/com/java110/po/payFeeDetailDiscount/PayFeeDetailDiscountPo.java
@@ -0,0 +1,60 @@
+package com.java110.po.payFeeDetailDiscount;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class PayFeeDetailDiscountPo implements Serializable {
+
+    private String detailDiscountId;
+private String discountPrice;
+private String detailId;
+private String remark;
+private String communityId;
+private String discountId;
+private String feeId;
+public String getDetailDiscountId() {
+        return detailDiscountId;
+    }
+public void setDetailDiscountId(String detailDiscountId) {
+        this.detailDiscountId = detailDiscountId;
+    }
+public String getDiscountPrice() {
+        return discountPrice;
+    }
+public void setDiscountPrice(String discountPrice) {
+        this.discountPrice = discountPrice;
+    }
+public String getDetailId() {
+        return detailId;
+    }
+public void setDetailId(String detailId) {
+        this.detailId = detailId;
+    }
+public String getRemark() {
+        return remark;
+    }
+public void setRemark(String remark) {
+        this.remark = remark;
+    }
+public String getCommunityId() {
+        return communityId;
+    }
+public void setCommunityId(String communityId) {
+        this.communityId = communityId;
+    }
+public String getDiscountId() {
+        return discountId;
+    }
+public void setDiscountId(String discountId) {
+        this.discountId = discountId;
+    }
+public String getFeeId() {
+        return feeId;
+    }
+public void setFeeId(String feeId) {
+        this.feeId = feeId;
+    }
+
+
+
+}
diff --git a/java110-core/src/main/java/com/java110/core/factory/GenerateCodeFactory.java b/java110-core/src/main/java/com/java110/core/factory/GenerateCodeFactory.java
index be1e2ac..08f8693 100644
--- a/java110-core/src/main/java/com/java110/core/factory/GenerateCodeFactory.java
+++ b/java110-core/src/main/java/com/java110/core/factory/GenerateCodeFactory.java
@@ -172,6 +172,10 @@
     public static final String CODE_PREFIX_discountId = "13";
     public static final String CODE_PREFIX_ruleId = "14";
     public static final String CODE_PREFIX_configDiscountId = "14";
+    public static final String CODE_PREFIX_detailDiscountId = "15";
+    public static final String CODE_PREFIX_errId = "10";
+
+
 
 
     /**
diff --git a/java110-core/src/main/java/com/java110/core/smo/fee/IPayFeeDetailDiscountInnerServiceSMO.java b/java110-core/src/main/java/com/java110/core/smo/fee/IPayFeeDetailDiscountInnerServiceSMO.java
new file mode 100644
index 0000000..b6a3261
--- /dev/null
+++ b/java110-core/src/main/java/com/java110/core/smo/fee/IPayFeeDetailDiscountInnerServiceSMO.java
@@ -0,0 +1,42 @@
+package com.java110.core.smo.fee;
+
+import com.java110.config.feign.FeignConfiguration;
+import com.java110.dto.payFeeDetailDiscount.PayFeeDetailDiscountDto;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import java.util.List;
+
+/**
+ * @ClassName IPayFeeDetailDiscountInnerServiceSMO
+ * @Description 缂磋垂浼樻儬鎺ュ彛绫�
+ * @Author wuxw
+ * @Date 2019/4/24 9:04
+ * @Version 1.0
+ * add by wuxw 2019/4/24
+ **/
+@FeignClient(name = "community-service", configuration = {FeignConfiguration.class})
+@RequestMapping("/payFeeDetailDiscountApi")
+public interface IPayFeeDetailDiscountInnerServiceSMO {
+
+    /**
+     * <p>鏌ヨ灏忓尯妤间俊鎭�</p>
+     *
+     *
+     * @param payFeeDetailDiscountDto 鏁版嵁瀵硅薄鍒嗕韩
+     * @return PayFeeDetailDiscountDto 瀵硅薄鏁版嵁
+     */
+    @RequestMapping(value = "/queryPayFeeDetailDiscounts", method = RequestMethod.POST)
+    List<PayFeeDetailDiscountDto> queryPayFeeDetailDiscounts(@RequestBody PayFeeDetailDiscountDto payFeeDetailDiscountDto);
+
+    /**
+     * 鏌ヨ<p>灏忓尯妤�</p>鎬昏褰曟暟
+     *
+     * @param payFeeDetailDiscountDto 鏁版嵁瀵硅薄鍒嗕韩
+     * @return 灏忓尯涓嬬殑灏忓尯妤艰褰曟暟
+     */
+    @RequestMapping(value = "/queryPayFeeDetailDiscountsCount", method = RequestMethod.POST)
+    int queryPayFeeDetailDiscountsCount(@RequestBody PayFeeDetailDiscountDto payFeeDetailDiscountDto);
+}
diff --git a/java110-db/src/main/resources/mapper/common/LogSystemErrorServiceDaoImplMapper.xml b/java110-db/src/main/resources/mapper/common/LogSystemErrorServiceDaoImplMapper.xml
new file mode 100644
index 0000000..8cb6c09
--- /dev/null
+++ b/java110-db/src/main/resources/mapper/common/LogSystemErrorServiceDaoImplMapper.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="logSystemErrorServiceDaoImpl">
+
+
+
+
+
+    <!-- 淇濆瓨绯荤粺寮傚父淇℃伅 add by wuxw 2018-07-03 -->
+    <insert id="saveLogSystemErrorInfo" parameterType="Map">
+        insert into log_system_error(
+msg,err_type,err_id
+) values (
+#{msg},#{errType},#{errId}
+)
+    </insert>
+
+
+
+    <!-- 鏌ヨ绯荤粺寮傚父淇℃伅 add by wuxw 2018-07-03 -->
+    <select id="getLogSystemErrorInfo" parameterType="Map" resultType="Map">
+        select  t.msg,t.err_type,t.err_type errType,t.err_id,t.err_id errId,t.status_cd,t.status_cd statusCd 
+from log_system_error t 
+where 1 =1 
+<if test="msg !=null and msg != ''">
+   and t.msg= #{msg}
+</if> 
+<if test="errType !=null and errType != ''">
+   and t.err_type= #{errType}
+</if> 
+<if test="errId !=null and errId != ''">
+   and t.err_id= #{errId}
+</if> 
+<if test="statusCd !=null and statusCd != ''">
+   and t.status_cd= #{statusCd}
+</if> 
+order by t.create_time desc
+<if test="page != -1 and page != null ">
+   limit #{page}, #{row}
+</if> 
+
+    </select>
+
+
+
+
+    <!-- 淇敼绯荤粺寮傚父淇℃伅 add by wuxw 2018-07-03 -->
+    <update id="updateLogSystemErrorInfo" parameterType="Map">
+        update  log_system_error t set t.status_cd = #{statusCd}
+<if test="newBId != null and newBId != ''">
+,t.b_id = #{newBId}
+</if> 
+<if test="msg !=null and msg != ''">
+, t.msg= #{msg}
+</if> 
+<if test="errType !=null and errType != ''">
+, t.err_type= #{errType}
+</if> 
+ where 1=1 <if test="errId !=null and errId != ''">
+and t.err_id= #{errId}
+</if> 
+
+    </update>
+
+    <!-- 鏌ヨ绯荤粺寮傚父鏁伴噺 add by wuxw 2018-07-03 -->
+     <select id="queryLogSystemErrorsCount" parameterType="Map" resultType="Map">
+        select  count(1) count 
+from log_system_error t 
+where 1 =1 
+<if test="msg !=null and msg != ''">
+   and t.msg= #{msg}
+</if> 
+<if test="errType !=null and errType != ''">
+   and t.err_type= #{errType}
+</if> 
+<if test="errId !=null and errId != ''">
+   and t.err_id= #{errId}
+</if> 
+<if test="statusCd !=null and statusCd != ''">
+   and t.status_cd= #{statusCd}
+</if> 
+
+
+     </select>
+
+</mapper>
diff --git a/java110-db/src/main/resources/mapper/fee/PayFeeDetailDiscountServiceDaoImplMapper.xml b/java110-db/src/main/resources/mapper/fee/PayFeeDetailDiscountServiceDaoImplMapper.xml
new file mode 100644
index 0000000..9541690
--- /dev/null
+++ b/java110-db/src/main/resources/mapper/fee/PayFeeDetailDiscountServiceDaoImplMapper.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="payFeeDetailDiscountServiceDaoImpl">
+
+    <!-- 淇濆瓨缂磋垂浼樻儬淇℃伅 add by wuxw 2018-07-03 -->
+       <insert id="saveBusinessPayFeeDetailDiscountInfo" parameterType="Map">
+           insert into business_pay_fee_detail_discount(
+operate,create_time,detail_discount_id,discount_price,detail_id,remark,b_id,community_id,discount_id,fee_id
+) values (
+#{operate},#{createTime},#{detailDiscountId},#{discountPrice},#{detailId},#{remark},#{bId},#{communityId},#{discountId},#{feeId}
+)
+       </insert>
+
+
+       <!-- 鏌ヨ缂磋垂浼樻儬淇℃伅锛圔usiness锛� add by wuxw 2018-07-03 -->
+       <select id="getBusinessPayFeeDetailDiscountInfo" parameterType="Map" resultType="Map">
+           select  t.operate,t.create_time,t.create_time createTime,t.detail_discount_id,t.detail_discount_id detailDiscountId,t.discount_price,t.discount_price discountPrice,t.detail_id,t.detail_id detailId,t.remark,t.b_id,t.b_id bId,t.community_id,t.community_id communityId,t.discount_id,t.discount_id discountId,t.fee_id,t.fee_id feeId 
+from business_pay_fee_detail_discount t 
+where 1 =1 
+<if test="operate !=null and operate != ''">
+   and t.operate= #{operate}
+</if> 
+<if test="createTime !=null and createTime != ''">
+   and t.create_time= #{createTime}
+</if> 
+<if test="detailDiscountId !=null and detailDiscountId != ''">
+   and t.detail_discount_id= #{detailDiscountId}
+</if> 
+<if test="discountPrice !=null and discountPrice != ''">
+   and t.discount_price= #{discountPrice}
+</if> 
+<if test="detailId !=null and detailId != ''">
+   and t.detail_id= #{detailId}
+</if> 
+<if test="remark !=null and remark != ''">
+   and t.remark= #{remark}
+</if> 
+<if test="bId !=null and bId != ''">
+   and t.b_id= #{bId}
+</if> 
+<if test="communityId !=null and communityId != ''">
+   and t.community_id= #{communityId}
+</if> 
+<if test="discountId !=null and discountId != ''">
+   and t.discount_id= #{discountId}
+</if> 
+<if test="feeId !=null and feeId != ''">
+   and t.fee_id= #{feeId}
+</if> 
+
+       </select>
+
+
+
+
+
+    <!-- 淇濆瓨缂磋垂浼樻儬淇℃伅鑷� instance琛ㄤ腑 add by wuxw 2018-07-03 -->
+    <insert id="savePayFeeDetailDiscountInfoInstance" parameterType="Map">
+        insert into pay_fee_detail_discount(
+create_time,detail_discount_id,discount_price,detail_id,status_cd,remark,b_id,community_id,discount_id,fee_id
+) select t.create_time,t.detail_discount_id,t.discount_price,t.detail_id,'0',t.remark,t.b_id,t.community_id,t.discount_id,t.fee_id from business_pay_fee_detail_discount t where 1=1
+   and t.operate= 'ADD'
+<if test="createTime !=null and createTime != ''">
+   and t.create_time= #{createTime}
+</if> 
+<if test="detailDiscountId !=null and detailDiscountId != ''">
+   and t.detail_discount_id= #{detailDiscountId}
+</if> 
+<if test="discountPrice !=null and discountPrice != ''">
+   and t.discount_price= #{discountPrice}
+</if> 
+<if test="detailId !=null and detailId != ''">
+   and t.detail_id= #{detailId}
+</if> 
+<if test="remark !=null and remark != ''">
+   and t.remark= #{remark}
+</if> 
+<if test="bId !=null and bId != ''">
+   and t.b_id= #{bId}
+</if> 
+<if test="communityId !=null and communityId != ''">
+   and t.community_id= #{communityId}
+</if> 
+<if test="discountId !=null and discountId != ''">
+   and t.discount_id= #{discountId}
+</if> 
+<if test="feeId !=null and feeId != ''">
+   and t.fee_id= #{feeId}
+</if> 
+
+    </insert>
+
+
+
+    <!-- 鏌ヨ缂磋垂浼樻儬淇℃伅 add by wuxw 2018-07-03 -->
+    <select id="getPayFeeDetailDiscountInfo" parameterType="Map" resultType="Map">
+        select  t.create_time,t.create_time createTime,t.detail_discount_id,t.detail_discount_id detailDiscountId,t.discount_price,t.discount_price discountPrice,t.detail_id,t.detail_id detailId,t.status_cd,t.status_cd statusCd,t.remark,t.b_id,t.b_id bId,t.community_id,t.community_id communityId,t.discount_id,t.discount_id discountId,t.fee_id,t.fee_id feeId 
+from pay_fee_detail_discount t 
+where 1 =1 
+<if test="createTime !=null and createTime != ''">
+   and t.create_time= #{createTime}
+</if> 
+<if test="detailDiscountId !=null and detailDiscountId != ''">
+   and t.detail_discount_id= #{detailDiscountId}
+</if> 
+<if test="discountPrice !=null and discountPrice != ''">
+   and t.discount_price= #{discountPrice}
+</if> 
+<if test="detailId !=null and detailId != ''">
+   and t.detail_id= #{detailId}
+</if> 
+<if test="statusCd !=null and statusCd != ''">
+   and t.status_cd= #{statusCd}
+</if> 
+<if test="remark !=null and remark != ''">
+   and t.remark= #{remark}
+</if> 
+<if test="bId !=null and bId != ''">
+   and t.b_id= #{bId}
+</if> 
+<if test="communityId !=null and communityId != ''">
+   and t.community_id= #{communityId}
+</if> 
+<if test="discountId !=null and discountId != ''">
+   and t.discount_id= #{discountId}
+</if> 
+<if test="feeId !=null and feeId != ''">
+   and t.fee_id= #{feeId}
+</if> 
+order by t.create_time desc
+<if test="page != -1 and page != null ">
+   limit #{page}, #{row}
+</if> 
+
+    </select>
+
+
+
+
+    <!-- 淇敼缂磋垂浼樻儬淇℃伅 add by wuxw 2018-07-03 -->
+    <update id="updatePayFeeDetailDiscountInfoInstance" parameterType="Map">
+        update  pay_fee_detail_discount t set t.status_cd = #{statusCd}
+<if test="newBId != null and newBId != ''">
+,t.b_id = #{newBId}
+</if> 
+<if test="createTime !=null and createTime != ''">
+, t.create_time= #{createTime}
+</if> 
+<if test="discountPrice !=null and discountPrice != ''">
+, t.discount_price= #{discountPrice}
+</if> 
+<if test="detailId !=null and detailId != ''">
+, t.detail_id= #{detailId}
+</if> 
+<if test="remark !=null and remark != ''">
+, t.remark= #{remark}
+</if> 
+<if test="communityId !=null and communityId != ''">
+, t.community_id= #{communityId}
+</if> 
+<if test="discountId !=null and discountId != ''">
+, t.discount_id= #{discountId}
+</if> 
+<if test="feeId !=null and feeId != ''">
+, t.fee_id= #{feeId}
+</if> 
+ where 1=1 <if test="detailDiscountId !=null and detailDiscountId != ''">
+and t.detail_discount_id= #{detailDiscountId}
+</if> 
+<if test="bId !=null and bId != ''">
+and t.b_id= #{bId}
+</if> 
+
+    </update>
+
+    <!-- 鏌ヨ缂磋垂浼樻儬鏁伴噺 add by wuxw 2018-07-03 -->
+     <select id="queryPayFeeDetailDiscountsCount" parameterType="Map" resultType="Map">
+        select  count(1) count 
+from pay_fee_detail_discount t 
+where 1 =1 
+<if test="createTime !=null and createTime != ''">
+   and t.create_time= #{createTime}
+</if> 
+<if test="detailDiscountId !=null and detailDiscountId != ''">
+   and t.detail_discount_id= #{detailDiscountId}
+</if> 
+<if test="discountPrice !=null and discountPrice != ''">
+   and t.discount_price= #{discountPrice}
+</if> 
+<if test="detailId !=null and detailId != ''">
+   and t.detail_id= #{detailId}
+</if> 
+<if test="statusCd !=null and statusCd != ''">
+   and t.status_cd= #{statusCd}
+</if> 
+<if test="remark !=null and remark != ''">
+   and t.remark= #{remark}
+</if> 
+<if test="bId !=null and bId != ''">
+   and t.b_id= #{bId}
+</if> 
+<if test="communityId !=null and communityId != ''">
+   and t.community_id= #{communityId}
+</if> 
+<if test="discountId !=null and discountId != ''">
+   and t.discount_id= #{discountId}
+</if> 
+<if test="feeId !=null and feeId != ''">
+   and t.fee_id= #{feeId}
+</if> 
+
+
+     </select>
+
+</mapper>
diff --git a/java110-generator/src/main/resources/back/template_1.json b/java110-generator/src/main/resources/back/template_1.json
index b5f1686..d97e20a 100644
--- a/java110-generator/src/main/resources/back/template_1.json
+++ b/java110-generator/src/main/resources/back/template_1.json
@@ -1,43 +1,44 @@
 {
   "autoMove": true,
-  "id": "attrId",
-  "name": "ownerAttr",
-  "desc": "涓氫富灞炴��",
+  "id": "detailDiscountId",
+  "name": "payFeeDetailDiscount",
+  "desc": "缂磋垂浼樻儬",
   "shareParam": "community_id",
   "shareColumn": "communityId",
-  "shareName": "user",
-  "newBusinessTypeCd": "BUSINESS_TYPE_SAVE_OWNER_ATTR_INFO",
-  "updateBusinessTypeCd": "BUSINESS_TYPE_UPDATE_OWNER_ATTR_INFO",
-  "deleteBusinessTypeCd": "BUSINESS_TYPE_DELETE_OWNER_ATTR_INFO",
-  "newBusinessTypeCdValue": "110200030001",
-  "updateBusinessTypeCdValue": "110200040001",
-  "deleteBusinessTypeCdValue": "110200050001",
-  "businessTableName": "business_building_owner_attr",
-  "tableName": "building_owner_attr",
+  "shareName": "fee",
+  "newBusinessTypeCd": "BUSINESS_TYPE_SAVE_DETAIL_DISCOUNT_INFO",
+  "updateBusinessTypeCd": "BUSINESS_TYPE_UPDATE_DETAIL_DISCOUNT_INFO",
+  "deleteBusinessTypeCd": "BUSINESS_TYPE_DELETE_DETAIL_DISCOUNT_INFO",
+  "newBusinessTypeCdValue": "641100030001",
+  "updateBusinessTypeCdValue": "641100040001",
+  "deleteBusinessTypeCdValue": "641100050001",
+  "businessTableName": "business_pay_fee_detail_discount",
+  "tableName": "pay_fee_detail_discount",
   "param": {
-    "attrId": "attr_id",
+    "detailDiscountId": "detail_discount_id",
     "bId": "b_id",
-    "memberId": "member_id",
-    "specCd": "spec_cd",
-    "value": "value",
+    "feeId": "fee_id",
+    "detailId": "detail_id",
+    "communityId": "community_id",
     "statusCd": "status_cd",
     "createTime": "create_time",
-    "communityId": "community_id",
+    "discountId": "discount_id",
+    "discountPrice": "discount_price",
+    "remark": "remark",
     "operate": "operate"
   },
   "required": [
     {
-
-      "code": "memberId",
-      "msg": "涓氫富ID涓嶈兘涓虹┖"
+      "code": "detailId",
+      "msg": "缂磋垂鏄庣粏涓嶈兘涓虹┖"
     },
     {
-      "code": "specCd",
-      "msg": "浠诲姟灞炴�т笉鑳戒负绌�"
+      "code": "feeId",
+      "msg": "璐圭敤涓嶈兘涓虹┖"
     },
     {
-      "code": "value",
-      "msg": "浠诲姟灞炴�у�间笉鑳戒负绌�"
+      "code": "discountId",
+      "msg": "浼樻儬涓嶈兘涓虹┖"
     }
   ]
 }
\ No newline at end of file
diff --git a/java110-generator/src/main/resources/newBack/template_1.json b/java110-generator/src/main/resources/newBack/template_1.json
index 8b02077..d30f54f 100644
--- a/java110-generator/src/main/resources/newBack/template_1.json
+++ b/java110-generator/src/main/resources/newBack/template_1.json
@@ -1,31 +1,22 @@
 {
   "autoMove": true,
-  "id": "configDiscountId",
-  "name": "payFeeConfigDiscount",
-  "desc": "璐圭敤椤规姌鎵�",
-  "shareParam": "communityId",
-  "shareColumn": "community_id",
-  "shareName": "fee",
-  "tableName": "pay_fee_config_discount",
+  "id": "errId",
+  "name": "logSystemError",
+  "desc": "绯荤粺寮傚父",
+  "shareParam": "errId",
+  "shareColumn": "errId",
+  "shareName": "common",
+  "tableName": "log_system_error",
   "param": {
-    "configDiscountId": "config_discount_id",
-    "configId": "config_id",
-    "discountId": "discount_id",
-    "communityId": "community_id",
+    "errId": "err_id",
+    "errType": "err_type",
+    "msg": "msg",
     "statusCd": "status_cd"
   },
   "required": [
     {
-      "code": "configId",
-      "msg": "璐圭敤椤逛笉鑳戒负绌�"
-    },
-    {
-      "code": "discountId",
-      "msg": "鎶樻墸涓嶈兘涓虹┖"
-    },
-    {
-      "code": "communityId",
-      "msg": "灏忓尯涓嶈兘涓虹┖"
+      "code": "errType",
+      "msg": "寮傚父涓嶈兘涓虹┖"
     }
   ]
 }
diff --git a/java110-interface/src/main/java/com/java110/intf/common/ILogSystemErrorInnerServiceSMO.java b/java110-interface/src/main/java/com/java110/intf/common/ILogSystemErrorInnerServiceSMO.java
new file mode 100644
index 0000000..541d852
--- /dev/null
+++ b/java110-interface/src/main/java/com/java110/intf/common/ILogSystemErrorInnerServiceSMO.java
@@ -0,0 +1,52 @@
+package com.java110.intf.common;
+
+import com.java110.config.feign.FeignConfiguration;
+import com.java110.dto.logSystemError.LogSystemErrorDto;
+import com.java110.po.logSystemError.LogSystemErrorPo;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import java.util.List;
+
+/**
+ * @ClassName ILogSystemErrorInnerServiceSMO
+ * @Description 绯荤粺寮傚父鎺ュ彛绫�
+ * @Author wuxw
+ * @Date 2019/4/24 9:04
+ * @Version 1.0
+ * add by wuxw 2019/4/24
+ **/
+@FeignClient(name = "common-service", configuration = {FeignConfiguration.class})
+@RequestMapping("/logSystemErrorApi")
+public interface ILogSystemErrorInnerServiceSMO {
+
+
+    @RequestMapping(value = "/saveLogSystemError", method = RequestMethod.POST)
+    public int saveLogSystemError(@RequestBody LogSystemErrorPo logSystemErrorPo);
+
+    @RequestMapping(value = "/updateLogSystemError", method = RequestMethod.POST)
+    public int updateLogSystemError(@RequestBody LogSystemErrorPo logSystemErrorPo);
+
+    @RequestMapping(value = "/deleteLogSystemError", method = RequestMethod.POST)
+    public int deleteLogSystemError(@RequestBody LogSystemErrorPo logSystemErrorPo);
+
+    /**
+     * <p>鏌ヨ灏忓尯妤间俊鎭�</p>
+     *
+     * @param logSystemErrorDto 鏁版嵁瀵硅薄鍒嗕韩
+     * @return LogSystemErrorDto 瀵硅薄鏁版嵁
+     */
+    @RequestMapping(value = "/queryLogSystemErrors", method = RequestMethod.POST)
+    List<LogSystemErrorDto> queryLogSystemErrors(@RequestBody LogSystemErrorDto logSystemErrorDto);
+
+    /**
+     * 鏌ヨ<p>灏忓尯妤�</p>鎬昏褰曟暟
+     *
+     * @param logSystemErrorDto 鏁版嵁瀵硅薄鍒嗕韩
+     * @return 灏忓尯涓嬬殑灏忓尯妤艰褰曟暟
+     */
+    @RequestMapping(value = "/queryLogSystemErrorsCount", method = RequestMethod.POST)
+    int queryLogSystemErrorsCount(@RequestBody LogSystemErrorDto logSystemErrorDto);
+}
diff --git a/java110-service/src/main/java/com/java110/service/smo/ISaveSystemErrorSMO.java b/java110-service/src/main/java/com/java110/service/smo/ISaveSystemErrorSMO.java
new file mode 100644
index 0000000..ff5afa1
--- /dev/null
+++ b/java110-service/src/main/java/com/java110/service/smo/ISaveSystemErrorSMO.java
@@ -0,0 +1,18 @@
+package com.java110.service.smo;
+
+import com.java110.po.logSystemError.LogSystemErrorPo;
+
+/**
+ * @ClassName ISaveTransactionLog
+ * @Description TODO
+ * @Author wuxw
+ * @Date 2020/11/16 0:42
+ * @Version 1.0
+ * add by wuxw 2020/11/16
+ **/
+public interface ISaveSystemErrorSMO {
+
+    public void saveLog(LogSystemErrorPo logSystemErrorPo);
+
+
+}
diff --git a/java110-service/src/main/java/com/java110/service/smo/impl/SaveSystemErrorSMOImpl.java b/java110-service/src/main/java/com/java110/service/smo/impl/SaveSystemErrorSMOImpl.java
new file mode 100644
index 0000000..46cb278
--- /dev/null
+++ b/java110-service/src/main/java/com/java110/service/smo/impl/SaveSystemErrorSMOImpl.java
@@ -0,0 +1,29 @@
+package com.java110.service.smo.impl;
+
+import com.java110.intf.common.ILogSystemErrorInnerServiceSMO;
+import com.java110.po.logSystemError.LogSystemErrorPo;
+import com.java110.service.smo.ISaveSystemErrorSMO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+/**
+ * @ClassName SaveTransactionLogSMOImpl
+ * @Description TODO
+ * @Author wuxw
+ * @Date 2020/11/16 0:43
+ * @Version 1.0
+ * add by wuxw 2020/11/16
+ **/
+@Service
+public class SaveSystemErrorSMOImpl implements ISaveSystemErrorSMO {
+
+    @Autowired(required = false)
+    private ILogSystemErrorInnerServiceSMO systemErrorInnerServiceSMOImpl;
+
+    @Override
+    @Async
+    public void saveLog(LogSystemErrorPo logSystemErrorPo) {
+        systemErrorInnerServiceSMOImpl.saveLogSystemError(logSystemErrorPo);
+    }
+}
diff --git a/java110-utils/src/main/java/com/java110/utils/constant/BusinessTypeConstant.java b/java110-utils/src/main/java/com/java110/utils/constant/BusinessTypeConstant.java
index c6171da..4162668 100644
--- a/java110-utils/src/main/java/com/java110/utils/constant/BusinessTypeConstant.java
+++ b/java110-utils/src/main/java/com/java110/utils/constant/BusinessTypeConstant.java
@@ -1218,6 +1218,23 @@
      * 鍒犻櫎宸ヤ綔娴佽妭鐐� 澶勭悊鍛樺伐
      */
     public static final String BUSINESS_TYPE_DELETE_WORKFLOW_STEP_STAFF="580300050001";
+    /**
+     *  淇濆瓨宸ヤ綔娴佽妭鐐� 澶勭悊鍛樺伐
+     *  3淇濆瓨
+     */
+    public static final String BUSINESS_TYPE_SAVE_DETAIL_DISCOUNT_INFO="641100030001";
+
+
+    /**
+     *  淇敼宸ヤ綔娴佽妭鐐� 澶勭悊鍛樺伐
+     *  3淇濆瓨
+     */
+    public static final String BUSINESS_TYPE_UPDATE_DETAIL_DISCOUNT_INFO="641100040001";
+
+    /**
+     * 鍒犻櫎宸ヤ綔娴佽妭鐐� 澶勭悊鍛樺伐
+     */
+    public static final String BUSINESS_TYPE_DELETE_DETAIL_DISCOUNT_INFO="641100050001";
 
 
 }
diff --git a/java110-utils/src/main/java/com/java110/utils/constant/ServiceCodePayFeeDetailDiscountConstant.java b/java110-utils/src/main/java/com/java110/utils/constant/ServiceCodePayFeeDetailDiscountConstant.java
new file mode 100644
index 0000000..bf88a7b
--- /dev/null
+++ b/java110-utils/src/main/java/com/java110/utils/constant/ServiceCodePayFeeDetailDiscountConstant.java
@@ -0,0 +1,31 @@
+package com.java110.utils.constant;
+
+/**
+ * 缂磋垂浼樻儬甯搁噺绫�
+ * Created by wuxw on 2017/5/20.
+ */
+public class ServiceCodePayFeeDetailDiscountConstant {
+
+    /**
+     * 娣诲姞 缂磋垂浼樻儬
+     */
+    public static final String ADD_PAYFEEDETAILDISCOUNT = "payFeeDetailDiscount.savePayFeeDetailDiscount";
+
+
+    /**
+     * 淇敼 缂磋垂浼樻儬
+     */
+    public static final String UPDATE_PAYFEEDETAILDISCOUNT = "payFeeDetailDiscount.updatePayFeeDetailDiscount";
+    /**
+     * 鍒犻櫎 缂磋垂浼樻儬
+     */
+    public static final String DELETE_PAYFEEDETAILDISCOUNT = "payFeeDetailDiscount.deletePayFeeDetailDiscount";
+
+
+    /**
+     * 鏌ヨ 缂磋垂浼樻儬
+     */
+    public static final String LIST_PAYFEEDETAILDISCOUNTS = "payFeeDetailDiscount.listPayFeeDetailDiscounts";
+
+
+}
diff --git a/java110-utils/src/main/java/com/java110/utils/util/ExceptionUtil.java b/java110-utils/src/main/java/com/java110/utils/util/ExceptionUtil.java
new file mode 100644
index 0000000..34bc048
--- /dev/null
+++ b/java110-utils/src/main/java/com/java110/utils/util/ExceptionUtil.java
@@ -0,0 +1,22 @@
+package com.java110.utils.util;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+/**
+ * 寮傚父宸ュ叿绫�
+ */
+public class ExceptionUtil {
+
+    public static String getStackTrace(Throwable throwable) {
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw);
+
+        try {
+            throwable.printStackTrace(pw);
+            return sw.toString();
+        } finally {
+            pw.close();
+        }
+    }
+}
diff --git a/service-api/src/main/java/com/java110/api/bmo/payFeeDetailDiscount/IPayFeeDetailDiscountBMO.java b/service-api/src/main/java/com/java110/api/bmo/payFeeDetailDiscount/IPayFeeDetailDiscountBMO.java
new file mode 100644
index 0000000..34697ae
--- /dev/null
+++ b/service-api/src/main/java/com/java110/api/bmo/payFeeDetailDiscount/IPayFeeDetailDiscountBMO.java
@@ -0,0 +1,38 @@
+package com.java110.api.bmo.payFeeDetailDiscount;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.api.bmo.IApiBaseBMO;
+import com.java110.core.context.DataFlowContext;
+
+public interface IPayFeeDetailDiscountBMO extends IApiBaseBMO {
+
+
+    /**
+     * 娣诲姞缂磋垂浼樻儬
+     * @param paramInJson
+     * @param dataFlowContext
+     * @return
+     */
+     void addPayFeeDetailDiscount(JSONObject paramInJson, DataFlowContext dataFlowContext);
+
+    /**
+     * 娣诲姞缂磋垂浼樻儬淇℃伅
+     *
+     * @param paramInJson     鎺ュ彛璋冪敤鏀句紶鍏ュ叆鍙�
+     * @param dataFlowContext 鏁版嵁涓婁笅鏂�
+     * @return 璁㈠崟鏈嶅姟鑳藉鎺ュ彈鐨勬姤鏂�
+     */
+     void updatePayFeeDetailDiscount(JSONObject paramInJson, DataFlowContext dataFlowContext);
+
+    /**
+     * 鍒犻櫎缂磋垂浼樻儬
+     *
+     * @param paramInJson     鎺ュ彛璋冪敤鏀句紶鍏ュ叆鍙�
+     * @param dataFlowContext 鏁版嵁涓婁笅鏂�
+     * @return 璁㈠崟鏈嶅姟鑳藉鎺ュ彈鐨勬姤鏂�
+     */
+     void deletePayFeeDetailDiscount(JSONObject paramInJson, DataFlowContext dataFlowContext);
+
+
+
+}
diff --git a/service-api/src/main/java/com/java110/api/bmo/payFeeDetailDiscount/impl/PayFeeDetailDiscountBMOImpl.java b/service-api/src/main/java/com/java110/api/bmo/payFeeDetailDiscount/impl/PayFeeDetailDiscountBMOImpl.java
new file mode 100644
index 0000000..d09eaf2
--- /dev/null
+++ b/service-api/src/main/java/com/java110/api/bmo/payFeeDetailDiscount/impl/PayFeeDetailDiscountBMOImpl.java
@@ -0,0 +1,61 @@
+package com.java110.api.bmo.payFeeDetailDiscount.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.api.bmo.ApiBaseBMO;
+import com.java110.api.bmo.payFeeDetailDiscount.IPayFeeDetailDiscountBMO;
+import com.java110.core.context.DataFlowContext;
+import com.java110.core.smo.fee.IPayFeeDetailDiscountInnerServiceSMO;
+import com.java110.po.payFeeDetailDiscount.PayFeeDetailDiscountPo;
+import com.java110.utils.constant.BusinessTypeConstant;
+import com.java110.utils.util.BeanConvertUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service("payFeeDetailDiscountBMOImpl")
+public class PayFeeDetailDiscountBMOImpl extends ApiBaseBMO implements IPayFeeDetailDiscountBMO {
+
+    @Autowired
+    private IPayFeeDetailDiscountInnerServiceSMO payFeeDetailDiscountInnerServiceSMOImpl;
+
+    /**
+     * 娣诲姞灏忓尯淇℃伅
+     *
+     * @param paramInJson     鎺ュ彛璋冪敤鏀句紶鍏ュ叆鍙�
+     * @param dataFlowContext 鏁版嵁涓婁笅鏂�
+     * @return 璁㈠崟鏈嶅姟鑳藉鎺ュ彈鐨勬姤鏂�
+     */
+    public void addPayFeeDetailDiscount(JSONObject paramInJson, DataFlowContext dataFlowContext) {
+
+        paramInJson.put("detailDiscountId", "-1");
+        PayFeeDetailDiscountPo payFeeDetailDiscountPo = BeanConvertUtil.covertBean(paramInJson, PayFeeDetailDiscountPo.class);
+        super.insert(dataFlowContext, payFeeDetailDiscountPo, BusinessTypeConstant.BUSINESS_TYPE_SAVE_DETAIL_DISCOUNT_INFO);
+    }
+
+
+    /**
+     * 娣诲姞娲诲姩淇℃伅
+     *
+     * @param paramInJson     鎺ュ彛璋冪敤鏀句紶鍏ュ叆鍙�
+     * @param dataFlowContext 鏁版嵁涓婁笅鏂�
+     * @return 璁㈠崟鏈嶅姟鑳藉鎺ュ彈鐨勬姤鏂�
+     */
+    public void updatePayFeeDetailDiscount(JSONObject paramInJson, DataFlowContext dataFlowContext) {
+        PayFeeDetailDiscountPo payFeeDetailDiscountPo = BeanConvertUtil.covertBean(paramInJson, PayFeeDetailDiscountPo.class);
+        super.update(dataFlowContext, payFeeDetailDiscountPo, BusinessTypeConstant.BUSINESS_TYPE_UPDATE_DETAIL_DISCOUNT_INFO);
+    }
+
+
+    /**
+     * 娣诲姞灏忓尯淇℃伅
+     *
+     * @param paramInJson     鎺ュ彛璋冪敤鏀句紶鍏ュ叆鍙�
+     * @param dataFlowContext 鏁版嵁涓婁笅鏂�
+     * @return 璁㈠崟鏈嶅姟鑳藉鎺ュ彈鐨勬姤鏂�
+     */
+    public void deletePayFeeDetailDiscount(JSONObject paramInJson, DataFlowContext dataFlowContext) {
+
+        PayFeeDetailDiscountPo payFeeDetailDiscountPo = BeanConvertUtil.covertBean(paramInJson, PayFeeDetailDiscountPo.class);
+        super.update(dataFlowContext, payFeeDetailDiscountPo, BusinessTypeConstant.BUSINESS_TYPE_DELETE_DETAIL_DISCOUNT_INFO);
+    }
+
+}
diff --git a/service-api/src/main/java/com/java110/api/listener/payFeeDetailDiscount/DeletePayFeeDetailDiscountListener.java b/service-api/src/main/java/com/java110/api/listener/payFeeDetailDiscount/DeletePayFeeDetailDiscountListener.java
new file mode 100644
index 0000000..43340fc
--- /dev/null
+++ b/service-api/src/main/java/com/java110/api/listener/payFeeDetailDiscount/DeletePayFeeDetailDiscountListener.java
@@ -0,0 +1,49 @@
+package com.java110.api.listener.payFeeDetailDiscount;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.api.bmo.payFeeDetailDiscount.IPayFeeDetailDiscountBMO;
+import com.java110.api.listener.AbstractServiceApiPlusListener;
+import com.java110.core.annotation.Java110Listener;
+import com.java110.core.context.DataFlowContext;
+import com.java110.core.event.service.api.ServiceDataFlowEvent;
+import com.java110.utils.constant.ServiceCodePayFeeDetailDiscountConstant;
+import com.java110.utils.util.Assert;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpMethod;
+
+
+/**
+ * 淇濆瓨灏忓尯渚﹀惉
+ * add by wuxw 2019-06-30
+ */
+@Java110Listener("deletePayFeeDetailDiscountListener")
+public class DeletePayFeeDetailDiscountListener extends AbstractServiceApiPlusListener {
+
+    @Autowired
+    private IPayFeeDetailDiscountBMO payFeeDetailDiscountBMOImpl;
+
+    @Override
+    protected void validate(ServiceDataFlowEvent event, JSONObject reqJson) {
+        //Assert.hasKeyAndValue(reqJson, "xxx", "xxx");
+
+        Assert.hasKeyAndValue(reqJson, "detailDiscountId", "detailDiscountId涓嶈兘涓虹┖");
+
+    }
+
+    @Override
+    protected void doSoService(ServiceDataFlowEvent event, DataFlowContext context, JSONObject reqJson) {
+
+        payFeeDetailDiscountBMOImpl.deletePayFeeDetailDiscount(reqJson, context);
+    }
+
+    @Override
+    public String getServiceCode() {
+        return ServiceCodePayFeeDetailDiscountConstant.DELETE_PAYFEEDETAILDISCOUNT;
+    }
+
+    @Override
+    public HttpMethod getHttpMethod() {
+        return HttpMethod.POST;
+    }
+
+}
diff --git a/service-api/src/main/java/com/java110/api/listener/payFeeDetailDiscount/ListPayFeeDetailDiscountsListener.java b/service-api/src/main/java/com/java110/api/listener/payFeeDetailDiscount/ListPayFeeDetailDiscountsListener.java
new file mode 100644
index 0000000..4873573
--- /dev/null
+++ b/service-api/src/main/java/com/java110/api/listener/payFeeDetailDiscount/ListPayFeeDetailDiscountsListener.java
@@ -0,0 +1,82 @@
+package com.java110.api.listener.payFeeDetailDiscount;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.api.listener.AbstractServiceApiListener;
+import com.java110.core.annotation.Java110Listener;
+import com.java110.core.context.DataFlowContext;
+import com.java110.core.event.service.api.ServiceDataFlowEvent;
+import com.java110.core.smo.fee.IPayFeeDetailDiscountInnerServiceSMO;
+import com.java110.dto.payFeeDetailDiscount.PayFeeDetailDiscountDto;
+import com.java110.utils.constant.ServiceCodePayFeeDetailDiscountConstant;
+import com.java110.utils.util.BeanConvertUtil;
+import com.java110.vo.ResultVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 鏌ヨ灏忓尯渚﹀惉绫�
+ */
+@Java110Listener("listPayFeeDetailDiscountsListener")
+public class ListPayFeeDetailDiscountsListener extends AbstractServiceApiListener {
+
+    @Autowired
+    private IPayFeeDetailDiscountInnerServiceSMO payFeeDetailDiscountInnerServiceSMOImpl;
+
+    @Override
+    public String getServiceCode() {
+        return ServiceCodePayFeeDetailDiscountConstant.LIST_PAYFEEDETAILDISCOUNTS;
+    }
+
+    @Override
+    public HttpMethod getHttpMethod() {
+        return HttpMethod.GET;
+    }
+
+
+    @Override
+    public int getOrder() {
+        return DEFAULT_ORDER;
+    }
+
+
+    public IPayFeeDetailDiscountInnerServiceSMO getPayFeeDetailDiscountInnerServiceSMOImpl() {
+        return payFeeDetailDiscountInnerServiceSMOImpl;
+    }
+
+    public void setPayFeeDetailDiscountInnerServiceSMOImpl(IPayFeeDetailDiscountInnerServiceSMO payFeeDetailDiscountInnerServiceSMOImpl) {
+        this.payFeeDetailDiscountInnerServiceSMOImpl = payFeeDetailDiscountInnerServiceSMOImpl;
+    }
+
+    @Override
+    protected void validate(ServiceDataFlowEvent event, JSONObject reqJson) {
+        super.validatePageInfo(reqJson);
+    }
+
+    @Override
+    protected void doSoService(ServiceDataFlowEvent event, DataFlowContext context, JSONObject reqJson) {
+
+        PayFeeDetailDiscountDto payFeeDetailDiscountDto = BeanConvertUtil.covertBean(reqJson, PayFeeDetailDiscountDto.class);
+
+        int count = payFeeDetailDiscountInnerServiceSMOImpl.queryPayFeeDetailDiscountsCount(payFeeDetailDiscountDto);
+
+        List<PayFeeDetailDiscountDto> payFeeDetailDiscountDtos = null;
+
+        if (count > 0) {
+            payFeeDetailDiscountDtos = payFeeDetailDiscountInnerServiceSMOImpl.queryPayFeeDetailDiscounts(payFeeDetailDiscountDto);
+        } else {
+            payFeeDetailDiscountDtos = new ArrayList<>();
+        }
+
+        ResultVo resultVo = new ResultVo((int) Math.ceil((double) count / (double) reqJson.getInteger("row")), count, payFeeDetailDiscountDtos);
+
+        ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.OK);
+
+        context.setResponseEntity(responseEntity);
+
+    }
+}
diff --git a/service-api/src/main/java/com/java110/api/listener/payFeeDetailDiscount/SavePayFeeDetailDiscountListener.java b/service-api/src/main/java/com/java110/api/listener/payFeeDetailDiscount/SavePayFeeDetailDiscountListener.java
new file mode 100644
index 0000000..443d146
--- /dev/null
+++ b/service-api/src/main/java/com/java110/api/listener/payFeeDetailDiscount/SavePayFeeDetailDiscountListener.java
@@ -0,0 +1,49 @@
+package com.java110.api.listener.payFeeDetailDiscount;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.api.bmo.payFeeDetailDiscount.IPayFeeDetailDiscountBMO;
+import com.java110.api.listener.AbstractServiceApiPlusListener;
+import com.java110.core.annotation.Java110Listener;
+import com.java110.core.context.DataFlowContext;
+import com.java110.core.event.service.api.ServiceDataFlowEvent;
+import com.java110.utils.constant.ServiceCodePayFeeDetailDiscountConstant;
+import com.java110.utils.util.Assert;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpMethod;
+
+/**
+ * 淇濆瓨鍟嗘埛渚﹀惉
+ * add by wuxw 2019-06-30
+ */
+@Java110Listener("savePayFeeDetailDiscountListener")
+public class SavePayFeeDetailDiscountListener extends AbstractServiceApiPlusListener {
+
+    @Autowired
+    private IPayFeeDetailDiscountBMO payFeeDetailDiscountBMOImpl;
+
+    @Override
+    protected void validate(ServiceDataFlowEvent event, JSONObject reqJson) {
+        //Assert.hasKeyAndValue(reqJson, "xxx", "xxx");
+
+        Assert.hasKeyAndValue(reqJson, "detailId", "璇锋眰鎶ユ枃涓湭鍖呭惈detailId");
+        Assert.hasKeyAndValue(reqJson, "feeId", "璇锋眰鎶ユ枃涓湭鍖呭惈feeId");
+        Assert.hasKeyAndValue(reqJson, "discountId", "璇锋眰鎶ユ枃涓湭鍖呭惈discountId");
+
+    }
+
+    @Override
+    protected void doSoService(ServiceDataFlowEvent event, DataFlowContext context, JSONObject reqJson) {
+        payFeeDetailDiscountBMOImpl.addPayFeeDetailDiscount(reqJson, context);
+    }
+
+    @Override
+    public String getServiceCode() {
+        return ServiceCodePayFeeDetailDiscountConstant.ADD_PAYFEEDETAILDISCOUNT;
+    }
+
+    @Override
+    public HttpMethod getHttpMethod() {
+        return HttpMethod.POST;
+    }
+
+}
diff --git a/service-api/src/main/java/com/java110/api/listener/payFeeDetailDiscount/UpdatePayFeeDetailDiscountListener.java b/service-api/src/main/java/com/java110/api/listener/payFeeDetailDiscount/UpdatePayFeeDetailDiscountListener.java
new file mode 100644
index 0000000..1de4f0e
--- /dev/null
+++ b/service-api/src/main/java/com/java110/api/listener/payFeeDetailDiscount/UpdatePayFeeDetailDiscountListener.java
@@ -0,0 +1,49 @@
+package com.java110.api.listener.payFeeDetailDiscount;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.api.bmo.payFeeDetailDiscount.IPayFeeDetailDiscountBMO;
+import com.java110.api.listener.AbstractServiceApiPlusListener;
+import com.java110.core.annotation.Java110Listener;
+import com.java110.core.context.DataFlowContext;
+import com.java110.core.event.service.api.ServiceDataFlowEvent;
+import com.java110.utils.constant.ServiceCodePayFeeDetailDiscountConstant;
+import com.java110.utils.util.Assert;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpMethod;
+
+/**
+ * 淇濆瓨缂磋垂浼樻儬渚﹀惉
+ * add by wuxw 2019-06-30
+ */
+@Java110Listener("updatePayFeeDetailDiscountListener")
+public class UpdatePayFeeDetailDiscountListener extends AbstractServiceApiPlusListener {
+
+    @Autowired
+    private IPayFeeDetailDiscountBMO payFeeDetailDiscountBMOImpl;
+
+    @Override
+    protected void validate(ServiceDataFlowEvent event, JSONObject reqJson) {
+
+        Assert.hasKeyAndValue(reqJson, "detailDiscountId", "detailDiscountId涓嶈兘涓虹┖");
+        Assert.hasKeyAndValue(reqJson, "detailId", "璇锋眰鎶ユ枃涓湭鍖呭惈detailId");
+        Assert.hasKeyAndValue(reqJson, "feeId", "璇锋眰鎶ユ枃涓湭鍖呭惈feeId");
+        Assert.hasKeyAndValue(reqJson, "discountId", "璇锋眰鎶ユ枃涓湭鍖呭惈discountId");
+
+    }
+
+    @Override
+    protected void doSoService(ServiceDataFlowEvent event, DataFlowContext context, JSONObject reqJson) {
+
+        payFeeDetailDiscountBMOImpl.updatePayFeeDetailDiscount(reqJson, context);
+    }
+
+    @Override
+    public String getServiceCode() {
+        return ServiceCodePayFeeDetailDiscountConstant.UPDATE_PAYFEEDETAILDISCOUNT;
+    }
+
+    @Override
+    public HttpMethod getHttpMethod() {
+        return HttpMethod.POST;
+    }
+}
diff --git a/service-api/src/main/java/com/java110/api/smo/ISaveTransactionLogSMO.java b/service-api/src/main/java/com/java110/api/smo/ISaveTransactionLogSMO.java
index df6e911..805bee5 100644
--- a/service-api/src/main/java/com/java110/api/smo/ISaveTransactionLogSMO.java
+++ b/service-api/src/main/java/com/java110/api/smo/ISaveTransactionLogSMO.java
@@ -13,4 +13,6 @@
 public interface ISaveTransactionLogSMO {
 
     public void saveLog(TransactionLogPo transactionLogPo);
+
+
 }
diff --git a/service-common/src/main/java/com/java110/common/api/LogSystemErrorApi.java b/service-common/src/main/java/com/java110/common/api/LogSystemErrorApi.java
new file mode 100644
index 0000000..6e4875d
--- /dev/null
+++ b/service-common/src/main/java/com/java110/common/api/LogSystemErrorApi.java
@@ -0,0 +1,103 @@
+package com.java110.common.api;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.common.bmo.logSystemError.IDeleteLogSystemErrorBMO;
+import com.java110.common.bmo.logSystemError.IGetLogSystemErrorBMO;
+import com.java110.common.bmo.logSystemError.ISaveLogSystemErrorBMO;
+import com.java110.common.bmo.logSystemError.IUpdateLogSystemErrorBMO;
+import com.java110.dto.logSystemError.LogSystemErrorDto;
+import com.java110.po.logSystemError.LogSystemErrorPo;
+import com.java110.utils.util.Assert;
+import com.java110.utils.util.BeanConvertUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+
+@RestController
+@RequestMapping(value = "/logSystemError")
+public class LogSystemErrorApi {
+
+    @Autowired
+    private ISaveLogSystemErrorBMO saveLogSystemErrorBMOImpl;
+    @Autowired
+    private IUpdateLogSystemErrorBMO updateLogSystemErrorBMOImpl;
+    @Autowired
+    private IDeleteLogSystemErrorBMO deleteLogSystemErrorBMOImpl;
+
+    @Autowired
+    private IGetLogSystemErrorBMO getLogSystemErrorBMOImpl;
+
+    /**
+     * 寰俊淇濆瓨娑堟伅妯℃澘
+     *
+     * @param reqJson
+     * @return
+     * @serviceCode /logSystemError/saveLogSystemError
+     * @path /app/logSystemError/saveLogSystemError
+     */
+    @RequestMapping(value = "/saveLogSystemError", method = RequestMethod.POST)
+    public ResponseEntity<String> saveLogSystemError(@RequestBody JSONObject reqJson) {
+
+        Assert.hasKeyAndValue(reqJson, "errType", "璇锋眰鎶ユ枃涓湭鍖呭惈errType");
+
+
+        LogSystemErrorPo logSystemErrorPo = BeanConvertUtil.covertBean(reqJson, LogSystemErrorPo.class);
+        return saveLogSystemErrorBMOImpl.save(logSystemErrorPo);
+    }
+
+    /**
+     * 寰俊淇敼娑堟伅妯℃澘
+     *
+     * @param reqJson
+     * @return
+     * @serviceCode /logSystemError/updateLogSystemError
+     * @path /app/logSystemError/updateLogSystemError
+     */
+    @RequestMapping(value = "/updateLogSystemError", method = RequestMethod.POST)
+    public ResponseEntity<String> updateLogSystemError(@RequestBody JSONObject reqJson) {
+
+        Assert.hasKeyAndValue(reqJson, "errType", "璇锋眰鎶ユ枃涓湭鍖呭惈errType");
+        Assert.hasKeyAndValue(reqJson, "errId", "errId涓嶈兘涓虹┖");
+
+
+        LogSystemErrorPo logSystemErrorPo = BeanConvertUtil.covertBean(reqJson, LogSystemErrorPo.class);
+        return updateLogSystemErrorBMOImpl.update(logSystemErrorPo);
+    }
+
+    /**
+     * 寰俊鍒犻櫎娑堟伅妯℃澘
+     *
+     * @param reqJson
+     * @return
+     * @serviceCode /logSystemError/deleteLogSystemError
+     * @path /app/logSystemError/deleteLogSystemError
+     */
+    @RequestMapping(value = "/deleteLogSystemError", method = RequestMethod.POST)
+    public ResponseEntity<String> deleteLogSystemError(@RequestBody JSONObject reqJson) {
+        Assert.hasKeyAndValue(reqJson, "communityId", "灏忓尯ID涓嶈兘涓虹┖");
+
+        Assert.hasKeyAndValue(reqJson, "errId", "errId涓嶈兘涓虹┖");
+
+
+        LogSystemErrorPo logSystemErrorPo = BeanConvertUtil.covertBean(reqJson, LogSystemErrorPo.class);
+        return deleteLogSystemErrorBMOImpl.delete(logSystemErrorPo);
+    }
+
+    /**
+     * 寰俊鍒犻櫎娑堟伅妯℃澘
+     *
+     * @return
+     * @serviceCode /logSystemError/queryLogSystemError
+     * @path /app/logSystemError/queryLogSystemError
+     */
+    @RequestMapping(value = "/queryLogSystemError", method = RequestMethod.GET)
+    public ResponseEntity<String> queryLogSystemError(
+            @RequestParam(value = "page") int page,
+            @RequestParam(value = "row") int row) {
+        LogSystemErrorDto logSystemErrorDto = new LogSystemErrorDto();
+        logSystemErrorDto.setPage(page);
+        logSystemErrorDto.setRow(row);
+        return getLogSystemErrorBMOImpl.get(logSystemErrorDto);
+    }
+}
diff --git a/service-common/src/main/java/com/java110/common/bmo/logSystemError/IDeleteLogSystemErrorBMO.java b/service-common/src/main/java/com/java110/common/bmo/logSystemError/IDeleteLogSystemErrorBMO.java
new file mode 100644
index 0000000..d3c36d8
--- /dev/null
+++ b/service-common/src/main/java/com/java110/common/bmo/logSystemError/IDeleteLogSystemErrorBMO.java
@@ -0,0 +1,17 @@
+package com.java110.common.bmo.logSystemError;
+import com.java110.po.logSystemError.LogSystemErrorPo;
+import org.springframework.http.ResponseEntity;
+
+public interface IDeleteLogSystemErrorBMO {
+
+
+    /**
+     * 淇敼绯荤粺寮傚父
+     * add by wuxw
+     * @param logSystemErrorPo
+     * @return
+     */
+    ResponseEntity<String> delete(LogSystemErrorPo logSystemErrorPo);
+
+
+}
diff --git a/service-common/src/main/java/com/java110/common/bmo/logSystemError/IGetLogSystemErrorBMO.java b/service-common/src/main/java/com/java110/common/bmo/logSystemError/IGetLogSystemErrorBMO.java
new file mode 100644
index 0000000..cf33cfe
--- /dev/null
+++ b/service-common/src/main/java/com/java110/common/bmo/logSystemError/IGetLogSystemErrorBMO.java
@@ -0,0 +1,16 @@
+package com.java110.common.bmo.logSystemError;
+import com.java110.dto.logSystemError.LogSystemErrorDto;
+import org.springframework.http.ResponseEntity;
+public interface IGetLogSystemErrorBMO {
+
+
+    /**
+     * 鏌ヨ绯荤粺寮傚父
+     * add by wuxw
+     * @param  logSystemErrorDto
+     * @return
+     */
+    ResponseEntity<String> get(LogSystemErrorDto logSystemErrorDto);
+
+
+}
diff --git a/service-common/src/main/java/com/java110/common/bmo/logSystemError/ISaveLogSystemErrorBMO.java b/service-common/src/main/java/com/java110/common/bmo/logSystemError/ISaveLogSystemErrorBMO.java
new file mode 100644
index 0000000..22d28aa
--- /dev/null
+++ b/service-common/src/main/java/com/java110/common/bmo/logSystemError/ISaveLogSystemErrorBMO.java
@@ -0,0 +1,17 @@
+package com.java110.common.bmo.logSystemError;
+
+import com.java110.po.logSystemError.LogSystemErrorPo;
+import org.springframework.http.ResponseEntity;
+public interface ISaveLogSystemErrorBMO {
+
+
+    /**
+     * 娣诲姞绯荤粺寮傚父
+     * add by wuxw
+     * @param logSystemErrorPo
+     * @return
+     */
+    ResponseEntity<String> save(LogSystemErrorPo logSystemErrorPo);
+
+
+}
diff --git a/service-common/src/main/java/com/java110/common/bmo/logSystemError/IUpdateLogSystemErrorBMO.java b/service-common/src/main/java/com/java110/common/bmo/logSystemError/IUpdateLogSystemErrorBMO.java
new file mode 100644
index 0000000..3de1d4b
--- /dev/null
+++ b/service-common/src/main/java/com/java110/common/bmo/logSystemError/IUpdateLogSystemErrorBMO.java
@@ -0,0 +1,17 @@
+package com.java110.common.bmo.logSystemError;
+import com.java110.po.logSystemError.LogSystemErrorPo;
+import org.springframework.http.ResponseEntity;
+
+public interface IUpdateLogSystemErrorBMO {
+
+
+    /**
+     * 淇敼绯荤粺寮傚父
+     * add by wuxw
+     * @param logSystemErrorPo
+     * @return
+     */
+    ResponseEntity<String> update(LogSystemErrorPo logSystemErrorPo);
+
+
+}
diff --git a/service-common/src/main/java/com/java110/common/bmo/logSystemError/impl/DeleteLogSystemErrorBMOImpl.java b/service-common/src/main/java/com/java110/common/bmo/logSystemError/impl/DeleteLogSystemErrorBMOImpl.java
new file mode 100644
index 0000000..50c6db5
--- /dev/null
+++ b/service-common/src/main/java/com/java110/common/bmo/logSystemError/impl/DeleteLogSystemErrorBMOImpl.java
@@ -0,0 +1,34 @@
+package com.java110.common.bmo.logSystemError.impl;
+
+import com.java110.common.bmo.logSystemError.IDeleteLogSystemErrorBMO;
+import com.java110.core.annotation.Java110Transactional;
+import com.java110.intf.common.ILogSystemErrorInnerServiceSMO;
+import com.java110.po.logSystemError.LogSystemErrorPo;
+import com.java110.vo.ResultVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+@Service("deleteLogSystemErrorBMOImpl")
+public class DeleteLogSystemErrorBMOImpl implements IDeleteLogSystemErrorBMO {
+
+    @Autowired
+    private ILogSystemErrorInnerServiceSMO logSystemErrorInnerServiceSMOImpl;
+
+    /**
+     * @param logSystemErrorPo 鏁版嵁
+     * @return 璁㈠崟鏈嶅姟鑳藉鎺ュ彈鐨勬姤鏂�
+     */
+    @Java110Transactional
+    public ResponseEntity<String> delete(LogSystemErrorPo logSystemErrorPo) {
+
+        int flag = logSystemErrorInnerServiceSMOImpl.deleteLogSystemError(logSystemErrorPo);
+
+        if (flag > 0) {
+            return ResultVo.createResponseEntity(ResultVo.CODE_OK, "淇濆瓨鎴愬姛");
+        }
+
+        return ResultVo.createResponseEntity(ResultVo.CODE_ERROR, "淇濆瓨澶辫触");
+    }
+
+}
diff --git a/service-common/src/main/java/com/java110/common/bmo/logSystemError/impl/GetLogSystemErrorBMOImpl.java b/service-common/src/main/java/com/java110/common/bmo/logSystemError/impl/GetLogSystemErrorBMOImpl.java
new file mode 100644
index 0000000..b9f809a
--- /dev/null
+++ b/service-common/src/main/java/com/java110/common/bmo/logSystemError/impl/GetLogSystemErrorBMOImpl.java
@@ -0,0 +1,44 @@
+package com.java110.common.bmo.logSystemError.impl;
+
+import com.java110.common.bmo.logSystemError.IGetLogSystemErrorBMO;
+import com.java110.dto.logSystemError.LogSystemErrorDto;
+import com.java110.intf.common.ILogSystemErrorInnerServiceSMO;
+import com.java110.vo.ResultVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service("getLogSystemErrorBMOImpl")
+public class GetLogSystemErrorBMOImpl implements IGetLogSystemErrorBMO {
+
+    @Autowired
+    private ILogSystemErrorInnerServiceSMO logSystemErrorInnerServiceSMOImpl;
+
+    /**
+     * @param logSystemErrorDto
+     * @return 璁㈠崟鏈嶅姟鑳藉鎺ュ彈鐨勬姤鏂�
+     */
+    public ResponseEntity<String> get(LogSystemErrorDto logSystemErrorDto) {
+
+
+        int count = logSystemErrorInnerServiceSMOImpl.queryLogSystemErrorsCount(logSystemErrorDto);
+
+        List<LogSystemErrorDto> logSystemErrorDtos = null;
+        if (count > 0) {
+            logSystemErrorDtos = logSystemErrorInnerServiceSMOImpl.queryLogSystemErrors(logSystemErrorDto);
+        } else {
+            logSystemErrorDtos = new ArrayList<>();
+        }
+
+        ResultVo resultVo = new ResultVo((int) Math.ceil((double) count / (double) logSystemErrorDto.getRow()), count, logSystemErrorDtos);
+
+        ResponseEntity<String> responseEntity = new ResponseEntity<String>(resultVo.toString(), HttpStatus.OK);
+
+        return responseEntity;
+    }
+
+}
diff --git a/service-common/src/main/java/com/java110/common/bmo/logSystemError/impl/SaveLogSystemErrorBMOImpl.java b/service-common/src/main/java/com/java110/common/bmo/logSystemError/impl/SaveLogSystemErrorBMOImpl.java
new file mode 100644
index 0000000..dcab14a
--- /dev/null
+++ b/service-common/src/main/java/com/java110/common/bmo/logSystemError/impl/SaveLogSystemErrorBMOImpl.java
@@ -0,0 +1,38 @@
+package com.java110.common.bmo.logSystemError.impl;
+
+import com.java110.common.bmo.logSystemError.ISaveLogSystemErrorBMO;
+import com.java110.core.annotation.Java110Transactional;
+import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.intf.common.ILogSystemErrorInnerServiceSMO;
+import com.java110.po.logSystemError.LogSystemErrorPo;
+import com.java110.vo.ResultVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+@Service("saveLogSystemErrorBMOImpl")
+public class SaveLogSystemErrorBMOImpl implements ISaveLogSystemErrorBMO {
+
+    @Autowired
+    private ILogSystemErrorInnerServiceSMO logSystemErrorInnerServiceSMOImpl;
+
+    /**
+     * 娣诲姞灏忓尯淇℃伅
+     *
+     * @param logSystemErrorPo
+     * @return 璁㈠崟鏈嶅姟鑳藉鎺ュ彈鐨勬姤鏂�
+     */
+    @Java110Transactional
+    public ResponseEntity<String> save(LogSystemErrorPo logSystemErrorPo) {
+
+        logSystemErrorPo.setErrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_errId));
+        int flag = logSystemErrorInnerServiceSMOImpl.saveLogSystemError(logSystemErrorPo);
+
+        if (flag > 0) {
+            return ResultVo.createResponseEntity(ResultVo.CODE_OK, "淇濆瓨鎴愬姛");
+        }
+
+        return ResultVo.createResponseEntity(ResultVo.CODE_ERROR, "淇濆瓨澶辫触");
+    }
+
+}
diff --git a/service-common/src/main/java/com/java110/common/bmo/logSystemError/impl/UpdateLogSystemErrorBMOImpl.java b/service-common/src/main/java/com/java110/common/bmo/logSystemError/impl/UpdateLogSystemErrorBMOImpl.java
new file mode 100644
index 0000000..c1cab22
--- /dev/null
+++ b/service-common/src/main/java/com/java110/common/bmo/logSystemError/impl/UpdateLogSystemErrorBMOImpl.java
@@ -0,0 +1,34 @@
+package com.java110.common.bmo.logSystemError.impl;
+
+import com.java110.common.bmo.logSystemError.IUpdateLogSystemErrorBMO;
+import com.java110.core.annotation.Java110Transactional;
+import com.java110.intf.common.ILogSystemErrorInnerServiceSMO;
+import com.java110.po.logSystemError.LogSystemErrorPo;
+import com.java110.vo.ResultVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+@Service("updateLogSystemErrorBMOImpl")
+public class UpdateLogSystemErrorBMOImpl implements IUpdateLogSystemErrorBMO {
+
+    @Autowired
+    private ILogSystemErrorInnerServiceSMO logSystemErrorInnerServiceSMOImpl;
+
+    /**
+     * @param logSystemErrorPo
+     * @return 璁㈠崟鏈嶅姟鑳藉鎺ュ彈鐨勬姤鏂�
+     */
+    @Java110Transactional
+    public ResponseEntity<String> update(LogSystemErrorPo logSystemErrorPo) {
+
+        int flag = logSystemErrorInnerServiceSMOImpl.updateLogSystemError(logSystemErrorPo);
+
+        if (flag > 0) {
+            return ResultVo.createResponseEntity(ResultVo.CODE_OK, "淇濆瓨鎴愬姛");
+        }
+
+        return ResultVo.createResponseEntity(ResultVo.CODE_ERROR, "淇濆瓨澶辫触");
+    }
+
+}
diff --git a/service-common/src/main/java/com/java110/common/dao/ILogSystemErrorServiceDao.java b/service-common/src/main/java/com/java110/common/dao/ILogSystemErrorServiceDao.java
new file mode 100644
index 0000000..45e52f3
--- /dev/null
+++ b/service-common/src/main/java/com/java110/common/dao/ILogSystemErrorServiceDao.java
@@ -0,0 +1,61 @@
+package com.java110.common.dao;
+
+
+import com.java110.utils.exception.DAOException;
+import com.java110.entity.merchant.BoMerchant;
+import com.java110.entity.merchant.BoMerchantAttr;
+import com.java110.entity.merchant.Merchant;
+import com.java110.entity.merchant.MerchantAttr;
+
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 绯荤粺寮傚父缁勪欢鍐呴儴涔嬮棿浣跨敤锛屾病鏈夌粰澶栧洿绯荤粺鎻愪緵鏈嶅姟鑳藉姏
+ * 绯荤粺寮傚父鏈嶅姟鎺ュ彛绫伙紝瑕佹眰鍏ㄩ儴浠ュ瓧绗︿覆浼犺緭锛屾柟渚垮井鏈嶅姟鍖�
+ * 鏂板缓瀹㈡埛锛屼慨鏀瑰鎴凤紝鍒犻櫎瀹㈡埛锛屾煡璇㈠鎴风瓑鍔熻兘
+ *
+ * Created by wuxw on 2016/12/27.
+ */
+public interface ILogSystemErrorServiceDao {
+
+
+    /**
+     * 淇濆瓨 绯荤粺寮傚父淇℃伅
+     * @param info
+     * @throws DAOException DAO寮傚父
+     */
+    void saveLogSystemErrorInfo(Map info) throws DAOException;
+
+
+
+
+    /**
+     * 鏌ヨ绯荤粺寮傚父淇℃伅锛坕nstance杩囩▼锛�
+     * 鏍规嵁bId 鏌ヨ绯荤粺寮傚父淇℃伅
+     * @param info bId 淇℃伅
+     * @return 绯荤粺寮傚父淇℃伅
+     * @throws DAOException DAO寮傚父
+     */
+    List<Map> getLogSystemErrorInfo(Map info) throws DAOException;
+
+
+
+    /**
+     * 淇敼绯荤粺寮傚父淇℃伅
+     * @param info 淇敼淇℃伅
+     * @throws DAOException DAO寮傚父
+     */
+    void updateLogSystemErrorInfo(Map info) throws DAOException;
+
+
+    /**
+     * 鏌ヨ绯荤粺寮傚父鎬绘暟
+     *
+     * @param info 绯荤粺寮傚父淇℃伅
+     * @return 绯荤粺寮傚父鏁伴噺
+     */
+    int queryLogSystemErrorsCount(Map info);
+
+}
diff --git a/service-common/src/main/java/com/java110/common/dao/impl/LogSystemErrorServiceDaoImpl.java b/service-common/src/main/java/com/java110/common/dao/impl/LogSystemErrorServiceDaoImpl.java
new file mode 100644
index 0000000..e8d2756
--- /dev/null
+++ b/service-common/src/main/java/com/java110/common/dao/impl/LogSystemErrorServiceDaoImpl.java
@@ -0,0 +1,98 @@
+package com.java110.common.dao.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.utils.constant.ResponseConstant;
+import com.java110.utils.exception.DAOException;
+import com.java110.utils.util.DateUtil;
+import com.java110.core.base.dao.BaseServiceDao;
+import com.java110.common.dao.ILogSystemErrorServiceDao;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 绯荤粺寮傚父鏈嶅姟 涓庢暟鎹簱浜や簰
+ * Created by wuxw on 2017/4/5.
+ */
+@Service("logSystemErrorServiceDaoImpl")
+//@Transactional
+public class LogSystemErrorServiceDaoImpl extends BaseServiceDao implements ILogSystemErrorServiceDao {
+
+    private static Logger logger = LoggerFactory.getLogger(LogSystemErrorServiceDaoImpl.class);
+
+
+
+
+
+    /**
+     * 淇濆瓨绯荤粺寮傚父淇℃伅 鍒� instance
+     * @param info   bId 淇℃伅
+     * @throws DAOException DAO寮傚父
+     */
+    @Override
+    public void saveLogSystemErrorInfo(Map info) throws DAOException {
+        logger.debug("淇濆瓨绯荤粺寮傚父淇℃伅Instance 鍏ュ弬 info : {}",info);
+
+        int saveFlag = sqlSessionTemplate.insert("logSystemErrorServiceDaoImpl.saveLogSystemErrorInfo",info);
+
+        if(saveFlag < 1){
+            throw new DAOException(ResponseConstant.RESULT_PARAM_ERROR,"淇濆瓨绯荤粺寮傚父淇℃伅Instance鏁版嵁澶辫触锛�"+ JSONObject.toJSONString(info));
+        }
+    }
+
+
+    /**
+     * 鏌ヨ绯荤粺寮傚父淇℃伅锛坕nstance锛�
+     * @param info bId 淇℃伅
+     * @return List<Map>
+     * @throws DAOException DAO寮傚父
+     */
+    @Override
+    public List<Map> getLogSystemErrorInfo(Map info) throws DAOException {
+        logger.debug("鏌ヨ绯荤粺寮傚父淇℃伅 鍏ュ弬 info : {}",info);
+
+        List<Map> businessLogSystemErrorInfos = sqlSessionTemplate.selectList("logSystemErrorServiceDaoImpl.getLogSystemErrorInfo",info);
+
+        return businessLogSystemErrorInfos;
+    }
+
+
+    /**
+     * 淇敼绯荤粺寮傚父淇℃伅
+     * @param info 淇敼淇℃伅
+     * @throws DAOException DAO寮傚父
+     */
+    @Override
+    public void updateLogSystemErrorInfo(Map info) throws DAOException {
+        logger.debug("淇敼绯荤粺寮傚父淇℃伅Instance 鍏ュ弬 info : {}",info);
+
+        int saveFlag = sqlSessionTemplate.update("logSystemErrorServiceDaoImpl.updateLogSystemErrorInfo",info);
+
+        if(saveFlag < 1){
+            throw new DAOException(ResponseConstant.RESULT_PARAM_ERROR,"淇敼绯荤粺寮傚父淇℃伅Instance鏁版嵁澶辫触锛�"+ JSONObject.toJSONString(info));
+        }
+    }
+
+     /**
+     * 鏌ヨ绯荤粺寮傚父鏁伴噺
+     * @param info 绯荤粺寮傚父淇℃伅
+     * @return 绯荤粺寮傚父鏁伴噺
+     */
+    @Override
+    public int queryLogSystemErrorsCount(Map info) {
+        logger.debug("鏌ヨ绯荤粺寮傚父鏁版嵁 鍏ュ弬 info : {}",info);
+
+        List<Map> businessLogSystemErrorInfos = sqlSessionTemplate.selectList("logSystemErrorServiceDaoImpl.queryLogSystemErrorsCount", info);
+        if (businessLogSystemErrorInfos.size() < 1) {
+            return 0;
+        }
+
+        return Integer.parseInt(businessLogSystemErrorInfos.get(0).get("count").toString());
+    }
+
+
+}
diff --git a/service-common/src/main/java/com/java110/common/smo/impl/LogSystemErrorInnerServiceSMOImpl.java b/service-common/src/main/java/com/java110/common/smo/impl/LogSystemErrorInnerServiceSMOImpl.java
new file mode 100644
index 0000000..8e9b173
--- /dev/null
+++ b/service-common/src/main/java/com/java110/common/smo/impl/LogSystemErrorInnerServiceSMOImpl.java
@@ -0,0 +1,83 @@
+package com.java110.common.smo.impl;
+
+
+import com.java110.common.dao.ILogSystemErrorServiceDao;
+import com.java110.core.base.smo.BaseServiceSMO;
+import com.java110.dto.PageDto;
+import com.java110.dto.logSystemError.LogSystemErrorDto;
+import com.java110.intf.common.ILogSystemErrorInnerServiceSMO;
+import com.java110.po.logSystemError.LogSystemErrorPo;
+import com.java110.utils.util.BeanConvertUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @ClassName FloorInnerServiceSMOImpl
+ * @Description 绯荤粺寮傚父鍐呴儴鏈嶅姟瀹炵幇绫�
+ * @Author wuxw
+ * @Date 2019/4/24 9:20
+ * @Version 1.0
+ * add by wuxw 2019/4/24
+ **/
+@RestController
+public class LogSystemErrorInnerServiceSMOImpl extends BaseServiceSMO implements ILogSystemErrorInnerServiceSMO {
+
+    @Autowired
+    private ILogSystemErrorServiceDao logSystemErrorServiceDaoImpl;
+
+
+    @Override
+    public int saveLogSystemError(@RequestBody LogSystemErrorPo logSystemErrorPo) {
+        int saveFlag = 1;
+        logSystemErrorServiceDaoImpl.saveLogSystemErrorInfo(BeanConvertUtil.beanCovertMap(logSystemErrorPo));
+        return saveFlag;
+    }
+
+    @Override
+    public int updateLogSystemError(@RequestBody LogSystemErrorPo logSystemErrorPo) {
+        int saveFlag = 1;
+        logSystemErrorServiceDaoImpl.updateLogSystemErrorInfo(BeanConvertUtil.beanCovertMap(logSystemErrorPo));
+        return saveFlag;
+    }
+
+    @Override
+    public int deleteLogSystemError(@RequestBody LogSystemErrorPo logSystemErrorPo) {
+        int saveFlag = 1;
+        logSystemErrorPo.setStatusCd("1");
+        logSystemErrorServiceDaoImpl.updateLogSystemErrorInfo(BeanConvertUtil.beanCovertMap(logSystemErrorPo));
+        return saveFlag;
+    }
+
+    @Override
+    public List<LogSystemErrorDto> queryLogSystemErrors(@RequestBody LogSystemErrorDto logSystemErrorDto) {
+
+        //鏍¢獙鏄惁浼犱簡 鍒嗛〉淇℃伅
+
+        int page = logSystemErrorDto.getPage();
+
+        if (page != PageDto.DEFAULT_PAGE) {
+            logSystemErrorDto.setPage((page - 1) * logSystemErrorDto.getRow());
+        }
+
+        List<LogSystemErrorDto> logSystemErrors = BeanConvertUtil.covertBeanList(logSystemErrorServiceDaoImpl.getLogSystemErrorInfo(BeanConvertUtil.beanCovertMap(logSystemErrorDto)), LogSystemErrorDto.class);
+
+        return logSystemErrors;
+    }
+
+
+    @Override
+    public int queryLogSystemErrorsCount(@RequestBody LogSystemErrorDto logSystemErrorDto) {
+        return logSystemErrorServiceDaoImpl.queryLogSystemErrorsCount(BeanConvertUtil.beanCovertMap(logSystemErrorDto));
+    }
+
+    public ILogSystemErrorServiceDao getLogSystemErrorServiceDaoImpl() {
+        return logSystemErrorServiceDaoImpl;
+    }
+
+    public void setLogSystemErrorServiceDaoImpl(ILogSystemErrorServiceDao logSystemErrorServiceDaoImpl) {
+        this.logSystemErrorServiceDaoImpl = logSystemErrorServiceDaoImpl;
+    }
+}
diff --git a/service-fee/src/main/java/com/java110/fee/bmo/payFeeConfigDiscount/impl/GetPayFeeConfigDiscountBMOImpl.java b/service-fee/src/main/java/com/java110/fee/bmo/payFeeConfigDiscount/impl/GetPayFeeConfigDiscountBMOImpl.java
index 9c572e1..cba604e 100644
--- a/service-fee/src/main/java/com/java110/fee/bmo/payFeeConfigDiscount/impl/GetPayFeeConfigDiscountBMOImpl.java
+++ b/service-fee/src/main/java/com/java110/fee/bmo/payFeeConfigDiscount/impl/GetPayFeeConfigDiscountBMOImpl.java
@@ -1,6 +1,5 @@
 package com.java110.fee.bmo.payFeeConfigDiscount.impl;
 
-import com.java110.dto.feeDiscount.FeeDiscountDto;
 import com.java110.dto.feeDiscountSpec.FeeDiscountSpecDto;
 import com.java110.dto.payFeeConfigDiscount.PayFeeConfigDiscountDto;
 import com.java110.fee.bmo.payFeeConfigDiscount.IGetPayFeeConfigDiscountBMO;
@@ -75,11 +74,9 @@
             for (FeeDiscountSpecDto feeDiscountSpecDto : feeDiscountSpecDtos) {
                 if (payFeeConfigDiscountDto.getDiscountId().equals(feeDiscountSpecDto.getDiscountId())) {
                     tmpSpecs.add(feeDiscountSpecDto);
-
                 }
             }
             payFeeConfigDiscountDto.setFeeDiscountSpecs(tmpSpecs);
         }
     }
-
 }
diff --git a/service-fee/src/main/java/com/java110/fee/dao/IPayFeeDetailDiscountServiceDao.java b/service-fee/src/main/java/com/java110/fee/dao/IPayFeeDetailDiscountServiceDao.java
new file mode 100644
index 0000000..7715af2
--- /dev/null
+++ b/service-fee/src/main/java/com/java110/fee/dao/IPayFeeDetailDiscountServiceDao.java
@@ -0,0 +1,81 @@
+package com.java110.fee.dao;
+
+
+import com.java110.utils.exception.DAOException;
+import com.java110.entity.merchant.BoMerchant;
+import com.java110.entity.merchant.BoMerchantAttr;
+import com.java110.entity.merchant.Merchant;
+import com.java110.entity.merchant.MerchantAttr;
+
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 缂磋垂浼樻儬缁勪欢鍐呴儴涔嬮棿浣跨敤锛屾病鏈夌粰澶栧洿绯荤粺鎻愪緵鏈嶅姟鑳藉姏
+ * 缂磋垂浼樻儬鏈嶅姟鎺ュ彛绫伙紝瑕佹眰鍏ㄩ儴浠ュ瓧绗︿覆浼犺緭锛屾柟渚垮井鏈嶅姟鍖�
+ * 鏂板缓瀹㈡埛锛屼慨鏀瑰鎴凤紝鍒犻櫎瀹㈡埛锛屾煡璇㈠鎴风瓑鍔熻兘
+ *
+ * Created by wuxw on 2016/12/27.
+ */
+public interface IPayFeeDetailDiscountServiceDao {
+
+    /**
+     * 淇濆瓨 缂磋垂浼樻儬淇℃伅
+     * @param businessPayFeeDetailDiscountInfo 缂磋垂浼樻儬淇℃伅 灏佽
+     * @throws DAOException 鎿嶄綔鏁版嵁搴撳紓甯�
+     */
+    void saveBusinessPayFeeDetailDiscountInfo(Map businessPayFeeDetailDiscountInfo) throws DAOException;
+
+
+
+    /**
+     * 鏌ヨ缂磋垂浼樻儬淇℃伅锛坆usiness杩囩▼锛�
+     * 鏍规嵁bId 鏌ヨ缂磋垂浼樻儬淇℃伅
+     * @param info bId 淇℃伅
+     * @return 缂磋垂浼樻儬淇℃伅
+     * @throws DAOException DAO寮傚父
+     */
+    List<Map> getBusinessPayFeeDetailDiscountInfo(Map info) throws DAOException;
+
+
+
+
+    /**
+     * 淇濆瓨 缂磋垂浼樻儬淇℃伅 Business鏁版嵁鍒� Instance涓�
+     * @param info
+     * @throws DAOException DAO寮傚父
+     */
+    void savePayFeeDetailDiscountInfoInstance(Map info) throws DAOException;
+
+
+
+
+    /**
+     * 鏌ヨ缂磋垂浼樻儬淇℃伅锛坕nstance杩囩▼锛�
+     * 鏍规嵁bId 鏌ヨ缂磋垂浼樻儬淇℃伅
+     * @param info bId 淇℃伅
+     * @return 缂磋垂浼樻儬淇℃伅
+     * @throws DAOException DAO寮傚父
+     */
+    List<Map> getPayFeeDetailDiscountInfo(Map info) throws DAOException;
+
+
+
+    /**
+     * 淇敼缂磋垂浼樻儬淇℃伅
+     * @param info 淇敼淇℃伅
+     * @throws DAOException DAO寮傚父
+     */
+    void updatePayFeeDetailDiscountInfoInstance(Map info) throws DAOException;
+
+
+    /**
+     * 鏌ヨ缂磋垂浼樻儬鎬绘暟
+     *
+     * @param info 缂磋垂浼樻儬淇℃伅
+     * @return 缂磋垂浼樻儬鏁伴噺
+     */
+    int queryPayFeeDetailDiscountsCount(Map info);
+
+}
diff --git a/service-fee/src/main/java/com/java110/fee/dao/impl/PayFeeDetailDiscountServiceDaoImpl.java b/service-fee/src/main/java/com/java110/fee/dao/impl/PayFeeDetailDiscountServiceDaoImpl.java
new file mode 100644
index 0000000..c30dbe3
--- /dev/null
+++ b/service-fee/src/main/java/com/java110/fee/dao/impl/PayFeeDetailDiscountServiceDaoImpl.java
@@ -0,0 +1,130 @@
+package com.java110.fee.dao.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.utils.constant.ResponseConstant;
+import com.java110.utils.exception.DAOException;
+import com.java110.utils.util.DateUtil;
+import com.java110.core.base.dao.BaseServiceDao;
+import com.java110.fee.dao.IPayFeeDetailDiscountServiceDao;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 缂磋垂浼樻儬鏈嶅姟 涓庢暟鎹簱浜や簰
+ * Created by wuxw on 2017/4/5.
+ */
+@Service("payFeeDetailDiscountServiceDaoImpl")
+//@Transactional
+public class PayFeeDetailDiscountServiceDaoImpl extends BaseServiceDao implements IPayFeeDetailDiscountServiceDao {
+
+    private static Logger logger = LoggerFactory.getLogger(PayFeeDetailDiscountServiceDaoImpl.class);
+
+    /**
+     * 缂磋垂浼樻儬淇℃伅灏佽
+     * @param businessPayFeeDetailDiscountInfo 缂磋垂浼樻儬淇℃伅 灏佽
+     * @throws DAOException DAO寮傚父
+     */
+    @Override
+    public void saveBusinessPayFeeDetailDiscountInfo(Map businessPayFeeDetailDiscountInfo) throws DAOException {
+        businessPayFeeDetailDiscountInfo.put("month", DateUtil.getCurrentMonth());
+        // 鏌ヨbusiness_user 鏁版嵁鏄惁宸茬粡瀛樺湪
+        logger.debug("淇濆瓨缂磋垂浼樻儬淇℃伅 鍏ュ弬 businessPayFeeDetailDiscountInfo : {}",businessPayFeeDetailDiscountInfo);
+        int saveFlag = sqlSessionTemplate.insert("payFeeDetailDiscountServiceDaoImpl.saveBusinessPayFeeDetailDiscountInfo",businessPayFeeDetailDiscountInfo);
+
+        if(saveFlag < 1){
+            throw new DAOException(ResponseConstant.RESULT_PARAM_ERROR,"淇濆瓨缂磋垂浼樻儬鏁版嵁澶辫触锛�"+ JSONObject.toJSONString(businessPayFeeDetailDiscountInfo));
+        }
+    }
+
+
+    /**
+     * 鏌ヨ缂磋垂浼樻儬淇℃伅
+     * @param info bId 淇℃伅
+     * @return 缂磋垂浼樻儬淇℃伅
+     * @throws DAOException DAO寮傚父
+     */
+    @Override
+    public List<Map> getBusinessPayFeeDetailDiscountInfo(Map info) throws DAOException {
+
+        logger.debug("鏌ヨ缂磋垂浼樻儬淇℃伅 鍏ュ弬 info : {}",info);
+
+        List<Map> businessPayFeeDetailDiscountInfos = sqlSessionTemplate.selectList("payFeeDetailDiscountServiceDaoImpl.getBusinessPayFeeDetailDiscountInfo",info);
+
+        return businessPayFeeDetailDiscountInfos;
+    }
+
+
+
+    /**
+     * 淇濆瓨缂磋垂浼樻儬淇℃伅 鍒� instance
+     * @param info   bId 淇℃伅
+     * @throws DAOException DAO寮傚父
+     */
+    @Override
+    public void savePayFeeDetailDiscountInfoInstance(Map info) throws DAOException {
+        logger.debug("淇濆瓨缂磋垂浼樻儬淇℃伅Instance 鍏ュ弬 info : {}",info);
+
+        int saveFlag = sqlSessionTemplate.insert("payFeeDetailDiscountServiceDaoImpl.savePayFeeDetailDiscountInfoInstance",info);
+
+        if(saveFlag < 1){
+            throw new DAOException(ResponseConstant.RESULT_PARAM_ERROR,"淇濆瓨缂磋垂浼樻儬淇℃伅Instance鏁版嵁澶辫触锛�"+ JSONObject.toJSONString(info));
+        }
+    }
+
+
+    /**
+     * 鏌ヨ缂磋垂浼樻儬淇℃伅锛坕nstance锛�
+     * @param info bId 淇℃伅
+     * @return List<Map>
+     * @throws DAOException DAO寮傚父
+     */
+    @Override
+    public List<Map> getPayFeeDetailDiscountInfo(Map info) throws DAOException {
+        logger.debug("鏌ヨ缂磋垂浼樻儬淇℃伅 鍏ュ弬 info : {}",info);
+
+        List<Map> businessPayFeeDetailDiscountInfos = sqlSessionTemplate.selectList("payFeeDetailDiscountServiceDaoImpl.getPayFeeDetailDiscountInfo",info);
+
+        return businessPayFeeDetailDiscountInfos;
+    }
+
+
+    /**
+     * 淇敼缂磋垂浼樻儬淇℃伅
+     * @param info 淇敼淇℃伅
+     * @throws DAOException DAO寮傚父
+     */
+    @Override
+    public void updatePayFeeDetailDiscountInfoInstance(Map info) throws DAOException {
+        logger.debug("淇敼缂磋垂浼樻儬淇℃伅Instance 鍏ュ弬 info : {}",info);
+
+        int saveFlag = sqlSessionTemplate.update("payFeeDetailDiscountServiceDaoImpl.updatePayFeeDetailDiscountInfoInstance",info);
+
+        if(saveFlag < 1){
+            throw new DAOException(ResponseConstant.RESULT_PARAM_ERROR,"淇敼缂磋垂浼樻儬淇℃伅Instance鏁版嵁澶辫触锛�"+ JSONObject.toJSONString(info));
+        }
+    }
+
+     /**
+     * 鏌ヨ缂磋垂浼樻儬鏁伴噺
+     * @param info 缂磋垂浼樻儬淇℃伅
+     * @return 缂磋垂浼樻儬鏁伴噺
+     */
+    @Override
+    public int queryPayFeeDetailDiscountsCount(Map info) {
+        logger.debug("鏌ヨ缂磋垂浼樻儬鏁版嵁 鍏ュ弬 info : {}",info);
+
+        List<Map> businessPayFeeDetailDiscountInfos = sqlSessionTemplate.selectList("payFeeDetailDiscountServiceDaoImpl.queryPayFeeDetailDiscountsCount", info);
+        if (businessPayFeeDetailDiscountInfos.size() < 1) {
+            return 0;
+        }
+
+        return Integer.parseInt(businessPayFeeDetailDiscountInfos.get(0).get("count").toString());
+    }
+
+
+}
diff --git a/service-fee/src/main/java/com/java110/fee/listener/payFeeDetailDiscount/AbstractPayFeeDetailDiscountBusinessServiceDataFlowListener.java b/service-fee/src/main/java/com/java110/fee/listener/payFeeDetailDiscount/AbstractPayFeeDetailDiscountBusinessServiceDataFlowListener.java
new file mode 100644
index 0000000..b656478
--- /dev/null
+++ b/service-fee/src/main/java/com/java110/fee/listener/payFeeDetailDiscount/AbstractPayFeeDetailDiscountBusinessServiceDataFlowListener.java
@@ -0,0 +1,94 @@
+package com.java110.fee.listener.payFeeDetailDiscount;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.core.event.service.AbstractBusinessServiceDataFlowListener;
+import com.java110.entity.center.Business;
+import com.java110.fee.dao.IPayFeeDetailDiscountServiceDao;
+import com.java110.utils.constant.ResponseConstant;
+import com.java110.utils.constant.StatusConstant;
+import com.java110.utils.exception.ListenerExecuteException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 缂磋垂浼樻儬 鏈嶅姟渚﹀惉 鐖剁被
+ * Created by wuxw on 2018/7/4.
+ */
+public abstract class AbstractPayFeeDetailDiscountBusinessServiceDataFlowListener extends AbstractBusinessServiceDataFlowListener {
+    private static Logger logger = LoggerFactory.getLogger(AbstractPayFeeDetailDiscountBusinessServiceDataFlowListener.class);
+
+
+    /**
+     * 鑾峰彇 DAO宸ュ叿绫�
+     *
+     * @return
+     */
+    public abstract IPayFeeDetailDiscountServiceDao getPayFeeDetailDiscountServiceDaoImpl();
+
+    /**
+     * 鍒锋柊 businessPayFeeDetailDiscountInfo 鏁版嵁
+     * 涓昏灏� 鏁版嵁搴� 涓瓧娈靛拰 鎺ュ彛浼犻�掑瓧娈靛缓绔嬪叧绯�
+     *
+     * @param businessPayFeeDetailDiscountInfo
+     */
+    protected void flushBusinessPayFeeDetailDiscountInfo(Map businessPayFeeDetailDiscountInfo, String statusCd) {
+        businessPayFeeDetailDiscountInfo.put("newBId", businessPayFeeDetailDiscountInfo.get("b_id"));
+        businessPayFeeDetailDiscountInfo.put("operate", businessPayFeeDetailDiscountInfo.get("operate"));
+        businessPayFeeDetailDiscountInfo.put("createTime", businessPayFeeDetailDiscountInfo.get("create_time"));
+        businessPayFeeDetailDiscountInfo.put("detailDiscountId", businessPayFeeDetailDiscountInfo.get("detail_discount_id"));
+        businessPayFeeDetailDiscountInfo.put("discountPrice", businessPayFeeDetailDiscountInfo.get("discount_price"));
+        businessPayFeeDetailDiscountInfo.put("detailId", businessPayFeeDetailDiscountInfo.get("detail_id"));
+        businessPayFeeDetailDiscountInfo.put("remark", businessPayFeeDetailDiscountInfo.get("remark"));
+        businessPayFeeDetailDiscountInfo.put("communityId", businessPayFeeDetailDiscountInfo.get("community_id"));
+        businessPayFeeDetailDiscountInfo.put("discountId", businessPayFeeDetailDiscountInfo.get("discount_id"));
+        businessPayFeeDetailDiscountInfo.put("feeId", businessPayFeeDetailDiscountInfo.get("fee_id"));
+        businessPayFeeDetailDiscountInfo.remove("bId");
+        businessPayFeeDetailDiscountInfo.put("statusCd", statusCd);
+    }
+
+
+    /**
+     * 褰撲慨鏀规暟鎹椂锛屾煡璇nstance琛ㄤ腑鐨勬暟鎹� 鑷姩淇濆瓨鍒犻櫎鏁版嵁鍒癰usiness涓�
+     *
+     * @param businessPayFeeDetailDiscount 缂磋垂浼樻儬淇℃伅
+     */
+    protected void autoSaveDelBusinessPayFeeDetailDiscount(Business business, JSONObject businessPayFeeDetailDiscount) {
+//鑷姩鎻掑叆DEL
+        Map info = new HashMap();
+        info.put("detailDiscountId", businessPayFeeDetailDiscount.getString("detailDiscountId"));
+        info.put("statusCd", StatusConstant.STATUS_CD_VALID);
+        List<Map> currentPayFeeDetailDiscountInfos = getPayFeeDetailDiscountServiceDaoImpl().getPayFeeDetailDiscountInfo(info);
+        if (currentPayFeeDetailDiscountInfos == null || currentPayFeeDetailDiscountInfos.size() != 1) {
+            throw new ListenerExecuteException(ResponseConstant.RESULT_PARAM_ERROR, "鏈壘鍒伴渶瑕佷慨鏀规暟鎹俊鎭紝鍏ュ弬閿欒鎴栨暟鎹湁闂锛岃妫�鏌�" + info);
+        }
+
+        Map currentPayFeeDetailDiscountInfo = currentPayFeeDetailDiscountInfos.get(0);
+
+        currentPayFeeDetailDiscountInfo.put("bId", business.getbId());
+
+        currentPayFeeDetailDiscountInfo.put("operate", currentPayFeeDetailDiscountInfo.get("operate"));
+        currentPayFeeDetailDiscountInfo.put("createTime", currentPayFeeDetailDiscountInfo.get("create_time"));
+        currentPayFeeDetailDiscountInfo.put("detailDiscountId", currentPayFeeDetailDiscountInfo.get("detail_discount_id"));
+        currentPayFeeDetailDiscountInfo.put("discountPrice", currentPayFeeDetailDiscountInfo.get("discount_price"));
+        currentPayFeeDetailDiscountInfo.put("detailId", currentPayFeeDetailDiscountInfo.get("detail_id"));
+        currentPayFeeDetailDiscountInfo.put("remark", currentPayFeeDetailDiscountInfo.get("remark"));
+        currentPayFeeDetailDiscountInfo.put("communityId", currentPayFeeDetailDiscountInfo.get("community_id"));
+        currentPayFeeDetailDiscountInfo.put("discountId", currentPayFeeDetailDiscountInfo.get("discount_id"));
+        currentPayFeeDetailDiscountInfo.put("feeId", currentPayFeeDetailDiscountInfo.get("fee_id"));
+
+
+        currentPayFeeDetailDiscountInfo.put("operate", StatusConstant.OPERATE_DEL);
+        getPayFeeDetailDiscountServiceDaoImpl().saveBusinessPayFeeDetailDiscountInfo(currentPayFeeDetailDiscountInfo);
+        for (Object key : currentPayFeeDetailDiscountInfo.keySet()) {
+            if (businessPayFeeDetailDiscount.get(key) == null) {
+                businessPayFeeDetailDiscount.put(key.toString(), currentPayFeeDetailDiscountInfo.get(key));
+            }
+        }
+    }
+
+
+}
diff --git a/service-fee/src/main/java/com/java110/fee/listener/payFeeDetailDiscount/DeletePayFeeDetailDiscountInfoListener.java b/service-fee/src/main/java/com/java110/fee/listener/payFeeDetailDiscount/DeletePayFeeDetailDiscountInfoListener.java
new file mode 100644
index 0000000..c294cf5
--- /dev/null
+++ b/service-fee/src/main/java/com/java110/fee/listener/payFeeDetailDiscount/DeletePayFeeDetailDiscountInfoListener.java
@@ -0,0 +1,176 @@
+package com.java110.fee.listener.payFeeDetailDiscount;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.po.payFeeDetailDiscount.PayFeeDetailDiscountPo;
+import com.java110.utils.constant.BusinessTypeConstant;
+import com.java110.utils.constant.ResponseConstant;
+import com.java110.utils.constant.StatusConstant;
+import com.java110.utils.exception.ListenerExecuteException;
+import com.java110.utils.util.Assert;
+import com.java110.core.annotation.Java110Listener;
+import com.java110.core.context.DataFlowContext;
+import com.java110.entity.center.Business;
+import com.java110.fee.dao.IPayFeeDetailDiscountServiceDao;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鍒犻櫎缂磋垂浼樻儬淇℃伅 渚﹀惉
+ *
+ * 澶勭悊鑺傜偣
+ * 1銆乥usinessPayFeeDetailDiscount:{} 缂磋垂浼樻儬鍩烘湰淇℃伅鑺傜偣
+ * 2銆乥usinessPayFeeDetailDiscountAttr:[{}] 缂磋垂浼樻儬灞炴�т俊鎭妭鐐�
+ * 3銆乥usinessPayFeeDetailDiscountPhoto:[{}] 缂磋垂浼樻儬鐓х墖淇℃伅鑺傜偣
+ * 4銆乥usinessPayFeeDetailDiscountCerdentials:[{}] 缂磋垂浼樻儬璇佷欢淇℃伅鑺傜偣
+ * 鍗忚鍦板潃 锛歨ttps://github.com/java110/MicroCommunity/wiki/%E5%88%A0%E9%99%A4%E5%95%86%E6%88%B7%E4%BF%A1%E6%81%AF-%E5%8D%8F%E8%AE%AE
+ * Created by wuxw on 2018/5/18.
+ */
+@Java110Listener("deletePayFeeDetailDiscountInfoListener")
+@Transactional
+public class DeletePayFeeDetailDiscountInfoListener extends AbstractPayFeeDetailDiscountBusinessServiceDataFlowListener {
+
+    private final static Logger logger = LoggerFactory.getLogger(DeletePayFeeDetailDiscountInfoListener.class);
+    @Autowired
+    IPayFeeDetailDiscountServiceDao payFeeDetailDiscountServiceDaoImpl;
+
+    @Override
+    public int getOrder() {
+        return 3;
+    }
+
+    @Override
+    public String getBusinessTypeCd() {
+        return BusinessTypeConstant.BUSINESS_TYPE_DELETE_DETAIL_DISCOUNT_INFO;
+    }
+
+    /**
+     * 鏍规嵁鍒犻櫎淇℃伅 鏌ュ嚭Instance琛ㄤ腑鏁版嵁 淇濆瓨鑷砨usiness琛� 锛堢姸鎬佸啓DEL锛� 鏂逛究鎾ゅ崟鏃剁洿鎺ユ洿鏂板洖鍘�
+     * @param dataFlowContext 鏁版嵁瀵硅薄
+     * @param business 褰撳墠涓氬姟瀵硅薄
+     */
+    @Override
+    protected void doSaveBusiness(DataFlowContext dataFlowContext, Business business) {
+        JSONObject data = business.getDatas();
+
+        Assert.notEmpty(data,"娌℃湁datas 鑺傜偣锛屾垨娌℃湁瀛愯妭鐐归渶瑕佸鐞�");
+
+            //澶勭悊 businessPayFeeDetailDiscount 鑺傜偣
+            if(data.containsKey(PayFeeDetailDiscountPo.class.getSimpleName())){
+                Object _obj = data.get(PayFeeDetailDiscountPo.class.getSimpleName());
+                JSONArray businessPayFeeDetailDiscounts = null;
+                if(_obj instanceof JSONObject){
+                    businessPayFeeDetailDiscounts = new JSONArray();
+                    businessPayFeeDetailDiscounts.add(_obj);
+                }else {
+                    businessPayFeeDetailDiscounts = (JSONArray)_obj;
+                }
+                //JSONObject businessPayFeeDetailDiscount = data.getJSONObject(PayFeeDetailDiscountPo.class.getSimpleName());
+                for (int _payFeeDetailDiscountIndex = 0; _payFeeDetailDiscountIndex < businessPayFeeDetailDiscounts.size();_payFeeDetailDiscountIndex++) {
+                    JSONObject businessPayFeeDetailDiscount = businessPayFeeDetailDiscounts.getJSONObject(_payFeeDetailDiscountIndex);
+                    doBusinessPayFeeDetailDiscount(business, businessPayFeeDetailDiscount);
+                    if(_obj instanceof JSONObject) {
+                        dataFlowContext.addParamOut("detailDiscountId", businessPayFeeDetailDiscount.getString("detailDiscountId"));
+                    }
+                }
+
+        }
+
+
+    }
+
+    /**
+     * 鍒犻櫎 instance鏁版嵁
+     * @param dataFlowContext 鏁版嵁瀵硅薄
+     * @param business 褰撳墠涓氬姟瀵硅薄
+     */
+    @Override
+    protected void doBusinessToInstance(DataFlowContext dataFlowContext, Business business) {
+        String bId = business.getbId();
+        //Assert.hasLength(bId,"璇锋眰鎶ユ枃涓病鏈夊寘鍚� bId");
+
+        //缂磋垂浼樻儬淇℃伅
+        Map info = new HashMap();
+        info.put("bId",business.getbId());
+        info.put("operate",StatusConstant.OPERATE_DEL);
+
+        //缂磋垂浼樻儬淇℃伅
+        List<Map> businessPayFeeDetailDiscountInfos = payFeeDetailDiscountServiceDaoImpl.getBusinessPayFeeDetailDiscountInfo(info);
+        if( businessPayFeeDetailDiscountInfos != null && businessPayFeeDetailDiscountInfos.size() >0) {
+            for (int _payFeeDetailDiscountIndex = 0; _payFeeDetailDiscountIndex < businessPayFeeDetailDiscountInfos.size();_payFeeDetailDiscountIndex++) {
+                Map businessPayFeeDetailDiscountInfo = businessPayFeeDetailDiscountInfos.get(_payFeeDetailDiscountIndex);
+                flushBusinessPayFeeDetailDiscountInfo(businessPayFeeDetailDiscountInfo,StatusConstant.STATUS_CD_INVALID);
+                payFeeDetailDiscountServiceDaoImpl.updatePayFeeDetailDiscountInfoInstance(businessPayFeeDetailDiscountInfo);
+                dataFlowContext.addParamOut("detailDiscountId",businessPayFeeDetailDiscountInfo.get("detail_discount_id"));
+            }
+        }
+
+    }
+
+    /**
+     * 鎾ゅ崟
+     * 浠巄usiness琛ㄤ腑鏌ヨ鍒癉EL鐨勬暟鎹� 灏唅nstance涓殑鏁版嵁鏇存柊鍥炴潵
+     * @param dataFlowContext 鏁版嵁瀵硅薄
+     * @param business 褰撳墠涓氬姟瀵硅薄
+     */
+    @Override
+    protected void doRecover(DataFlowContext dataFlowContext, Business business) {
+        String bId = business.getbId();
+        //Assert.hasLength(bId,"璇锋眰鎶ユ枃涓病鏈夊寘鍚� bId");
+        Map info = new HashMap();
+        info.put("bId",bId);
+        info.put("statusCd",StatusConstant.STATUS_CD_INVALID);
+
+        Map delInfo = new HashMap();
+        delInfo.put("bId",business.getbId());
+        delInfo.put("operate",StatusConstant.OPERATE_DEL);
+        //缂磋垂浼樻儬淇℃伅
+        List<Map> payFeeDetailDiscountInfo = payFeeDetailDiscountServiceDaoImpl.getPayFeeDetailDiscountInfo(info);
+        if(payFeeDetailDiscountInfo != null && payFeeDetailDiscountInfo.size() > 0){
+
+            //缂磋垂浼樻儬淇℃伅
+            List<Map> businessPayFeeDetailDiscountInfos = payFeeDetailDiscountServiceDaoImpl.getBusinessPayFeeDetailDiscountInfo(delInfo);
+            //闄ら潪绋嬪簭鍑洪敊浜嗭紝杩欓噷涓嶄細涓虹┖
+            if(businessPayFeeDetailDiscountInfos == null ||  businessPayFeeDetailDiscountInfos.size() == 0){
+                throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_INNER_ERROR,"鎾ゅ崟澶辫触锛坧ayFeeDetailDiscount锛夛紝绋嬪簭鍐呴儴寮傚父,璇锋鏌ワ紒 "+delInfo);
+            }
+            for (int _payFeeDetailDiscountIndex = 0; _payFeeDetailDiscountIndex < businessPayFeeDetailDiscountInfos.size();_payFeeDetailDiscountIndex++) {
+                Map businessPayFeeDetailDiscountInfo = businessPayFeeDetailDiscountInfos.get(_payFeeDetailDiscountIndex);
+                flushBusinessPayFeeDetailDiscountInfo(businessPayFeeDetailDiscountInfo,StatusConstant.STATUS_CD_VALID);
+                payFeeDetailDiscountServiceDaoImpl.updatePayFeeDetailDiscountInfoInstance(businessPayFeeDetailDiscountInfo);
+            }
+        }
+    }
+
+
+
+    /**
+     * 澶勭悊 businessPayFeeDetailDiscount 鑺傜偣
+     * @param business 鎬荤殑鏁版嵁鑺傜偣
+     * @param businessPayFeeDetailDiscount 缂磋垂浼樻儬鑺傜偣
+     */
+    private void doBusinessPayFeeDetailDiscount(Business business,JSONObject businessPayFeeDetailDiscount){
+
+        Assert.jsonObjectHaveKey(businessPayFeeDetailDiscount,"detailDiscountId","businessPayFeeDetailDiscount 鑺傜偣涓嬫病鏈夊寘鍚� detailDiscountId 鑺傜偣");
+
+        if(businessPayFeeDetailDiscount.getString("detailDiscountId").startsWith("-")){
+            throw new ListenerExecuteException(ResponseConstant.RESULT_PARAM_ERROR,"detailDiscountId 閿欒锛屼笉鑳借嚜鍔ㄧ敓鎴愶紙蹇呴』宸茬粡瀛樺湪鐨刣etailDiscountId锛�"+businessPayFeeDetailDiscount);
+        }
+        //鑷姩鎻掑叆DEL
+        autoSaveDelBusinessPayFeeDetailDiscount(business,businessPayFeeDetailDiscount);
+    }
+    @Override
+    public IPayFeeDetailDiscountServiceDao getPayFeeDetailDiscountServiceDaoImpl() {
+        return payFeeDetailDiscountServiceDaoImpl;
+    }
+
+    public void setPayFeeDetailDiscountServiceDaoImpl(IPayFeeDetailDiscountServiceDao payFeeDetailDiscountServiceDaoImpl) {
+        this.payFeeDetailDiscountServiceDaoImpl = payFeeDetailDiscountServiceDaoImpl;
+    }
+}
diff --git a/service-fee/src/main/java/com/java110/fee/listener/payFeeDetailDiscount/SavePayFeeDetailDiscountInfoListener.java b/service-fee/src/main/java/com/java110/fee/listener/payFeeDetailDiscount/SavePayFeeDetailDiscountInfoListener.java
new file mode 100644
index 0000000..5872855
--- /dev/null
+++ b/service-fee/src/main/java/com/java110/fee/listener/payFeeDetailDiscount/SavePayFeeDetailDiscountInfoListener.java
@@ -0,0 +1,176 @@
+package com.java110.fee.listener.payFeeDetailDiscount;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.po.payFeeDetailDiscount.PayFeeDetailDiscountPo;
+import com.java110.utils.constant.BusinessTypeConstant;
+import com.java110.utils.constant.StatusConstant;
+import com.java110.utils.util.Assert;
+import com.java110.fee.dao.IPayFeeDetailDiscountServiceDao;
+import com.java110.core.annotation.Java110Listener;
+import com.java110.core.context.DataFlowContext;
+import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.entity.center.Business;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 淇濆瓨 缂磋垂浼樻儬淇℃伅 渚﹀惉
+ * Created by wuxw on 2018/5/18.
+ */
+@Java110Listener("savePayFeeDetailDiscountInfoListener")
+@Transactional
+public class SavePayFeeDetailDiscountInfoListener extends AbstractPayFeeDetailDiscountBusinessServiceDataFlowListener{
+
+    private static Logger logger = LoggerFactory.getLogger(SavePayFeeDetailDiscountInfoListener.class);
+
+    @Autowired
+    private IPayFeeDetailDiscountServiceDao payFeeDetailDiscountServiceDaoImpl;
+
+    @Override
+    public int getOrder() {
+        return 0;
+    }
+
+    @Override
+    public String getBusinessTypeCd() {
+        return BusinessTypeConstant.BUSINESS_TYPE_SAVE_DETAIL_DISCOUNT_INFO;
+    }
+
+    /**
+     * 淇濆瓨缂磋垂浼樻儬淇℃伅 business 琛ㄤ腑
+     * @param dataFlowContext 鏁版嵁瀵硅薄
+     * @param business 褰撳墠涓氬姟瀵硅薄
+     */
+    @Override
+    protected void doSaveBusiness(DataFlowContext dataFlowContext, Business business) {
+        JSONObject data = business.getDatas();
+        Assert.notEmpty(data,"娌℃湁datas 鑺傜偣锛屾垨娌℃湁瀛愯妭鐐归渶瑕佸鐞�");
+
+        //澶勭悊 businessPayFeeDetailDiscount 鑺傜偣
+        if(data.containsKey(PayFeeDetailDiscountPo.class.getSimpleName())){
+            Object bObj = data.get(PayFeeDetailDiscountPo.class.getSimpleName());
+            JSONArray businessPayFeeDetailDiscounts = null;
+            if(bObj instanceof JSONObject){
+                businessPayFeeDetailDiscounts = new JSONArray();
+                businessPayFeeDetailDiscounts.add(bObj);
+            }else {
+                businessPayFeeDetailDiscounts = (JSONArray)bObj;
+            }
+            //JSONObject businessPayFeeDetailDiscount = data.getJSONObject(PayFeeDetailDiscountPo.class.getSimpleName());
+            for (int bPayFeeDetailDiscountIndex = 0; bPayFeeDetailDiscountIndex < businessPayFeeDetailDiscounts.size();bPayFeeDetailDiscountIndex++) {
+                JSONObject businessPayFeeDetailDiscount = businessPayFeeDetailDiscounts.getJSONObject(bPayFeeDetailDiscountIndex);
+                doBusinessPayFeeDetailDiscount(business, businessPayFeeDetailDiscount);
+                if(bObj instanceof JSONObject) {
+                    dataFlowContext.addParamOut("detailDiscountId", businessPayFeeDetailDiscount.getString("detailDiscountId"));
+                }
+            }
+        }
+    }
+
+    /**
+     * business 鏁版嵁杞Щ鍒� instance
+     * @param dataFlowContext 鏁版嵁瀵硅薄
+     * @param business 褰撳墠涓氬姟瀵硅薄
+     */
+    @Override
+    protected void doBusinessToInstance(DataFlowContext dataFlowContext, Business business) {
+        JSONObject data = business.getDatas();
+
+        Map info = new HashMap();
+        info.put("bId",business.getbId());
+        info.put("operate",StatusConstant.OPERATE_ADD);
+
+        //缂磋垂浼樻儬淇℃伅
+        List<Map> businessPayFeeDetailDiscountInfo = payFeeDetailDiscountServiceDaoImpl.getBusinessPayFeeDetailDiscountInfo(info);
+        if( businessPayFeeDetailDiscountInfo != null && businessPayFeeDetailDiscountInfo.size() >0) {
+            reFreshShareColumn(info, businessPayFeeDetailDiscountInfo.get(0));
+            payFeeDetailDiscountServiceDaoImpl.savePayFeeDetailDiscountInfoInstance(info);
+            if(businessPayFeeDetailDiscountInfo.size() == 1) {
+                dataFlowContext.addParamOut("detailDiscountId", businessPayFeeDetailDiscountInfo.get(0).get("detail_discount_id"));
+            }
+        }
+    }
+
+
+    /**
+     * 鍒� 鍒嗙墖瀛楁
+     *
+     * @param info         鏌ヨ瀵硅薄
+     * @param businessInfo 灏忓尯ID
+     */
+    private void reFreshShareColumn(Map info, Map businessInfo) {
+
+        if (info.containsKey("community_id")) {
+            return;
+        }
+
+        if (!businessInfo.containsKey("communityId")) {
+            return;
+        }
+
+        info.put("community_id", businessInfo.get("communityId"));
+    }
+    /**
+     * 鎾ゅ崟
+     * @param dataFlowContext 鏁版嵁瀵硅薄
+     * @param business 褰撳墠涓氬姟瀵硅薄
+     */
+    @Override
+    protected void doRecover(DataFlowContext dataFlowContext, Business business) {
+        String bId = business.getbId();
+        //Assert.hasLength(bId,"璇锋眰鎶ユ枃涓病鏈夊寘鍚� bId");
+        Map info = new HashMap();
+        info.put("bId",bId);
+        info.put("statusCd",StatusConstant.STATUS_CD_VALID);
+        Map paramIn = new HashMap();
+        paramIn.put("bId",bId);
+        paramIn.put("statusCd",StatusConstant.STATUS_CD_INVALID);
+        //缂磋垂浼樻儬淇℃伅
+        List<Map> payFeeDetailDiscountInfo = payFeeDetailDiscountServiceDaoImpl.getPayFeeDetailDiscountInfo(info);
+        if(payFeeDetailDiscountInfo != null && payFeeDetailDiscountInfo.size() > 0){
+            reFreshShareColumn(paramIn, payFeeDetailDiscountInfo.get(0));
+            payFeeDetailDiscountServiceDaoImpl.updatePayFeeDetailDiscountInfoInstance(paramIn);
+        }
+    }
+
+
+
+    /**
+     * 澶勭悊 businessPayFeeDetailDiscount 鑺傜偣
+     * @param business 鎬荤殑鏁版嵁鑺傜偣
+     * @param businessPayFeeDetailDiscount 缂磋垂浼樻儬鑺傜偣
+     */
+    private void doBusinessPayFeeDetailDiscount(Business business,JSONObject businessPayFeeDetailDiscount){
+
+        Assert.jsonObjectHaveKey(businessPayFeeDetailDiscount,"detailDiscountId","businessPayFeeDetailDiscount 鑺傜偣涓嬫病鏈夊寘鍚� detailDiscountId 鑺傜偣");
+
+        if(businessPayFeeDetailDiscount.getString("detailDiscountId").startsWith("-")){
+            //鍒锋柊缂撳瓨
+            //flushPayFeeDetailDiscountId(business.getDatas());
+
+            businessPayFeeDetailDiscount.put("detailDiscountId",GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailDiscountId));
+
+        }
+
+        businessPayFeeDetailDiscount.put("bId",business.getbId());
+        businessPayFeeDetailDiscount.put("operate", StatusConstant.OPERATE_ADD);
+        //淇濆瓨缂磋垂浼樻儬淇℃伅
+        payFeeDetailDiscountServiceDaoImpl.saveBusinessPayFeeDetailDiscountInfo(businessPayFeeDetailDiscount);
+
+    }
+    @Override
+    public IPayFeeDetailDiscountServiceDao getPayFeeDetailDiscountServiceDaoImpl() {
+        return payFeeDetailDiscountServiceDaoImpl;
+    }
+
+    public void setPayFeeDetailDiscountServiceDaoImpl(IPayFeeDetailDiscountServiceDao payFeeDetailDiscountServiceDaoImpl) {
+        this.payFeeDetailDiscountServiceDaoImpl = payFeeDetailDiscountServiceDaoImpl;
+    }
+}
diff --git a/service-fee/src/main/java/com/java110/fee/listener/payFeeDetailDiscount/UpdatePayFeeDetailDiscountInfoListener.java b/service-fee/src/main/java/com/java110/fee/listener/payFeeDetailDiscount/UpdatePayFeeDetailDiscountInfoListener.java
new file mode 100644
index 0000000..232a1eb
--- /dev/null
+++ b/service-fee/src/main/java/com/java110/fee/listener/payFeeDetailDiscount/UpdatePayFeeDetailDiscountInfoListener.java
@@ -0,0 +1,190 @@
+package com.java110.fee.listener.payFeeDetailDiscount;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.core.annotation.Java110Listener;
+import com.java110.core.context.DataFlowContext;
+import com.java110.entity.center.Business;
+import com.java110.fee.dao.IPayFeeDetailDiscountServiceDao;
+import com.java110.po.payFeeDetailDiscount.PayFeeDetailDiscountPo;
+import com.java110.utils.constant.BusinessTypeConstant;
+import com.java110.utils.constant.ResponseConstant;
+import com.java110.utils.constant.StatusConstant;
+import com.java110.utils.exception.ListenerExecuteException;
+import com.java110.utils.util.Assert;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 淇敼缂磋垂浼樻儬淇℃伅 渚﹀惉
+ * <p>
+ * 澶勭悊鑺傜偣
+ * 1銆乥usinessPayFeeDetailDiscount:{} 缂磋垂浼樻儬鍩烘湰淇℃伅鑺傜偣
+ * 2銆乥usinessPayFeeDetailDiscountAttr:[{}] 缂磋垂浼樻儬灞炴�т俊鎭妭鐐�
+ * 3銆乥usinessPayFeeDetailDiscountPhoto:[{}] 缂磋垂浼樻儬鐓х墖淇℃伅鑺傜偣
+ * 4銆乥usinessPayFeeDetailDiscountCerdentials:[{}] 缂磋垂浼樻儬璇佷欢淇℃伅鑺傜偣
+ * 鍗忚鍦板潃 锛歨ttps://github.com/java110/MicroCommunity/wiki/%E4%BF%AE%E6%94%B9%E5%95%86%E6%88%B7%E4%BF%A1%E6%81%AF-%E5%8D%8F%E8%AE%AE
+ * Created by wuxw on 2018/5/18.
+ */
+@Java110Listener("updatePayFeeDetailDiscountInfoListener")
+@Transactional
+public class UpdatePayFeeDetailDiscountInfoListener extends AbstractPayFeeDetailDiscountBusinessServiceDataFlowListener {
+
+    private static Logger logger = LoggerFactory.getLogger(UpdatePayFeeDetailDiscountInfoListener.class);
+    @Autowired
+    private IPayFeeDetailDiscountServiceDao payFeeDetailDiscountServiceDaoImpl;
+
+    @Override
+    public int getOrder() {
+        return 2;
+    }
+
+    @Override
+    public String getBusinessTypeCd() {
+        return BusinessTypeConstant.BUSINESS_TYPE_UPDATE_DETAIL_DISCOUNT_INFO;
+    }
+
+    /**
+     * business杩囩▼
+     *
+     * @param dataFlowContext 涓婁笅鏂囧璞�
+     * @param business        涓氬姟瀵硅薄
+     */
+    @Override
+    protected void doSaveBusiness(DataFlowContext dataFlowContext, Business business) {
+
+        JSONObject data = business.getDatas();
+
+        Assert.notEmpty(data, "娌℃湁datas 鑺傜偣锛屾垨娌℃湁瀛愯妭鐐归渶瑕佸鐞�");
+
+
+        //澶勭悊 businessPayFeeDetailDiscount 鑺傜偣
+        if (data.containsKey(PayFeeDetailDiscountPo.class.getSimpleName())) {
+            Object _obj = data.get(PayFeeDetailDiscountPo.class.getSimpleName());
+            JSONArray businessPayFeeDetailDiscounts = null;
+            if (_obj instanceof JSONObject) {
+                businessPayFeeDetailDiscounts = new JSONArray();
+                businessPayFeeDetailDiscounts.add(_obj);
+            } else {
+                businessPayFeeDetailDiscounts = (JSONArray) _obj;
+            }
+            //JSONObject businessPayFeeDetailDiscount = data.getJSONObject(PayFeeDetailDiscountPo.class.getSimpleName());
+            for (int _payFeeDetailDiscountIndex = 0; _payFeeDetailDiscountIndex < businessPayFeeDetailDiscounts.size(); _payFeeDetailDiscountIndex++) {
+                JSONObject businessPayFeeDetailDiscount = businessPayFeeDetailDiscounts.getJSONObject(_payFeeDetailDiscountIndex);
+                doBusinessPayFeeDetailDiscount(business, businessPayFeeDetailDiscount);
+                if (_obj instanceof JSONObject) {
+                    dataFlowContext.addParamOut("detailDiscountId", businessPayFeeDetailDiscount.getString("detailDiscountId"));
+                }
+            }
+        }
+    }
+
+
+    /**
+     * business to instance 杩囩▼
+     *
+     * @param dataFlowContext 鏁版嵁瀵硅薄
+     * @param business        褰撳墠涓氬姟瀵硅薄
+     */
+    @Override
+    protected void doBusinessToInstance(DataFlowContext dataFlowContext, Business business) {
+
+        JSONObject data = business.getDatas();
+
+        Map info = new HashMap();
+        info.put("bId", business.getbId());
+        info.put("operate", StatusConstant.OPERATE_ADD);
+
+        //缂磋垂浼樻儬淇℃伅
+        List<Map> businessPayFeeDetailDiscountInfos = payFeeDetailDiscountServiceDaoImpl.getBusinessPayFeeDetailDiscountInfo(info);
+        if (businessPayFeeDetailDiscountInfos != null && businessPayFeeDetailDiscountInfos.size() > 0) {
+            for (int _payFeeDetailDiscountIndex = 0; _payFeeDetailDiscountIndex < businessPayFeeDetailDiscountInfos.size(); _payFeeDetailDiscountIndex++) {
+                Map businessPayFeeDetailDiscountInfo = businessPayFeeDetailDiscountInfos.get(_payFeeDetailDiscountIndex);
+                flushBusinessPayFeeDetailDiscountInfo(businessPayFeeDetailDiscountInfo, StatusConstant.STATUS_CD_VALID);
+                payFeeDetailDiscountServiceDaoImpl.updatePayFeeDetailDiscountInfoInstance(businessPayFeeDetailDiscountInfo);
+                if (businessPayFeeDetailDiscountInfo.size() == 1) {
+                    dataFlowContext.addParamOut("detailDiscountId", businessPayFeeDetailDiscountInfo.get("detail_discount_id"));
+                }
+            }
+        }
+
+    }
+
+    /**
+     * 鎾ゅ崟
+     *
+     * @param dataFlowContext 鏁版嵁瀵硅薄
+     * @param business        褰撳墠涓氬姟瀵硅薄
+     */
+    @Override
+    protected void doRecover(DataFlowContext dataFlowContext, Business business) {
+
+        String bId = business.getbId();
+        //Assert.hasLength(bId,"璇锋眰鎶ユ枃涓病鏈夊寘鍚� bId");
+        Map info = new HashMap();
+        info.put("bId", bId);
+        info.put("statusCd", StatusConstant.STATUS_CD_VALID);
+        Map delInfo = new HashMap();
+        delInfo.put("bId", business.getbId());
+        delInfo.put("operate", StatusConstant.OPERATE_DEL);
+        //缂磋垂浼樻儬淇℃伅
+        List<Map> payFeeDetailDiscountInfo = payFeeDetailDiscountServiceDaoImpl.getPayFeeDetailDiscountInfo(info);
+        if (payFeeDetailDiscountInfo != null && payFeeDetailDiscountInfo.size() > 0) {
+
+            //缂磋垂浼樻儬淇℃伅
+            List<Map> businessPayFeeDetailDiscountInfos = payFeeDetailDiscountServiceDaoImpl.getBusinessPayFeeDetailDiscountInfo(delInfo);
+            //闄ら潪绋嬪簭鍑洪敊浜嗭紝杩欓噷涓嶄細涓虹┖
+            if (businessPayFeeDetailDiscountInfos == null || businessPayFeeDetailDiscountInfos.size() == 0) {
+                throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_INNER_ERROR, "鎾ゅ崟澶辫触锛坧ayFeeDetailDiscount锛夛紝绋嬪簭鍐呴儴寮傚父,璇锋鏌ワ紒 " + delInfo);
+            }
+            for (int _payFeeDetailDiscountIndex = 0; _payFeeDetailDiscountIndex < businessPayFeeDetailDiscountInfos.size(); _payFeeDetailDiscountIndex++) {
+                Map businessPayFeeDetailDiscountInfo = businessPayFeeDetailDiscountInfos.get(_payFeeDetailDiscountIndex);
+                flushBusinessPayFeeDetailDiscountInfo(businessPayFeeDetailDiscountInfo, StatusConstant.STATUS_CD_VALID);
+                payFeeDetailDiscountServiceDaoImpl.updatePayFeeDetailDiscountInfoInstance(businessPayFeeDetailDiscountInfo);
+            }
+        }
+
+    }
+
+
+    /**
+     * 澶勭悊 businessPayFeeDetailDiscount 鑺傜偣
+     *
+     * @param business                     鎬荤殑鏁版嵁鑺傜偣
+     * @param businessPayFeeDetailDiscount 缂磋垂浼樻儬鑺傜偣
+     */
+    private void doBusinessPayFeeDetailDiscount(Business business, JSONObject businessPayFeeDetailDiscount) {
+
+        Assert.jsonObjectHaveKey(businessPayFeeDetailDiscount, "detailDiscountId", "businessPayFeeDetailDiscount 鑺傜偣涓嬫病鏈夊寘鍚� detailDiscountId 鑺傜偣");
+
+        if (businessPayFeeDetailDiscount.getString("detailDiscountId").startsWith("-")) {
+            throw new ListenerExecuteException(ResponseConstant.RESULT_PARAM_ERROR, "detailDiscountId 閿欒锛屼笉鑳借嚜鍔ㄧ敓鎴愶紙蹇呴』宸茬粡瀛樺湪鐨刣etailDiscountId锛�" + businessPayFeeDetailDiscount);
+        }
+        //鑷姩淇濆瓨DEL
+        autoSaveDelBusinessPayFeeDetailDiscount(business, businessPayFeeDetailDiscount);
+
+        businessPayFeeDetailDiscount.put("bId", business.getbId());
+        businessPayFeeDetailDiscount.put("operate", StatusConstant.OPERATE_ADD);
+        //淇濆瓨缂磋垂浼樻儬淇℃伅
+        payFeeDetailDiscountServiceDaoImpl.saveBusinessPayFeeDetailDiscountInfo(businessPayFeeDetailDiscount);
+
+    }
+
+
+    @Override
+    public IPayFeeDetailDiscountServiceDao getPayFeeDetailDiscountServiceDaoImpl() {
+        return payFeeDetailDiscountServiceDaoImpl;
+    }
+
+    public void setPayFeeDetailDiscountServiceDaoImpl(IPayFeeDetailDiscountServiceDao payFeeDetailDiscountServiceDaoImpl) {
+        this.payFeeDetailDiscountServiceDaoImpl = payFeeDetailDiscountServiceDaoImpl;
+    }
+
+
+}
diff --git a/service-fee/src/main/java/com/java110/fee/smo/impl/PayFeeDetailDiscountInnerServiceSMOImpl.java b/service-fee/src/main/java/com/java110/fee/smo/impl/PayFeeDetailDiscountInnerServiceSMOImpl.java
new file mode 100644
index 0000000..a52a834
--- /dev/null
+++ b/service-fee/src/main/java/com/java110/fee/smo/impl/PayFeeDetailDiscountInnerServiceSMOImpl.java
@@ -0,0 +1,93 @@
+package com.java110.fee.smo.impl;
+
+
+import com.java110.core.base.smo.BaseServiceSMO;
+import com.java110.core.smo.fee.IPayFeeDetailDiscountInnerServiceSMO;
+import com.java110.dto.PageDto;
+import com.java110.dto.payFeeDetailDiscount.PayFeeDetailDiscountDto;
+import com.java110.dto.user.UserDto;
+import com.java110.fee.dao.IPayFeeDetailDiscountServiceDao;
+import com.java110.utils.util.BeanConvertUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @ClassName FloorInnerServiceSMOImpl
+ * @Description 缂磋垂浼樻儬鍐呴儴鏈嶅姟瀹炵幇绫�
+ * @Author wuxw
+ * @Date 2019/4/24 9:20
+ * @Version 1.0
+ * add by wuxw 2019/4/24
+ **/
+@RestController
+public class PayFeeDetailDiscountInnerServiceSMOImpl extends BaseServiceSMO implements IPayFeeDetailDiscountInnerServiceSMO {
+
+    @Autowired
+    private IPayFeeDetailDiscountServiceDao payFeeDetailDiscountServiceDaoImpl;
+
+
+    @Override
+    public List<PayFeeDetailDiscountDto> queryPayFeeDetailDiscounts(@RequestBody PayFeeDetailDiscountDto payFeeDetailDiscountDto) {
+
+        //鏍¢獙鏄惁浼犱簡 鍒嗛〉淇℃伅
+
+        int page = payFeeDetailDiscountDto.getPage();
+
+        if (page != PageDto.DEFAULT_PAGE) {
+            payFeeDetailDiscountDto.setPage((page - 1) * payFeeDetailDiscountDto.getRow());
+        }
+
+        List<PayFeeDetailDiscountDto> payFeeDetailDiscounts = BeanConvertUtil.covertBeanList(payFeeDetailDiscountServiceDaoImpl.getPayFeeDetailDiscountInfo(BeanConvertUtil.beanCovertMap(payFeeDetailDiscountDto)), PayFeeDetailDiscountDto.class);
+
+
+        return payFeeDetailDiscounts;
+    }
+
+    /**
+     * 浠庣敤鎴峰垪琛ㄤ腑鏌ヨ鐢ㄦ埛锛屽皢鐢ㄦ埛涓殑淇℃伅 鍒锋柊鍒� floor瀵硅薄涓�
+     *
+     * @param payFeeDetailDiscount 灏忓尯缂磋垂浼樻儬淇℃伅
+     * @param users                鐢ㄦ埛鍒楄〃
+     */
+    private void refreshPayFeeDetailDiscount(PayFeeDetailDiscountDto payFeeDetailDiscount, List<UserDto> users) {
+        for (UserDto user : users) {
+            if (payFeeDetailDiscount.getDetailDiscountId().equals(user.getUserId())) {
+                BeanConvertUtil.covertBean(user, payFeeDetailDiscount);
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇鎵归噺userId
+     *
+     * @param payFeeDetailDiscounts 灏忓尯妤间俊鎭�
+     * @return 鎵归噺userIds 淇℃伅
+     */
+    private String[] getUserIds(List<PayFeeDetailDiscountDto> payFeeDetailDiscounts) {
+        List<String> userIds = new ArrayList<String>();
+        for (PayFeeDetailDiscountDto payFeeDetailDiscount : payFeeDetailDiscounts) {
+            userIds.add(payFeeDetailDiscount.getDetailDiscountId());
+        }
+
+        return userIds.toArray(new String[userIds.size()]);
+    }
+
+    @Override
+    public int queryPayFeeDetailDiscountsCount(@RequestBody PayFeeDetailDiscountDto payFeeDetailDiscountDto) {
+        return payFeeDetailDiscountServiceDaoImpl.queryPayFeeDetailDiscountsCount(BeanConvertUtil.beanCovertMap(payFeeDetailDiscountDto));
+    }
+
+    public IPayFeeDetailDiscountServiceDao getPayFeeDetailDiscountServiceDaoImpl() {
+        return payFeeDetailDiscountServiceDaoImpl;
+    }
+
+    public void setPayFeeDetailDiscountServiceDaoImpl(IPayFeeDetailDiscountServiceDao payFeeDetailDiscountServiceDaoImpl) {
+        this.payFeeDetailDiscountServiceDaoImpl = payFeeDetailDiscountServiceDaoImpl;
+    }
+
+
+}
diff --git a/service-job/src/main/java/com/java110/job/quartz/TaskSystemJob.java b/service-job/src/main/java/com/java110/job/quartz/TaskSystemJob.java
index 87cf92b..f2cec6b 100644
--- a/service-job/src/main/java/com/java110/job/quartz/TaskSystemJob.java
+++ b/service-job/src/main/java/com/java110/job/quartz/TaskSystemJob.java
@@ -30,11 +30,8 @@
         try {
             TaskDto taskDto = (TaskDto) (context.getJobDetail().getJobDataMap()
                     .get(JOB_DATA_TASK));
-
-
             taskSystemQuartz = (TaskSystemQuartz) ApplicationContextFactory.getBean(taskDto.getTaskTemplateDto().getClassBean());
             taskSystemQuartz.startTask(taskDto);
-
         } catch (Throwable ex) {
             logger.error("鎵ц浠诲姟澶辫触锛�", ex);
         }
diff --git a/service-job/src/main/java/com/java110/job/quartz/TaskSystemQuartz.java b/service-job/src/main/java/com/java110/job/quartz/TaskSystemQuartz.java
index db93267..aa278f8 100644
--- a/service-job/src/main/java/com/java110/job/quartz/TaskSystemQuartz.java
+++ b/service-job/src/main/java/com/java110/job/quartz/TaskSystemQuartz.java
@@ -1,12 +1,17 @@
 package com.java110.job.quartz;
 
+import com.java110.core.factory.GenerateCodeFactory;
 import com.java110.dto.community.CommunityDto;
+import com.java110.dto.logSystemError.LogSystemErrorDto;
 import com.java110.dto.store.StoreDto;
 import com.java110.dto.task.TaskDto;
 import com.java110.dto.taskAttr.TaskAttrDto;
 import com.java110.intf.community.ICommunityInnerServiceSMO;
 import com.java110.intf.store.IStoreInnerServiceSMO;
 import com.java110.job.dao.ITaskServiceDao;
+import com.java110.po.logSystemError.LogSystemErrorPo;
+import com.java110.service.smo.ISaveSystemErrorSMO;
+import com.java110.utils.util.ExceptionUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -31,6 +36,9 @@
     @Autowired
     private IStoreInnerServiceSMO storeInnerServiceSMOImpl;
 
+    @Autowired
+    private ISaveSystemErrorSMO saveSystemErrorSMOImpl;
+
 
     public void initTask() {
 
@@ -42,26 +50,26 @@
      * @param taskDto
      */
     public void startTask(TaskDto taskDto) throws Exception {
-
-        Map info = new HashMap();
-        info.put("taskId", taskDto.getTaskId());
-        List<Map> taskInfos = taskServiceDaoImpl.getTaskInfo(info);
-        if (taskInfos == null || taskInfos.size() < 1) {
-            return;
-        }
-
-        // 杩欎箞鍋氭槸涓轰簡锛屽崟绾跨▼璋冪敤锛岄槻姝㈠绾跨▼瀵艰嚧鏁版嵁閲嶅澶勭悊
-        if (!"002".equals(taskInfos.get(0).get("state"))) {
-            return;
-        }
-
-        String taskId = taskDto.getTaskId();
-
-        if (logger.isDebugEnabled()) {
-            logger.debug("---銆怲askSystemQuartz.startFtpTask銆戯細浠诲姟銆�" + taskId + "銆戝紑濮嬭繍琛岋紒", taskId);
-        }
-
         try {
+            Map info = new HashMap();
+            info.put("taskId", taskDto.getTaskId());
+            List<Map> taskInfos = taskServiceDaoImpl.getTaskInfo(info);
+            if (taskInfos == null || taskInfos.size() < 1) {
+                return;
+            }
+
+            // 杩欎箞鍋氭槸涓轰簡锛屽崟绾跨▼璋冪敤锛岄槻姝㈠绾跨▼瀵艰嚧鏁版嵁閲嶅澶勭悊
+            if (!"002".equals(taskInfos.get(0).get("state"))) {
+                return;
+            }
+
+            String taskId = taskDto.getTaskId();
+
+            if (logger.isDebugEnabled()) {
+                logger.debug("---銆怲askSystemQuartz.startFtpTask銆戯細浠诲姟銆�" + taskId + "銆戝紑濮嬭繍琛岋紒", taskId);
+            }
+
+
             // 1.0绌烘柟娉曪紝璁╁瓙绫诲幓瀹炵幇
             prepare(taskDto);
 
@@ -71,7 +79,11 @@
             // 5.0绌烘柟娉曪紝璁╁瓙绫诲幓瀹炵幇
             after(taskDto);
         } catch (Exception ex) {
-
+            LogSystemErrorPo logSystemErrorPo = new LogSystemErrorPo();
+            logSystemErrorPo.setErrId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_errId));
+            logSystemErrorPo.setErrType(LogSystemErrorDto.ERR_TYPE_JOB);
+            logSystemErrorPo.setMsg(ExceptionUtil.getStackTrace(ex));
+            saveSystemErrorSMOImpl.saveLog(logSystemErrorPo);
             // 鎺ョ画鍚戝鎶涘嚭鍘�
             logger.error("澶勭悊鍑虹幇闂锛�", ex);
             return;

--
Gitblit v1.8.0