liujs 3 år sedan
förälder
incheckning
150f79cc53
43 ändrade filer med 1992 tillägg och 33 borttagningar
  1. 10 0
      pom.xml
  2. 165 4
      src/main/java/com/parksong/basics/aspect/ControllerAop.java
  3. 59 0
      src/main/java/com/parksong/basics/beans/PageResultNo.java
  4. 41 0
      src/main/java/com/parksong/basics/beans/ResultNo.java
  5. 1 0
      src/main/java/com/parksong/basics/filter/ApiFilter.java
  6. 5 1
      src/main/java/com/parksong/basics/filter/Filter.java
  7. 5 0
      src/main/java/com/parksong/basics/util/redis/CacheTool.java
  8. 22 0
      src/main/java/com/parksong/beans/app/OssTokenBean.java
  9. 20 0
      src/main/java/com/parksong/beans/app/OssTokenRequestBean.java
  10. 37 0
      src/main/java/com/parksong/beans/delivery/Delivery.java
  11. 21 0
      src/main/java/com/parksong/beans/delivery/ExpressOperation.java
  12. 43 0
      src/main/java/com/parksong/beans/delivery/PhoneLibDto.java
  13. 2 0
      src/main/java/com/parksong/beans/delivery/ResponsePage.java
  14. 61 0
      src/main/java/com/parksong/beans/delivery/StatisticsOutboundRate.java
  15. 19 0
      src/main/java/com/parksong/beans/express/ConsumeStatistics.java
  16. 31 0
      src/main/java/com/parksong/beans/express/ExpressApplets.java
  17. 84 0
      src/main/java/com/parksong/beans/express/ExpressDept.java
  18. 30 4
      src/main/java/com/parksong/controllers/app/AppController.java
  19. 103 0
      src/main/java/com/parksong/controllers/applets/AppletsController.java
  20. 61 1
      src/main/java/com/parksong/controllers/delivery/DeliverysController.java
  21. 34 0
      src/main/java/com/parksong/controllers/store/StoreController.java
  22. 29 0
      src/main/java/com/parksong/dao/applets/AppletsMapper.java
  23. 17 4
      src/main/java/com/parksong/dao/delivery/DeliverysDao.java
  24. 5 0
      src/main/java/com/parksong/dao/store/StoreDao.java
  25. 51 0
      src/main/java/com/parksong/filter/applets/AppletsFilter.java
  26. 45 1
      src/main/java/com/parksong/filter/delivery/DeliveryFilter.java
  27. 28 0
      src/main/java/com/parksong/services/applets/AppletsService.java
  28. 103 0
      src/main/java/com/parksong/services/applets/impl/AppletsServiceImpl.java
  29. 14 0
      src/main/java/com/parksong/services/delivery/DeliverysService.java
  30. 206 7
      src/main/java/com/parksong/services/delivery/impl/DeliverysServiceImpl.java
  31. 10 0
      src/main/java/com/parksong/services/store/StoreService.java
  32. 6 0
      src/main/java/com/parksong/services/store/impl/StoreServiceImpl.java
  33. 145 0
      src/main/java/com/parksong/util/ExcelUtil.java
  34. 69 0
      src/main/java/com/parksong/util/JwtUtils.java
  35. 0 2
      src/main/java/com/parksong/util/enums/AppEnum.java
  36. 55 0
      src/main/java/com/parksong/util/enums/ExpressStatusEnum.java
  37. 53 0
      src/main/java/com/parksong/util/enums/OssEnum.java
  38. 48 0
      src/main/java/com/parksong/util/enums/SmsSendStatusEnum.java
  39. 1 2
      src/main/resources/application-dev.yml
  40. 0 2
      src/main/resources/application-pro.yml
  41. 96 0
      src/main/resources/com/parksong/mapper/applets/AppletsMapper.xml
  42. 153 5
      src/main/resources/com/parksong/mapper/deliverys/DeliveryMapper.xml
  43. 4 0
      src/main/resources/com/parksong/mapper/store/StoreMapper.xml

+ 10 - 0
pom.xml

@@ -153,6 +153,16 @@
             <artifactId>UserAgentUtils</artifactId>
             <version>1.21</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>4.1.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.16.0</version>
+        </dependency>
     </dependencies>
     <build>
         <resources>

+ 165 - 4
src/main/java/com/parksong/basics/aspect/ControllerAop.java

@@ -3,9 +3,7 @@ package com.parksong.basics.aspect;
 import com.alibaba.fastjson.JSON;
 import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException;
 import com.parksong.basics.api.Limiting;
-import com.parksong.basics.beans.PageResultBean;
-import com.parksong.basics.beans.ResultBean;
-import com.parksong.basics.beans.StoreReqLimit;
+import com.parksong.basics.beans.*;
 import com.parksong.basics.exception.AskException;
 import com.parksong.basics.exception.BusinessException;
 import com.parksong.basics.exception.NotLoginException;
@@ -13,20 +11,26 @@ import com.parksong.basics.filter.ApiFilter;
 import com.parksong.basics.filter.Filter;
 import com.parksong.basics.services.BasicsService;
 import com.parksong.basics.util.constants.ReturnStatusCodeConstants;
+import com.parksong.beans.express.ExpressDept;
 import com.parksong.beans.user.User;
 import com.parksong.services.log.LoggingEventService;
 import com.parksong.services.user.UsersService;
+import com.parksong.util.JwtUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.logging.log4j.util.Strings;
 import org.aspectj.lang.JoinPoint;
 import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.*;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestAttributes;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
 import java.util.Objects;
 
 /**
@@ -286,4 +290,161 @@ public class ControllerAop {
         }
         throw new NotLoginException("查询不到用户名为"+username+"的用户");
     }
+
+    /************************微信小程序aop****************************/
+    @Around("execution(public com.parksong.basics.beans.ResultNo *(..))")
+    public Object aroundResultNo(ProceedingJoinPoint pjp){
+        ResultNo<?> resultNo = getResultNo(pjp);
+        return resultNo;
+    }
+
+    private ResultNo<?> getResultNo(ProceedingJoinPoint pjp) {
+        long startTime = System.currentTimeMillis();
+        ResultNo<?> resultNo;
+        ApiFilter<?> filter = new ApiFilter<>();
+        Object[] objects = pjp.getArgs();
+        String requestMsg = "";
+        try {
+            requestMsg = JSON.toJSONString(objects);
+            filter = this.dealwithToken(objects);
+            resultNo = (ResultNo<?>) pjp.proceed();
+        } catch (Throwable e) {
+            resultNo = handlerExceptionResultNo(pjp, e);
+        }
+        long endTime = System.currentTimeMillis();
+        this.addLog(filter, requestMsg, (int) (endTime - startTime), JSON.toJSONString(resultNo), resultNo.getCode());
+        return resultNo;
+    }
+
+    private ApiFilter<?> dealwithToken(Object[] objects) throws Exception {
+        ApiFilter<?> filter = (ApiFilter<?>) objects[0];
+        ExpressDept expressDept = new ExpressDept();
+        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
+        HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();
+        String token = request.getHeader("token");
+        log.info("【请求 URL】:{}", request.getRequestURL());
+        log.info("【请求 IP】:{}", request.getRemoteAddr());
+        log.info("【请求参数】:{}", JSON.toJSONString(objects));
+        if ((Strings.isNotBlank(token))){
+            Map<String, String> map = JwtUtils.verifyToken(token);
+            expressDept.setId(Integer.parseInt(map.get("uid")));
+            expressDept.setStoreId(Integer.parseInt(map.get("storeid")));
+            expressDept.setExpId(Long.valueOf(map.get("expid")));
+            expressDept.setOwnerName(map.get("uname"));
+            expressDept.setOwnerPhone(map.get("uphone"));
+        }else {
+            if (null != objects && objects.length > 0) {
+                if (Strings.isBlank(filter.getAccount()) || Strings.isBlank(filter.getPassword())){
+                    throw new NotLoginException("用户名或者密码为空");
+                }
+                filter.setAccount(filter.getAccount());
+                filter.setPassword(filter.getPassword());
+                log.info("【请求用户】:{}",expressDept.getOwnerPhone());
+                return filter;
+            }else{
+                log.info("【请求参数】:null");
+                throw new BusinessException("传入参数不能为空");
+            }
+        }
+        if (filter.getData() == null){
+            ApiFilter<Filter> apiFilter = new ApiFilter<Filter>();
+            Filter filter1 = new Filter();
+            filter1.setExpressDept(expressDept);
+            apiFilter.setData(filter1);
+            return apiFilter;
+        }else {
+            filter.getData().setExpressDept(expressDept);
+            filter.getData().setStoreId(expressDept.getStoreId());
+        }
+        return filter;
+    }
+
+    private ResultNo<?> handlerExceptionResultNo(ProceedingJoinPoint pjp, Throwable e) {
+        ResultNo<?> result = new ResultNo<>();
+        if(e instanceof MySQLIntegrityConstraintViolationException){
+            result.setMsg("数据重复");
+            result.setCode(ReturnStatusCodeConstants.FAIL);
+        } else if(e instanceof NotLoginException){
+            result.setMsg(e.getMessage());
+            result.setCode(ReturnStatusCodeConstants.NO_LOGIN);
+        } else if(e instanceof BusinessException){
+            result.setMsg(e.getMessage());
+            result.setCode(ReturnStatusCodeConstants.FAIL);
+        } else if(e instanceof AskException){
+            result.setMsg(e.getMessage());
+            result.setCode(ReturnStatusCodeConstants.ASK);
+        }  else if(e instanceof NullPointerException){
+            result.setMsg("非法入参");
+            result.setCode(ReturnStatusCodeConstants.Unknown);
+        } else if(e instanceof Exception){
+            result.setMsg(e.getMessage());
+            result.setCode(ReturnStatusCodeConstants.Unknown);
+        } else {
+            result.setMsg(e.getMessage());
+            result.setCode(ReturnStatusCodeConstants.Unknown);
+        }
+        e.printStackTrace();
+        return result;
+    }
+
+    /************************微信小程序分页aop****************************/
+    @Around("execution(public com.parksong.basics.beans.PageResultNo *(..))")
+    public Object aroundPageResultNo(ProceedingJoinPoint pjp){
+        PageResultNo<?> result = getPageResultNo(pjp);
+        return result;
+    }
+
+    private PageResultNo<?> getPageResultNo(ProceedingJoinPoint pjp) {
+        long startTime = System.currentTimeMillis();
+        PageResultNo<?> result;
+        Object[] objs = pjp.getArgs();
+        ApiFilter<?> filter = null;
+        String requestMsg = "";
+        try {
+            requestMsg = JSON.toJSONString(objs);
+            filter = this.dealwithToken(objs);
+            //分页初始化数据
+            filter.getData().init();
+            result = (PageResultNo<?>) pjp.proceed();
+            //分页返回当前页和查询条数
+            if (filter != null) {
+                result.setCurrentPage(filter.getData().getCurrentPage());
+                result.setPageSize(filter.getData().getPageSize());
+                result.setRequestSign(filter.getData().getRequestSign());
+            }
+        } catch (Throwable e) {
+            result = handlerExceptionPageResultNo(pjp, e);
+        }
+        this.addLog(filter, requestMsg, new Long((System.currentTimeMillis() - startTime)).intValue(), JSON.toJSONString(result), result.getCode());
+        return result;
+    }
+
+    private PageResultNo<?> handlerExceptionPageResultNo(ProceedingJoinPoint pjp, Throwable e) {
+        PageResultNo<?> result = new PageResultNo<>();
+
+        if(e instanceof MySQLIntegrityConstraintViolationException){
+            result.setMsg("数据重复");
+            result.setCode(ReturnStatusCodeConstants.FAIL);
+        } else if(e instanceof NotLoginException){
+            result.setMsg(e.getMessage());
+            result.setCode(ReturnStatusCodeConstants.NO_LOGIN);
+        } else if(e instanceof BusinessException){
+            result.setMsg(e.getMessage());
+            result.setCode(ReturnStatusCodeConstants.FAIL);
+        } else if(e instanceof AskException){
+            result.setMsg(e.getMessage());
+            result.setCode(ReturnStatusCodeConstants.ASK);
+        } else if(e instanceof NullPointerException){
+            result.setMsg("非法入参");
+            result.setCode(ReturnStatusCodeConstants.Unknown);
+        } else if(e instanceof Exception){
+            result.setMsg(e.getMessage());
+            result.setCode(ReturnStatusCodeConstants.Unknown);
+        } else {
+            result.setMsg(e.getMessage());
+            result.setCode(ReturnStatusCodeConstants.Unknown);
+        }
+        e.printStackTrace();
+        return result;
+    }
 }

