rk
8 小时以前 cf17c2f7012fc4351f66c71d66a4aa3a9fe9e34a
代码生成
已添加21个文件
已删除3个文件
已修改29个文件
1968 ■■■■ 文件已修改
server/admin/src/main/java/com/doumee/api/business/AppVersionController.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/DriverInfoController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/ShopInfoController.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/db/db_change.sql 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/xyy/HashSignUtil.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/xyy/XyyConfig.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/xyy/dto/AddPrinterRequest.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/xyy/dto/AddPrinterRequestItem.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/xyy/dto/DelPrinterRequest.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/xyy/dto/OrderStatusType.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/xyy/dto/PrintRequest.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/xyy/dto/PrinterRequest.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/xyy/dto/PrinterStatusType.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/xyy/dto/PrintersRequest.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/xyy/dto/QueryOrderStateRequest.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/xyy/dto/QueryOrderStatisRequest.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/xyy/dto/RestRequest.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/xyy/dto/SetVoiceTypeRequest.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/xyy/dto/UpdPrinterRequest.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/xyy/dto/VoiceRequest.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/xyy/vo/ObjectRestResponse.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/xyy/vo/OrderStatisResult.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/xyy/vo/PrinterResult.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/constants/Constants.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/xpyun/XpyunPrintService.java 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/xpyun/XpyunResponse.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/AppVersion.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/DriverVerifyRequest.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/PrinterBindDTO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/dto/ShopPrinterDTO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/DriverCenterVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/OrderDetailVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/ShopWebDetailVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/AppVersionService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/AreasService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/DriverInfoService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/OrdersService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/ShopInfoService.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/AppVersionServiceImpl.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java 95 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/OrdersRefundServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java 151 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/PrintService.java 297 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/PrinterInfoServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/application-dev.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/application-pro.yml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/ConfigApi.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/DriverInfoApi.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/ShopInfoApi.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/AppVersionController.java
@@ -14,11 +14,14 @@
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.io.PrintWriter;
import java.util.*;
/**
 * APP版本管理
@@ -100,4 +103,44 @@
        return ApiResponse.success(appVersionService.findById(id));
    }
    @ApiOperation("上传APP文件")
    @PostMapping(value = "/uploadFile", headers = "content-type=multipart/form-data")
    public void uploadFile(HttpServletRequest request, HttpServletResponse response) throws Exception {
        Map<String, Object> context = new HashMap<>();
        try {
            CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
            if (multipartResolver.isMultipart(request)) {
                MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
                Iterator<String> it = multipartRequest.getFileNames();
                while (it.hasNext()) {
                    MultipartFile file = multipartRequest.getFile(it.next());
                    if (file != null && !file.isEmpty()) {
                        Map<String, Object> data = appVersionService.uploadFile(file);
                        context.put("success", true);
                        context.put("code", 200);
                        context.put("errno", 0);
                        context.put("data", data);
                        context.put("message", "请求成功");
                        response.setCharacterEncoding("UTF-8");
                        response.setContentType("application/json");
                        PrintWriter out = response.getWriter();
                        out.print(com.alibaba.fastjson.JSONObject.toJSONString(context));
                        out.flush();
                        out.close();
                        return;
                    }
                }
            }
        } catch (Exception e) {
            context.put("code", 0);
            context.put("message", "上传失败");
        }
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json");
        PrintWriter out = response.getWriter();
        out.print(com.alibaba.fastjson.JSONObject.toJSONString(context));
        out.flush();
        out.close();
    }
}
server/admin/src/main/java/com/doumee/api/business/DriverInfoController.java
@@ -9,6 +9,7 @@
import com.doumee.dao.business.model.DriverInfo;
import com.doumee.dao.dto.AuditDTO;
import com.doumee.dao.dto.ChangeStatusDTO;
import com.doumee.dao.dto.DriverVerifyRequest;
import com.doumee.service.business.DriverInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -99,6 +100,13 @@
        return ApiResponse.success(driverInfoService.getDetail(id));
    }
    @ApiOperation("修改司机注册信息")
    @PostMapping("/updateDriverInfo")
    @RequiresPermissions("business:driverInfo:update")
    public ApiResponse updateDriverInfo(@RequestBody DriverVerifyRequest request) {
        return ApiResponse.success(driverInfoService.updateDriverInfo(request));
    }
    @ApiOperation("审批司机实名认证")
    @PostMapping("/audit")
    @RequiresPermissions("business:driverInfo:update")
server/admin/src/main/java/com/doumee/api/business/ShopInfoController.java
@@ -9,8 +9,8 @@
import com.doumee.dao.business.model.ShopInfo;
import com.doumee.dao.dto.AuditDTO;
import com.doumee.dao.dto.ChangeStatusDTO;
import com.doumee.dao.dto.PrinterBindDTO;
import com.doumee.dao.dto.ResetPasswordDTO;
import com.doumee.dao.dto.ShopPrinterDTO;
import com.doumee.dao.dto.ShopUpdateDTO;
import com.doumee.dao.vo.ShopDetailVO;
import com.doumee.service.business.ShopInfoService;
@@ -136,27 +136,12 @@
        return ApiResponse.success("修改成功");
    }
    @ApiOperation("绑定打印机")
    @PostMapping("/bindPrinter")
    @ApiOperation("维护门店打印机SN")
    @PostMapping("/maintainPrinter")
    @RequiresPermissions("business:shopInfo:update")
    public ApiResponse bindPrinter(@RequestBody @javax.validation.Valid PrinterBindDTO dto) {
        shopInfoService.bindPrinter(dto);
        return ApiResponse.success("绑定成功");
    }
    @ApiOperation("解绑打印机")
    @PostMapping("/unbindPrinter/{shopId}")
    @RequiresPermissions("business:shopInfo:update")
    public ApiResponse unbindPrinter(@PathVariable Integer shopId) {
        shopInfoService.unbindPrinter(shopId);
        return ApiResponse.success("解绑成功");
    }
    @ApiOperation("查询打印机状态")
    @GetMapping("/printerStatus/{shopId}")
    @RequiresPermissions("business:shopInfo:query")
    public ApiResponse queryPrinterStatus(@PathVariable Integer shopId) {
        return ApiResponse.success(shopInfoService.queryPrinterStatus(shopId));
    public ApiResponse maintainPrinter(@RequestBody ShopPrinterDTO dto) {
        shopInfoService.maintainPrinterSn(dto);
        return ApiResponse.success("操作成功");
    }
}
server/services/db/db_change.sql
@@ -5,9 +5,10 @@
-- ============================================================
-- 2026/04/28 APP版本文件路径字典
-- 2026/04/30 APP版本文件上传字典配置
-- ============================================================
INSERT INTO `system_dict_data` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) VALUES ((SELECT `id` FROM `system_dict` WHERE `code` = 'OSS'), '', 'APP_FILES', 'APP版本文件路径', 0, 0, 1, NOW(), 0);
INSERT INTO `system_dict_data` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) VALUES ((SELECT `id` FROM `system_dict` WHERE `code` = 'OSS'), '', 'APP_FILES', 'APP版本文件存储路径', 0, 0, 1, NOW(), 0);
INSERT INTO `system_dict_data` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) VALUES ((SELECT `id` FROM `system_dict` WHERE `code` = 'OSS'), '', 'APP_FILES_URL', 'APP版本文件访问路径前缀', 0, 0, 1, NOW(), 0);
-- ============================================================
@@ -20,15 +21,14 @@
INSERT INTO `SYSTEM_PERMISSION`(`CODE`, `NAME`, `MODULE`, `REMARK`, `FIXED`, `CREATE_USER`, `CREATE_TIME`, `UPDATE_USER`, `UPDATE_TIME`, `DELETED`) VALUES ('business:printerInfo:query', '查询打印机', '打印机信息', '', 0, 1, CURRENT_TIMESTAMP, NULL, NULL, 0);
-- ============================================================
-- 2026/04/28 èŠ¯çƒ¨äº‘æ‰“å°æœºé›†æˆï¼šé—¨åº—è¡¨å¢žåŠ æ‰“å°æœºSN字段
-- 2026/04/29 å¸æœºè¡¨å¢žåŠ æžå…‰æŽ¨é€åˆ«åå­—æ®µ
-- ============================================================
ALTER TABLE `shop_info` ADD COLUMN `PRINTER_SN` VARCHAR(64) DEFAULT NULL COMMENT '芯烨云打印机SN编号' AFTER `BUSINESS_TYPE`;
ALTER TABLE `driver_info` ADD COLUMN `JPUSH_ALIAS` VARCHAR(64) DEFAULT NULL COMMENT '极光推送别名' AFTER `AUDIT_REMARK`;
-- ============================================================
-- 2026/04/28 èŠ¯çƒ¨äº‘æ‰“å°æœºé…ç½®å­—å…¸ï¼ˆè´¦å·ä¿¡æ¯åŽç»­æ‰‹åŠ¨ç»´æŠ¤CODE值)
-- 2026/04/28 èŠ¯çƒ¨äº‘æ‰“å°æœºé…ç½®å­—å…¸
-- ============================================================
INSERT INTO `system_dict` (`id`, `code`, `name`, `disabled`, `deleted`) VALUES (106, 'XPYUN_CONFIG', '芯烨云配置', 0, 0);
INSERT INTO `system_dict_data` (`DICT_ID`, `CODE`, `LABEL`, `REMARK`, `SORT`, `DISABLED`, `CREATE_USER`, `CREATE_TIME`, `DELETED`) VALUES (106, '', 'XPYUN_USER', '芯烨云开发者ID', 0, 0, 1, NOW(), 0);
server/services/src/main/java/com/doumee/config/xyy/HashSignUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package com.doumee.config.xyy;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;
/**
 * å“ˆç¨€ç­¾åå·¥å…·ç±»
 *
 * @author RabyGao
 * @date Aug 9, 2019
 */
