Selaa lähdekoodia

微信支付(2)

GOLDEN-TECH\weiyf 3 vuotta sitten
vanhempi
commit
a989e480b1

+ 2 - 0
src/main/java/com/parksong/basics/aspect/ControllerAop.java

@@ -339,6 +339,7 @@ public class ControllerAop {
                 }
                 filter.setAccount(filter.getAccount());
                 filter.setPassword(filter.getPassword());
+                filter.setIpAdress(request.getRemoteAddr());
                 log.info("【请求用户】:{}",expressDept.getOwnerPhone());
                 return filter;
             }else{
@@ -354,6 +355,7 @@ public class ControllerAop {
             return apiFilter;
         }else {
             filter.getData().setExpressDept(expressDept);
+            filter.setIpAdress(request.getRemoteAddr());
             filter.getData().setStoreId(expressDept.getStoreId());
         }
         return filter;

+ 1 - 0
src/main/java/com/parksong/basics/filter/ApiFilter.java

@@ -17,5 +17,6 @@ public class ApiFilter <T extends Filter>{
     private Integer storeId;
     private String appVersion;
     private String jsCode;
+    private String ipAdress;
     private T data;
 }

+ 4 - 0
src/main/java/com/parksong/basics/util/redis/CacheTool.java

@@ -43,6 +43,7 @@ public class CacheTool {
 	private static final String DELIVERY_SIGN_STATUS = "delivery-sign-status";
 	private static final String DELIVERY_SHELFCODE = "delivery-shelfcode:";
 	private static final String JI_TU = "JITU:";
+	private static final String RECHARGE = "RECHARGE:";
 //	private static final SessionBusiness storeBusiness = SessionBusiness.init(SessionBusiness.MEMCACHED,"S");
 //	private static final SessionBusiness expressBusiness = SessionBusiness.init(SessionBusiness.MEMCACHED,"E");
 //	private static final SessionBusiness typeBusiness = SessionBusiness.init(SessionBusiness.MEMCACHED,"T");
@@ -72,6 +73,7 @@ public class CacheTool {
 	private static CacheTool expressAccountTool = new CacheTool(CACHE_NAMESPACE + "EA", ExpressDeptAccount.class);
 	private static CacheTool jiTuCacheTool = new CacheTool(JI_TU);
 	private static CacheTool shelfcodeCacheTool = new CacheTool(DELIVERY_SHELFCODE);
+	private static CacheTool rechargeCacheTool = new CacheTool(RECHARGE);
 
 
 	public CacheTool(){
@@ -128,6 +130,8 @@ public class CacheTool {
 
     public static CacheTool initShelfcodeCacheTool() {return shelfcodeCacheTool;}
 
+	public static CacheTool initrechargeCacheTool() {return rechargeCacheTool;}
+
     /**
 	 * 根据key获取对象
 	 */

+ 46 - 0
src/main/java/com/parksong/beans/express/ConsumeDetail.java

@@ -0,0 +1,46 @@
+package com.parksong.beans.express;
+
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Weiyf
+ * @Time 2021/7/19
+ * @Desc
+ * @Version 1.0
+ */
+
+@Data
+public class ConsumeDetail {
+
+    //业务员id
+    private String expId;
+    //快递公司账户ID
+    private String accountId;
+    //面单号
+    private String expCode;
+
+    private String bussCode;
+    //扣费节点(1: 入库,2:签收)
+    private String deductionNode;
+    //1: 扣费,2:退还,3:
+    private String type;
+    //包裹单价
+    private BigDecimal packagePrice;
+    //包裹数量
+    private int packageCount;
+    //备注
+    private String remark;
+    //统计结束时间
+    private String finishTime;
+    //创建时间(扣费时间)
+    private String createTime;
+    //总金额
+    private BigDecimal amount;
+
+
+
+
+}

+ 5 - 0
src/main/java/com/parksong/beans/express/ExpressDept.java

@@ -81,4 +81,9 @@ public class ExpressDept extends BasicsBean {
      * 扣费节点
      */
     private String deductionNode;
+
+    /**
+     * openid
+     */
+    private String openId;
 }

+ 36 - 0
src/main/java/com/parksong/beans/express/RechargeStatistics.java

@@ -0,0 +1,36 @@
+package com.parksong.beans.express;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author Weiyf
+ * @Time 2021/7/19
+ * @Desc
+ * @Version 1.0
+ */
+@Data
+public class RechargeStatistics {
+    //金额
+    private BigDecimal amount;
+    //支付途径 1支付宝2微信3充值赠送4线下充值5自动充值
+    private String payWay;
+    //商户订单号
+    private String outTradeNo;
+    //支付宝或微信交易号
+    private String tradeNo;
+    //支付状态 1.支付成功 2.待支付
+    private String payStatus;
+    //快递账号ID t_express_dept_account.id
+    private String accountId;
+    //备注
+    private String remark;
+    //充值人员
+    private String operator;
+    //充值时间
+    private Date optTime;
+
+
+}

+ 26 - 5
src/main/java/com/parksong/controllers/applets/AppletsController.java

@@ -6,9 +6,7 @@ import com.parksong.basics.beans.ResultNo;
 import com.parksong.basics.filter.ApiFilter;
 import com.parksong.beans.delivery.ResponsePage;
 import com.parksong.beans.delivery.StatisticsOutboundRate;
-import com.parksong.beans.express.ConsumeStatistics;
-import com.parksong.beans.express.ExpressApplets;
-import com.parksong.beans.express.ExpressDept;
+import com.parksong.beans.express.*;
 import com.parksong.filter.applets.AppletsFilter;
 import com.parksong.services.applets.AppletsService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -103,6 +101,28 @@ public class AppletsController {
         return new ResultNo<>(appletsService.consumeStatistics(filter.getData()));
     }
 
+    /**
+     * 消费详情统计
+     * @param filter
+     * @return
+     */
+    @ApiVersion(1)
+    @PostMapping("{version}/consume/statistics/detail")
+    public ResultNo<List<ConsumeDetail>> consumeDetail(@RequestBody ApiFilter<AppletsFilter> filter){
+        return new ResultNo<>(appletsService.consumeDetail(filter.getData()));
+    }
+
+    /**
+     * 充值统计
+     * @param filter
+     * @return
+     */
+    @ApiVersion(1)
+    @PostMapping("{version}/recharge/statistics")
+    public ResultNo<List<RechargeStatistics>> rechargeStatistics(@RequestBody ApiFilter<AppletsFilter> filter){
+        return new ResultNo<>(appletsService.rechargeStatistics(filter.getData()));
+    }
+
     /*-----------------------------------------------------充值模块-----------------------------------------------------*/
 
     /**
@@ -117,10 +137,11 @@ public class AppletsController {
     }
     //微信充值
     //回调地址 需要外网能够访问
+    @ApiVersion(1)
     @PostMapping("{version}/recharge/notify_url")
-    public ResultNo<Map<String, Object>> notifyUrl(HttpServletRequest request, HttpServletResponse response) throws Exception {
+    public String notifyUrl(HttpServletRequest request, HttpServletResponse response) throws Exception {
         appletsService.notifyUrl(request,response);
-        return null;
+        return "";
     }
 
 }

+ 13 - 3
src/main/java/com/parksong/dao/applets/AppletsMapper.java

@@ -1,8 +1,6 @@
 package com.parksong.dao.applets;
 
-import com.parksong.beans.express.ConsumeStatistics;
-import com.parksong.beans.express.ExpressApplets;
-import com.parksong.beans.express.ExpressDept;
+import com.parksong.beans.express.*;
 import com.parksong.filter.applets.AppletsFilter;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
@@ -21,9 +19,21 @@ public interface AppletsMapper {
 
     ExpressDept userDetail(@Param("id") Integer id);
 
+    ExpressDept userDetailByOpenId(@Param("openId") String openId);
+
+    int updateDeptAccount(@Param("expressDeptAccount") ExpressDeptAccount expressDeptAccount);
+
+    int insertSelective(RechargeStatistics rechargeStatistics);
+
+    int updateDept(@Param("user") ExpressDept user);
+
     List<ExpressApplets> expressInfo(@Param("filter") AppletsFilter filter);
 
     Long selectExpressInfoCount(@Param("filter") AppletsFilter filter);
 
     List<ConsumeStatistics> consumeStatistics(@Param("filter") AppletsFilter filter);
+
+    List<ConsumeDetail> consumeDetail(@Param("filter") AppletsFilter filter);
+
+    List<RechargeStatistics> rechargeStatistics(@Param("filter") AppletsFilter filter);
 }

+ 8 - 1
src/main/java/com/parksong/filter/applets/AppletsFilter.java

@@ -6,6 +6,8 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.math.BigDecimal;
+
 /**
  * @author LiuJS
  * @Time 2021/7/6 14:20
@@ -49,9 +51,14 @@ public class AppletsFilter extends Filter {
      */
     private String endTime;
 
+    /**
+     * 查询时间
+     */
+    private String searchTime;
+
     private String jsCode;
 
-    private String amount;
+    private BigDecimal amount;
 
 
 }

+ 6 - 0
src/main/java/com/parksong/services/applets/AppletsService.java

@@ -3,8 +3,10 @@ package com.parksong.services.applets;
 import com.parksong.basics.filter.ApiFilter;
 import com.parksong.beans.delivery.ResponsePage;
 import com.parksong.beans.delivery.StatisticsOutboundRate;
+import com.parksong.beans.express.ConsumeDetail;
 import com.parksong.beans.express.ConsumeStatistics;
 import com.parksong.beans.express.ExpressDept;
+import com.parksong.beans.express.RechargeStatistics;
 import com.parksong.filter.applets.AppletsFilter;
 
 import javax.servlet.http.HttpServletRequest;
@@ -30,6 +32,10 @@ public interface AppletsService {
 
     List<ConsumeStatistics> consumeStatistics(AppletsFilter filter);
 
+    List<ConsumeDetail> consumeDetail(AppletsFilter filter);
+
+    List<RechargeStatistics> rechargeStatistics(AppletsFilter filter);
+
     Map<String, Object> recharge(ApiFilter<AppletsFilter> filter);
 
     Map<String, Object> notifyUrl(HttpServletRequest request, HttpServletResponse response) throws Exception;

+ 64 - 20
src/main/java/com/parksong/services/applets/impl/AppletsServiceImpl.java

@@ -3,12 +3,11 @@ package com.parksong.services.applets.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.parksong.basics.exception.BusinessException;
 import com.parksong.basics.filter.ApiFilter;
+import com.parksong.basics.util.redis.CacheTool;
 import com.parksong.beans.applets.OrderPayBean;
 import com.parksong.beans.delivery.ResponsePage;
 import com.parksong.beans.delivery.StatisticsOutboundRate;
-import com.parksong.beans.express.ConsumeStatistics;
-import com.parksong.beans.express.ExpressApplets;
-import com.parksong.beans.express.ExpressDept;
+import com.parksong.beans.express.*;
 import com.parksong.dao.applets.AppletsMapper;
 import com.parksong.filter.applets.AppletsFilter;
 import com.parksong.filter.delivery.DeliveryFilter;
@@ -18,6 +17,7 @@ import com.parksong.util.Http.OkHttpUtil;
 import com.parksong.util.JwtUtils;
 import com.parksong.util.WxPayUtil;
 import com.parksong.util.enums.ExpressStatusEnum;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -31,6 +31,7 @@ import java.io.BufferedOutputStream;
 import java.io.BufferedReader;
 import java.io.InputStreamReader;
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.util.*;
 
 /**
@@ -40,6 +41,7 @@ import java.util.*;
  * @Version 1.0
  */
 @Service
+@Slf4j
 public class AppletsServiceImpl implements AppletsService {
 
     @Autowired
@@ -127,6 +129,20 @@ public class AppletsServiceImpl implements AppletsService {
         consumeStatisticsList.stream().forEach(consumeStatistics -> consumeStatistics.setConsumeAmount(new BigDecimal(consumeStatistics.getNumber()).multiply(consumeStatistics.getPrice())));
         return consumeStatisticsList;
     }
+    @Override
+    public List<ConsumeDetail> consumeDetail(AppletsFilter filter){
+        filter.setExpressId(filter.getExpressDept().getExpId().intValue());
+        List<ConsumeDetail> consumeDetailList = appletsMapper.consumeDetail(filter);
+        consumeDetailList.stream().forEach(consumeDetail -> consumeDetail.setAmount(new BigDecimal(consumeDetail.getPackageCount()).multiply(consumeDetail.getPackagePrice())));
+        return consumeDetailList;
+    }
+
+    @Override
+    public List<RechargeStatistics> rechargeStatistics(AppletsFilter filter){
+        filter.setExpressId(filter.getExpressDept().getExpId().intValue());
+        List<RechargeStatistics> rechargeStatisticsList = appletsMapper.rechargeStatistics(filter);
+        return rechargeStatisticsList;
+    }
 
     private void queryDeliveryFilterHandle(AppletsFilter filter){
         filter.sortInit();
@@ -136,7 +152,7 @@ public class AppletsServiceImpl implements AppletsService {
     public Map<String, Object> recharge(ApiFilter<AppletsFilter> filter){
 
         String jsCode = filter.getData().getJsCode();
-        String amount = filter.getData().getAmount();
+        BigDecimal amount = filter.getData().getAmount();
         //获取用户openid等相关参数
         String res = "";
         try {
@@ -146,10 +162,13 @@ public class AppletsServiceImpl implements AppletsService {
         }
         JSONObject resJson = JSONObject.parseObject(res);
         String openId = resJson.getString("openid");
+        ExpressDept user = appletsMapper.userDetail(filter.getData().getExpressDept().getId());
+        //绑定\更新用户的openid
+        user.setOpenId(openId);
+        appletsMapper.updateDept(user);
         //获取客户端的ip地址
         //String spbill_create_ip = wxPayUtil.getIpAddr(request);
-        String spbill_create_ip = "https://ubmtest.uxskj.com";
-
+        String spbill_create_ip = filter.getIpAdress();
         //生成六位数随机字符串
         String nonce_str = wxPayUtil.createCode(6);
         String out_trade_no = wxPayUtil.createCode(30);
@@ -167,7 +186,7 @@ public class AppletsServiceImpl implements AppletsService {
                 //ip地址 谁调用就是谁的地址 上面有用api获取
                 .spbill_create_ip(spbill_create_ip)
                 //金额 这里的金额实际业务需要乘 100 微信是按照分来算的 要转换位字符串 微信识别
-                .total_fee(amount)
+                .total_fee(((amount.multiply(new BigDecimal(100))).setScale( 0, BigDecimal.ROUND_DOWN ).longValue()) + "")
                 //用户的openId 这个需要调用微信获取openId 一般都是存储到用户表
                 .openid(openId)
                 .build();
@@ -177,6 +196,16 @@ public class AppletsServiceImpl implements AppletsService {
     }
 
     public Map<String, Object> notifyUrl(HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+        log.info("--------------回调开始----------------");
+        Enumeration e=request.getParameterNames();//获取所有参数名
+        while(e.hasMoreElements()){//通过Enumeration类中的hasMoreElements()判断是否还有参数名
+            String parameterName=(String)e.nextElement(); //获取当前参数名
+            //再通过request.getParameter("")的方法来获取对应参数名的值
+            System.out.println(parameterName+": "+request.getParameter(parameterName));
+            log.info("parameterName:"+parameterName+": "+request.getParameter(parameterName));
+        }
+
         //微信通过流传输
         BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
         String line = null;
@@ -189,8 +218,8 @@ public class AppletsServiceImpl implements AppletsService {
         String notityXml = sb.toString();
         String resXml = "";
         Map map = wxPayUtil.doXMLParse(notityXml);
-
         String returnCode = (String) map.get("return_code");
+        log.info("returnCode:"+returnCode);
         if ("SUCCESS".equals(returnCode)) {
             //验证签名是否正确
             Map<String, String> validParams = wxPayUtil.paraFilter(map);
@@ -199,20 +228,35 @@ public class AppletsServiceImpl implements AppletsService {
             //生成签名
             String mysign = wxPayUtil.sign(prestr, weChatKey, "utf-8").toUpperCase();
             //根据微信官网的介绍,此处不仅对回调的参数进行验签,还需要对返回的金额与系统订单的金额进行比对等
+            log.info("----------mysign:"+mysign+"--------------map.get(\"sign\"):"+map.get("sign"));
             if (mysign.equals(map.get("sign").toString())) {
-                //处理你系统内部的业务逻辑 订单状态修改  金额进行校正 等
-                //注意要判断微信支付重复回调,支付成功后微信会重复的进行回调
-
-                //数据库查询订单 进行金额校订
-
-
-
-                //进行金额比较
-
-
-                //使用数据库锁
-
 
+                String openid = (String) map.get("openid");
+                String cash_fee = (String) map.get("cash_fee");
+                String day = String.format("%02d", LocalDate.now().getDayOfMonth());
+                CacheTool rechargeCacheTool = CacheTool.initrechargeCacheTool();
+                String number = String.format("%06d", rechargeCacheTool.incrBy(day, 1).intValue());
+                BigDecimal amount = new BigDecimal(cash_fee).divide(new BigDecimal(100));
+
+                //根据openid获取用户信息
+                ExpressDept user = appletsMapper.userDetailByOpenId(openid);
+                //添加充值记录
+                RechargeStatistics rechargeStatistics = new RechargeStatistics();
+                rechargeStatistics.setAmount(amount);
+                rechargeStatistics.setPayWay("2");
+                rechargeStatistics.setOutTradeNo(day+number);
+                rechargeStatistics.setPayStatus("1");
+                rechargeStatistics.setAccountId(user.getId().toString());
+                rechargeStatistics.setOperator("admin");
+                int  a = appletsMapper.insertSelective(rechargeStatistics);
+
+                //更新余额
+                ExpressDeptAccount userAccount = new ExpressDeptAccount();
+                userAccount.setId(user.getId());
+                userAccount.setBalance(amount);
+                int b =appletsMapper.updateDeptAccount(userAccount);
+
+                log.info("----------a:"+a+"--------------b:"+b);
 
                 //返回通知微信已经接收到消息
                 resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"

+ 4 - 1
src/main/java/com/parksong/services/delivery/impl/DeliverysServiceImpl.java

@@ -836,9 +836,12 @@ public class DeliverysServiceImpl extends BasicsService implements DeliverysServ
         log.info("【快递单号】:{},【快递公司】:{},开始入库", storageDeliveryFilter.getExpCode(), storageDeliveryFilter.getExpId());
         boolean whiteUser = false;
         //去redis中检查是否存在相同记录
-        String stringKey = cacheTool.getStringKey(storageDeliveryFilter.getExpId() + "_" + storageDeliveryFilter.getExpCode() + "_" + storageDeliveryFilter.getShelfId() + "_" + storageDeliveryFilter.getShelfCode());
+        //String stringKey = cacheTool.getStringKey(storageDeliveryFilter.getExpId() + "_" + storageDeliveryFilter.getExpCode() + "_" + storageDeliveryFilter.getShelfId() + "_" + storageDeliveryFilter.getShelfCode());
+        String stringKey = cacheTool.getStringKey(storageDeliveryFilter.getExpId() + "_" + storageDeliveryFilter.getExpCode() + "_" + storageDeliveryFilter.getShelfId());
         if (!Strings.isBlank(stringKey)) {
             throw new BusinessException("面单号重复");
+        }else{
+            cacheTool.setStringKey(storageDeliveryFilter.getExpId() + "_" + storageDeliveryFilter.getExpCode() + "_" + storageDeliveryFilter.getShelfId(),"0");
         }
         if(!expressConsumeService.checkExpressBalance(filter.getStoreId(), storageDeliveryFilter.getExpId())){
             String express = CacheTool.initExpress().getString(storageDeliveryFilter.getExpId().toString());

+ 3 - 3
src/main/java/com/parksong/util/WxPayUtil.java

@@ -2,6 +2,7 @@ package com.parksong.util;
 
 import com.parksong.beans.applets.OrderPayBean;
 import com.parksong.services.applets.impl.AppletsServiceImpl;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.jdom.Document;
 import org.jdom.Element;
@@ -25,6 +26,7 @@ import java.util.*;
  * @see
  */
 @Component
+@Slf4j
 public class WxPayUtil {
 
     //小程序appid
@@ -44,7 +46,7 @@ public class WxPayUtil {
     //交易类型  不同业务需求选择不同  详见微信开发文档
     public String trade_type="JSAPI";
     //支付成功通知回调地址 需要外网能访问你的项目  可以使用花生壳进行内网穿透
-    private String notify_url="https://ubmtest.uxskj.com";
+    private String notify_url="https://ubmtest.uxskj.com/applets/v1/recharge/notify_url";
 
     //调用支付 统一下单 接口,返回Map数据
     public Map<String, Object> wxPay(OrderPayBean orderPay) {
@@ -90,12 +92,10 @@ public class WxPayUtil {
             System.out.println(xml);
             //调用统一下单接口,并接受返回的结果
             String result = WxPayUtil.httpRequest(orderPay.getPay_url(), "POST", xml);
-
             // 将解析结果存储在HashMap中
             Map map = WxPayUtil.doXMLParse(result);
             //返回状态码
             String return_code = (String) map.get("return_code");
-
             //返回给移动端需要的参数
             Map<String, Object> response = new HashMap<String, Object>();
             if (return_code == "SUCCESS" || return_code.equals(return_code)) {

+ 119 - 2
src/main/resources/com/parksong/mapper/applets/AppletsMapper.xml

@@ -12,12 +12,102 @@
 
     <select id="userDetail" resultType="com.parksong.beans.express.ExpressDept">
         SELECT
-            a.id, a.account, a.expressName, b.storeName, b.balance, b.packagePrice, b.closingPrice, IF(b.deductionNode = 1,'入库','出库') deductionNode, a.deptName, a.ownerName, a.ownerPhone, a.ownerMail, a.areaCode, a.address, a.createTime
+            a.id, a.account, a.expressName, a.openId, b.storeName, b.balance, b.packagePrice, b.closingPrice, IF(b.deductionNode = 1,'入库','出库') deductionNode, a.deptName, a.ownerName, a.ownerPhone, a.ownerMail, a.areaCode, a.address, a.createTime
         FROM fhm_jeesite.t_express_dept a
         left join fhm_jeesite.t_express_dept_account b on b.expressDeptId = a.id
         WHERE a.id = #{id}
     </select>
 
+    <select id="userDetailByOpenId" resultType="com.parksong.beans.express.ExpressDept">
+        SELECT
+            b.id, a.account, a.expressName, a.openId, b.storeName, b.balance, b.packagePrice, b.closingPrice, IF(b.deductionNode = 1,'入库','出库') deductionNode, a.deptName, a.ownerName, a.ownerPhone, a.ownerMail, a.areaCode, a.address, a.createTime
+        FROM fhm_jeesite.t_express_dept a
+        left join fhm_jeesite.t_express_dept_account b on b.expressDeptId = a.id
+        WHERE a.openid = #{openId}
+    </select>
+
+    <update id="updateDeptAccount">
+        UPDATE fhm_jeesite.t_express_dept_account teda
+          set balance = (#{expressDeptAccount.balance} + balance)
+        where id = #{expressDeptAccount.id}
+
+    </update>
+
+    <insert id="insertSelective">
+        insert into t_express_account_recharge_record
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">
+                id,
+            </if>
+            <if test="amount != null">
+                amount,
+            </if>
+            <if test="payWay != null">
+                payWay,
+            </if>
+            <if test="outTradeNo != null">
+                outTradeNo,
+            </if>
+            <if test="tradeNo != null">
+                tradeNo,
+            </if>
+            <if test="payStatus != null">
+                payStatus,
+            </if>
+            <if test="accountId != null">
+                accountId,
+            </if>
+            <if test="remark != null">
+                remark,
+            </if>
+            <if test="operator != null">
+                operator,
+            </if>
+            <if test="optTime != null">
+                optTime,
+            </if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">
+                #{id,jdbcType=BIGINT},
+            </if>
+            <if test="amount != null">
+                #{amount,jdbcType=DECIMAL},
+            </if>
+            <if test="payWay != null">
+                #{payWay,jdbcType=INTEGER},
+            </if>
+            <if test="outTradeNo != null">
+                #{outTradeNo,jdbcType=VARCHAR},
+            </if>
+            <if test="tradeNo != null">
+                #{tradeNo,jdbcType=VARCHAR},
+            </if>
+            <if test="payStatus != null">
+                #{payStatus,jdbcType=INTEGER},
+            </if>
+            <if test="accountId != null">
+                #{accountId,jdbcType=BIGINT},
+            </if>
+            <if test="remark != null">
+                #{remark,jdbcType=VARCHAR},
+            </if>
+            <if test="operator != null">
+                #{operator,jdbcType=VARCHAR},
+            </if>
+            <if test="optTime != null">
+                #{optTime,jdbcType=TIMESTAMP},
+            </if>
+        </trim>
+    </insert>
+
+
+    <update id="updateDept">
+        UPDATE fhm_jeesite.t_express_dept ted
+          set openId = #{user.openId}
+        where id = #{user.id}
+    </update>
+
     <select id="expressInfo" resultType="com.parksong.beans.express.ExpressApplets">
         select
             a.id, a.expcode expressCode, a.expId expressId, b.name expressName, a.shelfCode,
@@ -91,6 +181,33 @@
                 and a.createTime &lt; #{filter.endTime}
             </if>
         </where>
-        GROUP BY time ORDER BY time
+        GROUP BY time ORDER BY time DESC
+    </select>
+
+    <select id="consumeDetail" resultType="com.parksong.beans.express.ConsumeDetail">
+        SELECT tecr.* FROM
+          fhm_xiaomai_jisu.t_express_account_consume_record tecr
+        LEFT JOIN fhm_jeesite.t_express_dept_account teda ON tecr.accountId = teda.id
+        LEFT JOIN fhm_jeesite.t_express_dept ted ON  teda.expressDeptId = ted.id
+        <where>
+            tecr.TYPE = 1
+            <if test="filter.expressDept.expId != null and filter.expressDept.expId != ''">
+                AND ted.expId = #{filter.expressDept.expId}
+            </if>
+            <if test="filter.searchTime != null and filter.searchTime != ''">
+                AND DATE_FORMAT(tecr.createTime,'%Y-%m-%d') = DATE_FORMAT(#{filter.searchTime},'%Y-%m-%d')
+            </if>
+        </where>
+        ORDER BY tecr.createTime DESC
+    </select>
+
+
+    <select id="rechargeStatistics" resultType="com.parksong.beans.express.RechargeStatistics">
+        SELECT tear.* FROM
+          fhm_xiaomai_jisu.t_express_account_recharge_record tear
+          LEFT JOIN fhm_jeesite.t_express_dept_account teda ON tear.accountId = teda.id
+          LEFT JOIN fhm_jeesite.t_express_dept ted ON  teda.expressDeptId = ted.id
+        WHERE ted.expId = #{filter.expressDept.expId} and tear.payStatus = 1
+        ORDER BY tear.optTime DESC
     </select>
 </mapper>