+ 59 - 0
src/main/java/com/parksong/basics/beans/PageResultNo.java

@@ -0,0 +1,59 @@
+package com.parksong.basics.beans;
+
+import com.parksong.basics.util.constants.ReturnStatusCodeConstants;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author LiuJS
+ * @Time 2021/7/8 10:03
+ * @Desc
+ * @Version 1.0
+ */
+@Data
+public class PageResultNo <T> implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String msg = "请求成功";
+
+    private int code = ReturnStatusCodeConstants.SUCCESS;
+
+    private T data;
+
+    private String requestSign;
+
+    /**
+     * 当前页
+     */
+    private Integer currentPage=1;
+    /**
+     * 每页条数
+     */
+    private Integer pageSize=10;
+    /**
+     * 总条数
+     */
+    private Long total;
+
+    public PageResultNo() {
+        super();
+    }
+
+    public PageResultNo(T data) {
+        super();
+        this.data = data;
+    }
+
+    public PageResultNo(T data,Long total) {
+        super();
+        this.data = data;
+        this.total = total;
+    }
+
+    public PageResultNo(Throwable e) {
+        super();
+        this.msg = e.toString();
+        this.code = ReturnStatusCodeConstants.FAIL;
+    }
+}

+ 41 - 0
src/main/java/com/parksong/basics/beans/ResultNo.java

@@ -0,0 +1,41 @@
+package com.parksong.basics.beans;
+
+import com.parksong.basics.util.constants.ReturnStatusCodeConstants;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author LiuJS
+ * @Time 2021/7/6 15:31
+ * @Desc
+ * @Version 1.0
+ */
+@Data
+public class ResultNo<T> implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+
+    private String msg = "请求成功";
+
+    private int code = ReturnStatusCodeConstants.SUCCESS;
+
+    private T data;
+
+    private String requestSign;
+
+    public ResultNo() {
+        super();
+    }
+
+    public ResultNo(T data) {
+        super();
+        this.data = data;
+    }
+
+    public ResultNo(Throwable e) {
+        super();
+        this.msg = e.toString();
+        this.code = ReturnStatusCodeConstants.FAIL;
+    }
+}

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

