From 937c2b33d3dce706c454c2bcffe38729e1046871 Mon Sep 17 00:00:00 2001
From: Jerry Yan <792602257@qq.com>
Date: Thu, 22 May 2025 10:43:26 +0800
Subject: [PATCH] =?UTF-8?q?=E7=85=A7=E7=89=87=E6=89=93=E5=8D=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/ycwl/basic/biz/OrderBiz.java     |   7 +
 .../mobile/AppPrinterController.java          |  18 ++
 .../ycwl/basic/mapper/PrintTaskMapper.java    |  10 ++
 .../com/ycwl/basic/mapper/PrinterMapper.java  |   8 +
 .../pc/printer/resp/MemberPrintResp.java      |   1 +
 .../model/printer/req/FromSourceReq.java      |  10 ++
 .../service/pc/impl/OrderServiceImpl.java     |  29 ++-
 .../basic/service/printer/PrinterService.java |  12 ++
 .../printer/impl/PrinterServiceImpl.java      | 169 +++++++++++++++++-
 src/main/resources/mapper/OrderMapper.xml     |  10 +-
 src/main/resources/mapper/PrintTaskMapper.xml |   8 +
 src/main/resources/mapper/PrinterMapper.xml   |  31 +++-
 12 files changed, 306 insertions(+), 7 deletions(-)
 create mode 100644 src/main/java/com/ycwl/basic/mapper/PrintTaskMapper.java
 create mode 100644 src/main/java/com/ycwl/basic/model/printer/req/FromSourceReq.java
 create mode 100644 src/main/resources/mapper/PrintTaskMapper.xml

diff --git a/src/main/java/com/ycwl/basic/biz/OrderBiz.java b/src/main/java/com/ycwl/basic/biz/OrderBiz.java
index 7b8eed2..0683ff8 100644
--- a/src/main/java/com/ycwl/basic/biz/OrderBiz.java
+++ b/src/main/java/com/ycwl/basic/biz/OrderBiz.java
@@ -32,8 +32,10 @@ import com.ycwl.basic.repository.SourceRepository;
 import com.ycwl.basic.repository.TemplateRepository;
 import com.ycwl.basic.repository.VideoRepository;
 import com.ycwl.basic.repository.VideoTaskRepository;
+import com.ycwl.basic.service.printer.PrinterService;
 import com.ycwl.basic.utils.ApiResponse;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
@@ -74,6 +76,9 @@ public class OrderBiz {
     private BrokerBiz brokerBiz;
     @Autowired
     private CouponBiz couponBiz;
+    @Autowired
+    @Lazy
+    private PrinterService printerService;
 
     public PriceObj queryPrice(Long scenicId, int goodsType, Long goodsId) {
         PriceObj priceObj = new PriceObj();
@@ -237,6 +242,8 @@ public class OrderBiz {
                 case 1: // 视频原素材
                 case 2: // 照片原素材
                     sourceRepository.setUserIsBuyItem(order.getMemberId(), item.getGoodsType(), item.getGoodsId(), order.getId());
+                case 3:
+                    printerService.setUserIsBuyItem(order.getMemberId(), item.getGoodsId(), order.getId());
             }
         });
         orderRepository.clearOrderCache(orderId); // 更新完了,清理下
diff --git a/src/main/java/com/ycwl/basic/controller/mobile/AppPrinterController.java b/src/main/java/com/ycwl/basic/controller/mobile/AppPrinterController.java
index bdaf0b9..3d9daf1 100644
--- a/src/main/java/com/ycwl/basic/controller/mobile/AppPrinterController.java
+++ b/src/main/java/com/ycwl/basic/controller/mobile/AppPrinterController.java
@@ -3,6 +3,7 @@ package com.ycwl.basic.controller.mobile;
 import com.ycwl.basic.annotation.IgnoreToken;
 import com.ycwl.basic.model.jwt.JwtInfo;
 import com.ycwl.basic.model.pc.printer.resp.MemberPrintResp;