public class HashSignUtil {
    /**
     * å“ˆç¨€ç­¾å
     * @param signSource - æºå­—符串
     * @return
     */
    public static String sign(String signSource) {
        String signature = "";
        try {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(signSource.getBytes("UTF-8"));
            signature = byteToHex(crypt.digest());
        }
        catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return signature;
    }
    private static String byteToHex(final byte[] hash) {
        Formatter formatter = new Formatter();
        for (byte b : hash)
        {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }
}
server/services/src/main/java/com/doumee/config/xyy/XyyConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.doumee.config.xyy;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.xyy.dto.RestRequest;
import com.doumee.core.constants.Constants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
 * èŠ¯çƒ¨äº‘å…¬å…±é…ç½®ç±»
 */
@Component
public class XyyConfig {
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    /**
     * ç”Ÿæˆé€šç”¨çš„请求头
     */
    public void createRequestHeader(RestRequest request) {
        String user = systemDictDataBiz.queryByCode(Constants.XPYUN_CONFIG, Constants.XPYUN_USER).getCode();
        String userKey = systemDictDataBiz.queryByCode(Constants.XPYUN_CONFIG, Constants.XPYUN_USER_KEY).getCode();
        request.setUser(user);
        request.setTimestamp(System.currentTimeMillis() + "");
        request.setSign(HashSignUtil.sign(request.getUser() + userKey + request.getTimestamp()));
        request.setDebug("0");
    }
}
server/services/src/main/java/com/doumee/config/xyy/dto/AddPrinterRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.doumee.config.xyy.dto;
import lombok.Data;
/**
 * æ·»åŠ æ‰“å°æœºè¯·æ±‚å‚æ•°
 *
 * @author RabyGao
 * @date Aug 7, 2019
 */
@Data
public class AddPrinterRequest extends RestRequest {
    /**
     * è¯·æ±‚项集合
     */
    private AddPrinterRequestItem[] items;
}
server/services/src/main/java/com/doumee/config/xyy/dto/AddPrinterRequestItem.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.doumee.config.xyy.dto;
import lombok.Data;
/**
 * æ·»åŠ æ‰“å°æœºè¯·æ±‚é¡¹
 *
 * @author RabyGao
 * @date Aug 7, 2019
 */
@Data
public class AddPrinterRequestItem {
    /**
     * æ‰“印机编号
     */
    private String sn;
    /**
     * æ‰“印机名称
     */
    private String name;
}
server/services/src/main/java/com/doumee/config/xyy/dto/DelPrinterRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.doumee.config.xyy.dto;
import lombok.Data;
/**
 * åˆ é™¤æ‰“印机请求参数
 *
 * @author RabyGao
 * @date Aug 7, 2019
 */
@Data
public class DelPrinterRequest extends RestRequest {
    /**
     * æ‰“印机编号集合
     */
    private String[] snlist;
}
server/services/src/main/java/com/doumee/config/xyy/dto/OrderStatusType.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.doumee.config.xyy.dto;
/**
 * è®¢å•状态
 *
 * @author RabyGao
 * @date Aug 8, 2019
 */
public enum OrderStatusType {
    /**
     * å¤„理中
     */
    Processing(0),
    /**
     * å®Œæˆ
     */
    Completed(1),
    /**
     * å¤±è´¥
     */
    Failed(2);
    private final int val;
    public int getVal() {
        return val;
    }
    OrderStatusType(int num) {
        this.val = num;
    }
    public static OrderStatusType getOrderStatusType(int val) {
        for (OrderStatusType type : OrderStatusType.values()) {
            if (type.getVal() == val) {
                return type;
            }
        }
        return Processing;
    }
}
server/services/src/main/java/com/doumee/config/xyy/dto/PrintRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.doumee.config.xyy.dto;
import lombok.Data;
/**
 * æ‰“印机打印请求参数
 *
 * @author RabyGao
 * @date Aug 7, 2019
 */
@Data
public class PrintRequest extends RestRequest {
    /**
     * æ‰“印机编号
     */
    private String sn;
    /**
     * æ‰“印内容,不能超过5000字节
     */
    private String content;
    /**
     * æ‰“印份数,默认为1
     */
    private int copies = 1;
    /**
     * æ‰“印模式,默认为0
     */
    private int mode = 0;
    /**
     * æ”¯ä»˜æ–¹å¼41~55:支付宝 å¾®ä¿¡ ...
     */
    private Integer payType;
    /**
     * æ”¯ä»˜ä¸Žå¦59~61:退款 åˆ°è´¦ æ¶ˆè´¹
     */
    private Integer payMode;
    /**
     * æ”¯ä»˜é‡‘额
     */
    private Double money;
    /**
     * å£°éŸ³æ’­æ”¾æ¨¡å¼ï¼Œ0 ä¸ºå–消订单模式,1 ä¸ºé™éŸ³æ¨¡å¼ï¼Œ2 ä¸ºæ¥å•播放模式,默认为 2 æ¥å•播放模式
     */
    private Integer voice;
    /**
     * æ‰“印接口回调地址对应标识(取值范围 [ 1 - 5 ] çš„æ•´æ•°),对于web管理后台 â€œåŠŸèƒ½è®¾ç½®â€ èœå•设置界面的打印接口回调标识。
     */
    private Integer backurlFlag;
}
server/services/src/main/java/com/doumee/config/xyy/dto/PrinterRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.doumee.config.xyy.dto;
/**
 * æ‰“印机请求参数
 *
 * @author RabyGao
 * @date Aug 7, 2019
 */
public class PrinterRequest extends RestRequest {
    /**
     * æ‰“印机编号
     */
    private String sn;
    public String getSn() {
        return sn;
    }
    public void setSn(String sn) {
        this.sn = sn;
    }
}
server/services/src/main/java/com/doumee/config/xyy/dto/PrinterStatusType.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.doumee.config.xyy.dto;
/**
 * æ‰“印机状态
 *
 * @author RabyGao
 * @date Aug 8, 2019
 */
public enum PrinterStatusType {
    /**
     * ç¦»çº¿
     */
    Offline(0),
    /**
     * åœ¨çº¿æ­£å¸¸
     */
    OnlinNormal(1),
    /**
     * åœ¨çº¿ç¼ºçº¸
     */
    OnlineMissingPaper(2);
    private final int val;
    public int getVal() {
        return val;
    }
    private PrinterStatusType(int num) {
        this.val = num;
    }
    public static PrinterStatusType getPrinterStatusType(int val) {
        for (PrinterStatusType type : PrinterStatusType.values()) {
            if (type.getVal() == val) {
                return type;
            }
        }
        return Offline;
    }
}
server/services/src/main/java/com/doumee/config/xyy/dto/PrintersRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.doumee.config.xyy.dto;
import java.util.List;
/**
 * @author LylJavas
 * @create 2021/4/14 18:01
 * @description æ‰¹é‡æ‰“印机请求参数
 */
public class PrintersRequest extends RestRequest {
    /**
     * æ‰“印机编号列表
     */
    private List<String> snlist;
    public List<String> getSnlist() {
        return snlist;
    }
    public void setSnlist(List<String> snlist) {
        this.snlist = snlist;
    }
}
server/services/src/main/java/com/doumee/config/xyy/dto/QueryOrderStateRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.doumee.config.xyy.dto;
/**
 * æŸ¥è¯¢è®¢å•状态请求参数
 *
 * @author RabyGao
 * @date Aug 7, 2019
 */
public class QueryOrderStateRequest extends RestRequest {
    /**
     * è®¢å•编号
     */
    private String orderId;
    public String getOrderId() {
        return orderId;
    }
    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }
}
server/services/src/main/java/com/doumee/config/xyy/dto/QueryOrderStatisRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.doumee.config.xyy.dto;
/**
 * æŸ¥è¯¢è®¢å•统计请求参数
 *
 * @author RabyGao
 * @date Aug 7, 2019
 */
public class QueryOrderStatisRequest extends RestRequest {
    /**
     * æ‰“印机编号
     */
    private String sn;
    /**
     * æŸ¥è¯¢æ—¥æœŸï¼Œæ ¼å¼YY-MM-DD,如:2016-09-20
     */
    private String date;
    public String getSn() {
        return sn;
    }
    public void setSn(String sn) {
        this.sn = sn;
    }
    public String getDate() {
        return date;
    }
    public void setDate(String date) {
        this.date = date;
    }
}
server/services/src/main/java/com/doumee/config/xyy/dto/RestRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package com.doumee.config.xyy.dto;
/**
 * è¯·æ±‚公共参数
 *
 * @author RabyGao
 * @date Aug 7, 2019
 */
public class RestRequest {
    /**
     * èŠ¯çƒ¨äº‘åŽå°æ³¨å†Œç”¨æˆ·å
     */
    private String user;
    /**
     * å½“前UNIX时间戳,10位,精确到秒
     */
    private String timestamp;
    /**
     * å¯¹å‚æ•° user + UKEY + timestamp æ‹¼æŽ¥åŽï¼ˆ+号表示连接符)进行SHA1加密得到签名,值为40位小写字符串
     */
    private String sign;
    /**
     * debug=1返回非json格式的数据。仅测试时候使用
     */
    private String debug;
    public String getUser() {
        return user;
    }
    public void setUser(String user) {
        this.user = user;
    }
    public String getTimestamp() {
        return timestamp;
    }
    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }
    public String getSign() {
        return sign;
    }
    public void setSign(String sign) {
        this.sign = sign;
    }
    public String getDebug() {
        return debug;
    }
    public void setDebug(String debug) {
        this.debug = debug;
    }
}
server/services/src/main/java/com/doumee/config/xyy/dto/SetVoiceTypeRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.doumee.config.xyy.dto;
/**
 * è®¾ç½®æ‰“印机语音类型请求参数
 *
 * @author RabyGao
 * @date Aug 7, 2019
 */
public class SetVoiceTypeRequest extends RestRequest {
    /**
     * æ‰“印机编号
     */
    private String sn;
    /**
     * å£°éŸ³ç±»åž‹ï¼š 0真人语音(大) 1真人语音(中) 2真人语音(小) 3 å˜€å˜€å£°  4 é™éŸ³
     */
    private Integer voiceType;
    public String getSn() {
        return sn;
    }
    public void setSn(String sn) {
        this.sn = sn;
    }
    public Integer getVoiceType() {
        return voiceType;
    }
    public void setVoiceType(Integer voiceType) {
        this.voiceType = voiceType;
    }
}
server/services/src/main/java/com/doumee/config/xyy/dto/UpdPrinterRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,60 @@
package com.doumee.config.xyy.dto;
/**
 * ä¿®æ”¹æ‰“印机请求参数
 *
 * @author RabyGao
 * @date Aug 7, 2019
 */