@@ -12,6 +12,7 @@ import lombok.Data;
 @Data
 public class ApiFilter <T extends Filter>{
     private String userId;
+    private String account;
     private String password;
     private Integer storeId;
     private String appVersion;

+ 5 - 1
src/main/java/com/parksong/basics/filter/Filter.java

@@ -1,7 +1,7 @@
 package com.parksong.basics.filter;
 
+import com.parksong.beans.express.ExpressDept;
 import com.parksong.beans.user.User;
-import lombok.Builder;
 import lombok.Data;
 import org.apache.logging.log4j.util.Strings;
 
@@ -47,6 +47,10 @@ public class Filter {
      */
     private User user;
     /**
+     * 登录后微信小程序用户信息
+     */
+    private ExpressDept expressDept;
+    /**
      * 门店Id
      */
     private Integer storeId;

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

@@ -41,6 +41,7 @@ public class CacheTool {
 	private static final String PDD = "pdd";
 	private static final String DELIVERY_STATUS = "delivery-status";
 	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 SessionBusiness storeBusiness = SessionBusiness.init(SessionBusiness.MEMCACHED,"S");
 //	private static final SessionBusiness expressBusiness = SessionBusiness.init(SessionBusiness.MEMCACHED,"E");
@@ -70,6 +71,8 @@ public class CacheTool {
 	private static CacheTool platformConfigTool = new CacheTool(CACHE_NAMESPACE + "pfc", PlatformConfig.class);
 	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);
+
 
 	public CacheTool(){
 		
@@ -123,6 +126,8 @@ public class CacheTool {
 		return jiTuCacheTool;
     }
 
+    public static CacheTool initShelfcodeCacheTool() {return shelfcodeCacheTool;}
+
     /**
 	 * 根据key获取对象
 	 */

+ 22 - 0
src/main/java/com/parksong/beans/app/OssTokenBean.java

@@ -0,0 +1,22 @@
+package com.parksong.beans.app;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author LiuJS
+ * @Time 2021/6/8 16:04
+ * @Desc
+ * @Version 1.0
+ */
+@Data
+public class OssTokenBean {
+    private String statusCode;
+    private String accessKeyId;
+    private String accessKeySecret;
+    private String securityToken;
+    private String expiration;
+    private String ErrorCode;
+    private String ErrorMessage;
+}

+ 20 - 0
src/main/java/com/parksong/beans/app/OssTokenRequestBean.java

@@ -0,0 +1,20 @@
+package com.parksong.beans.app;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @author LiuJS
+ * @Time 2021/6/9 15:49
+ * @Desc
+ * @Version 1.0
+ */
+@Data
+public class OssTokenRequestBean {
+    private String accessKeyId;
+    private String accessKeySecret;
+    private String roleArn;
+    private Long durationSeconds;
+    private String policy;
+    private String roleSessionName;
+}

+ 37 - 0
src/main/java/com/parksong/beans/delivery/Delivery.java

@@ -4,6 +4,7 @@ import com.parksong.basics.beans.BasicsBean;
 import lombok.*;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * @ClassName delivery
@@ -58,6 +59,8 @@ public class Delivery extends BasicsBean {
 
     private Integer status;
 
+    private String statusName;
+
     private Date statusTime;
 
     private Integer problemType;
@@ -95,6 +98,7 @@ public class Delivery extends BasicsBean {
      * 短信发送状态;// 状态 0:已发送, 1:成功, 2:失败
      */
     private Integer smsStatus;
+    private String smsStatusName;
     /**
      * 1.短信发送通道 2.微信发送通道 3.短信,微信都发送通道
      */
@@ -122,11 +126,24 @@ public class Delivery extends BasicsBean {
      * 推送物流数据平台
      */
     private String tracePushPlatform;
+    /**
+     * 签收快递的图片
+     */
+    private String signPhotoUrl;
+    private List<String> signPhotoUrlList;
     /*****************************************非数据库字段**********************************************/
     /**
      * 快递公司名称
      */
     private String expName;
+    /**
+     * 快递logo地址
+     */
+    private String expLogo;
+    /**
+     * 快递收件人地址
+     */
+    private String expAddress;
 
     /**
      * 货架名称
@@ -143,4 +160,24 @@ public class Delivery extends BasicsBean {
      *   2:派送签收
      */
     private Integer signWay;
+    /**
+     * 短信发送内容
+     */
+    private String smsContent;
+    /**
+     * 短信发送时间
+     */
+    private Date smsTime;
+    /**
+     * 快递在库时间
+     */
+    private Long warehousingTime;
+    /**
+     * 收件人信息
+     */
+    private String consigneeName;
+    /**
+     * 快递操作记录
+     */
+    private List<ExpressOperation> expressOperationList;
 }

+ 21 - 0
src/main/java/com/parksong/beans/delivery/ExpressOperation.java

@@ -0,0 +1,21 @@
+package com.parksong.beans.delivery;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author LiuJS
+ * @Time 2021/6/28 17:05
+ * @Desc
+ * @Version 1.0
+ */
+@Data
+public class ExpressOperation {
+        private Integer storeId;
+        private String expcode;
+        private Integer status;
+        private String title;
+        private String operationContent;
+        private Date createTime;
+}

+ 43 - 0
src/main/java/com/parksong/beans/delivery/PhoneLibDto.java

@@ -2,8 +2,10 @@ package com.parksong.beans.delivery;
 
 
 import com.parksong.basics.beans.BasicsBean;
+import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
@@ -14,8 +16,49 @@ import java.util.Date;
  * @author kael
  */
 @Data
+@NoArgsConstructor
+@AllArgsConstructor
 @Builder
 public class PhoneLibDto extends BasicsBean {
     private String phones;
+    /**
+     * 门店Id
+     */
     private int storeId;
+    /**
+     * 小区Id
+     */
+    private int areaId;
+    /**
+     * 小区名称
+     */
+    private String areaName;
+    /**
+     * 收件人名称
+     */
+    private String consingeeName;
+    /**
+     * 收件人电话
+     */
+    private String consingeePhone;
+    /**
+     * 收件人地址
+     */
+    private String address;
+    /**
+     * 楼栋号
+     */
+    private String buildingNumber;
+    /**
+     * 楼层号
+     */
+    private String floorNumber;
+    /**
+     * 备注
+     */
+    private String remark;
+    /**
+     * 姓名+电话
+     */
+    private String namePhone;
 }

+ 2 - 0
src/main/java/com/parksong/beans/delivery/ResponsePage.java

@@ -1,5 +1,6 @@
 package com.parksong.beans.delivery;
 
+import com.parksong.beans.express.ExpressApplets;
 import lombok.Data;
 
 import java.util.List;
@@ -11,4 +12,5 @@ public class ResponsePage {
     private int pages;
     private int pageNumber;
     private List<Delivery> list;
+    private List<ExpressApplets> expressAppletsList;
 }

+ 61 - 0
src/main/java/com/parksong/beans/delivery/StatisticsOutboundRate.java

@@ -0,0 +1,61 @@
+package com.parksong.beans.delivery;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author LiuJS
+ * @Time 2021/6/11 16:10
+ * @Desc
+ * @Version 1.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class StatisticsOutboundRate {
+    /**
+     * 时间
+     */
+    private String time;
+    /**
+     * 快递公司Id
+     */
+    private Long expId;
+    /**
+     * 快递公司名称
+     */
+    private String expName;
+    /**
+     * 快递公司logo
+     */
+    private String expLogo;
+    /**
+     * 入库数
+     */
+    private Integer warehousing;
+    /**
+     * 出库数
+     */
+    private Integer outboundNum;
+    /**
+     * 待出库数
+     */
+    private Integer waitOutboundNum;
+    /**
+     * 退件数
+     */
+    private Integer sendBackNum;
+    /**
+     * 出库率
+     */
+    private String outboundRate;
+    /**
+     * 查询时间范围的详情数据/每日各种快递的详情数据
+     */
+    private List<StatisticsOutboundRate> detailInfo;
+}

+ 19 - 0
src/main/java/com/parksong/beans/express/ConsumeStatistics.java

@@ -0,0 +1,19 @@
+package com.parksong.beans.express;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author LiuJS
+ * @Time 2021/7/9 9:12
+ * @Desc
+ * @Version 1.0
+ */
+@Data
+public class ConsumeStatistics {
+    private String time;
+    private Integer number;
+    private BigDecimal price;
+    private BigDecimal consumeAmount;
+}

+ 31 - 0
src/main/java/com/parksong/beans/express/ExpressApplets.java

@@ -0,0 +1,31 @@
+package com.parksong.beans.express;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ * @author LiuJS
+ * @Time 2021/7/7 15:10
+ * @Desc
+ * @Version 1.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ExpressApplets {
+    private Integer id;
+    private Integer expressId;
+    private String expressName;
+    private String expressCode;
+    private String shelfCode;
+    private String userPhone;
+    private Integer status;
+    private String statusName;
+    private Date createTime;
+
+}

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

@@ -0,0 +1,84 @@
+package com.parksong.beans.express;
+
+import com.parksong.basics.beans.BasicsBean;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author LiuJS
+ * @Time 2021/7/6 11:19
+ * @Desc
+ * @Version 1.0
+ */
+@Data
+public class ExpressDept extends BasicsBean {
+    /**
+     * 账号
+     */
+    private String account;
+    /**
+     * 密码
+     */
+    private String password;
+    /**
+     * 快递公司ID
+     */
+    private Long expId;
+    /**
+     * 快递公司名称
+     */
+    private String expressName;
+    /**
+     * 部门名(对应画面账号名称)
+     */
+    private String deptName;
+    /**
+     * 负责人姓名
+     */
+    private String ownerName;
+    /**
+     * 负责人电话
+     */
+    private String ownerPhone;
+    /**
+     * 负责人邮箱(预留)
+     */
+    private String ownerMail;
+    /**
+     * 所属地区(行政区划代码)示例310104
+     */
+    private String areaCode;
+    /**
+     * 详细地址
+     */
+    private String address;
+    /**
+     * 是否启用(1:启用,0:未启用)
+     */
+    private int valid;
+    /**
+     * 所属门店Id
+     */
+    private Integer storeId;
+    /**
+     * 所属商店名称
+     */
+    private String storeName;
+    /**
+     * 余额
+     */
+    private BigDecimal balance;
+    /**
+     * 快递单价
+     */
+    private BigDecimal packagePrice;
+    /**
+     * 余额最低临界值
+     */
+    private BigDecimal closingPrice;
+    /**
+     * 扣费节点
+     */
+    private String deductionNode;
+}

+ 30 - 4
src/main/java/com/parksong/controllers/app/AppController.java

@@ -1,14 +1,17 @@
 package com.parksong.controllers.app;
 
+import com.alibaba.fastjson.JSONObject;
 import com.parksong.basics.beans.ResultBean;
 import com.parksong.basics.filter.ApiFilter;
+import com.parksong.beans.app.OssTokenBean;
+import com.parksong.beans.app.OssTokenRequestBean;
 import com.parksong.filter.app.AppFilter;
 import com.parksong.services.app.AppService;
+import com.parksong.util.Http.OkHttpUtil;
+import com.parksong.util.enums.OssEnum;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * @author LiuJS
@@ -16,6 +19,7 @@ import org.springframework.web.bind.annotation.RestController;
  * @Desc app版本
  * @Version 1.0
  */
+@Slf4j
 @RestController
 @RequestMapping("app")
 public class AppController {
@@ -27,4 +31,26 @@ public class AppController {
     public ResultBean check(@RequestBody ApiFilter<AppFilter> apiFilter) {
         return new ResultBean(appService.checkVersion(apiFilter.getData()));
     }
+
+    /**
+     * APP获取OSS临时token接口
+     * @return
+     * @throws Exception
+     */
+    @GetMapping("/ossSecurityToken")
+    public Object ossSecurityToken() throws Exception{
+        OssTokenRequestBean ossTokenRequestBean = new OssTokenRequestBean();
+        ossTokenRequestBean.setAccessKeyId(OssEnum.ACCESS_KEY_ID.getValue());
+        ossTokenRequestBean.setAccessKeySecret(OssEnum.ACCESS_KEY_SECRET.getValue());
+        ossTokenRequestBean.setRoleArn(OssEnum.ROLE_ARN.getValue());
+        ossTokenRequestBean.setPolicy(OssEnum.POLICY.getValue());
+        ossTokenRequestBean.setDurationSeconds(900L);
+        ossTokenRequestBean.setRoleSessionName("youbaimi");
+        String url = "http://ybmcp.uxskj.com";
+        String res = OkHttpUtil.postJson(url + "/logistics/alibb/ossSecurityToken", ossTokenRequestBean);
+        log.info("APP获取OSS临时token接口返回参数:{}",res);
+        OssTokenBean ossTokenBean = JSONObject.parseObject(res, OssTokenBean.class);
+        ResultBean resultBean = new ResultBean(ossTokenBean);
+        return resultBean;
+    }
 }

+ 103 - 0
src/main/java/com/parksong/controllers/applets/AppletsController.java

@@ -0,0 +1,103 @@
+package com.parksong.controllers.applets;
+
+import com.parksong.basics.api.ApiVersion;
+import com.parksong.basics.beans.PageResultNo;
+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.filter.applets.AppletsFilter;
+import com.parksong.services.applets.AppletsService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author LiuJS
+ * @Time 2021/7/6 11:04
+ * @Desc 小程序接口
+ * @Version 1.0
+ */
+@RestController
+@ResponseBody
+@RequestMapping("applets")
+public class AppletsController {
+
+    @Autowired
+    private AppletsService appletsService;
+
+    /*-----------------------------------------------------用户模块-----------------------------------------------------*/
+
+    /**
+     * 用户登录
+     * @param filter
+     * @return
+     * @throws Exception
+     */
+    @ApiVersion(1)
+    @PostMapping("{version}/user/login")
+    public ResultNo<String> userLogin(@RequestBody ApiFilter<AppletsFilter> filter) throws Exception {
+        return new ResultNo<>(appletsService.userLogin(filter.getAccount(), filter.getPassword()));
+    }
+
+    /**
+     * 用户详情信息
+     * @param filter
+     * @return
+     */
+    @ApiVersion(1)
+    @PostMapping("{version}/user/detail")
+    public ResultNo<ExpressDept> userDetail(@RequestBody ApiFilter<AppletsFilter> filter){
+        return new ResultNo<>(appletsService.userDetail(filter.getData()));
+    }
+
+    //修改用户信息
+
+    //修改密码
+
+
+    /*-----------------------------------------------------业务统计模块-----------------------------------------------------*/
+
+    /**
+     * 查询快递信息接口
+     * @param filter
+     * @return
+     */
+    @ApiVersion(1)
+    @PostMapping("{version}/express/info")
+    public PageResultNo<List<ExpressApplets>> expressInfo(@RequestBody ApiFilter<AppletsFilter> filter){
+        ResponsePage responsePage = appletsService.expressInfo(filter.getData());
+        return new PageResultNo<>(responsePage.getExpressAppletsList(), responsePage.getTotal());
+    }
+
+    /**
+     * 业务统计
+     * @param filter
+     * @return
+     */
+    @ApiVersion(1)
+    @PostMapping("{version}/express/statistics")
+    public PageResultNo<StatisticsOutboundRate> expressStatistics(@RequestBody ApiFilter<AppletsFilter> filter){
+        return new PageResultNo<>(appletsService.expressStatistics(filter.getData()));
+    }
+
+    /*-----------------------------------------------------消费统计模块-----------------------------------------------------*/
+
+    /**
+     * 消费统计
+     * @param filter
+     * @return
+     */
+    @ApiVersion(1)
+    @PostMapping("{version}/consume/statistics")
+    public ResultNo<List<ConsumeStatistics>> consumeStatistics(@RequestBody ApiFilter<AppletsFilter> filter){
+        return new ResultNo<>(appletsService.consumeStatistics(filter.getData()));
+    }
+
+    /*-----------------------------------------------------充值模块-----------------------------------------------------*/
+    //微信充值
+}

+ 61 - 1
src/main/java/com/parksong/controllers/delivery/DeliverysController.java

@@ -14,6 +14,8 @@ import com.parksong.services.delivery.DeliverysService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.text.ParseException;
 import java.util.List;
 
@@ -78,7 +80,19 @@ public class DeliverysController extends BasicsController {
     @ResponseBody
     @ApiVersion(1)
     public ResultBean<Boolean> storageDelivery(@RequestBody ApiFilter<DeliveryFilter> filter,@PathVariable String version){
-        return new ResultBean<Boolean>(deliverysService.storageDelivery(filter.getData(),filter.getAppVersion(),version));
+        return new ResultBean<>(deliverysService.storageDelivery(filter.getData(),filter.getAppVersion(),version));
+    }
+
+    /**
+     * 入库--新
+     * @param filter
+     * @return
+     */
+    @RequestMapping(value ="/app/storageNew", method = {RequestMethod.POST})
+    @ResponseBody
+    @ApiVersion(2)
+    public ResultBean<Delivery> storageDeliveryNew(@RequestBody ApiFilter<DeliveryFilter> filter,@PathVariable String version){
+        return new ResultBean<>(deliverysService.storageDeliveryNew(filter.getData(),filter.getAppVersion(),version));
     }
 
     /**
@@ -166,4 +180,50 @@ public class DeliverysController extends BasicsController {
         resultBean.setMsg("没查询到相关数据");
         return resultBean;
     }
+
+    /**
+     * 统计出库率
+     * @param filter
+     * @return
+     */
+    @PostMapping(value ="/app/outboundRate")
+    @ApiVersion(1)
+    public PageResultBean<StatisticsOutboundRate> outboundRate(@RequestBody ApiFilter<DeliveryFilter> filter){
+        return new PageResultBean<>(deliverysService.outboundRate(filter.getData()));
+    }
+
+    /**
+     * 出库率数据导出
+     * @param filter
+     * @return
+     */
+    @PostMapping(value ="/app/export")
+    @ApiVersion(1)
+    public void export(HttpServletResponse response, @RequestBody DeliveryFilter filter) throws IOException {
+        deliverysService.export(response, filter);
+    }
+
+    /**
+     * 根据收件人电话号码查询收件人信息
+     */
+    @PostMapping(value ="/app/getConsigneeInfoByPhone")
+    public ResultBean<List<PhoneLibDto>> getConsigneeInfoByPhone(@RequestBody ApiFilter<DeliveryFilter> filter){
+        return new ResultBean<>(deliverysService.getConsigneeInfoByPhone(filter.getData()));
+    }
+
+    /**
+     * 获取快递详情接口
+     */
+    @PostMapping(value ="/app/expressDetailInfo")
+    public ResultBean<Delivery> expressDetailInfo(@RequestBody ApiFilter<DeliveryFilter> filter){
+        return new ResultBean<>(deliverysService.expressDetailInfo(filter.getData()));
+    }
+
+    /**
+     * 添加寄件人信息
+     */
+    @PostMapping(value ="/app/addSenderInfo")
+    public ResultBean<Boolean> addSenderInfo(@RequestBody ApiFilter<DeliveryFilter> filter){
+        return new ResultBean<>(deliverysService.addSenderInfo(filter.getData()));
+    }
 }

+ 34 - 0
src/main/java/com/parksong/controllers/store/StoreController.java

@@ -0,0 +1,34 @@
+package com.parksong.controllers.store;
+
+import com.parksong.basics.api.ApiVersion;
+import com.parksong.basics.beans.ResultBean;
+import com.parksong.basics.filter.ApiFilter;
+import com.parksong.filter.store.StoreFilter;
+import com.parksong.services.store.StoreService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @author LiuJS
+ * @Time 2021/6/30 10:10
+ * @Desc
+ * @Version 1.0
+ */
+@RestController
+@ApiVersion(2)
+@RequestMapping("/{version}/store")
+public class StoreController {
+
+    @Autowired
+    private StoreService storeService;
+
+    @PostMapping("/consigneePhoneInfo")
+    public ResultBean<List<String>> consigneePhoneInfo(@RequestBody ApiFilter<StoreFilter> filter){
+        return new ResultBean<>(storeService.getConsigneePhoneInfo(filter.getStoreId()));
+    }
+}

+ 29 - 0
src/main/java/com/parksong/dao/applets/AppletsMapper.java

@@ -0,0 +1,29 @@
+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.filter.applets.AppletsFilter;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * @author LiuJS
+ * @Time 2021/7/6 11:13
+ * @Desc
+ * @Version 1.0
+ */
+@Repository
+public interface AppletsMapper {
+    ExpressDept userLogin(@Param("account") String account);
+
+    ExpressDept userDetail(@Param("id") Integer id);
+
+    List<ExpressApplets> expressInfo(@Param("filter") AppletsFilter filter);
+
+    Long selectExpressInfoCount(@Param("filter") AppletsFilter filter);
+
+    List<ConsumeStatistics> consumeStatistics(@Param("filter") AppletsFilter filter);
+}

+ 17 - 4
src/main/java/com/parksong/dao/delivery/DeliverysDao.java

@@ -1,9 +1,7 @@
 package com.parksong.dao.delivery;
 
 import com.parksong.basics.dao.BasicDao;
-import com.parksong.beans.delivery.BaseStatToday;
-import com.parksong.beans.delivery.Delivery;
-import com.parksong.beans.delivery.GuoanFtpData;
+import com.parksong.beans.delivery.*;
 import com.parksong.filter.delivery.DeliveryFilter;
 import org.apache.ibatis.annotations.MapKey;
 import org.apache.ibatis.annotations.Param;
@@ -24,7 +22,7 @@ public interface DeliverysDao extends BasicDao<DeliveryFilter, Delivery> {
      * @param filter
      * @return
      */
-    Delivery queryDeliveryByIdOrExpCode(DeliveryFilter filter);
+    Delivery queryDeliveryByIdOrExpCode(@Param("filter") DeliveryFilter filter);
 
     /**
      * 查询总表数据,返回国安需要数据
@@ -99,4 +97,19 @@ public interface DeliverysDao extends BasicDao<DeliveryFilter, Delivery> {
 
     List<Delivery> queryMasterDelivery(Delivery delivery);
 
+    List<StatisticsOutboundRate> todayData(@Param("storeId") Integer storeId, @Param("todayTime") String todayTime, @Param("expId") Integer expId);
+
+    List<String> historyTime(@Param("storeId") Integer storeId, @Param("beginTime") String beginTime, @Param("endTime") String endTime);
+
+    StatisticsOutboundRate getExportData(@Param("storeId") Integer storeId, @Param("time") String time);
+
+    List<PhoneLibDto> getConsigneeInfoByPhone(@Param("filter") DeliveryFilter filter);
+
+    Delivery expressDetailInfo(@Param("deliveryId") Integer deliveryId, @Param("storeId") Integer storeId);
+
+    int selectDelivery(@Param("storeId") Integer storeId, @Param("shelfCode") String shelfCode);
+
+    List<ExpressOperation> selectExpressOperationRecord(@Param("storeId") Integer storeId,@Param("expcode") String expcode);
+
+    void addSenderInfo(@Param ("filter") DeliveryFilter filter);
 }

+ 5 - 0
src/main/java/com/parksong/dao/store/StoreDao.java

@@ -4,8 +4,11 @@ import com.parksong.basics.dao.BasicDao;
 import com.parksong.beans.store.SignBackSwitchBean;
 import com.parksong.beans.store.Store;
 import com.parksong.filter.store.StoreFilter;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 /**
  * @author kael
  */
@@ -25,4 +28,6 @@ public interface StoreDao extends BasicDao<StoreFilter, Store> {
      * @return
      */
     public SignBackSwitchBean getSignBackSwitch(StoreFilter filter);
+
+    List<String> getConsigneePhoneInfo(@Param("storeId") Integer storeId);
 }

+ 51 - 0
src/main/java/com/parksong/filter/applets/AppletsFilter.java

@@ -0,0 +1,51 @@
+package com.parksong.filter.applets;
+
+import com.parksong.basics.filter.Filter;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author LiuJS
+ * @Time 2021/7/6 14:20
+ * @Desc
+ * @Version 1.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AppletsFilter extends Filter {
+    private String account;
+    private String password;
+
+    //查询快递信息参数
+    /**
+     * 快递公司Id
+     */
+    private Integer expressId;
+    /**
+     * 快递单号
+     */
+    private String expressCode;
+    /**
+     * 手机人电话号码
+     */
+    private String consigneePhone;
+    /**
+     * 快递状态
+     * 已出库:126 246
+     * 待出库: 122
+     * 退回件:暂未定义
+     */
+    private Integer expressStatus;
+    /**
+     * 开始时间
+     */
+    private String startTime;
+    /**
+     * 结束时间
+     */
+    private String endTime;
+}

+ 45 - 1
src/main/java/com/parksong/filter/delivery/DeliveryFilter.java

@@ -129,6 +129,50 @@ public class DeliveryFilter extends Filter {
     private String searchExpTime;
 
     private String timeConditions;
+    /**
+     * 签收时的图片
+     */
+    private List<String> expSignPhotos;
+    /**
+     * 小区id
+     */
+    private Integer areaId;
+    /**
+     * 收件人名称
+     */
+    private String consingeeName;
+    /**
+     * 收件人号码
+     */
+    private String consigneePhone;
+    /**
+     * 收件人电话号码后四位
+     */
+    private String consigneePhoneEnd;
+    /**
+     * 收件人地址
+     */
+    private String address;
+    /**
+     * 楼栋号
+     */
+    private String buildingNumber;
+    /**
+     * 楼层号
+     */
+    private String floorNumber;
+    /**
+     * 备注
+     */
+    private String remark;
 
-
+    //---------------------寄件信息--------------------
+    /**
+     * 寄件人姓名
+     */
+    private String senderName;
+    /**
+     * 寄件人电话
+     */
+    private String senderPhone;
 }

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

@@ -0,0 +1,28 @@
+package com.parksong.services.applets;
+
+import com.parksong.beans.delivery.ResponsePage;
+import com.parksong.beans.delivery.StatisticsOutboundRate;
+import com.parksong.beans.express.ConsumeStatistics;
+import com.parksong.beans.express.ExpressDept;
+import com.parksong.filter.applets.AppletsFilter;
+
+import java.util.List;
+
+/**
+ * @author LiuJS
+ * @Time 2021/7/6 11:11
+ * @Desc
+ * @Version 1.0
+ */
+public interface AppletsService {
+
+    String userLogin(String account, String password) throws Exception;
+
+    ExpressDept userDetail(AppletsFilter filter);
+
+    ResponsePage expressInfo(AppletsFilter filter);
+
+    StatisticsOutboundRate expressStatistics(AppletsFilter filter);
+
+    List<ConsumeStatistics> consumeStatistics(AppletsFilter filter);
+}

+ 103 - 0
src/main/java/com/parksong/services/applets/impl/AppletsServiceImpl.java

@@ -0,0 +1,103 @@
+package com.parksong.services.applets.impl;
+
+import com.parksong.basics.exception.BusinessException;
+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.dao.applets.AppletsMapper;
+import com.parksong.filter.applets.AppletsFilter;
+import com.parksong.filter.delivery.DeliveryFilter;
+import com.parksong.services.applets.AppletsService;
+import com.parksong.services.delivery.DeliverysService;
+import com.parksong.util.JwtUtils;
+import com.parksong.util.enums.ExpressStatusEnum;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.DigestUtils;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author LiuJS
+ * @Time 2021/7/6 11:12
+ * @Desc
+ * @Version 1.0
+ */
+@Service
+public class AppletsServiceImpl implements AppletsService {
+
+    @Autowired
+    private AppletsMapper appletsMapper;
+
+    @Autowired
+    private DeliverysService deliverysService;
+
+    @Override
+    public String userLogin(String account, String password) throws Exception {
+        if (StringUtils.isBlank(account) || StringUtils.isBlank(password)){
+            throw new BusinessException("账号或者密码不能为空");
+        }
+        ExpressDept expressDept = appletsMapper.userLogin(account);
+        if (expressDept == null){
+            throw new BusinessException("账号不存在或者账号状态出现异常");
+        }else {
+            if (DigestUtils.md5DigestAsHex(("youbaimi" + password).getBytes()).equals(expressDept.getPassword())){
+                Map<String, String> claims = new HashMap<>(3);
+                claims.put("uid", expressDept.getId().toString());
+                claims.put("storeid", expressDept.getStoreId().toString());
+                claims.put("expid", expressDept.getExpId().toString());
+                claims.put("uname", expressDept.getOwnerName());
+                claims.put("uphone", expressDept.getOwnerPhone());
+                return JwtUtils.createToken(claims);
+            } else {
+                throw new BusinessException("密码错误");
+            }
+        }
+
+    }
+
+    @Override
+    public ExpressDept userDetail(AppletsFilter filter) {
+        return appletsMapper.userDetail(filter.getExpressDept().getId());
+    }
+
+    @Override
+    public ResponsePage expressInfo(AppletsFilter filter) {
+        ResponsePage responsePage = new ResponsePage();
+        // 查询前的filter数据处理
+        this.queryDeliveryFilterHandle(filter);
+        List<ExpressApplets> expressApplets = appletsMapper.expressInfo(filter);
+        expressApplets.stream().forEach(express -> express.setStatusName(ExpressStatusEnum.valueOf(express.getStatus()).getValue()));
+        responsePage.setExpressAppletsList(expressApplets);
+        responsePage.setTotal(appletsMapper.selectExpressInfoCount(filter));
+        return responsePage;
+    }
+
+    @Override
+    public StatisticsOutboundRate expressStatistics(AppletsFilter filter) {
+        DeliveryFilter deliveryFilter = new DeliveryFilter();
+        deliveryFilter.setStoreId(filter.getStoreId());
+        deliveryFilter.setBeginTime(filter.getStartTime());
+        deliveryFilter.setEndTime(filter.getEndTime());
+        deliveryFilter.setExpId(filter.getExpressDept().getExpId().intValue());
+        return deliverysService.outboundRate(deliveryFilter);
+    }
+
+    @Override
+    public List<ConsumeStatistics> consumeStatistics(AppletsFilter filter) {
+        filter.setExpressId(filter.getExpressDept().getExpId().intValue());
+        List<ConsumeStatistics> consumeStatisticsList = appletsMapper.consumeStatistics(filter);
+        consumeStatisticsList.stream().forEach(consumeStatistics -> consumeStatistics.setConsumeAmount(new BigDecimal(consumeStatistics.getNumber()).multiply(consumeStatistics.getPrice())));
+        return consumeStatisticsList;
+    }
+
+    private void queryDeliveryFilterHandle(AppletsFilter filter){
+        filter.sortInit();
+    }
+}

+ 14 - 0
src/main/java/com/parksong/services/delivery/DeliverysService.java

@@ -6,6 +6,8 @@ import com.parksong.beans.delivery.*;
 import com.parksong.beans.express.ExpressType;
 import com.parksong.filter.delivery.DeliveryFilter;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.text.ParseException;
 import java.util.List;
 import java.util.Map;
@@ -176,4 +178,16 @@ public interface DeliverysService {
     ExpressType getExpressByExpCode(ApiFilter<DeliveryFilter> filterApiFilter, String version);
 
     DeliveryInOutBoundDto queryInOutBound(ApiFilter<DeliveryFilter> filter);
+
+    StatisticsOutboundRate outboundRate(DeliveryFilter filter);
+
+    void export(HttpServletResponse response, DeliveryFilter filter) throws IOException;
+
+    List<PhoneLibDto> getConsigneeInfoByPhone(DeliveryFilter filter);
+
+    Delivery storageDeliveryNew(DeliveryFilter data, String appVersion, String version);
+
+    Delivery expressDetailInfo(DeliveryFilter filter);
+
+    boolean addSenderInfo(DeliveryFilter filter);
 }

+ 206 - 7
src/main/java/com/parksong/services/delivery/impl/DeliverysServiceImpl.java

@@ -1,6 +1,7 @@
 package com.parksong.services.delivery.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.parksong.basics.beans.BatchDataMsg;
 import com.parksong.basics.exception.AskException;
 import com.parksong.basics.exception.BusinessException;
@@ -28,11 +29,13 @@ import com.parksong.services.delivery.*;
 import com.parksong.services.express.ExpressConsumeService;
 import com.parksong.services.sms.SmsService;
 import com.parksong.services.store.*;
+import com.parksong.util.ExcelUtil;
 import com.parksong.util.RegexUtil;
 import com.parksong.util.bacth.BatchDataHandleUtil;
 import com.parksong.util.enums.DeliverySignReturnEnum;
+import com.parksong.util.enums.ExpressStatusEnum;
 import com.parksong.util.enums.SMSErrorCodeEnum;
-import com.parksong.util.txt.TxtUtils;
+import com.parksong.util.enums.SmsSendStatusEnum;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.util.Strings;
@@ -42,10 +45,15 @@ import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
+import org.springframework.util.CollectionUtils;
 
+import javax.servlet.http.HttpServletResponse;
+import java.text.NumberFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.Duration;
 import java.time.LocalDate;
+import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
@@ -245,6 +253,9 @@ public class DeliverysServiceImpl extends BasicsService implements DeliverysServ
                         delivery.getStatus().compareTo(DeliveryStatusConstants.ORDER_STATUS_COMPLETE) == 0) {
                     throw new BusinessException("订单已出库,请勿重复签收!");
                 }
+                if (!CollectionUtils.isEmpty(filter.getExpSignPhotos())){
+                    delivery.setSignPhotoUrl(StringUtils.join(filter.getExpSignPhotos(), ","));
+                }
                 delivery.setStoreId(storeId);
                 Delivery entity = new Delivery();
                 BeanUtils.copyProperties(delivery, entity);
@@ -462,9 +473,9 @@ public class DeliverysServiceImpl extends BasicsService implements DeliverysServ
         if (null == data.getDeliveryId() || null == data.getStoreId()) {
             throw new BusinessException("不合法的参数");
         }
-        if (!Strings.isBlank(data.getShelfCode()) && data.getShelfCode().length() > 9) {
+        /*if (!Strings.isBlank(data.getShelfCode()) && data.getShelfCode().length() > 9) {
             throw new BusinessException("取件码不能大于9位");
-        }
+        }*/
         if(Strings.isNotBlank(data.getUserPhone())){
             boolean userPhoneValid =  RegexUtil.isValidPhoneNumberCN(data.getUserPhone())
                     || Constants.DEFAULT_MOBILE_KB.equals(data.getUserPhone());
@@ -631,6 +642,181 @@ public class DeliverysServiceImpl extends BasicsService implements DeliverysServ
         return null;
     }
 
+    @Override
+    public StatisticsOutboundRate outboundRate(DeliveryFilter filter) {
+        // 创建一个数值格式化对象
+        NumberFormat numberFormat = NumberFormat.getInstance();
+        // 设置精确到小数点后2位
+        numberFormat.setMaximumFractionDigits(2);
+        List<StatisticsOutboundRate> queryData = getQueryData(filter.getStoreId(), filter.getBeginTime(), filter.getEndTime(), filter.getExpId(), numberFormat);
+        StatisticsOutboundRate totalData = getTotalData(queryData, numberFormat);
+        return totalData;
+    }
+
+    @Override
+    public void export(HttpServletResponse response, DeliveryFilter filter) {
+        List<StatisticsOutboundRate> queryData = getQueryData(filter.getStoreId(), filter.getBeginTime(), filter.getEndTime(), null, null);
+        ExcelUtil.exportExpressData(response, queryData);
+    }
+
+    @Override
+    public List<PhoneLibDto> getConsigneeInfoByPhone(DeliveryFilter filter) {
+        List<PhoneLibDto> phoneLibDtoList = deliverysDao.getConsigneeInfoByPhone(filter);
+        if (StringUtils.isNotBlank(filter.getConsigneePhoneEnd())){
+            phoneLibDtoList.stream().forEach(phoneLibDto -> phoneLibDto.setNamePhone(phoneLibDto.getConsingeeName() + "--" + phoneLibDto.getConsingeePhone()));
+        }
+        return phoneLibDtoList;
+    }
+
+    @Override
+    public Delivery storageDeliveryNew(DeliveryFilter filter, String appVersion, String apiVersion) {
+        Delivery delivery = new Delivery();
+        CacheTool cacheTool = new CacheTool("inDelivery:count");
+        Map<Integer, List<WhiteList>> map = whiteListService.getMapByStoreId(filter.getStoreId());
+        Store store = storeService.getStoreById(filter.getStoreId());
+        User user = filter.getUser();
+        log.info("入库门店:" + store.getShortName() + "------->入库用户:" + user.getUserName());
+        StorageDeliveryFilter storageDeliveryFilter = filter.getDeliverys().get(0);
+        //处理取件码
+        dealWithShelfCode(filter.getStoreId(), storageDeliveryFilter);
+        this.storageDelivery(filter, appVersion, apiVersion, storageDeliveryFilter, cacheTool, map, store, user);
+        delivery.setShelfCode(storageDeliveryFilter.getShelfCode());
+        return delivery;
+    }
+
+    @Override
+    public Delivery expressDetailInfo(DeliveryFilter filter) {
+        Delivery delivery = deliverysDao.expressDetailInfo(filter.getDeliveryId(), filter.getStoreId());
+        if (delivery.getStatus() == 126 || delivery.getStatus() == 246){
+            //相隔时间
+            Duration duration = Duration.between(delivery.getCreateTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(), delivery.getStatusTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
+            delivery.setWarehousingTime(duration.toDays());
+        }else {
+            delivery.setStatusTime(null);
+            delivery.setWarehousingTime(0L);
+        }
+        delivery.setStatusName(ExpressStatusEnum.valueOf(delivery.getStatus()).getValue());
+        delivery.setSmsStatusName(SmsSendStatusEnum.valueOf(delivery.getSmsStatus()).getValue());
+        if (StringUtils.isNotBlank(delivery.getSignPhotoUrl())){
+            delivery.setSignPhotoUrlList(Arrays.asList(delivery.getSignPhotoUrl().split(",")));
+        }
+
+        List<ExpressOperation> expressOperationList = deliverysDao.selectExpressOperationRecord(filter.getStoreId(), delivery.getExpcode());
+        for (ExpressOperation expressOperation : expressOperationList) {
+            String createTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(expressOperation.getCreateTime());
+            DeliveryFilter build = DeliveryFilter.builder()
+                    .storeId(expressOperation.getStoreId())
+                    .expCode(expressOperation.getExpcode())
+                    .build();
+            Delivery delivery1 = deliverysDao.queryDeliveryByIdOrExpCode(build);
+            if (expressOperation.getStatus() == 0) {
+                expressOperation.setTitle(ExpressStatusEnum.valueOf(expressOperation.getStatus()).getValue() + SmsSendStatusEnum.valueOf(delivery1.getSmsStatus()).getValue());
+                expressOperation.setOperationContent(createTime + " 操作人:" + delivery1.getDeliveryUname());
+            } else {
+                expressOperation.setTitle(ExpressStatusEnum.valueOf(expressOperation.getStatus()).getValue() + "成功");
+                if (expressOperation.getStatus() == 122){
+                    expressOperation.setOperationContent(createTime + " 操作人:" + delivery1.getDeliveryUname());
+                }else {
+                    expressOperation.setOperationContent(createTime + " 操作人:" + delivery1.getDeliveryUid());
+                }
+            }
+
+        }
+        delivery.setExpressOperationList(expressOperationList);
+        return delivery;
+    }
+
+    @Override
+    public boolean addSenderInfo(DeliveryFilter filter) {
+        if (StringUtils.isBlank(filter.getSenderPhone())){
+            throw new BusinessException("寄件人电话号码不能为空");
+        }
+        deliverysDao.addSenderInfo(filter);
+        return true;
+    }
+
+    private void dealWithShelfCode(Integer storeId, StorageDeliveryFilter storageDeliveryFilter) {
+        CacheTool shelfcodeCacheTool = CacheTool.initShelfcodeCacheTool();
+        String day = String.format("%02d", LocalDate.now().getDayOfMonth());
+        String redisKey = storeId + ":" + day + ":" + storageDeliveryFilter.getShelfId();
+        String number = String.format("%03d", shelfcodeCacheTool.incrBy(redisKey, 1).intValue());
+        StoreShelf storeShelf = storeShelfService.getById(storageDeliveryFilter.getShelfId());
+        //取件码  货架号 + 当天日期 + 三位自增长
+        storageDeliveryFilter.setShelfCode(storeShelf.getShelfName() + "-" + day + "-" + number);
+        //是否存在相同取货码+在库的快递
+        if (deliverysDao.selectDelivery(storeId, storageDeliveryFilter.getShelfCode()) > 0){
+            throw new BusinessException("库中存在相同取件码,请及时处理:" + storageDeliveryFilter.getShelfCode());
+        }
+
+    }
+
+    private StatisticsOutboundRate getTotalData(List<StatisticsOutboundRate> queryData, NumberFormat numberFormat) {
+        StatisticsOutboundRate totalData = StatisticsOutboundRate.builder()
+                .outboundNum(0)
+                .warehousing(0)
+                .waitOutboundNum(0)
+                .sendBackNum(0)
+                .outboundRate("0%")
+                .detailInfo(queryData)
+                .build();
+        if (org.apache.commons.collections.CollectionUtils.isNotEmpty(queryData)){
+            queryData.stream().forEach(data -> {
+                totalData.setWarehousing(totalData.getWarehousing() + data.getWarehousing());
+                totalData.setOutboundNum(totalData.getOutboundNum() + data.getOutboundNum());
+            });
+            totalData.setWaitOutboundNum(totalData.getWarehousing() - totalData.getOutboundNum());
+            if(totalData.getWarehousing() == 0){
+                totalData.setOutboundRate("0%");
+            }else {
+                totalData.setOutboundRate(numberFormat.format((float) totalData.getOutboundNum() / (float) totalData.getWarehousing() * 100) + "%");
+            }
+
+        }
+        return totalData;
+    }
+
+    private List<StatisticsOutboundRate> getQueryData(Integer storeId, String beginTime, String endTime, Integer expId, NumberFormat numberFormat) {
+        List<StatisticsOutboundRate> queryData = new ArrayList<>();
+        List<String> timeList = deliverysDao.historyTime(storeId, beginTime, endTime);
+        timeList.stream().forEach(time -> {
+            queryData.add(getTodayData(storeId, time, expId, numberFormat));
+        });
+        return queryData;
+    }
+
+    private StatisticsOutboundRate getTodayData(Integer storeId, String todayTime, Integer expId, NumberFormat numberFormat) {
+        StatisticsOutboundRate todayData = StatisticsOutboundRate.builder()
+                .time(todayTime)
+                .outboundNum(0)
+                .warehousing(0)
+                .waitOutboundNum(0)
+                .sendBackNum(0)
+                .outboundRate("0%")
+                .detailInfo(new ArrayList<>())
+                .build();
+        List<StatisticsOutboundRate> statisticsOutboundRates = deliverysDao.todayData(storeId, todayTime, expId);
+        if (org.apache.commons.collections.CollectionUtils.isNotEmpty(statisticsOutboundRates)){
+            statisticsOutboundRates.stream().forEach(statisticsOutboundRate -> {
+                statisticsOutboundRate.setWaitOutboundNum(statisticsOutboundRate.getWarehousing() - statisticsOutboundRate.getOutboundNum());
+                if (null !=numberFormat){
+                    statisticsOutboundRate.setOutboundRate(numberFormat.format((float) statisticsOutboundRate.getOutboundNum() / (float) statisticsOutboundRate.getWarehousing() * 100) + "%");
+                }
+                todayData.setWarehousing(todayData.getWarehousing() + statisticsOutboundRate.getWarehousing());
+                todayData.setOutboundNum(todayData.getOutboundNum() + statisticsOutboundRate.getOutboundNum());
+                todayData.getDetailInfo().add(statisticsOutboundRate);
+            });
+            todayData.setWaitOutboundNum(todayData.getWarehousing() - todayData.getOutboundNum());
+            if (null != numberFormat){
+                if(todayData.getWarehousing() == 0){
+                    todayData.setOutboundRate("0%");
+                }else {
+                    todayData.setOutboundRate(numberFormat.format((float) todayData.getOutboundNum() / (float) todayData.getWarehousing() * 100) + "%");
+                }
+            }
+        }
+        return todayData;
+    }
+
     /**
      * 单个订单入库
      * @param filter
@@ -651,7 +837,13 @@ public class DeliverysServiceImpl extends BasicsService implements DeliverysServ
             throw new BusinessException("面单号重复");
         }
         if(!expressConsumeService.checkExpressBalance(filter.getStoreId(), storageDeliveryFilter.getExpId())){
-            throw new BusinessException("快递余额不足,请联系管理员充值");
+            String express = CacheTool.initExpress().getString(storageDeliveryFilter.getExpId().toString());
+            if (StringUtils.isNotBlank(express)){
+                ExpressType expressCompany = JSONObject.parseObject(express, ExpressType.class);
+                throw new BusinessException(expressCompany.getExpName() + "快递余额不足,请联系管理员充值");
+            }else{
+                throw new BusinessException("快递余额不足,请联系管理员充值");
+            }
         }
         if (storageDeliveryFilter.getTelPhone() != null){
             //白名单用户
@@ -682,7 +874,7 @@ public class DeliverysServiceImpl extends BasicsService implements DeliverysServ
         try{
             delivery = insertDelivery(store, storageDeliveryFilter, whiteUser, odeliveryType, user.getUserId());
         }catch (Exception e){
-            throw new BusinessException("面单号重复");
+            throw new BusinessException("入库失败");
         }
 
         //下面代码执行顺序中,手机号同步和入库签收回传调用必须在最后面,防止事务回滚却发送了签收回传和手机号同步mq
@@ -696,7 +888,7 @@ public class DeliverysServiceImpl extends BasicsService implements DeliverysServ
                 //短信自动发送开关
                 this.smsAutomaticSend(user, delivery,whiteUser);
                 //手机号同步
-                this.phoneLibPush(store.getId(), storageDeliveryFilter.getTelPhone());
+                this.phoneLibPush(filter, store.getId(), storageDeliveryFilter.getTelPhone());
             }
             //添加订单流水记录
             deliveryRunningWaterService.addDeliveryInsert(appVersion, apiVersion, delivery, HttpUtil.getDeviceType(), user.getUserId(),HttpUtil.getHeader("imei"));
@@ -944,12 +1136,19 @@ public class DeliverysServiceImpl extends BasicsService implements DeliverysServ
     /**
      * 手机号同步
      *
+     * @param filter
      * @param storeId
      * @param phone
      */
-    private void phoneLibPush(Integer storeId, String phone) {
+    private void phoneLibPush(DeliveryFilter filter, Integer storeId, String phone) {
         PhoneLibDto phoneLibDto = PhoneLibDto.builder()
                 .storeId(storeId)
+                .consingeeName(filter.getConsingeeName())
+                .consingeePhone(phone.trim())
+                .address(filter.getAddress())
+                .buildingNumber(filter.getBuildingNumber())
+                .floorNumber(filter.getFloorNumber())
+                .remark(filter.getRemark())
                 .phones(phone.trim())
                 .build();
         phoneLibDto.setCreateTime(new Date());

+ 10 - 0
src/main/java/com/parksong/services/store/StoreService.java

@@ -2,6 +2,9 @@ package com.parksong.services.store;
 
 import com.parksong.beans.store.SignBackSwitchBean;
 import com.parksong.beans.store.Store;
+import com.parksong.filter.store.StoreFilter;
+
+import java.util.List;
 
 /**
  * @author kael
@@ -21,4 +24,11 @@ public interface StoreService {
      * @return
      */
     SignBackSwitchBean getSignBackSwitch(Integer expId, Integer storeId);
+
+    /**
+     * 获取门店下 用户电话号码
+     * @param storeId
+     * @return
+     */
+    List<String> getConsigneePhoneInfo(Integer storeId);
 }

+ 6 - 0
src/main/java/com/parksong/services/store/impl/StoreServiceImpl.java

@@ -10,6 +10,7 @@ import com.parksong.services.store.StoreService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -48,4 +49,9 @@ public class StoreServiceImpl extends BasicsService implements StoreService {
         filter.setStoreId(storeId);
         return storeDao.getSignBackSwitch(filter);
     }
+
+    @Override
+    public List<String> getConsigneePhoneInfo(Integer storeId) {
+        return storeDao.getConsigneePhoneInfo(storeId);
+    }
 }

+ 145 - 0
src/main/java/com/parksong/util/ExcelUtil.java

@@ -0,0 +1,145 @@
+package com.parksong.util;
+
+import com.parksong.beans.delivery.StatisticsOutboundRate;
+import org.apache.poi.hssf.usermodel.*;
+import org.apache.poi.ss.usermodel.VerticalAlignment;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.net.URLEncoder;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * @author LiuJS
+ * @Time 2021/6/17 10:24
+ * @Desc excel 工具类
+ * @Version 1.0
+ */
+public class ExcelUtil {
+
+    public static void exportExpressData(HttpServletResponse response, List<StatisticsOutboundRate> totalList) {
+        OutputStream ouputStream = null;
+        try {
+            String workbookName = "驿站每日快递出入库数据统计";
+            String fileName = URLEncoder.encode(workbookName, "UTF-8");
+            response.setContentType("application/vnd.ms-excel");
+            response.setCharacterEncoding("utf-8");
+            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");
+
+            String[] totalTitle = {"日期","入库数","出库数","待出库"};
+            String[] branchTitle = {"快递公司","入库数","出库数","待出库"};
+
+            Map<String, List<StatisticsOutboundRate>> branchListMap = new LinkedHashMap<>();
+            totalList.stream().forEach(statisticsOutboundRate -> branchListMap.put(statisticsOutboundRate.getTime(), statisticsOutboundRate.getDetailInfo()));
+
+            //创建excel表
+            HSSFWorkbook wb = new HSSFWorkbook();
+            //写入汇总数据
+            writeDate(wb, "汇总", totalTitle, true, totalList);
+            //写入详细数据
+            for (Map.Entry<String, List<StatisticsOutboundRate>> branch :branchListMap.entrySet()) {
+                writeDate(wb, branch.getKey(), branchTitle, false, branch.getValue());
+            }
+            ouputStream = response.getOutputStream();
+            wb.write(ouputStream);
+            ouputStream.flush();
+            ouputStream.close();
+        }catch (Exception e) {
+            Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, e);
+            e.printStackTrace();
+            try {
+                ouputStream.close();
+            } catch (IOException e1) {
+                e1.printStackTrace();
+            }
+        }
+    }
+
+    private static void writeDate(HSSFWorkbook wb, String sheetName, String[] title, boolean result, List<StatisticsOutboundRate> list) {
+        //表头样式(加粗,水平居中,垂直居中)
+        HSSFCellStyle cellStyle = wb.createCellStyle();
+        //垂直居中
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        HSSFFont fontStyle = wb.createFont();
+        fontStyle.setBold(true);
+        cellStyle.setFont(fontStyle);
+        //标题样式(加粗,垂直居中)
+        HSSFCellStyle cellStyle2 = wb.createCellStyle();
+        //垂直居中
+        cellStyle2.setVerticalAlignment(VerticalAlignment.CENTER);
+        cellStyle2.setFont(fontStyle);
+        //字段样式(垂直居中)
+        HSSFCellStyle cellStyle3 = wb.createCellStyle();
+        cellStyle3.setVerticalAlignment(VerticalAlignment.CENTER);
+
+        HSSFCell hc;
+        HSSFSheet sheet = wb.createSheet(sheetName);
+        //设置默认行宽
+        sheet.setDefaultColumnWidth(20);
+        //创建标题
+        HSSFRow rowTitle = sheet.createRow(0);
+        rowTitle.setHeightInPoints(20);
+        for (int i = 0; i < title.length; i++) {
+            hc = rowTitle.createCell(i);
+            hc.setCellValue(title[i]);
+            hc.setCellStyle(cellStyle2);
+        }
+
+        try {
+            //创建表格数据
+            int i = 1;
+            StatisticsOutboundRate total = StatisticsOutboundRate.builder()
+                    .warehousing(0)
+                    .outboundNum(0)
+                    .waitOutboundNum(0)
+                    .build();
+            for (StatisticsOutboundRate statisticsOutboundRate : list) {
+                HSSFRow rowBody = sheet.createRow(i);
+                rowBody.setHeightInPoints(20);
+                hc = rowBody.createCell(0);
+                if (result){
+                    hc.setCellValue(statisticsOutboundRate.getTime());
+                    total.setWarehousing(total.getWarehousing() + statisticsOutboundRate.getWarehousing());
+                    total.setOutboundNum(total.getOutboundNum() + statisticsOutboundRate.getOutboundNum());
+                }else {
+                    hc.setCellValue(statisticsOutboundRate.getExpName());
+                }
+
+                hc = rowBody.createCell(1);
+                hc.setCellValue(statisticsOutboundRate.getWarehousing());
+                hc = rowBody.createCell(2);
+                hc.setCellValue(statisticsOutboundRate.getOutboundNum());
+                hc = rowBody.createCell(3);
+                hc.setCellValue(statisticsOutboundRate.getWaitOutboundNum());
+                i++;
+            }
+            if (result){
+                HSSFRow rt = sheet.createRow(i);
+                rt.setHeightInPoints(20);
+                hc = rt.createCell(0);
+                hc.setCellValue("合计");
+                hc.setCellStyle(cellStyle2);
+                hc = rt.createCell(1);
+                hc.setCellValue(total.getWarehousing());
+                hc.setCellStyle(cellStyle2);
+                hc = rt.createCell(2);
+                hc.setCellValue(total.getOutboundNum());
+                hc.setCellStyle(cellStyle2);
+            }
+
+        } catch (Exception e) {
+            Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, e);
+        } finally {
+            try {
+                wb.close();
+            } catch (IOException e) {
+                Logger.getLogger(ExcelUtil.class.getName()).log(Level.SEVERE, null, e);
+            }
+        }
+    }
+}

+ 69 - 0
src/main/java/com/parksong/util/JwtUtils.java

@@ -0,0 +1,69 @@
+package com.parksong.util;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTCreator;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.interfaces.Claim;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import com.parksong.basics.exception.BusinessException;
+import com.parksong.basics.exception.NotLoginException;
+import org.apache.catalina.authenticator.NonLoginAuthenticator;
+import org.apache.commons.lang3.time.DateUtils;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author LiuJS
+ * @Time 2021/7/6 16:31
+ * @Desc
+ * @Version 1.0
+ */
+public class JwtUtils {
+
+    private static final String SECRET = "youbaidi-2021";
+    private static final String ISSUER = "ybm";
+
+    /**
+     * 生成token
+     * @param claims
+     * @return
+     * @throws Exception
+     */
+    public static String createToken(Map<String, String> claims) throws Exception {
+        try {
+            Algorithm algorithm = Algorithm.HMAC256(SECRET);
+            JWTCreator.Builder builder = JWT.create()
+                    .withIssuer(ISSUER)
+                    //设置过期时间为2小时
+                    .withExpiresAt(DateUtils.addHours(new Date(), 2));
+            claims.forEach(builder::withClaim);
+            return builder.sign(algorithm);
+        }catch (IllegalArgumentException  e) {
+            throw new Exception("生成token失败");
+        }
+    }
+
+    /**
+     * 校验token,并返回数据
+     * @param token
+     * @return
+     */
+    public static Map<String, String> verifyToken(String token) throws Exception {
+        Algorithm algorithm;
+        Map<String, Claim> map;
+        try {
+            algorithm = Algorithm.HMAC256(SECRET);
+            JWTVerifier verifier = JWT.require(algorithm).withIssuer(ISSUER).build();
+            DecodedJWT jwt = verifier.verify(token);
+            map = jwt.getClaims();
+        } catch (Exception e) {
+            throw new NotLoginException("Token鉴权失败,请重新登录");
+        }
+        Map<String, String> resultMap = new HashMap<>(map.size());
+        map.forEach((k, v) -> resultMap.put(k, v.asString()));
+        return resultMap;
+    }
+}

+ 0 - 2
src/main/java/com/parksong/util/enums/AppEnum.java

@@ -1,7 +1,5 @@
 package com.parksong.util.enums;
 
-import lombok.Data;
-
 /**
  * @author LiuJS
  * @Time 2021/5/27 14:01

+ 55 - 0
src/main/java/com/parksong/util/enums/ExpressStatusEnum.java

@@ -0,0 +1,55 @@
+package com.parksong.util.enums;
+
+/**
+ * @author LiuJS
+ * @Time 2021/6/25 10:13
+ * @Desc
+ * @Version 1.0
+ */
+public enum ExpressStatusEnum {
+
+    ORDER_STATUS_SMS(0, "通知"),
+    ORDER_STATUS_AFLOAT(120, "未到货"),
+    ORDER_STATUS_WAIT_IN_STORE(245, "待入库"),
+    ORDER_STATUS_STORED(122, "入库"),
+    ORDER_STATUS_DISPATCHING(124, "派送中"),
+    ORDER_STATUS_MAIKE_DISPATCHING(125, "麦客配送中"),
+    ORDER_STATUS_COMPLETE(126, "出库"),
+    ORDER_STATUS_LEAVE_STORE(246, "退件"),
+    ORDER_STATUS_REJECT_LEAVE_STORE(130, "拒收离库"),
+    ORDER_STATUS_REJECT_PICK_UP(128, "拒收在库"),
+    ORDER_STATUS_REJECT_RETENTION(225, "滞留");
+
+    private Integer key;
+    private String value;
+
+    public Integer getKey() {
+        return key;
+    }
+
+    public void setKey(Integer key) {
+        this.key = key;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    ExpressStatusEnum(Integer key, String value) {
+        this.key = key;
+        this.value = value;
+    }
+
+    public static ExpressStatusEnum valueOf(int code) {
+        for (ExpressStatusEnum statusCode : ExpressStatusEnum.values()) {
+            if (statusCode.getKey() == code) {
+                return statusCode;
+            }
+        }
+        return null;
+    }
+}

+ 53 - 0
src/main/java/com/parksong/util/enums/OssEnum.java

@@ -0,0 +1,53 @@
+package com.parksong.util.enums;
+
+/**
+ * @author LiuJS
+ * @Time 2021/6/9 17:18
+ * @Desc
+ * @Version 1.0
+ */
+public enum OssEnum {
+    ACCESS_KEY_ID("accessKeyId", "LTAI5tKQYeCYrPRtU5j3DJtC"),
+    ACCESS_KEY_SECRET("accessKeySecret", "Nqne4EXo18DexADel4DC6BtrNfec1R"),
+    ROLE_ARN("roleArn", "acs:ram::1563149204495493:role/aliyunosstokengeneratorrole"),
+    POLICY("policy", "{\n" +
+                    "    \"Version\": \"1\", \n" +
+                    "    \"Statement\": [\n" +
+                    "        {\n" +
+                    "            \"Action\": [\n" +
+                    "                \"oss:PutObject\",\n" +
+                    "                \"oss:ListParts\",\n" +
+                    "                \"oss:AbortMultipartUpload\"\n" +
+                    "            ], \n" +
+                    "            \"Resource\": [\n" +
+                    "                \"acs:oss:*:*:cri-taktmbqaxzeakg24-registry/*\" \n" +
+                    "            ], \n" +
+                    "            \"Effect\": \"Allow\"\n" +
+                    "        }\n" +
+                    "    ]\n" +
+                    "}");
+
+    private String key;
+    private String value;
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    OssEnum(String key, String value) {
+        this.key = key;
+        this.value = value;
+    }
+}

+ 48 - 0
src/main/java/com/parksong/util/enums/SmsSendStatusEnum.java

@@ -0,0 +1,48 @@
+package com.parksong.util.enums;
+
+/**
+ * @author LiuJS
+ * @Time 2021/6/25 10:23
+ * @Desc
+ * @Version 1.0
+ */
+public enum SmsSendStatusEnum {
+
+    SMS_STATUS_NOSEND(-1, "未发送"),
+    SMS_STATUS_SENDING(0, "已发送"),
+    SMS_STATUS_SUCCESS(1, "成功"),
+    SMS_STATUS_FAIL(2, "失败");
+
+    private Integer key;
+    private String value;
+
+    public Integer getKey() {
+        return key;
+    }
+
+    public void setKey(Integer key) {
+        this.key = key;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    SmsSendStatusEnum(Integer key, String value) {
+        this.key = key;
+        this.value = value;
+    }
+
+    public static SmsSendStatusEnum valueOf(int code) {
+        for (SmsSendStatusEnum sendStatus : SmsSendStatusEnum.values()) {
+            if (sendStatus.getKey() == code) {
+                return sendStatus;
+            }
+        }
+        return null;
+    }
+}

+ 1 - 2
src/main/resources/application-dev.yml

@@ -2,6 +2,7 @@ server:
   port: 8081
 spring:
   datasource:
+    # 外网
     url: jdbc:mysql://rm-uf632y0g7ed0y3i9xyo.mysql.rds.aliyuncs.com:3306/fhm_xiaomai_jisu?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
     username: youbaidi2021
     password: baisong@2021
@@ -66,8 +67,6 @@ spring:
     port: 5672
     username: LTAI5tMh7AirYwG4Gz1rqZ6V
     password: 3QJBePoQrd9RlgCyfBbOKc1CzfROmT
-    #username: MjphbXFwLWNuLW42dzI0aDUyMDAxeTpMVEFJNXRNaDdBaXJZd0c0R3oxcnFaNlY=
-    #password: OEZCMjlDMUQwNjY3ODVFMzUyNjk3RkJBRTc2QTdEMkQzOEJGNTI3QzoxNjE4MTk1NjU2MzM5
     virtual-host: youbaidi_dev
     publisher-confirms: true
     publisher-returns: true

+ 0 - 2
src/main/resources/application-pro.yml

@@ -66,8 +66,6 @@ spring:
     port: 5672
     username: LTAI5tMh7AirYwG4Gz1rqZ6V
     password: 3QJBePoQrd9RlgCyfBbOKc1CzfROmT
-    #username: MjphbXFwLWNuLW42dzI0aDUyMDAxeTpMVEFJNXRNaDdBaXJZd0c0R3oxcnFaNlY=
-    #password: OEZCMjlDMUQwNjY3ODVFMzUyNjk3RkJBRTc2QTdEMkQzOEJGNTI3QzoxNjE4MTk1NjU2MzM5
     virtual-host: youbaidi_pro
     publisher-confirms: true
     publisher-returns: true

+ 96 - 0
src/main/resources/com/parksong/mapper/applets/AppletsMapper.xml

@@ -0,0 +1,96 @@
+<?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="com.parksong.dao.applets.AppletsMapper" >
+
+    <select id="userLogin" resultType="com.parksong.beans.express.ExpressDept">
+        SELECT
+            a.id,  b.storeId, a.account, a.password, a.expId, a.expressName, 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.ownerPhone = #{account} AND a.valid = 1
+    </select>
+
+    <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
+        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="expressInfo" resultType="com.parksong.beans.express.ExpressApplets">
+        select
+            a.id, a.expcode expressCode, a.expId expressId, b.name expressName, a.shelfCode,
+            a.userPhone, a.status, a.createTime from fhm_xiaomai_jisu.delivery_${filter.storeId} a
+        left join fhm_jeesite.ex_express_type b on a.expId = b.id
+        <where>
+            <if test="filter.expressDept.expId != null and filter.expressDept.expId != 0">
+                and a.expId = #{filter.expressDept.expId}
+            </if>
+            <if test="filter.consigneePhone != null and filter.consigneePhone != ''">
+                and a.userPhone LIKE '%${filter.consigneePhone}%'
+            </if>
+            <if test="filter.expressCode != null and filter.expressCode != ''">
+                and a.expcode LIKE '%${filter.expressCode}%'
+            </if>
+            <if test="filter.expressStatus != null and filter.expressStatus != 0">
+                and a.status = #{filter.expressStatus}
+            </if>
+            <if test="filter.startTime != null and filter.startTime != ''">
+                and a.createTime &gt; #{filter.startTime}
+            </if>
+            <if test="filter.endTime != null and filter.endTime != ''">
+                and a.createTime &lt; #{filter.endTime}
+            </if>
+        </where>
+        <if test="filter.sort != null">
+            order by ${filter.sort} ${filter.sortType}
+        </if>
+        <if test="filter.pageSize > 0">
+            limit #{filter.count},#{filter.pageSize}
+        </if>
+    </select>
+
+    <select id="selectExpressInfoCount" resultType="java.lang.Long">
+        select count(id) from fhm_xiaomai_jisu.delivery_${filter.storeId}
+        <where>
+            <if test="filter.expressDept.expId != null and filter.expressDept.expId != 0">
+                and expId = #{filter.expressDept.expId}
+            </if>
+            <if test="filter.consigneePhone != null and filter.consigneePhone != ''">
+                and userPhone LIKE '%${filter.consigneePhone}%'
+            </if>
+            <if test="filter.expressCode != null and filter.expressCode != ''">
+                and expcode LIKE '%${filter.expressCode}%'
+            </if>
+            <if test="filter.expressStatus != null and filter.expressStatus != 0">
+                and status = #{filter.expressStatus}
+            </if>
+            <if test="filter.startTime != null and filter.startTime != ''">
+                and createTime &gt;= #{filter.startTime}
+            </if>
+            <if test="filter.endTime != null and filter.endTime != ''">
+                and createTime &lt; #{filter.endTime}
+            </if>
+        </where>
+    </select>
+
+    <select id="consumeStatistics" resultType="com.parksong.beans.express.ConsumeStatistics">
+        SELECT
+            DATE_FORMAT(a.createTime,'%Y-%m-%d') time, COUNT(a.expcode) number, b.packagePrice price
+        FROM fhm_xiaomai_jisu.delivery_${filter.storeId} a
+        LEFT JOIN fhm_jeesite.t_express_dept_account b ON #{filter.expressDept.id} = b.expressDeptId
+        <where>
+            <if test="filter.expressDept.expId != null and filter.expressDept.expId != ''">
+                and a.expId = #{filter.expressDept.expId}
+            </if>
+            <if test="filter.startTime != null and filter.startTime != ''">
+                and a.createTime &gt;= #{filter.startTime}
+            </if>
+            <if test="filter.endTime != null and filter.endTime != ''">
+                and a.createTime &lt; #{filter.endTime}
+            </if>
+        </where>
+        GROUP BY time ORDER BY time
+    </select>
+</mapper>

+ 153 - 5
src/main/resources/com/parksong/mapper/deliverys/DeliveryMapper.xml

@@ -66,13 +66,13 @@
             parameterType="com.parksong.filter.delivery.DeliveryFilter">
         select
         <include refid="Base_Column_List"/>
-        from delivery_${storeId} d
+        from delivery_${filter.storeId} d
         where 1=1
-        <if test="deliveryId != null">
-            and d.id = #{deliveryId}
+        <if test="filter.deliveryId != null">
+            and d.id = #{filter.deliveryId}
         </if>
-        <if test="expCode != null and expCode != ''">
-            and d.expCode = #{expCode}
+        <if test="filter.expCode != null and filter.expCode != ''">
+            and d.expCode = #{filter.expCode}
         </if>
     </select>
 
@@ -574,6 +574,9 @@
             <if test="signWay != null">
                 signWay = #{signWay},
             </if>
+            <if test="signPhotoUrl != null">
+                signPhotoUrl = #{signPhotoUrl},
+            </if>
         </set>
         where 1=1
         <if test="id != null">
@@ -736,6 +739,9 @@
             <if test="returnSignStatus != null">
                 returnSignStatus,
             </if>
+            <if test="signPhotoUrl != null">
+                signPhotoUrl,
+            </if>
 
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
@@ -845,6 +851,9 @@
             <if test="returnSignStatus != null">
                 #{returnSignStatus},
             </if>
+            <if test="signPhotoUrl != null">
+                #{signPhotoUrl},
+            </if>
         </trim>
     </insert>
 
@@ -888,6 +897,46 @@
 
     </insert>
 
+    <insert id="addSenderInfo">
+        insert into fhm_xiaomai_jisu.sender_info
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="filter.storeId != null">
+                store_id,
+            </if>
+            <if test="filter.expId != null">
+                express_id,
+            </if>
+            <if test="filter.expCode != null and filter.expCode != ''">
+                express_code,
+            </if>
+            <if test="filter.senderName != null and filter.senderName != ''">
+                sender_name,
+            </if>
+            <if test="filter.senderPhone != null and filter.senderPhone != ''">
+                sender_phone,
+            </if>
+                create_time,
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="filter.storeId != null">
+                #{filter.storeId},
+            </if>
+            <if test="filter.expId != null">
+                #{filter.expId},
+            </if>
+            <if test="filter.expCode != null and filter.expCode != ''">
+                #{filter.expCode},
+            </if>
+            <if test="filter.senderName != null and filter.senderName != ''">
+                #{filter.senderName},
+            </if>
+            <if test="filter.senderPhone != null and filter.senderPhone != ''">
+                #{filter.senderPhone},
+            </if>
+                NOW(),
+        </trim>
+    </insert>
+
     <update id="pushTodayToYesterday" parameterType="com.parksong.beans.delivery.BaseStatToday">
 		update fhm_gaia.base_stat_today
 		set createTimeNum = createTimeNum + 1, statusTimeNum = statusTimeNum + 1, source = 1
@@ -1012,6 +1061,9 @@
             <if test="returnSignStatus != null">
                 returnSignStatus = #{returnSignStatus},
             </if>
+            <if test="signPhotoUrl != null and signPhotoUrl != ''">
+                signPhotoUrl = #{signPhotoUrl},
+            </if>
         </set>
         <include refid="Base_Where_List" />
     </update>
@@ -1206,4 +1258,100 @@
         order by create_time desc
     </select>
 
+    <select id="todayData" resultType="com.parksong.beans.delivery.StatisticsOutboundRate">
+        SELECT
+	        a.time, a.expId, c.`name` expName, c.expImage expLogo, IFNULL( a.warehousing, 0 ) warehousing, IFNULL( b.outboundNum, 0 ) outboundNum
+        FROM
+            (
+                SELECT
+                    IFNULL( DATE( createTime ), 0 ) time, expId, COUNT( expcode ) AS warehousing
+                FROM
+                    delivery_${storeId}
+                WHERE
+                    DATE( createTime ) = #{todayTime}
+                GROUP BY time, expId
+            ) a
+	        LEFT JOIN (
+                SELECT
+                    DATE( createTime ) time, COUNT( expcode ) AS outboundNum
+                FROM
+                    delivery_${storeId}
+                WHERE
+                    DATE( createTime ) = #{todayTime} AND DATE( createTime ) = DATE( statusTime ) AND `status` IN ( 126, 246 )
+                GROUP BY time, expId
+            ) b ON a.time = b.time
+	        LEFT JOIN fhm_jeesite.ex_express_type c ON a.expId = c.id
+	        <where>
+                <if test="expId != null and expId != 0">
+                    a.expId = #{expId}
+                </if>
+            </where>
+        GROUP BY a.time, a.expId
+    </select>
+
+    <select id="historyTime" resultType="java.lang.String">
+        SELECT DISTINCT(DATE(createTime)) FROM delivery_${storeId} WHERE createTime BETWEEN #{beginTime} AND #{endTime}
+    </select>
+
+    <select id="getExportData" resultType="com.parksong.beans.delivery.StatisticsOutboundRate">
+         SELECT
+	        IFNULL( a.warehousing, 0 ) warehousing, IFNULL( b.outboundNum, 0 ) outboundNum
+         FROM
+            (
+                SELECT
+                    IFNULL( DATE( createTime ), 0 ) time, expId, COUNT( expcode ) AS warehousing
+                FROM
+                    delivery_${storeId}
+                WHERE
+                    DATE( createTime ) = #{time}
+                GROUP BY time
+            ) a
+	        LEFT JOIN (
+                SELECT
+                    DATE( createTime ) time, COUNT( expcode ) AS outboundNum
+                FROM
+                    delivery_${storeId}
+                WHERE
+                    DATE( createTime ) = #{time} AND DATE( createTime ) = DATE( statusTime ) AND `status` IN ( 126, 246 )
+                GROUP BY time
+            ) b ON a.time = b.time
+        GROUP BY a.time
+    </select>
+
+    <select id="getConsigneeInfoByPhone" resultType="com.parksong.beans.delivery.PhoneLibDto">
+        select
+            a.store_id storeId, a.area_id areaId, b.area_name areaName, a.consignee_name consingeeName, a.consignee_phone consingeePhone, a.building_number buildingNumber, a.floor_number floorNumber, a.address address
+        from fhm_xiaomai_jisu.consignee_info a, fhm_xiaomai_jisu.area_info b
+        <where>
+            a.is_used = 1
+            <if test="filter.consigneePhoneEnd != null and filter.consigneePhoneEnd != ''">
+                AND a.phone = #{filter.consigneePhoneEnd}
+            </if>
+            <if test="filter.consigneePhone != null and filter.consigneePhone!=''">
+                AND a.consignee_phone = #{filter.consigneePhone}
+            </if>
+            <if test="filter.storeId != null">
+                AND a.store_id = #{filter.storeId}
+            </if>
+        </where>
+    </select>
+
+    <select id="expressDetailInfo" resultType="com.parksong.beans.delivery.Delivery">
+        select a.id , b.name expName, b.expImage expLogo, a.expcode, a.status, d.consignee_name consigneeName, a.userPhone, a.shelfCode, a.deliveryUname, a.deliveryUid, a.createTime, a.statusTime,
+         a.signPhotoUrl, d.address expAddress, c.content smsContent, a.smsStatus, a.resultInfo, c.sendSuccessType sendSuccessType, c.createTime smsTime
+        from fhm_xiaomai_jisu.delivery_${storeId} a
+        left join fhm_jeesite.ex_express_type b on b.id = a.expId
+        left join fhm_xiaomai_jisu.sms_record c on c.storeId = a.storeId and deliveryid = a.id
+        left join fhm_xiaomai_jisu.consignee_info d on a.userPhone = d.consignee_phone
+        where a.id = #{deliveryId}
+    </select>
+
+    <select id="selectDelivery" resultType="java.lang.Integer">
+        select count(id) from fhm_xiaomai_jisu.delivery_${storeId} where status = 122 and shelfCode = #{shelfCode}
+    </select>
+
+    <select id="selectExpressOperationRecord" resultType="com.parksong.beans.delivery.ExpressOperation">
+        select store_id storeId, expcode, `status`, create_time createTime from fhm_xiaomai_jisu.express_operation_record where store_id = #{storeId} and expcode = #{expcode} GROUP BY `status` order by create_time
+    </select>
+
 </mapper>

+ 4 - 0
src/main/resources/com/parksong/mapper/store/StoreMapper.xml

@@ -84,4 +84,8 @@
     where a.storeId = #{storeId} and a.expId = #{expId}
   </select>
 
+  <select id="getConsigneePhoneInfo" resultType="java.lang.String">
+    select DISTINCT phones from fhm_xiaomai_jisu.lib_phone where storeId = #{storeId}
+  </select>
+
 </mapper>