+import com.ycwl.basic.model.printer.req.FromSourceReq;
 import com.ycwl.basic.service.printer.PrinterService;
 import com.ycwl.basic.storage.StorageFactory;
 import com.ycwl.basic.utils.ApiResponse;
@@ -11,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 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.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
@@ -18,6 +20,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 
 @RestController
@@ -69,6 +72,12 @@ public class AppPrinterController {
         printerService.setPhotoCropped(JwtTokenUtil.getWorker().getUserId(), scenicId, id, url);
         return ApiResponse.success(url);
     }
+    @PostMapping("/uploadTo/{scenicId}/formSource")
+    public ApiResponse<?> uploadFromSource(@PathVariable("scenicId") Long scenicId, @RequestBody FromSourceReq req) throws IOException {
+        printerService.addUserPhotoFromSource(JwtTokenUtil.getWorker().getUserId(), scenicId, req);
+        return ApiResponse.success(null);
+    }
+
     @PostMapping("/setQuantity/{scenicId}/{id}")
     public ApiResponse<?> setQuantity(@PathVariable("scenicId") Long scenicId, @PathVariable("id") Long id, @RequestParam("quantity") Integer quantity) {
         if (quantity == null) {
@@ -84,4 +93,13 @@ public class AppPrinterController {
     public ApiResponse<?> queryPrice(@PathVariable("scenicId") Long scenicId) {
         return ApiResponse.success(printerService.queryPrice(JwtTokenUtil.getWorker().getUserId(), scenicId));
     }
+
+    @PostMapping("/order/{scenicId}")
+    public ApiResponse<Map<String, Object>> createOrder(@PathVariable("scenicId") Long scenicId) {
+        return ApiResponse.success(printerService.createOrder(JwtTokenUtil.getWorker().getUserId(), scenicId, null));
+    }
+    @PostMapping("/order/{scenicId}/toPrinter/{printerId}")
+    public ApiResponse<Map<String, Object>> createOrderToPrinter(@PathVariable("scenicId") Long scenicId, @PathVariable("printerId") Integer printerId) {
+        return ApiResponse.success(printerService.createOrder(JwtTokenUtil.getWorker().getUserId(), scenicId, printerId));
+    }
 }
diff --git a/src/main/java/com/ycwl/basic/mapper/PrintTaskMapper.java b/src/main/java/com/ycwl/basic/mapper/PrintTaskMapper.java
new file mode 100644
index 0000000..85330d4
--- /dev/null
+++ b/src/main/java/com/ycwl/basic/mapper/PrintTaskMapper.java
@@ -0,0 +1,10 @@
+package com.ycwl.basic.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ycwl.basic.model.pc.printer.entity.PrintTaskEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface PrintTaskMapper extends BaseMapper<PrintTaskEntity> {
+    int insertTask(PrintTaskEntity entity);
+}
diff --git a/src/main/java/com/ycwl/basic/mapper/PrinterMapper.java b/src/main/java/com/ycwl/basic/mapper/PrinterMapper.java
index 338afb5..6e17a61 100644
--- a/src/main/java/com/ycwl/basic/mapper/PrinterMapper.java
+++ b/src/main/java/com/ycwl/basic/mapper/PrinterMapper.java
@@ -42,4 +42,12 @@ public interface PrinterMapper {
     int setPhotoCropped(Long memberId, Long scenicId, Long id, String url);
 
     int setPhotoQuantity(Long memberId, Long scenicId, Long id, Integer quantity);
+
+    List<MemberPrintResp> getUserPhotoByIds(List<Long> ids);
+
+    int setUserIsBuyItem(Long memberId, Long id, Long orderId);
+
+    void updateUserPhotoListToPrinter(Long memberId, Long scenicId, Integer printerId);
+
+    List<MemberPrintResp> listRelationByOrderId(Long orderId);
 }
\ No newline at end of file
diff --git a/src/main/java/com/ycwl/basic/model/pc/printer/resp/MemberPrintResp.java b/src/main/java/com/ycwl/basic/model/pc/printer/resp/MemberPrintResp.java
index 652de59..25f1070 100644
--- a/src/main/java/com/ycwl/basic/model/pc/printer/resp/MemberPrintResp.java
+++ b/src/main/java/com/ycwl/basic/model/pc/printer/resp/MemberPrintResp.java
@@ -13,6 +13,7 @@ public class MemberPrintResp {
     private String origUrl;
     private String cropUrl;
     private Integer quantity;
+    private Integer printerId;
     private Long orderId;
     private Integer status;
     private Date createTime;
diff --git a/src/main/java/com/ycwl/basic/model/printer/req/FromSourceReq.java b/src/main/java/com/ycwl/basic/model/printer/req/FromSourceReq.java
new file mode 100644
index 0000000..891a524
--- /dev/null
+++ b/src/main/java/com/ycwl/basic/model/printer/req/FromSourceReq.java
@@ -0,0 +1,10 @@
+package com.ycwl.basic.model.printer.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class FromSourceReq {
+    List<Long> ids;
+}
diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java
index d7e1c60..3bf5b25 100644
--- a/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java
+++ b/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java
@@ -32,6 +32,7 @@ import com.ycwl.basic.model.pc.order.resp.OrderRespVO;
 import com.ycwl.basic.model.pc.orderOp.entity.OrderOperationEntity;
 import com.ycwl.basic.model.pc.price.entity.PriceConfigEntity;
 import com.ycwl.basic.model.pc.price.resp.GoodsListRespVO;
+import com.ycwl.basic.model.pc.printer.resp.MemberPrintResp;
 import com.ycwl.basic.model.pc.source.entity.SourceEntity;
 import com.ycwl.basic.model.pc.task.entity.TaskEntity;
 import com.ycwl.basic.model.pc.template.resp.TemplateRespVO;
@@ -101,6 +102,8 @@ public class OrderServiceImpl implements OrderService {
     private TemplateRepository templateRepository;
     @Autowired
     private TaskTaskServiceImpl taskTaskService;
+    @Autowired
+    private PrinterMapper printerMapper;
 
     @Override
     public ApiResponse<PageInfo<OrderRespVO>> pageQuery(OrderReqQuery query) {
@@ -204,6 +207,26 @@ public class OrderServiceImpl implements OrderService {
                         item.setShootingTime(memberVideoEntityList.get(0).getCreateTime());
                     }
                 }
+            } else if (Integer.valueOf(3).equals(item.getGoodsType())) { // 打印照片 goodsId就是memberPrintId
+                List<MemberPrintResp> list = printerMapper.getUserPhotoByIds(orderItemList.stream().map(OrderItemVO::getGoodsId).collect(Collectors.toList()));
+                item.setCoverList(orderItemList.stream().map(OrderItemVO::getCoverUrl).collect(Collectors.toList()));
+                if (!_f.contains(3)) {
+                    _f.add(3);
+                    if (!list.isEmpty()) {
+                        for (MemberPrintResp sourceEntity : list) {
+                            GoodsDetailVO goods = new GoodsDetailVO();
+                            goods.setGoodsId(Long.valueOf(sourceEntity.getId()));
+                            goods.setGoodsName("打印照片("+sourceEntity.getQuantity()+"张)");
+                            goods.setUrl(sourceEntity.getCropUrl());
+                            goods.setGoodsType(3);
+                            goods.setScenicId(sourceEntity.getScenicId());
+                            goods.setTemplateCoverUrl(sourceEntity.getCropUrl());
+                            goods.setScenicId(sourceEntity.getScenicId());
+                            goods.setCreateTime(sourceEntity.getCreateTime());
+                            goodsList.add(goods);
+                        }
+                    }
+                }
             } else {
                 item.setCoverList(Collections.singletonList(item.getCoverUrl()));
                 VideoEntity videoMapperById = videoRepository.getVideo(item.getGoodsId());
@@ -342,12 +365,16 @@ public class OrderServiceImpl implements OrderService {
                     if (!memberVideoEntityList.isEmpty()) {
                         item.setShootingTime(memberVideoEntityList.get(0).getCreateTime());
                     }
-                } else {
+                } else if (Integer.valueOf(0).equals(item.getGoodsType())) {
                     item.setCoverList(Collections.singletonList(item.getCoverUrl()));
                     VideoEntity video = videoRepository.getVideo(item.getGoodsId());
                     if (video != null) {
                         item.setShootingTime(videoTaskRepository.getTaskShotDate(video.getTaskId()));
                     }
+                } else if (Integer.valueOf(3).equals(item.getGoodsType())) {
+                    // 打印订单
+                    List<MemberPrintResp> photo = printerMapper.getUserPhotoByIds(orderItemList.stream().map(OrderItemVO::getGoodsId).collect(Collectors.toList()));
+                    item.setCoverList(photo.stream().map(MemberPrintResp::getCropUrl).collect(Collectors.toList()));
                 }
             });
         });