public class UpdPrinterRequest extends RestRequest {
    /**
     * æ‰“印机编号
     */
    private String sn;
    /**
     * æ‰“印机名称
     */
    private String name;
    /**
     * æ‰“印机识别码
     */
    private String idcode;
    /**
     * æµé‡å¡å·ç 
     */
    private String cardno;
    public String getSn() {
        return sn;
    }
    public void setSn(String sn) {
        this.sn = sn;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getIdcode() {
        return idcode;
    }
    public void setIdcode(String idcode) {
        this.idcode = idcode;
    }
    public String getCardno() {
        return cardno;
    }
    public void setCardno(String cardno) {
        this.cardno = cardno;
    }
}
server/services/src/main/java/com/doumee/config/xyy/dto/VoiceRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.doumee.config.xyy.dto;
/**
 * äº‘喇叭播放语音请求参数
 *
 * @author RabyGao
 * @date Aug 5, 2020
 */
public class VoiceRequest extends RestRequest {
    /**
     * æ‰“印机编号
     */
    private String sn;
    /**
     * æ”¯ä»˜æ–¹å¼41~55:支付宝 å¾®ä¿¡ ...
     */
    private Integer payType;
    /**
     * æ”¯ä»˜ä¸Žå¦59~61:退款 åˆ°è´¦ æ¶ˆè´¹
     */
    private Integer payMode;
    /**
     * æ”¯ä»˜é‡‘额
     */
    private Double money;
    public String getSn() {
        return sn;
    }
    public void setSn(String sn) {
        this.sn = sn;
    }
    public Integer getPayType() {
        return payType;
    }
    public void setPayType(Integer payType) {
        this.payType = payType;
    }
    public Integer getPayMode() {
        return payMode;
    }
    public void setPayMode(Integer payMode) {
        this.payMode = payMode;
    }
    public Double getMoney() {
        return money;
    }
    public void setMoney(Double money) {
        this.money = money;
    }
}
server/services/src/main/java/com/doumee/config/xyy/vo/ObjectRestResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
package com.doumee.config.xyy.vo;
import lombok.Data;
/**
 * è¿”回公共参数
 *
 * @param <T>
 * @author RabyGao
 * @date Aug 7, 2019
 */
@Data
public class ObjectRestResponse<T> {
    public static final String REST_RESPONSE_OK = "ok";
    /**
     * è¿”回码,正确返回0,【注意:结果正确与否的判断请用此返回参数】,错误返回非零
     */
    private int code;
    /**
     * ç»“果提示信息,正确返回”ok”,如果有错误,返回错误信息
     */
    private String msg;
    /**
     * æ•°æ®ç±»åž‹å’Œå†…容详看私有返回参数data,如果有错误,返回null
     */
    private T data;
    /**
     * æœåŠ¡å™¨ç¨‹åºæ‰§è¡Œæ—¶é—´ï¼Œå•ä½ï¼šæ¯«ç§’
     */
    private long serverExecutedTime;
    public ObjectRestResponse() {
        this.setCode(0);
        this.setMsg(REST_RESPONSE_OK);
    }
    public ObjectRestResponse code(int code) {
        this.setCode(code);
        return this;
    }
    public ObjectRestResponse data(T data) {
        this.setData(data);
        return this;
    }
    public ObjectRestResponse msg(String msg) {
        this.setMsg(msg);
        return this;
    }
    public ObjectRestResponse setResult(int code, T data) {
        this.setCode(code);
        this.setData(data);
        return this;
    }
    public ObjectRestResponse setResult(int code, T data, String msg) {
        this.setCode(code);
        this.setData(data);
        this.setMsg(msg);
        return this;
    }
}
server/services/src/main/java/com/doumee/config/xyy/vo/OrderStatisResult.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.doumee.config.xyy.vo;
/**
 * è®¢å•统计结果
 *
 * @author RabyGao
 * @date Aug 7, 2019
 */
public class OrderStatisResult {
    /**
     * å·²æ‰“印订单数
     */
    private int printed;
    /**
     * ç­‰å¾…打印订单数
     */
    private int waiting;
    public int getPrinted() {
        return printed;
    }
    public void setPrinted(int printed) {
        this.printed = printed;
    }
    public int getWaiting() {
        return waiting;
    }
    public void setWaiting(int waiting) {
        this.waiting = waiting;
    }
}
server/services/src/main/java/com/doumee/config/xyy/vo/PrinterResult.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.doumee.config.xyy.vo;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
 * æ‰¹é‡æ·»åŠ æˆ–åˆ é™¤æ‰“å°æœºç»“æžœ
 *
 * @author RabyGao
 * @date Aug 7, 2019
 */
@Data
public class PrinterResult {
    public PrinterResult() {
        success = new ArrayList<>();
        fail = new ArrayList<>();
        failMsg=new ArrayList<>();
    }
    /**
     * æˆåŠŸçš„æ‰“å°æœºç¼–å·é›†åˆ
     */
    private List<String> success;
    /**
     * å¤±è´¥çš„æ‰“印机编号集合
     */
    private List<String> fail;
    /**
     * å¤±è´¥åŽŸå› é›†åˆ  è®¾å¤‡ç¼–号:失败原因
     */
    private List<String> failMsg ;
}
server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -89,6 +89,7 @@
    public static final String BANNER_FILES = "BANNER_FILES";
    public static final String ORDERS_FILES = "ORDERS_FILES";
    public static final String APP_FILES = "APP_FILES";
    public static final String APP_FILES_URL = "APP_FILES_URL";
    // è¿è¥é…ç½®
    public static final String OPERATION_CONFIG = "OPERATION_CONFIG";
server/services/src/main/java/com/doumee/core/utils/xpyun/XpyunPrintService.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/xpyun/XpyunResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/dao/business/model/AppVersion.java
@@ -96,4 +96,8 @@
    @TableField(exist = false)
    private String createUserName;
    @ApiModelProperty(value = "APP文件全路径")
    @TableField(exist = false)
    private String fileFullUrl;
}
server/services/src/main/java/com/doumee/dao/business/model/DriverInfo.java
@@ -186,6 +186,10 @@
    private Long memberAmount;
    @TableField(exist = false)
    @ApiModelProperty(value = "驾驶车辆类型: æœºåŠ¨è½¦ = driving éžæœºåŠ¨è½¦ = bicycling")
    private String driverType;
    @TableField(exist = false)
    @ApiModelProperty(value = "图片前缀地址")
    private String imgPrefix;
@@ -233,4 +237,7 @@
    @ApiModelProperty(value = "审批人名称")
    private String auditUserName;
    @ApiModelProperty(value = "极光推送别名")
    private String jpushAlias;
}
server/services/src/main/java/com/doumee/dao/dto/DriverVerifyRequest.java
@@ -20,6 +20,9 @@
@ApiModel("司机实名认证请求类")
public class DriverVerifyRequest implements Serializable {
    @ApiModelProperty(value = "司机主键(管理端修改时必传)")
    private Integer id;
    @NotEmpty(message = "姓名不能为空")
    @ApiModelProperty(value = "姓名", required = true)
    private String name;
server/services/src/main/java/com/doumee/dao/dto/PrinterBindDTO.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/dao/dto/ShopPrinterDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.doumee.dao.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("门店打印机维护请求")
public class ShopPrinterDTO {
    @ApiModelProperty(value = "门店主键", required = true)
    private Integer id;
    @ApiModelProperty(value = "打印机SN编号(不传则为删除)")
    private String printerSn;
}
server/services/src/main/java/com/doumee/dao/vo/DriverCenterVO.java
@@ -31,6 +31,10 @@
    @ApiModelProperty(value = "司机定级:5=S 4=A 3=B 2=C 1=D")
    private Integer driverLevel;
    @ApiModelProperty(value = "驾驶车辆类型: æœºåŠ¨è½¦ = driving éžæœºåŠ¨è½¦ = bicycling")
    private String driverType;
    @ApiModelProperty(value = "司机定级名称:S/A/B/C/D")
    private String driverLevelName;
server/services/src/main/java/com/doumee/dao/vo/OrderDetailVO.java
@@ -53,7 +53,7 @@
    @ApiModelProperty(value = "司机完成图片")
    private List<String> driverDoneImages;
    @ApiModelProperty(value = "门店入库图片")
    @ApiModelProperty(value = "取件门店入库图片")
    private List<String> storeInImages;
    @ApiModelProperty(value = "门店出库图片")
server/services/src/main/java/com/doumee/dao/vo/ShopWebDetailVO.java
@@ -45,4 +45,7 @@
    @ApiModelProperty(value = "门店经度")
    private Double longitude;
    @ApiModelProperty(value = "门店联系电话")
    private String linkPhone;
}
server/services/src/main/java/com/doumee/service/business/AppVersionService.java
@@ -5,6 +5,7 @@
import com.doumee.dao.business.model.AppVersion;
import java.util.List;
import java.util.Map;
/**
 * APP版本Service定义
@@ -104,4 +105,13 @@
     */
    AppVersion getLatestVersion(Integer type);
    /**
     * ä¸Šä¼ æ–‡ä»¶åˆ°æœåŠ¡å™¨æœ¬åœ°ç›®å½•
     *
     * @param file   æ–‡ä»¶
     * @param folder æ–‡ä»¶å¤¹å
     * @return æ–‡ä»¶ä¿¡æ¯
     */
    Map<String, Object> uploadFile(org.springframework.web.multipart.MultipartFile file) throws Exception;
}
server/services/src/main/java/com/doumee/service/business/AreasService.java
@@ -150,6 +150,8 @@
     */
    Areas getOpenedCityByName(String cityName);
    Areas getOpenedCityByCode(String code);
    /**
     * ä¿®æ”¹çŠ¶æ€
     *
server/services/src/main/java/com/doumee/service/business/DriverInfoService.java
@@ -162,6 +162,15 @@
    DriverInfo getDetail(Integer id);
    /**
     * ç®¡ç†ç«¯ä¿®æ”¹å¸æœºæ³¨å†Œä¿¡æ¯ï¼ˆå«é™„件)
     *
     * @param id      å¸æœºä¸»é”®
     * @param request ä¿®æ”¹è¯·æ±‚
     * @return æ›´æ–°åŽçš„司机详情(含附件)
     */
    DriverInfo updateDriverInfo(DriverVerifyRequest request);
    /**
     * ä¿®æ”¹å¸æœºçŠ¶æ€ï¼ˆå¯ç”¨/禁用)
     *
     * @param dto ä¿®æ”¹çŠ¶æ€è¯·æ±‚
@@ -300,4 +309,9 @@
     */
    boolean checkDriverToken(String token);
    /**
     * æ³¨å†Œæžå…‰æŽ¨é€åˆ«å
     */
    void registerJpushAlias(Integer driverId, String jpushAlias);
}
server/services/src/main/java/com/doumee/service/business/OrdersService.java
@@ -426,4 +426,9 @@
     */
    int autoCompleteOrders();
    /**
     * æ‰“印订单标签
     */
    void printOrderLabel(Integer orderId, Integer shopId);
}
server/services/src/main/java/com/doumee/service/business/ShopInfoService.java
@@ -220,18 +220,9 @@
    void changePassword(Integer shopId, String oldPassword, String newPassword, String token);
    /**
     * ç»‘定打印机
     * ç»´æŠ¤é—¨åº—打印机SN
     * @param dto é—¨åº—打印机维护请求
     */
    void bindPrinter(com.doumee.dao.dto.PrinterBindDTO dto);
    /**
     * è§£ç»‘打印机
     */
    void unbindPrinter(Integer shopId);
    /**
     * æŸ¥è¯¢æ‰“印机状态
     */
    Object queryPrinterStatus(Integer shopId);
    void maintainPrinterSn(ShopPrinterDTO dto);
}
server/services/src/main/java/com/doumee/service/business/impl/AppVersionServiceImpl.java
@@ -4,11 +4,13 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.AppVersionMapper;
import com.doumee.dao.business.model.AppVersion;
@@ -17,9 +19,10 @@
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Objects;
import java.io.File;
import java.util.*;
/**
 * APP版本Service实现
@@ -32,13 +35,15 @@
    @Autowired
    private AppVersionMapper appVersionMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    public Integer create(AppVersion appVersion) {
        if (StringUtils.isBlank(appVersion.getVersionInfo())
                || StringUtils.isBlank(appVersion.getFileUrl())
                || StringUtils.isBlank(appVersion.getName())
                || StringUtils.isBlank(appVersion.getContent())
                || StringUtils.isBlank(appVersion.getTitle())
                || Objects.isNull(appVersion.getIsForce())
                || Objects.isNull(appVersion.getType())
                || Objects.isNull(appVersion.getFileSize())
@@ -132,7 +137,14 @@
            wrapper.eq(AppVersion::getType, model.getType());
        }
        wrapper.orderByDesc(AppVersion::getId);
        return PageData.from(appVersionMapper.selectJoinPage(page, AppVersion.class, wrapper));
        PageData<AppVersion> pageData = PageData.from(appVersionMapper.selectJoinPage(page, AppVersion.class, wrapper));
        String urlPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.APP_FILES_URL).getCode();
        for (AppVersion vo : pageData.getRecords()) {
            if (StringUtils.isNotBlank(vo.getFileUrl())) {
                vo.setFileFullUrl(urlPrefix + vo.getFileUrl());
            }
        }
        return pageData;
    }
    @Override
@@ -152,4 +164,34 @@
        return appVersionMapper.selectOne(qw);
    }
    @Override
    public Map<String, Object> uploadFile(MultipartFile file) throws Exception {
        if (file == null || file.isEmpty()) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "上传文件不能为空");
        }
        String rootPath = systemDictDataBiz.queryByCode(Constants.OSS, Constants.APP_FILES).getCode();
        String urlPrefix = systemDictDataBiz.queryByCode(Constants.OSS, Constants.APP_FILES_URL).getCode();
        String originName = file.getOriginalFilename();
        String ext = ".apk";
        if (originName != null && originName.indexOf(".") > 0) {
            ext = originName.substring(originName.lastIndexOf("."));
        }
        String fileName =  UUID.randomUUID() + ext;
        File dest = new File(rootPath + fileName);
        if (!dest.getParentFile().exists()) {
            dest.getParentFile().mkdirs();
        }
        try {
            file.transferTo(dest);
        } catch (Exception e) {
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "文件上传失败: " + e.getMessage());
        }
        Map<String, Object> data = new HashMap<>();
        data.put("url", urlPrefix + fileName);
        data.put("imgaddr", fileName);
        data.put("imgname", fileName);
        data.put("originname", originName);
        return data;
    }
}
server/services/src/main/java/com/doumee/service/business/impl/AreasServiceImpl.java
@@ -553,6 +553,7 @@
        return list;
    }
    @Override
    public Areas getOpenedCityByName(String cityName) {
        if (StringUtils.isBlank(cityName)) {
@@ -568,6 +569,24 @@
        return areasMapper.selectOne(qw);
    }
    @Override
    public Areas getOpenedCityByCode(String code) {
        if (StringUtils.isBlank(code)) {
            return null;
        }
        Areas areas = areasMapper.selectById(code);
        if(Objects.isNull(areas)||Objects.isNull(areas.getParentId())){
            return null;
        }
        Areas city = areasMapper.selectById(areas.getParentId());
        if(Objects.isNull(city)||Constants.equalsInteger(city.getIsdeleted(),Constants.ONE)||
            Constants.equalsInteger(city.getStatus(),Constants.ZERO)){
            return null;
        }
        return city;
    }
    @Override
    public void updateStatus(Areas areas) {
        if (areas == null || areas.getId() == null) {
server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
@@ -406,6 +406,7 @@
            driverInfo.setMemberId(member.getId());
            driverInfo.setStatus(Constants.ZERO);
            driverInfo.setAuditStatus(99);
            driverInfo.setJpushAlias(org.springframework.util.DigestUtils.md5DigestAsHex(telephone.getBytes()));
            driverInfoMapper.insert(driverInfo);
        }
@@ -581,6 +582,7 @@
            if (Objects.nonNull(category)) {
                driverInfo.setCarTypeName(category.getName());
                driverInfo.setNeedLicense(Constants.equalsInteger(Integer.valueOf(category.getOtherField()), Constants.ONE) ? Constants.ONE : Constants.ZERO);
                driverInfo.setDriverType(category.getDetail());
            }
        }
        // æŸ¥è¯¢çœå¸‚区信息
@@ -730,6 +732,55 @@
    }
    @Override
    public DriverInfo updateDriverInfo(DriverVerifyRequest request) {
        Integer id = request.getId();
        if (id == null) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "司机主键不能为空");
        }
        DriverInfo driverInfo = driverInfoMapper.selectById(id);
        if (Objects.isNull(driverInfo) || Constants.equalsInteger(driverInfo.getDeleted(), Constants.ONE)) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        Date now = new Date();
        driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda()
                .set(DriverInfo::getName, request.getName())
                .set(DriverInfo::getIdcard, request.getIdcard())
                .set(DriverInfo::getMaritalStatus, request.getMaritalStatus())
                .set(DriverInfo::getAreaId, request.getAreaId())
                .set(DriverInfo::getLivePlace, request.getLivePlace())
                .set(DriverInfo::getCarCode, request.getCarCode())
                .set(DriverInfo::getCarType, request.getCarType())
                .set(DriverInfo::getCarColor, request.getCarColor())
                .set(DriverInfo::getCardStartDate, request.getCardStartDate())
                .set(DriverInfo::getCardEndDate, request.getCardEndDate())
                .set(DriverInfo::getIdcardImg, request.getIdcardImg())
                .set(DriverInfo::getIdcardImgBack, request.getIdcardImgBack())
                .set(DriverInfo::getAliAccount, request.getAliAccount())
                .set(DriverInfo::getAliName, request.getAliName())
                .set(DriverInfo::getUpdateTime, now)
                .eq(DriverInfo::getId, id));
        // åˆ é™¤æ—§çš„照片记录并保存新的
        multifileMapper.delete(new QueryWrapper<Multifile>().lambda()
                .eq(Multifile::getObjId, id)
                .in(Multifile::getObjType,
                        Constants.FileType.DRIVER_CAR.getKey(),
                        Constants.FileType.DRIVER_LICENSE.getKey(),
                        Constants.FileType.DRIVER_OTHER.getKey()));
        if (!CollectionUtils.isEmpty(request.getCarImgUrls())) {
            saveMultifileList(id, Constants.FileType.DRIVER_CAR.getKey(), request.getCarImgUrls(), now);
        }
        if (!CollectionUtils.isEmpty(request.getLicenseImgUrls())) {
            saveMultifileList(id, Constants.FileType.DRIVER_LICENSE.getKey(), request.getLicenseImgUrls(), now);
        }
        if (!CollectionUtils.isEmpty(request.getOtherImgUrls())) {
            saveMultifileList(id, Constants.FileType.DRIVER_OTHER.getKey(), request.getOtherImgUrls(), now);
        }
        return getDetail(id);
    }
    @Override
    public void changeStatus(ChangeStatusDTO dto) {
        if (dto.getId() == null) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "主键不能为空");
@@ -833,7 +884,10 @@
                    + systemDictDataBiz.queryByCode(Constants.OSS, Constants.MEMBER_FILES).getCode();
            vo.setFullImgUrl(imgPrefix + driver.getImgurl());
        }
        Category category = categoryMapper.selectById(driver.getCarType());
        if(Objects.nonNull(category)&&StringUtils.isNotBlank(category.getDetail())){
            vo.setDriverType(category.getDetail());
        }
        // ä»Šæ—¥é¢„计佣金:今日接单的司机佣金 + å¹³å°å¥–励金
        Date now = new Date();
        Calendar cal = Calendar.getInstance();
@@ -1075,14 +1129,15 @@
                .select("s1.address", Orders::getDepositShopAddress)
                .select("s2.name", Orders::getTakeShopName)
                .select("s2.address", Orders::getTakeShopAddress)
                .select("s1.link_phone", Orders::getDepositShopLinkPhone)
                .select("s2.link_phone as takeShopLinkPhone")
                .select("c2.other_field as c2OtherField")
                .select("c2.name as goodLevelName")
                .select("IF(EXISTS(SELECT 1 FROM orders_detail od JOIN category c3 ON c3.id = od.LUGGAGE_ID AND c3.TYPE = 4 AND c3.OTHER_FIELD = '1' WHERE od.ORDER_ID = t.ID AND od.DELETED = 0), 1, 0) as hasOversized")
                .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID and s1.DELETED = 0")
                .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID and s2.DELETED = 0")
                .leftJoin("category c1 on c1.id = t.GOOD_TYPE and c1.DELETED = 0")
                .leftJoin("category c2 on c2.id = c1.RELATION_ID and c2.DELETED = 0 and c2.TYPE = 3")
                .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID ")
                .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID    ")
                .leftJoin("category c1 on c1.id = t.GOOD_TYPE   ")
                .leftJoin("category c2 on c2.id = c1.RELATION_ID and  c2.TYPE = 3")
                .eq(Orders::getAcceptDriver, driver.getId())
                .eq(Orders::getType, Constants.ONE)
                .eq(Objects.nonNull(dto.getStatus()),Orders::getStatus, dto.getStatus())
@@ -1124,7 +1179,7 @@
                .select("s2.name", Orders::getTakeShopName)
                .select("s2.address", Orders::getTakeShopAddress)
                .select("s2.telephone", Orders::getTakeShopLinkPhone)
                .select("c2.other_field as c2OtherField")
                .select("c1.other_field as c2OtherField")
                .select("c1.name as goodTypeName")
                .select("IF(EXISTS(SELECT 1 FROM orders_detail od JOIN category c3 ON c3.id = od.LUGGAGE_ID AND c3.TYPE = 4 AND c3.OTHER_FIELD = '1' WHERE od.ORDER_ID = t.ID AND od.DELETED = 0), 1, 0) as hasOversized")
                .leftJoin("shop_info s1 on s1.id = t.DEPOSIT_SHOP_ID and s1.DELETED = 0")
@@ -1738,17 +1793,15 @@
            vo.setDepositDistance(formatDistance(distKm));
        }
        // å–件信息 + è”系电话(使用Orders自带坐标)
        // å–件信息(使用Orders自带坐标)
        boolean hasTakeShop = order.getTakeShopId() != null && StringUtils.isNotBlank(order.getTakeShopName());
        if (hasTakeShop) {
            vo.setTakeName(order.getTakeShopName());
            vo.setTakeAddress(order.getTakeShopAddress());
            vo.setTakeShopId(order.getTakeShopId());
            vo.setContactPhone(order.getTakeShopLinkPhone());
        } else {
            vo.setTakeName(order.getTakeLocation());
            vo.setTakeAddress(order.getTakeLocationRemark());
            vo.setContactPhone(order.getTakePhone());
        }
        vo.setTakeLng(order.getTakeLgt() != null ? order.getTakeLgt().doubleValue() : null);
        vo.setTakeLat(order.getTakeLat() != null ? order.getTakeLat().doubleValue() : null);
@@ -1773,6 +1826,19 @@
        vo.setStatus(order.getStatus());
        vo.setStatusDesc(getStatusDesc(order.getStatus()));
        vo.setCreateTime(order.getCreateTime());
        // è”系电话(按订单状态)
        if (Constants.equalsInteger(order.getStatus(), Constants.THREE)) {
            vo.setContactPhone(order.getDepositShopLinkPhone());
        } else if (Constants.equalsInteger(order.getStatus(), Constants.FOUR)) {
            if (hasTakeShop) {
                vo.setContactPhone(order.getTakeShopLinkPhone());
            } else {
                vo.setContactPhone(order.getTakePhone());
            }
        } else if (Constants.equalsInteger(order.getStatus(), Constants.FIVE)) {
            vo.setContactPhone(order.getTakePhone());
        }
        // ç‰©å“æ˜Žç»†
        List<OrdersDetail> details = detailMap.getOrDefault(order.getId(), Collections.emptyList());
@@ -1930,7 +1996,8 @@
                .select("s1.name", Orders::getDepositShopName)
                .select("s1.address", Orders::getDepositShopAddress)
                .select("s2.name", Orders::getTakeShopName)
                .select("s2.address", Orders::getTakeShopAddress)
                .select("s2.address", Orders::getDepositShopAddress)
                .select("s1.link_phone as takeShopLinkPhone")
                .select("s2.link_phone as takeShopLinkPhone")
                .select("c2.other_field as c2OtherField")
                .select("c2.name as goodLevelName")
@@ -2038,4 +2105,12 @@
        }
    }
    @Override
    public void registerJpushAlias(Integer driverId, String jpushAlias) {
        DriverInfo update = new DriverInfo();
        update.setId(driverId);
        update.setJpushAlias(jpushAlias);
        driverInfoMapper.updateById(update);
    }
}
server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -625,7 +625,10 @@
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        //判断新手机号是否已被使用
        if(memberMapper.selectCount(new QueryWrapper<Member>().lambda().eq(Member::getTelephone,request.getPhone()))>Constants.ZERO){
        if(memberMapper.selectCount(new QueryWrapper<Member>().lambda()
                        .eq(Member::getDeleted,Constants.ZERO)
                        .eq(Member::getUserType,Constants.ZERO)
                .eq(Member::getTelephone,request.getPhone()))>Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,新手机号已被绑定,无法进行换绑!");
        }
        Member member = memberMapper.selectById(request.getMemberId());
server/services/src/main/java/com/doumee/service/business/impl/OrdersRefundServiceImpl.java
@@ -151,7 +151,7 @@
                .select("o.total_amount as totalAmount")
                .select("o.pay_amount as payAmount")
                .select("c2.name as goodLevelName")
                .leftJoin("orders o on o.id = t.ORDER_ID and o.DELETED = 0")
                .innerJoin("orders o on o.id = t.ORDER_ID ")
                .leftJoin("category c1 on c1.id = o.GOOD_TYPE and c1.DELETED = 0")
                .leftJoin("category c2 on c2.id = c1.RELATION_ID and c2.DELETED = 0 and c2.TYPE = 3")
                .eq(OrdersRefund::getDeleted, 0);
server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -1,15 +1,19 @@
package com.doumee.service.business.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.biz.system.AreasBiz;
import com.doumee.config.xyy.XyyConfig;
import com.doumee.config.xyy.dto.PrintRequest;
import com.doumee.biz.system.OperationConfigBiz;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.wx.WxMiniConfig;
import com.doumee.config.wx.WxPayProperties;
import com.doumee.config.wx.WxPayV3Service;
import com.doumee.core.utils.jpush.JPushUtil;
import com.wechat.pay.java.service.refund.model.Refund;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
@@ -55,6 +59,7 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.text.SimpleDateFormat;
import java.util.concurrent.TimeUnit;
/**
@@ -129,6 +134,9 @@
    private AreasService areasService;
    @Autowired
    private AreasMapper aareasMapper;
    @Autowired
    private NoticeService noticeService;
    @Autowired
@@ -139,6 +147,12 @@
    @Autowired
    private WxPayProperties wxPayProperties;
    @Autowired
    private XyyConfig xyyConfig;
    @Autowired
    private PrintService printService;
    @Override
    public Integer create(Orders orders) {
@@ -216,7 +230,6 @@
                .leftJoin("shop_info s2 on s2.id = t.TAKE_SHOP_ID");
                ;
        Utils.MP.blankToNull(pageWrap.getModel());
        pageWrap.getModel().setDeleted(Constants.ZERO);
        queryWrapper.eq(pageWrap.getModel().getDeleted() != null, Orders::getDeleted, pageWrap.getModel().getDeleted());
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCode()), Orders::getCode, pageWrap.getModel().getCode());
        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getDepositShopName()), "s1.name", pageWrap.getModel().getDepositShopName());
@@ -234,13 +247,7 @@
        queryWrapper.eq(pageWrap.getModel().getAcceptDriver() != null, Orders::getAcceptDriver, pageWrap.getModel().getAcceptDriver());
        queryWrapper.and(pageWrap.getModel().getShopId() != null, i -> i.eq(Orders::getDepositShopId, pageWrap.getModel().getShopId())
                .or().eq(Orders::getTakeShopId, pageWrap.getModel().getShopId()));
        for (PageWrap.SortData sortData : pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        queryWrapper.orderByDesc(Orders::getId);
        PageData<Orders> pageData = PageData.from(ordersMapper.selectJoinPage(page, Orders.class, queryWrapper));
        for (Orders o : pageData.getRecords()) {
            if (o.getStatus() != null) {
@@ -368,7 +375,7 @@
        for (Category c : categories) {
            categoryNameMap.put(c.getId(), c.getName());
            categoryDetailMap.put(c.getId(), c.getDetail());
            categoryOtherFieldMap.put(c.getId(),c.getOtherField());
            categoryOtherFieldMap.put(c.getId(),c.getRemark());
        }
        // è®¡ç®—每项物品费用:小计 = å•ä»· Ã— æ•°é‡ Ã— å¤©æ•°
@@ -490,7 +497,7 @@
        for (Category c : categories) {
            categoryNameMap.put(c.getId(), c.getName());
            categoryDetailMap.put(c.getId(), c.getDetail());
            categoryOtherFieldMap.put(c.getId(),c.getOtherField());
            categoryOtherFieldMap.put(c.getId(),c.getRemark());
        }
        // 3. é€é¡¹è®¡ç®—运费:起步价 + è¶…出部分阶梯价
@@ -1600,12 +1607,13 @@
        // é—¨åº—待处理订单:按业务环节区分门店角色
        if (combinedStatus != null && Constants.equalsInteger(combinedStatus, Constants.SEVEN)) {
            wrapper.and(w -> w
                    .and(w1 -> w1.eq(Orders::getDepositShopId, shopId)
                    .and(w1 -> w1.eq(Orders::getType, Constants.ZERO).eq(Orders::getDepositShopId, shopId)
                            .in(Orders::getStatus, Constants.OrderStatus.waitDeposit.getStatus(),
                                    Constants.OrderStatus.deposited.getStatus()))
                    .or(w2 -> w2.eq(Orders::getTakeShopId, shopId)
                            .in(Orders::getStatus, Constants.OrderStatus.delivering.getStatus(),
                                    Constants.OrderStatus.arrived.getStatus()))
                                    Constants.OrderStatus.arrived.getStatus())
                    .or(w3-> w3.eq(Orders::getType, Constants.ONE).eq(Orders::getDepositShopId, shopId)
                            .eq(Orders::getStatus, Constants.OrderStatus.waitDeposit.getStatus()))
                    .or(w2 -> w2.eq(Orders::getType, Constants.ONE).eq(Orders::getTakeShopId, shopId)
                            .eq(Orders::getStatus, Constants.OrderStatus.arrived.getStatus())))
            );
        } else {
            wrapper.and(w -> w.eq(Orders::getDepositShopId, shopId).or().eq(Orders::getTakeShopId, shopId));
@@ -2414,13 +2422,13 @@
        // 6. æŠ¼é‡‘支付完成后,若城市未开通则自动开通
        if (shopInfo.getAreaId() != null) {
            Areas shopArea = areasService.getById(shopInfo.getAreaId());
            Areas shopArea = aareasMapper.selectById(shopInfo.getAreaId());
            if (shopArea != null && shopArea.getParentId() != null) {
                Areas cityArea = areasService.getById(shopArea.getParentId());
                Areas cityArea = aareasMapper.selectById(shopArea.getParentId());
                if (cityArea != null && !Constants.equalsInteger(cityArea.getStatus(), Constants.ONE)) {
                    cityArea.setStatus(Constants.ONE);
                    cityArea.setEditDate(now);
                    areasService.updateById(cityArea);
                    aareasMapper.updateById(cityArea);
                    areasService.cacheData();
                }
            }
@@ -2758,6 +2766,8 @@
                // å¼‚地寄存 â†’ å¾…抢单
                sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_GRAB, order.getId(),
                        "orderNo", order.getCode());
                // æŽ¨é€é€šçŸ¥å¸æœº
                pushDriverNewOrder(order);
            } else {
                // å°±åœ°å¯„å­˜ â†’ å¾…取件提醒
                sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_PICKUP_REMIND, order.getId(),
@@ -2917,6 +2927,8 @@
                // å¼‚地寄存 â†’ å¾…抢单
                sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_GRAB, order.getId(),
                        "orderNo", order.getCode());
                // æŽ¨é€é€šçŸ¥å¸æœº
                pushDriverNewOrder(order);
            } else {
                // å°±åœ°å¯„å­˜ â†’ å¾…取件提醒
                sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_PICKUP_REMIND, order.getId(),
@@ -3580,7 +3592,10 @@
     * ä¾›åˆ†é¡µç­‰å·²æŸ¥è¯¢æ˜Žç»†çš„业务场景复用,避免重复查询
     */
    private OverdueFeeVO calculateOverdueFeeInternal(Orders order, List<OrdersDetail> details) {
        if (CollectionUtils.isEmpty(details)) {
        if (CollectionUtils.isEmpty(details)||
                Constants.equalsInteger(order.getStatus(),Constants.ZERO)
        || Constants.equalsInteger(order.getStatus(),Constants.ONE)
        ) {
            OverdueFeeVO vo = new OverdueFeeVO();
            vo.setOverdue(false);
            vo.setOverdueDays(0);
@@ -4107,4 +4122,102 @@
        }
    }
    @Override
    public void printOrderLabel(Integer orderId, Integer shopId) {
        Orders orders = ordersMapper.selectById(orderId);
        if (orders == null) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "订单不存在");
        }
        if (!Constants.equalsInteger(orders.getDepositShopId(), shopId)) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "当前门店不是该订单的存件门店");
        }
        if (orders.getStatus() < 2 || orders.getStatus() > 5) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "当前订单状态不允许打印");
        }
        ShopInfo shop = shopInfoMapper.selectById(shopId);
        if (shop == null) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "存件门店不存在");
        }
        if (StringUtils.isBlank(shop.getPrinterSn())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "存件门店未绑定打印机");
        }
        List<OrdersDetail> detailList = ordersDetailMapper.selectList(
                new QueryWrapper<OrdersDetail>().lambda().eq(OrdersDetail::getOrderId, orderId));
        // æ‹¼æŽ¥å®¢æˆ·ä¿¡æ¯
        String userInfo = "";
        if (StringUtils.isNotBlank(orders.getTakeUser())) {
            String phone = orders.getTakePhone();
            userInfo = orders.getTakeUser();
            if (StringUtils.isNotBlank(phone) && phone.length() >= 4) {
                userInfo += "(" + phone.substring(phone.length() - 4) + ")";
            }
        }
        String content = printService.getPrintContent(shop.getName(), detailList, userInfo, orders.getCode(), orders.getRemark(),
                orders.getTakeLocationRemark(),
                orders.getPayTime() != null ? new SimpleDateFormat("yyyy-MM-dd HH:mm").format(orders.getPayTime()) : "",
                orders.getExpectedTakeTime() != null ? new SimpleDateFormat("yyyy-MM-dd HH:mm").format(orders.getExpectedTakeTime()) : "");
        if (StringUtils.isBlank(content)) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "打印内容为空");
        }
        PrintRequest request = new PrintRequest();
        xyyConfig.createRequestHeader(request);
        request.setSn(shop.getPrinterSn());
        request.setContent(content);
        request.setCopies(1);
        request.setVoice(2);
        request.setMode(0);
        com.doumee.config.xyy.vo.ObjectRestResponse<String> resp = printService.printLabel(request);
        if (resp.getCode() != 0) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "打印失败:" + resp.getMsg());
        }
        log.info("订单标签打印成功: orderId={}, orderIndex={}", orderId, resp.getData());
    }
    /**
     * å¼‚地订单寄存成功后推送通知给司机
     * 1、未加急:推送同城且门店配送范围内接单中的司机
     * 2、加急:推送同城所有接单中的司机
     * åŸŽå¸‚匹配:司机AREA_ID关联areas表,逐级parent_id找到城市级,与订单cityId匹配
     */
    private void pushDriverNewOrder(Orders order) {
        ShopInfo shop = shopInfoMapper.selectById(order.getDepositShopId());
        if (shop == null || shop.getLongitude() == null || shop.getLatitude() == null) {
            return;
        }
        String orderCityId = order.getCityId();
        if (StringUtils.isBlank(orderCityId)) {
            return;
        }
        String distSql = "(ST_Distance_Sphere(POINT(t.LONGITUDE, t.LATITUDE), POINT(" + shop.getLongitude() + ", " + shop.getLatitude() + ")) / 1000)";
        // MPJ关联查询:司机 â†’ areas(区县) â†’ areas_city(城市),匹配订单cityId
        MPJLambdaWrapper<DriverInfo> wrapper = new MPJLambdaWrapper<>();
        wrapper.selectAll(DriverInfo.class)
                .leftJoin(Areas.class,Areas::getId,DriverInfo::getAreaId)
                .eq(DriverInfo::getAcceptingStatus, Constants.ONE)
                .eq(DriverInfo::getStatus, Constants.ZERO)
                .eq(DriverInfo::getDeleted, Constants.ZERO)
                .eq(DriverInfo::getAuditStatus, Constants.THREE)
                .eq(Areas::getParentId, orderCityId);
        if (!Constants.equalsInteger(order.getIsUrgent(), Constants.ONE)) {
            // æœªåŠ æ€¥ï¼šé—¨åº—é…é€èŒƒå›´å†…
            double rangeKm = shop.getDeliveryArea() != null ? shop.getDeliveryArea().doubleValue() : 5.0;
            wrapper.apply(distSql + " <= {0}", rangeKm);
        }
        List<DriverInfo> drivers = driverInfoMapper.selectJoinList(DriverInfo.class, wrapper);
        if (drivers.isEmpty()) {
            return;
        }
        List<String> aliases = new ArrayList<>();
        for (DriverInfo d : drivers) {
            aliases.add(org.springframework.util.DigestUtils.md5DigestAsHex(d.getTelephone().getBytes()));
        }
        String title = Constants.equalsInteger(order.getIsUrgent(), Constants.ONE) ? "新加急订单" : "新订单";
        String content = "订单号:" + order.getCode();
        java.util.Map<String, String> extras = new java.util.HashMap<>();
        extras.put("orderId", String.valueOf(order.getId()));
        extras.put("orderCode", order.getCode());
        extras.put("type", "new_order");
        JPushUtil.sendByAliases(aliases, title, content, extras);
    }
}
server/services/src/main/java/com/doumee/service/business/impl/PrintService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,297 @@
package com.doumee.service.business.impl;
import cn.binarywang.wx.miniapp.bean.intractiy.WxMaStoreBalance;
import com.alibaba.druid.sql.visitor.functions.Concat;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alipay.v3.model.GoodsDetail;
import com.doumee.config.xyy.dto.*;
import com.doumee.config.xyy.vo.ObjectRestResponse;
import com.doumee.config.xyy.vo.OrderStatisResult;
import com.doumee.config.xyy.vo.PrinterResult;
import com.doumee.core.constants.Constants;
import com.doumee.core.utils.HttpsUtil;
import com.doumee.dao.business.model.OrdersDetail;
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
 * äº‘打印相关接口封装类
 * @author JavaLyl
 */