diff --git a/src/main/java/com/ycwl/basic/service/printer/PrinterService.java b/src/main/java/com/ycwl/basic/service/printer/PrinterService.java
index 7dd09e5..f176da3 100644
--- a/src/main/java/com/ycwl/basic/service/printer/PrinterService.java
+++ b/src/main/java/com/ycwl/basic/service/printer/PrinterService.java
@@ -4,12 +4,14 @@ import com.ycwl.basic.model.mobile.order.PriceObj;
 import com.ycwl.basic.model.pc.printer.entity.PrinterEntity;
 import com.ycwl.basic.model.pc.printer.resp.MemberPrintResp;
 import com.ycwl.basic.model.pc.printer.resp.PrinterResp;
+import com.ycwl.basic.model.printer.req.FromSourceReq;
 import com.ycwl.basic.model.printer.req.PrinterSyncReq;
 import com.ycwl.basic.model.printer.resp.PrintTaskResp;
 import com.ycwl.basic.model.printer.req.WorkerAuthReqVo;
 import com.ycwl.basic.utils.ApiResponse;
 
 import java.util.List;
+import java.util.Map;
 
 public interface PrinterService {
     List<PrinterResp> listByScenicId(Long scenicId);
@@ -32,6 +34,8 @@ public interface PrinterService {
 
     List<MemberPrintResp> getUserPhotoList(Long userId, Long scenicId);
 
+    List<MemberPrintResp> getUserPhotoListByOrderId(Long orderId);
+
     boolean deleteUserPhoto(Long memberId, Long scenicId, Long relationId);
 
     boolean addUserPhoto(Long memberId, Long scenicId, String url);
@@ -43,4 +47,12 @@ public interface PrinterService {
     int setPhotoQuantity(Long memberId, Long scenicId, Long id, Integer quantity);
 
     PriceObj queryPrice(Long memberId, Long scenicId);
+
+    boolean addUserPhotoFromSource(Long memberId, Long scenicId, FromSourceReq req);
+
+    Map<String, Object> createOrder(Long memberId, Long scenicId, Integer printerId);
+
+    void batchSetUserPhotoListToPrinter(Long memberId, Long scenicId, Integer printerId);
+
+    void setUserIsBuyItem(Long memberId, Long id, Long orderId);
 }
\ No newline at end of file
diff --git a/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java b/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java
index 7d85faa..4bc85e0 100644
--- a/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java
+++ b/src/main/java/com/ycwl/basic/service/printer/impl/PrinterServiceImpl.java
@@ -1,32 +1,70 @@
 package com.ycwl.basic.service.printer.impl;
 
+import com.ycwl.basic.biz.OrderBiz;
+import com.ycwl.basic.constant.NumberConstant;
+import com.ycwl.basic.enums.OrderStateEnum;
+import com.ycwl.basic.exception.BaseException;
+import com.ycwl.basic.mapper.MemberMapper;
+import com.ycwl.basic.mapper.OrderMapper;
+import com.ycwl.basic.mapper.PrintTaskMapper;
 import com.ycwl.basic.mapper.PrinterMapper;
+import com.ycwl.basic.mapper.SourceMapper;
 import com.ycwl.basic.model.mobile.order.PriceObj;
+import com.ycwl.basic.model.pc.member.resp.MemberRespVO;
+import com.ycwl.basic.model.pc.order.entity.OrderEntity;
+import com.ycwl.basic.model.pc.order.entity.OrderItemEntity;
 import com.ycwl.basic.model.pc.price.entity.PriceConfigEntity;
 import com.ycwl.basic.model.pc.printer.entity.PrintTaskEntity;
 import com.ycwl.basic.model.pc.printer.entity.PrinterEntity;
 import com.ycwl.basic.model.pc.printer.resp.MemberPrintResp;
 import com.ycwl.basic.model.pc.printer.resp.PrinterResp;
+import com.ycwl.basic.model.pc.source.resp.SourceRespVO;
+import com.ycwl.basic.model.printer.req.FromSourceReq;
 import com.ycwl.basic.model.printer.req.PrinterSyncReq;
 import com.ycwl.basic.model.printer.req.WorkerAuthReqVo;
 import com.ycwl.basic.model.printer.resp.PrintTaskResp;
+import com.ycwl.basic.model.wx.WXPayOrderReqVO;
 import com.ycwl.basic.repository.PriceRepository;
+import com.ycwl.basic.service.mobile.WxPayService;
 import com.ycwl.basic.service.printer.PrinterService;
 import com.ycwl.basic.utils.ApiResponse;
+import com.ycwl.basic.utils.SnowFlakeUtil;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
+@Slf4j
 @Service
 public class PrinterServiceImpl implements PrinterService {
     @Autowired
     private PrinterMapper printerMapper;
     @Autowired
     private PriceRepository priceRepository;
+    @Autowired
+    private SourceMapper sourceMapper;
+    @Autowired
+    private MemberMapper memberMapper;
+    @Autowired
+    private OrderMapper orderMapper;
+    @Autowired
+    @Lazy
+    private OrderBiz orderBiz;
+    @Autowired
+    private WxPayService wxPayService;
+    @Autowired
+    private PrintTaskMapper printTaskMapper;
 
     @Override
     public List<PrinterResp> listByScenicId(Long scenicId) {
@@ -131,6 +169,11 @@ public class PrinterServiceImpl implements PrinterService {
         return list;
     }
 
+    @Override
+    public List<MemberPrintResp> getUserPhotoListByOrderId(Long orderId) {
+        return printerMapper.listRelationByOrderId(orderId);
+    }
+
     @Override
     public boolean deleteUserPhoto(Long memberId, Long scenicId, Long relationId) {
         int record = printerMapper.deleteUserPhoto(memberId, scenicId, relationId);
@@ -164,11 +207,133 @@ public class PrinterServiceImpl implements PrinterService {
         // 判断几张
         PriceConfigEntity priceConfig = priceRepository.getPriceConfigByScenicTypeGoods(scenicId, 3, null);
         PriceObj obj = new PriceObj();
-        obj.setPrice(priceConfig.getPrice().multiply(BigDecimal.valueOf(userPhotoList.size())));
-        obj.setSlashPrice(priceConfig.getSlashPrice().multiply(BigDecimal.valueOf(userPhotoList.size())));
+        long count = userPhotoList.stream().filter(item -> Objects.nonNull(item.getQuantity())).mapToInt(MemberPrintResp::getQuantity).sum();
+        obj.setPrice(priceConfig.getPrice().multiply(BigDecimal.valueOf(count)));
+        obj.setSlashPrice(priceConfig.getSlashPrice().multiply(BigDecimal.valueOf(count)));
         obj.setGoodsType(3);
         obj.setFree(false);
         obj.setScenicId(scenicId);
         return obj;
     }
+
+    @Override
+    public boolean addUserPhotoFromSource(Long memberId, Long scenicId, FromSourceReq req) {
+        req.getIds().forEach(id -> {
+            SourceRespVO byId = sourceMapper.getById(id);
+            if (byId == null) {
+                return;
+            }
+            printerMapper.addUserPhoto(memberId, scenicId, byId.getUrl());
+        });
+        return false;
+    }
+
+    @Override
+    public Map<String, Object> createOrder(Long memberId, Long scenicId, Integer printerId) {
+        if (printerId == null) {
+            List<PrinterResp> printerList = printerMapper.listByScenicId(scenicId);
+            if (printerList.size() != 1) {
+                throw new BaseException("请选择打印机");
+            } else {
+                printerId = printerList.get(0).getId();
+            }
+        } else {
+            PrinterEntity printer = printerMapper.getById(printerId);
+            if (printer == null) {
+                throw new BaseException("打印机不存在");
+            }
+            if (printer.getStatus() != 1) {
+                throw new BaseException("打印机已停用");
+            }
+            if (!printer.getScenicId().equals(scenicId)) {
+                throw new BaseException("打印机不属于该景区");
+            }
+        }
+        PriceConfigEntity priceConfig = priceRepository.getPriceConfigByScenicTypeGoods(scenicId, 3, null);
+        if (priceConfig == null) {
+            throw new BaseException("该套餐暂未开放购买");
+        }
+        log.info("创建打印订单,价格配置:{}", priceConfig);
+        OrderEntity order = new OrderEntity();
+        Long orderId = SnowFlakeUtil.getLongId();
+        order.setId(orderId);
+        order.setMemberId(memberId);
+        MemberRespVO member = memberMapper.getById(memberId);
+        order.setOpenId(member.getOpenId());
+        order.setScenicId(scenicId);
+        order.setType(priceConfig.getType());
+        batchSetUserPhotoListToPrinter(memberId, scenicId, printerId);
+        List<MemberPrintResp> userPhotoList = getUserPhotoList(memberId, scenicId);
+        List<OrderItemEntity> orderItems = userPhotoList.stream().map(goods -> {
+            OrderItemEntity orderItem = new OrderItemEntity();
+            orderItem.setOrderId(orderId);
+            // member_print
+            orderItem.setGoodsId(Long.valueOf(goods.getId()));
+            orderItem.setGoodsType(3);
+            return orderItem;
+        }).collect(Collectors.toList());
+        long count = userPhotoList.stream().filter(item -> Objects.nonNull(item.getQuantity())).mapToInt(MemberPrintResp::getQuantity).sum();
+        order.setPrice(priceConfig.getPrice().multiply(BigDecimal.valueOf(count)));
+        order.setSlashPrice(priceConfig.getSlashPrice().multiply(BigDecimal.valueOf(count)));
+        order.setPayPrice(priceConfig.getPrice().multiply(BigDecimal.valueOf(count)));
+//        order.setFaceId();
+        if (order.getPayPrice().equals(BigDecimal.ZERO)) {
+            order.setStatus(OrderStateEnum.PAID.getState());
+            order.setPayAt(new Date());
+        } else {
+            order.setStatus(OrderStateEnum.UNPAID.getState());
+        }
+        orderMapper.add(order);
+        int addOrderItems = orderMapper.addOrderItems(orderItems);
+        if (addOrderItems == NumberConstant.ZERO) {
+            log.error("订单明细添加失败");
+            throw new BaseException("订单添加失败");
+        }
+        Map<String, Object> data = new HashMap<>();
+        if (order.getPayPrice().equals(BigDecimal.ZERO)) {
+            orderBiz.paidOrder(order.getId());
+            data.put("needPay", false);
+            return data;
+        } else {
+            WXPayOrderReqVO wxPayOrderReqVO = new WXPayOrderReqVO();
+            wxPayOrderReqVO.setOpenId(order.getOpenId())
+                    .setMemberId(order.getMemberId())
+                    .setOrderSn(order.getId())
+                    .setTotalPrice(order.getPayPrice().setScale(2, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).intValueExact())
+                    .setGoodsName("照片打印")
+                    .setDescription("照片打印");
+            try {
+                data = wxPayService.createOrder(order.getScenicId(), wxPayOrderReqVO);
+            } catch (Exception e) {
+                throw new BaseException(e);
+            }
+            data.put("orderId", orderId);
+            return data;
+        }
+    }
+
+    @Override
+    public void batchSetUserPhotoListToPrinter(Long memberId, Long scenicId, Integer printerId) {
+        printerMapper.updateUserPhotoListToPrinter(memberId, scenicId, printerId);
+    }
+
+    @Override
+    public void setUserIsBuyItem(Long memberId, Long id, Long orderId) {
+        printerMapper.setUserIsBuyItem(memberId, id, orderId);
+        // 创建打印任务
+        List<MemberPrintResp> userPhotoListByOrderId = getUserPhotoListByOrderId(orderId);
+        userPhotoListByOrderId.forEach(item -> {
+            PrinterEntity printer = printerMapper.getById(item.getPrinterId());
+            PrintTaskEntity task = new PrintTaskEntity();
+            task.setPrinterId(printer.getId());
+            task.setStatus(0);
+            task.setUrl(item.getCropUrl());
+            task.setPrinterName(printer.getUsePrinter());
+            task.setHeight(printer.getPreferH());
+            task.setWidth(printer.getPreferW());
+            task.setCreateTime(new Date());
+            task.setUpdateTime(new Date());
+            printTaskMapper.insertTask(task);
+        });
+    }
 }
\ No newline at end of file
diff --git a/src/main/resources/mapper/OrderMapper.xml b/src/main/resources/mapper/OrderMapper.xml
index b9895a0..66d67f1 100644
--- a/src/main/resources/mapper/OrderMapper.xml
+++ b/src/main/resources/mapper/OrderMapper.xml
@@ -99,7 +99,11 @@
                  FROM member_source ms
                           LEFT JOIN face f ON ms.face_id = f.id
                           LEFT JOIN source s ON ms.source_id = s.id
-             )
+        ),
+            member_photo_data AS (
+                 SELECT mp.member_id, 3 as type, mp.id, mp.crop_url as url, mp.quantity, mp.status, mp.create_time
+                  FROM member_print mp
+            )
         SELECT
             oi.id AS oiId,
             oi.order_id AS orderId,
@@ -109,12 +113,14 @@
             sc.name AS scenic_name,
             CASE oi.goods_type
                 WHEN '0' THEN mvd.cover_url
+                WHEN '3' THEN mpd.url
                 END AS coverUrl,
             oi.goods_type,
             CASE oi.goods_type
                 WHEN '0' THEN mvd.name
                 WHEN '1' THEN '录像集'
                 WHEN '2' THEN '照片集'
+                WHEN '3' THEN '照片打印'
                 ELSE '其他'
                 END AS goods_name,
             CASE oi.goods_type
@@ -134,12 +140,14 @@
             CASE oi.goods_type
                 WHEN '1' THEN msd.url
                 WHEN '2' THEN msd.url
+                WHEN '3' THEN mpd.url
                 END AS imgUrl
         FROM order_item oi
                  LEFT JOIN `order` o ON oi.order_id = o.id
                  LEFT JOIN scenic sc ON o.scenic_id = sc.id
                  LEFT JOIN member_video_data mvd ON o.face_id = mvd.face_id AND oi.goods_id = mvd.video_id
                  LEFT JOIN member_source_data msd ON o.face_id = msd.face_id  AND oi.goods_id = msd.face_id AND msd.type = oi.goods_type
+                 LEFT JOIN member_photo_data mpd ON oi.goods_id = mpd.id AND mpd.type = oi.goods_type
         WHERE oi.order_id = #{id};
     </select>
 
diff --git a/src/main/resources/mapper/PrintTaskMapper.xml b/src/main/resources/mapper/PrintTaskMapper.xml
new file mode 100644
index 0000000..40e2051
--- /dev/null
+++ b/src/main/resources/mapper/PrintTaskMapper.xml
@@ -0,0 +1,8 @@
+<?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.ycwl.basic.mapper.PrintTaskMapper">
+    <insert id="insertTask">
+        insert into print_task(printer_id, status, printer_name, url, width, height, create_time)
+        values (#{printerId}, 0, #{printerName}, #{url}, #{width}, #{height}, NOW())
+    </insert>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/PrinterMapper.xml b/src/main/resources/mapper/PrinterMapper.xml
index 0960cbf..2017e56 100644
--- a/src/main/resources/mapper/PrinterMapper.xml
+++ b/src/main/resources/mapper/PrinterMapper.xml
@@ -41,19 +41,38 @@
     <select id="listRelation" resultType="com.ycwl.basic.model.pc.printer.resp.MemberPrintResp">
         SELECT p.id, p.scenic_id as scenicId, s.name as scenicName, p.member_id as memberId,
                p.orig_url as origUrl, p.crop_url as cropUrl, p.order_id as orderId, p.quantity,
-               p.status, p.create_time as createTime
+               p.status, p.create_time as createTime, p.printer_id
         FROM member_print p
         LEFT JOIN scenic s ON s.id = p.scenic_id
-        WHERE p.member_id = #{memberId} AND p.scenic_id = #{scenicId}
+        WHERE p.member_id = #{memberId} AND p.scenic_id = #{scenicId} AND p.status = 0
     </select>
     <select id="getUserPhoto" resultType="com.ycwl.basic.model.pc.printer.resp.MemberPrintResp">
         SELECT p.id, p.scenic_id, s.name as scenicName, p.member_id as memberId,
                p.member_id, p.orig_url as origUrl, p.crop_url as cropUrl, p.order_id as orderId, p.quantity,
-               p.status, p.create_time as createTime
+               p.status, p.create_time as createTime, p.printer_id
         FROM member_print p
         LEFT JOIN scenic s ON s.id = p.scenic_id
         WHERE p.id = #{id} AND p.member_id = #{memberId} AND p.scenic_id = #{scenicId}
     </select>
+    <select id="getUserPhotoByIds" resultType="com.ycwl.basic.model.pc.printer.resp.MemberPrintResp">
+        SELECT p.id, p.scenic_id, s.name as scenicName, p.member_id as memberId,
+               p.orig_url as origUrl, p.crop_url as cropUrl, p.order_id as orderId, p.quantity,
+               p.status, p.create_time as createTime, p.printer_id
+        FROM member_print p
+        LEFT JOIN scenic s ON s.id = p.scenic_id
+        WHERE p.id IN
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
+    <select id="listRelationByOrderId" resultType="com.ycwl.basic.model.pc.printer.resp.MemberPrintResp">
+        SELECT p.id, p.scenic_id as scenicId, s.name as scenicName, p.member_id as memberId,
+               p.orig_url as origUrl, p.crop_url as cropUrl, p.order_id as orderId, p.quantity,
+               p.status, p.create_time as createTime, p.printer_id
+        FROM member_print p
+        LEFT JOIN scenic s ON s.id = p.scenic_id
+        WHERE p.id in (select order_item.goods_id from order_item where order_item.order_id = #{orderId} and order_item.goods_type = 3)
+    </select>
 
     <!-- 新增 -->
     <insert id="add">
@@ -121,6 +140,12 @@
     <update id="setPhotoQuantity">
         UPDATE member_print SET quantity = #{quantity}, update_time = NOW() WHERE id = #{id}
     </update>
+    <update id="setUserIsBuyItem">
+        UPDATE member_print SET order_id = #{orderId}, status = 1, update_time = NOW() WHERE member_id = #{memberId} AND id = #{id}
+    </update>
+    <update id="updateUserPhotoListToPrinter">
+        UPDATE member_print SET printer_id = #{printerId}, update_time = NOW() WHERE member_id = #{memberId} AND scenic_id = #{scenicId} AND status = 0 AND printer_id is null
+    </update>
 
     <!-- 删除 -->
     <delete id="deleteById">