@Service
public class PrintService {
    private static String BASE_URL = "https://open.xpyun.net/api/openapi";
    public String getPrintContent(String shopName, List<OrdersDetail> detailList, String userInfo, String orderCode, String remark, String takeLocationRemark, String payTime, String expectedTakeTime){
        StringBuilder printContent = new StringBuilder();
        if(CollectionUtils.isNotEmpty(detailList)){
            Integer num = detailList.stream().map(i->i.getNum()).reduce(Constants.ZERO, Integer::sum);
            Integer index = 1;
            for (OrdersDetail detail:detailList) {
                for (int i = 1; i <= detail.getNum(); i++) {
                    int y = 160;
                    StringBuilder page = new StringBuilder();
                    page.append("<PAGE>").append("<SIZE>60,60</SIZE>");
                    page.append("<TEXT x=\"30\" y=\"10\" w=\"1\" h=\"1\" r=\"0\">")
                            .append(detail.getLuggageName()).append("(").append(i).append("/").append(detail.getNum()).append(")")
                            .append("</TEXT>");
                    page.append("<BC128 x=\"50\" y=\"60\" h=\"64\" s=\"1\" n=\"2\" w=\"2\" r=\"0\">")
                            .append(orderCode)
                            .append("</BC128>");
                    // å®¢æˆ·ä¿¡æ¯
                    page.append("<TEXT x=\"30\" y=\"").append(y).append("\" w=\"1\" h=\"1\" r=\"0\">")
                            .append("客户信息:").append(userInfo).append(StringUtils.repeat(" ", 4))
                            .append("</TEXT>");
                    y += 40;
                    // ä¸‹å•时间(支付时间)
                    page.append("<TEXT x=\"30\" y=\"").append(y).append("\" w=\"1\" h=\"1\" r=\"0\">")
                            .append("下单时间:").append(payTime)
                            .append("</TEXT>");
                    y += 40;
                    // å–件地址(最多2行)
                    y = appendMultiLine(page, "取件地址:", takeLocationRemark, y, 2);
                    y += 10;
                    // é€è¾¾æ—¶é—´
                    page.append("<TEXT x=\"30\" y=\"").append(y).append("\" w=\"1\" h=\"1\" r=\"0\">")
                            .append("客户预计取件时间:").append(expectedTakeTime)
                            .append("</TEXT>");
                    y += 40;
                    // è®¢å•备注(最多2行)
                    y = appendMultiLine(page, "订单备注:", remark, y, 2);
                    // é—¨åº—名 + åºå·ï¼ˆå›ºå®šåœ¨åº•部)
                    page.append("<TEXT x=\"30\" y=\"440\" w=\"1\" h=\"1\" r=\"0\">")
                            .append(shopName).append(StringUtils.repeat(" ", 18))
                            .append(index).append("/").append(num)
                            .append("</TEXT>");
                    page.append("</PAGE>");
                    printContent.append(page);
                    index =  index+1;
                }
            }
        }
        return printContent.toString();
    }
    /**
     * è¿½åŠ å¯èƒ½æ¢è¡Œçš„æ–‡æœ¬ï¼ˆæ ‡é¢˜+内容),超过maxChars个字符换行,最多maxLines行
     * @return æ¶ˆè€—çš„y偏移后的下一个y坐标
     */
    private int appendMultiLine(StringBuilder sb, String title, String content, int startY, int maxLines) {
        String fullText = title + (StringUtils.isNotBlank(content) ? content : "");
        int maxChars = 18;
        int line = 0;
        int pos = 0;
        int y = startY;
        while (pos < fullText.length() && line < maxLines) {
            String lineText;
            int end = Math.min(pos + maxChars, fullText.length());
            lineText = fullText.substring(pos, end);
            pos = end;
            line++;
            sb.append("<TEXT x=\"30\" y=\"").append(y).append("\" w=\"1\" h=\"1\" r=\"0\">")
                    .append(lineText).append(StringUtils.repeat(" ", 4))
                    .append("</TEXT>");
            y += 35;
        }
        return y;
    }
    /**
     * 1.批量添加打印机
     * @param restRequest
     * @return
     */
    public ObjectRestResponse<PrinterResult> addPrinters(AddPrinterRequest restRequest) {
        String url = BASE_URL + "/xprinter/addPrinters";
        String jsonRequest = JSON.toJSONString(restRequest);
        String resp = HttpsUtil.postJson(url, jsonRequest);
        ObjectRestResponse<PrinterResult> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<PrinterResult>>(){});
        return result;
    }
    /**
     * 2.设置打印机语音类型
     * @param restRequest
     * @return
     */
    public ObjectRestResponse<Boolean> setPrinterVoiceType(SetVoiceTypeRequest restRequest) {
        String url = BASE_URL + "/xprinter/setVoiceType";
        String jsonRequest = JSON.toJSONString(restRequest);
        String resp = HttpsUtil.postJson(url, jsonRequest);
        ObjectRestResponse<Boolean> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<Boolean>>(){});
        return result;
    }
    /**
     * 3.打印小票订单
     * @param restRequest
     * @return
     */
    public ObjectRestResponse<String> print(PrintRequest restRequest) {
        String url = BASE_URL + "/xprinter/print";
        String jsonRequest = JSON.toJSONString(restRequest);
        String resp = HttpsUtil.postJson(url, jsonRequest);
        ObjectRestResponse<String> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<String>>(){});
        return result;
    }
    /**
     * 4.打印标签订单
     * @param restRequest
     * @return
     */
    public ObjectRestResponse<String> printLabel(PrintRequest restRequest) {
        String url = BASE_URL + "/xprinter/printLabel";
        String jsonRequest = JSON.toJSONString(restRequest);
        String resp = HttpsUtil.postJson(url, jsonRequest);
        ObjectRestResponse<String> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<String>>(){});
        return result;
    }
    /**
     * 5.批量删除打印机
     * @param restRequest
     * @return
     */
    public ObjectRestResponse<PrinterResult> delPrinters(DelPrinterRequest restRequest) {
        String url = BASE_URL + "/xprinter/delPrinters";
        String jsonRequest = JSON.toJSONString(restRequest);
        String resp = HttpsUtil.postJson(url, jsonRequest);
        ObjectRestResponse<PrinterResult> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<PrinterResult>>(){});
        return result;
    }
    /**
     * 6.修改打印机信息
     * @param restRequest
     * @return
     */
    public ObjectRestResponse<Boolean> updPrinter(UpdPrinterRequest restRequest) {
        String url = BASE_URL + "/xprinter/updPrinter";
        String jsonRequest = JSON.toJSONString(restRequest);
        String resp = HttpsUtil.postJson(url, jsonRequest);
        ObjectRestResponse<Boolean> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<Boolean>>(){});
        return result;
    }
    /**
     * 7.清空待打印队列
     * @param restRequest
     * @return
     */
    public ObjectRestResponse<Boolean> delPrinterQueue(PrinterRequest restRequest) {
        String url = BASE_URL + "/xprinter/delPrinterQueue";
        String jsonRequest = JSON.toJSONString(restRequest);
        String resp = HttpsUtil.postJson(url, jsonRequest);
        ObjectRestResponse<Boolean> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<Boolean>>(){});
        return result;
    }
    /**
     * 8.查询订单是否打印成功
     * @param restRequest
     * @return
     */
    public ObjectRestResponse<Boolean> queryOrderState(QueryOrderStateRequest restRequest) {
        String url = BASE_URL + "/xprinter/queryOrderState";
        String jsonRequest = JSON.toJSONString(restRequest);
        String resp = HttpsUtil.postJson(url, jsonRequest);
        ObjectRestResponse<Boolean> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<Boolean>>(){});
        return result;
    }
    /**
     * 9.查询打印机某天的订单统计数
     * @param restRequest
     * @return
     */
    public ObjectRestResponse<OrderStatisResult> queryOrderStatis(QueryOrderStatisRequest restRequest) {
        String url = BASE_URL + "/xprinter/queryOrderStatis";
        String jsonRequest = JSON.toJSONString(restRequest);
        String resp = HttpsUtil.postJson(url, jsonRequest);
        ObjectRestResponse<OrderStatisResult> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<OrderStatisResult>>(){});
        return result;
    }
    /**
     * 10.查询打印机状态
     *
     * 0、离线 1、在线正常 2、在线不正常
     * å¤‡æ³¨ï¼šå¼‚常一般是无纸,离线的判断是打印机与服务器失去联系超过30秒
     * @param restRequest
     * @return
     */
    public ObjectRestResponse<Integer> queryPrinterStatus(PrinterRequest restRequest) {
        String url = BASE_URL + "/xprinter/queryPrinterStatus";
        String jsonRequest = JSON.toJSONString(restRequest);
        String resp = HttpsUtil.postJson(url, jsonRequest);
        ObjectRestResponse<Integer> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<Integer>>(){});
        return result;
    }
    /**
     * 10.批量查询打印机状态
     *
     * 0、离线 1、在线正常 2、在线不正常
     * å¤‡æ³¨ï¼šå¼‚常一般是无纸,离线的判断是打印机与服务器失去联系超过30秒
     * @param restRequest
     * @return
     */
    public ObjectRestResponse<List<Integer>> queryPrintersStatus(PrintersRequest restRequest) {
        String url = BASE_URL + "/xprinter/queryPrintersStatus";
        String jsonRequest = JSON.toJSONString(restRequest);
        String resp = HttpsUtil.postJson(url, jsonRequest);
        ObjectRestResponse<List<Integer>> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<List<Integer>>>(){});
        return result;
    }
    /**
     * 11.云喇叭播放语音
     * @param restRequest
     * @return
     */
    public ObjectRestResponse<String> playVoice(VoiceRequest restRequest) {
        String url = BASE_URL + "/xprinter/playVoice";
        String jsonRequest = JSON.toJSONString(restRequest);
        String resp = HttpsUtil.postJson(url, jsonRequest);
        ObjectRestResponse<String> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<String>>(){});
        return result;
    }
    /**
     * 12.POS指令
     * @param restRequest
     * @return
     */
    public ObjectRestResponse<String> pos(PrintRequest restRequest) {
        String url = BASE_URL + "/xprinter/pos";
        String jsonRequest = JSON.toJSONString(restRequest);
        String resp = HttpsUtil.postJson(url, jsonRequest);
        ObjectRestResponse<String> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<String>>(){});
        return result;
    }
    /**
     * 13.钱箱控制
     * @param restRequest
     * @return
     */
    public ObjectRestResponse<String> controlBox(PrintRequest restRequest) {
        String url = BASE_URL + "/xprinter/controlBox";
        String jsonRequest = JSON.toJSONString(restRequest);
        String resp = HttpsUtil.postJson(url, jsonRequest);
        ObjectRestResponse<String> result = JSON.parseObject(resp, new TypeReference<ObjectRestResponse<String>>(){});
        return result;
    }
}
server/services/src/main/java/com/doumee/service/business/impl/PrinterInfoServiceImpl.java
@@ -3,16 +3,11 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.xpyun.XpyunPrintService;
import com.doumee.core.utils.xpyun.XpyunResponse;
import com.doumee.dao.business.PrinterInfoMapper;
import com.doumee.dao.business.model.PrinterInfo;
import com.doumee.service.business.PrinterInfoService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -30,21 +25,8 @@
    @Autowired
    private PrinterInfoMapper printerInfoMapper;
    @Autowired
    private XpyunPrintService xpyunPrintService;
    @Override
    public Integer create(PrinterInfo printerInfo) {
        if (StringUtils.isBlank(printerInfo.getSn())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "打印机SN不能为空");
        }
        if (StringUtils.isBlank(printerInfo.getName())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "打印机名称不能为空");
        }
        XpyunResponse response = xpyunPrintService.addPrinter(printerInfo.getSn(), printerInfo.getName());
        if (response.getCode() != 0) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "芯烨云添加打印机失败:" + response.getMsg());
        }
        printerInfoMapper.insert(printerInfo);
        return printerInfo.getId();
    }
server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java
@@ -26,6 +26,12 @@
import com.doumee.dao.business.model.Orders;
import com.doumee.dao.business.model.PricingRule;
import com.doumee.dao.business.model.ShopInfo;
import com.doumee.config.xyy.XyyConfig;
import com.doumee.config.xyy.dto.AddPrinterRequest;
import com.doumee.config.xyy.dto.AddPrinterRequestItem;
import com.doumee.config.xyy.dto.DelPrinterRequest;
import com.doumee.config.xyy.vo.ObjectRestResponse;
import com.doumee.config.xyy.vo.PrinterResult;
import com.doumee.dao.dto.*;
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.dao.system.SystemUserMapper;
@@ -93,6 +99,12 @@
    @Autowired
    private SmsrecordMapper smsrecordMapper;
    @Autowired
    private PrintService printService;
    @Autowired
    private XyyConfig xyyConfig;
    @Override
    public Integer create(ShopInfo shopInfo) {
        shopInfoMapper.insert(shopInfo);
@@ -870,6 +882,7 @@
        vo.setFeeStandard(shop.getFeeStandard());
        vo.setLatitude(shop.getLatitude());
        vo.setLongitude(shop.getLongitude());
        vo.setLinkPhone(shop.getLinkPhone());
        // é—¨å¤´ç…§ + å†…部照 å…¨è·¯å¾„集合
        String imgPrefix = getShopPrefix();
@@ -1082,6 +1095,7 @@
        // å­˜ä»¶é—¨åº—
        List<Orders> depositSalesOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
                .eq(Orders::getDeleted, Constants.ZERO)
                .notIn(Orders::getStatus,Constants.OrderStatus.cancelled.getStatus(),Constants.OrderStatus.waitPay.getStatus())
                .ge(Orders::getCreateTime, startTime)
                .lt(Orders::getCreateTime, endTime)
                .eq(Orders::getDepositShopId, shopId));
@@ -1089,6 +1103,7 @@
        List<Orders> takeSalesOrders = ordersMapper.selectList(new QueryWrapper<Orders>().lambda()
                .eq(Orders::getDeleted, Constants.ZERO)
                .eq(Orders::getType,Constants.ONE)
                .notIn(Orders::getStatus,Constants.OrderStatus.cancelled.getStatus(),Constants.OrderStatus.waitPay.getStatus())
                .ge(Orders::getCreateTime, startTime)
                .lt(Orders::getCreateTime, endTime)
                .eq(Orders::getTakeShopId, shopId));
@@ -1161,7 +1176,10 @@
                .last("limit 1")
        );
        if(shop==null){
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"请核对登录手机号是否正确");
        }
        if(Constants.equalsInteger(shop.getStatus(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"门店已禁用,请联系管理员");
        }
        if(!Constants.equalsInteger(shop.getAuditStatus(),Constants.THREE)){
            if(Constants.equalsInteger(shop.getAuditStatus(),Constants.ONE)){
@@ -1219,6 +1237,9 @@
                .last("limit 1"));
        if (shop == null) {
            return null;
        }
        if(Constants.equalsInteger(shop.getStatus(),Constants.ONE)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"门店已禁用,请联系管理员");
        }
        // åˆ›å»ºtoken(generateTokenForRedis å·²è‡ªåŠ¨æ¸…é™¤è¯¥ç”¨æˆ·æ—§token,保证唯一有效)
        String token = JwtTokenUtil.generateTokenForRedis(shop.getId(), Constants.TWO, JSONObject.toJSONString(shop), redisTemplate);
@@ -1418,56 +1439,57 @@
        }
    }
    @Autowired
    private com.doumee.core.utils.xpyun.XpyunPrintService xpyunPrintService;
    @Override
    public void bindPrinter(com.doumee.dao.dto.PrinterBindDTO dto) {
        ShopInfo shop = shopInfoMapper.selectById(dto.getShopId());
    public void maintainPrinterSn(ShopPrinterDTO dto) {
        ShopInfo shop = shopInfoMapper.selectById(dto.getId());
        if (shop == null || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        // è°ƒç”¨èŠ¯çƒ¨äº‘æ³¨å†Œæ‰“å°æœº
        com.doumee.core.utils.xpyun.XpyunResponse resp = xpyunPrintService.addPrinter(
                dto.getPrinterSn(), shop.getName());
        if (resp.getCode() != null && resp.getCode() == 0) {
            log.info("芯烨云打印机注册成功: sn={}", dto.getPrinterSn());
        } else {
            log.warn("芯烨云打印机注册返回非0: sn={}, code={}, msg={}",
                    dto.getPrinterSn(), resp.getCode(), resp.getMsg());
        String oldSn = shop.getPrinterSn();
        String newSn = dto.getPrinterSn();
        boolean hasNewSn = StringUtils.isNotBlank(newSn);
        boolean hasOldSn = StringUtils.isNotBlank(oldSn);
        if (!hasNewSn) {
            // æœªä¼ æ‰“印机SN â†’ åˆ é™¤é€»è¾‘
            if (hasOldSn) {
                delPrinterFromXyy(oldSn);
                shop.setPrinterSn(null);
                shopInfoMapper.updateById(shop);
            }
            return;
        }
        // æ— è®ºäº‘端是否成功,都绑定到门店(可后续重试云端注册)
        ShopInfo update = new ShopInfo();
        update.setId(dto.getShopId());
        update.setPrinterSn(dto.getPrinterSn());
        shopInfoMapper.updateById(update);
        // ä¼ äº†æ‰“印机SN â†’ å¦‚果旧绑定存在,先删除
        if (hasOldSn) {
            delPrinterFromXyy(oldSn);
        }
        // ç»‘定新打印机
        AddPrinterRequest addReq = new AddPrinterRequest();
        xyyConfig.createRequestHeader(addReq);
        addReq.setItems(new AddPrinterRequestItem[]{new AddPrinterRequestItem() {{
            setSn(newSn);
            setName(shop.getName());
        }}});
        ObjectRestResponse<PrinterResult> addResp = printService.addPrinters(addReq);
        if (addResp.getCode() != 0) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "绑定打印机失败:" + addResp.getMsg());
        }
        log.info("绑定成功:{}", newSn);
        shop.setPrinterSn(newSn);
        shopInfoMapper.updateById(shop);
    }
    @Override
    public void unbindPrinter(Integer shopId) {
        ShopInfo shop = shopInfoMapper.selectById(shopId);
        if (shop == null || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
    private void delPrinterFromXyy(String sn) {
        DelPrinterRequest delReq = new DelPrinterRequest();
        xyyConfig.createRequestHeader(delReq);
        delReq.setSnlist(new String[]{sn});
        ObjectRestResponse<PrinterResult> delResp = printService.delPrinters(delReq);
        if (delResp.getCode() != 0) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "解绑打印机失败:" + delResp.getMsg());
        }
        if (StringUtils.isNotBlank(shop.getPrinterSn())) {
            xpyunPrintService.deletePrinter(shop.getPrinterSn());
        }
        ShopInfo update = new ShopInfo();
        update.setId(shopId);
        update.setPrinterSn(null);
        shopInfoMapper.updateById(update);
    }
    @Override
    public Object queryPrinterStatus(Integer shopId) {
        ShopInfo shop = shopInfoMapper.selectById(shopId);
        if (shop == null || Constants.equalsInteger(shop.getDeleted(), Constants.ONE)) {
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if (StringUtils.isBlank(shop.getPrinterSn())) {
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "该门店未绑定打印机");
        }
        return xpyunPrintService.queryPrinterStatus(shop.getPrinterSn());
        log.info("解绑成功:{}", sn);
    }
}
server/services/src/main/resources/application-dev.yml
@@ -64,8 +64,8 @@
des_pwd: 123456SDFKDJF
jpush:
  appKey:
  masterSecret:
  appKey: bb8fd4bd06c8dcb004f4ee1e
  masterSecret: 569a75763aa5a59377c46fbb
  apnsProduction: false
knife4j:
server/services/src/main/resources/application-pro.yml
@@ -30,6 +30,11 @@
          ssl:
            enable: true
debug_model: false
########################极光推送配置########################
jpush:
  appKey: bb8fd4bd06c8dcb004f4ee1e
  masterSecret: 569a75763aa5a59377c46fbb
  apnsProduction: false
# Swagger配置
swagger:
server/web/src/main/java/com/doumee/api/web/ConfigApi.java
@@ -173,6 +173,15 @@
        return ApiResponse.success("查询成功", areasService.getOpenedCityByName(cityName));
    }
    @ApiOperation(value = "根据城市编码查询城市信息", notes = "仅返回已开通的城市,未开通返回空")
    @GetMapping("/getCityByCode")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "String", name = "code", value = "城市编码", required = true)
    })
    public ApiResponse<Areas> getCityByCode(@RequestParam String code) {
        return ApiResponse.success("查询成功", areasService.getOpenedCityByCode(code));
    }
    @LoginRequired
    @ApiOperation(value = "会员通知消息分页", notes = "未读优先,时间倒序")
    @PostMapping("/memberNoticePage")
server/web/src/main/java/com/doumee/api/web/DriverInfoApi.java
@@ -24,6 +24,7 @@
import com.doumee.dao.vo.DriverCenterVO;
import com.doumee.dao.vo.DriverGrabOrderVO;
import com.doumee.dao.vo.DriverOrderDetailVO;
import com.doumee.core.utils.jpush.JPushUtil;
import com.doumee.service.business.DriverInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
@@ -286,4 +287,26 @@
        return ApiResponse.success(driverInfoService.checkDriverToken(token));
    }
    @LoginDriverRequired
    @ApiOperation("注册极光推送别名")
    @PostMapping("/registerJpushAlias")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "司机token值", required = true)
    })
    public ApiResponse registerJpushAlias(@RequestParam String jpushAlias) {
        driverInfoService.registerJpushAlias(this.getDriverId(), jpushAlias);
        return ApiResponse.success("操作成功");
    }
    @ApiOperation("极光推送测试")
    @GetMapping("/testJpush")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "String", name = "title", value = "通知标题", required = true),
            @ApiImplicitParam(paramType = "query", dataType = "String", name = "content", value = "通知内容", required = true)
    })
    public ApiResponse<Boolean> testJpush(@RequestParam String telephone, @RequestParam String title, @RequestParam String content) {
        boolean result = JPushUtil.sendByAlias(org.springframework.util.DigestUtils.md5DigestAsHex(telephone.getBytes()), title, content, null);
        return ApiResponse.success("推送" + (result ? "成功" : "失败"), result);
    }
}
server/web/src/main/java/com/doumee/api/web/ShopInfoApi.java
@@ -144,4 +144,16 @@
        return ApiResponse.success("密码修改成功,请重新登录");
    }
    @LoginShopRequired
    @ApiOperation("门店打印订单标签")
    @GetMapping("/printOrderLabel/{orderId}")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "门店token值", required = true),
            @ApiImplicitParam(paramType = "path", dataType = "Integer", name = "orderId", value = "订单主键", required = true)
    })
    public ApiResponse printOrderLabel(@PathVariable Integer orderId) {
        ordersService.printOrderLabel(orderId, this.getShopId());
        return ApiResponse.success("打印成功");
    }
}